diff --git a/src/components/vital-wave/index.tsx b/src/components/vital-wave/index.tsx index 550fc04..1f625ed 100644 --- a/src/components/vital-wave/index.tsx +++ b/src/components/vital-wave/index.tsx @@ -4,6 +4,9 @@ import Taro from '@tarojs/taro' const V_PADDING = 8 const HEIGHT = 110 +// 纵轴最小跨度(BPM):心率生理波动常只有个位数,若按 min/max 归一化会把 +// 数 BPM 的微小起伏放大成满幅曲线,视觉误导为剧烈波动 +const MIN_SPAN = 20 interface Props { points: number[] @@ -63,8 +66,13 @@ export function VitalWave({ points, canvasId = 'vitalWave' }: Props) { function drawWave(canvasId: string, w: number, h: number, pts: number[]) { const ctx = Taro.createCanvasContext(canvasId) - const min = Math.min(...pts) - const max = Math.max(...pts) + let min = Math.min(...pts) + let max = Math.max(...pts) + if (max - min < MIN_SPAN) { + const mid = (min + max) / 2 + min = mid - MIN_SPAN / 2 + max = mid + MIN_SPAN / 2 + } const span = max - min || 1 const xAt = (i: number) => (pts.length <= 1 ? 0 : (i / (pts.length - 1)) * w) const yAt = (v: number) => h - V_PADDING - ((v - min) / span) * (h - V_PADDING * 2) diff --git a/src/pages/device/feature/add.tsx b/src/pages/device/feature/add.tsx index 54dda95..9ca9627 100644 --- a/src/pages/device/feature/add.tsx +++ b/src/pages/device/feature/add.tsx @@ -8,6 +8,7 @@ import { StateView } from '@/components/state-view' import { addHomeDevice } from '@/api/homeDevice' import { getHomeList, type HomeInfo } from '@/api/home' import { getRoomList, type HomeRoom } from '@/api/homeRoom' +import { resolveCurrentHome, setCurrentHomeId } from '@/store/currentHome' import { showToast } from '@/utils/toast' import { navigateBack } from '@/utils/navigation' import styles from './add.module.scss' @@ -33,9 +34,10 @@ export default function DeviceAdd() { setLoadError(false) getHomeList() .then(async (list) => { - const first = list[0] ?? null + const first = resolveCurrentHome(list) if (cancelled) return setHome(first) + if (first) setCurrentHomeId(first.homeId) if (!first) return const roomList = await getRoomList(first.homeId) if (cancelled) return diff --git a/src/pages/device/feature/detail.tsx b/src/pages/device/feature/detail.tsx index 497b752..d6c4d0d 100644 --- a/src/pages/device/feature/detail.tsx +++ b/src/pages/device/feature/detail.tsx @@ -86,7 +86,7 @@ export default function Detail() { const fmt = (v: number | undefined): string => (v === undefined || v === null ? '--' : String(v)) const goBleConfig = () => navigateTo(ROUTES.DEVICE_BLE_CONFIG) - const goWifiConfig = () => navigateTo(ROUTES.DEVICE_BLE_CONFIG) + void goBleConfig return ( @@ -157,8 +157,10 @@ export default function Detail() { + {/* BLE 配置流程联调未完成,暂隐藏两个配置入口 + */} diff --git a/src/pages/device/index.tsx b/src/pages/device/index.tsx index bef8ded..6651f5b 100644 --- a/src/pages/device/index.tsx +++ b/src/pages/device/index.tsx @@ -9,6 +9,7 @@ import { BottomSheet } from '@/components/bottom-sheet' import { getHomeDeviceList, unbindHomeDevice, type HomeDevice } from '@/api/homeDevice' import { getRoomList, type HomeRoom } from '@/api/homeRoom' import { getHomeList, type HomeInfo } from '@/api/home' +import { resolveCurrentHome, setCurrentHomeId } from '@/store/currentHome' import { ROUTES } from '@/constants/routes' import { navigateTo } from '@/utils/navigation' import { showToast } from '@/utils/toast' @@ -61,10 +62,11 @@ export default function DeviceList() { try { const list = await getHomeList() setFamilies(list) - // 若当前未选中,默认选第一条 + // 未选中时按持久化的 homeId 恢复,失效则回落第一条 setCurrentFamily((prev) => { - const next = prev ?? list[0] ?? null + const next = prev ?? resolveCurrentHome(list) if (next && next.homeId !== prev?.homeId) { + setCurrentHomeId(next.homeId) setFilterRoomId('') loadDevices(next.homeId) loadRooms(next.homeId) @@ -154,6 +156,7 @@ export default function DeviceList() { const confirmFamilySheet = () => { if (pendingFamily && pendingFamily.homeId !== currentFamily?.homeId) { setCurrentFamily(pendingFamily) + setCurrentHomeId(pendingFamily.homeId) setFilterRoomId('') loadDevices(pendingFamily.homeId) loadRooms(pendingFamily.homeId) diff --git a/src/pages/scene/select.tsx b/src/pages/scene/select.tsx index f47e207..df2a3fe 100644 --- a/src/pages/scene/select.tsx +++ b/src/pages/scene/select.tsx @@ -7,6 +7,7 @@ import { Empty } from '@/components/empty' import { StateView } from '@/components/state-view' import { BottomSheet } from '@/components/bottom-sheet' import { getHomeList, type HomeInfo } from '@/api/home' +import { resolveCurrentHome, setCurrentHomeId } from '@/store/currentHome' import { getRoomList, addRoom, updateRoom, deleteRoom, ROOM_SENCE_MAP, type HomeRoom } from '@/api/homeRoom' @@ -45,8 +46,9 @@ export default function SceneSelect() { setLoadError(false) try { const homes = await getHomeList() - const first = homes[0] ?? null + const first = resolveCurrentHome(homes) setHome(first) + if (first) setCurrentHomeId(first.homeId) if (!first) { setList([]) return diff --git a/src/store/currentHome.ts b/src/store/currentHome.ts new file mode 100644 index 0000000..8fa2c0e --- /dev/null +++ b/src/store/currentHome.ts @@ -0,0 +1,18 @@ +import { storage } from '@/utils/storage' +import type { HomeInfo } from '@/api/home' + +// 当前选中家庭持久化 key:设备列表 / 房间管理 / 添加设备三页共享 +const KEY = 'currentHomeId' + +export function setCurrentHomeId(homeId: string): void { + storage.set(KEY, homeId) +} + +// 从家庭列表解析当前家庭:优先已持久化的选择,失效(不在列表,如切换账号)时回落第一条并重新落盘 +export function resolveCurrentHome(homes: HomeInfo[]): HomeInfo | null { + if (homes.length === 0) return null + const stored = storage.get(KEY) + const next = homes.find((h) => h.homeId === stored) ?? homes[0] + storage.set(KEY, next.homeId) + return next +}