From 213d61bbf67b5916a31f6e8cd6c45ef008406b0f Mon Sep 17 00:00:00 2001 From: ozh Date: Mon, 21 Sep 2026 14:42:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(home):=20=E5=BD=93=E5=89=8D=E5=AE=B6?= =?UTF-8?q?=E5=BA=AD=E9=80=89=E6=8B=A9=E6=8C=81=E4=B9=85=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E4=B8=89=E9=A1=B5=E5=85=B1=E4=BA=AB=E6=81=A2=E5=A4=8D=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 store/currentHome.ts:storage 持久化 homeId,resolveCurrentHome 优先恢复已存选择、失效回落第一条并重新落盘 - 设备列表/房间管理/添加设备三页统一走 resolveCurrentHome, 切换家庭时同步 setCurrentHomeId - 详情页隐藏 BLE 网络配置/设备配置入口(联调未完成),清理无用跳转函数 - 心率波形纵轴最小跨度 20 BPM,避免小波动被归一化放大成满幅曲线 --- src/components/vital-wave/index.tsx | 12 ++++++++++-- src/pages/device/feature/add.tsx | 4 +++- src/pages/device/feature/detail.tsx | 4 +++- src/pages/device/index.tsx | 7 +++++-- src/pages/scene/select.tsx | 4 +++- src/store/currentHome.ts | 18 ++++++++++++++++++ 6 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 src/store/currentHome.ts 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 +}