feat(home): 当前家庭选择持久化,三页共享恢复逻辑统一
- 新增 store/currentHome.ts:storage 持久化 homeId,resolveCurrentHome 优先恢复已存选择、失效回落第一条并重新落盘 - 设备列表/房间管理/添加设备三页统一走 resolveCurrentHome, 切换家庭时同步 setCurrentHomeId - 详情页隐藏 BLE 网络配置/设备配置入口(联调未完成),清理无用跳转函数 - 心率波形纵轴最小跨度 20 BPM,避免小波动被归一化放大成满幅曲线
This commit is contained in:
parent
05d46368d1
commit
213d61bbf6
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
<View className={styles.page}>
|
||||
|
|
@ -157,8 +157,10 @@ export default function Detail() {
|
|||
<ListRow label="设备型号" value={deviceModel || '-'} />
|
||||
<ListRow label="设备 ID" value={installId || '-'} />
|
||||
<ListRow label="安装房间" value={device?.roomName ?? '-'} />
|
||||
{/* BLE 配置流程联调未完成,暂隐藏两个配置入口
|
||||
<ListRow label="网络配置" arrow onClick={goWifiConfig} />
|
||||
<ListRow label="设备配置" arrow onClick={goBleConfig} />
|
||||
*/}
|
||||
</ListRowGroup>
|
||||
</View>
|
||||
</View>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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<string>(KEY)
|
||||
const next = homes.find((h) => h.homeId === stored) ?? homes[0]
|
||||
storage.set(KEY, next.homeId)
|
||||
return next
|
||||
}
|
||||
Loading…
Reference in New Issue