import { useState, useEffect } from 'react' import Taro from '@tarojs/taro' import { useDidShow } from '@tarojs/taro' import { View, Text, Input } from '@tarojs/components' import { Navbar } from '@/components/navbar' import { Loading } from '@/components/loading' 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' export default function DeviceAdd() { const [deviceId, setDeviceId] = useState('') const [submitting, setSubmitting] = useState(false) const [loading, setLoading] = useState(true) const [loadError, setLoadError] = useState(false) const [home, setHome] = useState(null) const [rooms, setRooms] = useState([]) const [roomId, setRoomId] = useState('') // 数据加载体:useDidShow 首次与错误重试共用(state 变化触发 useDidShow 不可行,用计数器驱动 effect) const [reload, setReload] = useState(0) const [loaded, setLoaded] = useState(false) // 默认家庭 + 房间列表:addHomeDevice 需 homeId + roomId useEffect(() => { let cancelled = false setLoading(true) setLoadError(false) getHomeList() .then(async (list) => { 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 setRooms(roomList ?? []) setRoomId((prev) => prev || roomList[0]?.roomId || '') }) .catch(() => !cancelled && setLoadError(true)) .finally(() => { if (cancelled) return setLoading(false) setLoaded(true) }) return () => { cancelled = true } }, [reload]) // 从房间管理等页面返回时刷新(房间可能已变更) useDidShow(() => { if (loaded) setReload((n) => n + 1) }) const submitManual = async () => { if (submitting) return const code = deviceId.trim() if (!code) { showToast('请输入设备编号') return } if (!home || !roomId) { showToast('请选择安装房间') return } setSubmitting(true) try { await addHomeDevice({ deviceName: code, homeId: home.homeId, roomId }) showToast('添加成功') navigateBack() } catch (e) { showToast(e instanceof Error ? e.message : '添加失败') } finally { setSubmitting(false) } } // 点击扫码区拉起相机扫码,识别结果回填到输入框,确认后提交 const scanQRCode = async () => { try { const res = await Taro.scanCode({ scanType: ['qrCode', 'barCode'] }) const code = String(res.result ?? '').trim() if (!code) { showToast('未识别到有效编号') return } setDeviceId(code) showToast('已填入扫码结果') } catch { showToast('扫码取消') } } if (loading) { return ( ) } if (loadError || !home) { return ( (loadError ? setReload((n) => n + 1) : navigateBack())} /> ) } return ( 手动输入 将智能设备添加至「{home.name}」,可实时查看设备状态和告警信息。 setDeviceId(e.detail.value)} /> {rooms.length > 0 && ( 安装房间 {rooms.map((room) => ( setRoomId(room.roomId)} > {room.name} ))} )} {submitting ? '提交中...' : '提交'} 扫码添加 扫描设备机身或包装盒上的二维码,自动填入编号。 点击开始扫码 支持二维码 / 条形码 ) }