diff --git a/src/pages/device/feature/detail.tsx b/src/pages/device/feature/detail.tsx index d6c4d0d..0c07a64 100644 --- a/src/pages/device/feature/detail.tsx +++ b/src/pages/device/feature/detail.tsx @@ -6,10 +6,11 @@ import { Navbar } from '@/components/navbar' import { ListRow, ListRowGroup } from '@/components/list-row' import { VitalWave } from '@/components/vital-wave' import { ROUTES } from '@/constants/routes' -import { navigateTo } from '@/utils/navigation' +import { navigateTo, navigateBack } from '@/utils/navigation' +import { showToast } from '@/utils/toast' import { MOVE_STATE_MAP, BODY_STATUS_MAP, ONBED_STATUS_MAP } from '@/constants/enums' import { - getHomeDeviceDetail, getVitalRecords, type HomeDevice, type VitalSigns + getHomeDeviceDetail, getVitalRecords, unbindHomeDevice, type HomeDevice, type VitalSigns } from '@/api/homeDevice' import type { DeviceModel } from '@/constants/enums' import styles from './detail.module.scss' @@ -29,6 +30,7 @@ export default function Detail() { const [device, setDevice] = useState(null) const [online, setOnline] = useState(params.online === '1') const [wavePoints, setWavePoints] = useState([]) + const [unbinding, setUnbinding] = useState(false) const deviceNameRef = useRef(null) const timerRef = useRef | null>(null) @@ -88,6 +90,37 @@ export default function Detail() { const goBleConfig = () => navigateTo(ROUTES.DEVICE_BLE_CONFIG) void goBleConfig + // 解绑确认:防误触,成功后停轮询返回列表页 + const confirmUnbind = () => { + if (unbinding || !installId) return + Taro.showModal({ + title: '解绑设备', + content: `确定解绑「${deviceName}」吗?解绑后需重新添加。`, + confirmText: '解绑', + confirmColor: '#EE4B4B', + success: (res) => { + if (!res.confirm) return + doUnbind() + } + }) + } + + const doUnbind = async () => { + setUnbinding(true) + try { + await unbindHomeDevice({ installId }) + showToast('已解绑') + if (timerRef.current) { + clearInterval(timerRef.current) + timerRef.current = null + } + navigateBack() + } catch (e) { + showToast(e instanceof Error ? e.message : '解绑失败') + setUnbinding(false) + } + } + return ( @@ -161,6 +194,7 @@ export default function Detail() { */} + diff --git a/src/pages/device/index.module.scss b/src/pages/device/index.module.scss index ad95322..5bd42b0 100644 --- a/src/pages/device/index.module.scss +++ b/src/pages/device/index.module.scss @@ -211,27 +211,6 @@ .statusText { font-size: 24px; color: $color-primary-deep; } .statusTextOff { color: $color-text-secondary; } -// 解绑按钮:卡片底部通栏浅红描边,与详情点击区分 -.unbindBtn { - width: 100%; - margin-top: 20px; - padding: 12px 0; - border: 1px solid $color-danger; - border-radius: $radius-pill; - display: flex; - align-items: center; - justify-content: center; -} - -.unbindBtnPressed { - background: $color-danger-light-bg; -} - -.unbindBtnText { - font-size: 24px; - color: $color-danger; -} - // 切换家庭圈弹层内的列表项 .sheetList { padding-bottom: 16px; diff --git a/src/pages/device/index.tsx b/src/pages/device/index.tsx index 6651f5b..b25f6ac 100644 --- a/src/pages/device/index.tsx +++ b/src/pages/device/index.tsx @@ -6,13 +6,12 @@ import { Navbar } from '@/components/navbar' import { Loading } from '@/components/loading' import { StateView } from '@/components/state-view' import { BottomSheet } from '@/components/bottom-sheet' -import { getHomeDeviceList, unbindHomeDevice, type HomeDevice } from '@/api/homeDevice' +import { getHomeDeviceList, 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' import styles from './index.module.scss' const FALLBACK_ICON = '⌂' @@ -24,7 +23,6 @@ export default function DeviceList() { const [loading, setLoading] = useState(true) const [loadError, setLoadError] = useState(false) const [deviceList, setDeviceList] = useState([]) - const [unbinding, setUnbinding] = useState(false) const [families, setFamilies] = useState([]) const [currentFamily, setCurrentFamily] = useState(null) @@ -113,38 +111,6 @@ export default function DeviceList() { const goAdd = () => navigateTo(ROUTES.DEVICE_ADD) const goRoom = () => navigateTo(ROUTES.SCENE_SELECT) - // 解绑确认:防误触,成功后原地刷新列表 - const confirmUnbind = (device: HomeDevice) => { - if (unbinding) return - Taro.showModal({ - title: '解绑设备', - content: `确定解绑「${deviceLabel(device)}」吗?解绑后需重新添加。`, - confirmText: '解绑', - confirmColor: '#EE4B4B', - success: (res) => { - if (!res.confirm) return - doUnbind(device) - } - }) - } - - const doUnbind = async (device: HomeDevice) => { - if (!device.installId) { - showToast('缺少设备安装 ID,无法解绑') - return - } - setUnbinding(true) - try { - await unbindHomeDevice({ installId: device.installId }) - showToast('已解绑') - await loadDevices() - } catch (e) { - showToast(e instanceof Error ? e.message : '解绑失败') - } finally { - setUnbinding(false) - } - } - const openFamilySheet = () => { setPendingFamily(currentFamily) setFamilySheetOpen(true) @@ -251,9 +217,6 @@ export default function DeviceList() { - confirmUnbind(device)}> - 解绑 - ))}