import { lefuService } from '../../lefu/index' import type { LeFuWifiItem, WifiVersion } from '../../lefu/index' /** WiFi 展示项 */ interface WifiItem { ssid: string /** 是否已通过本页配网成功 */ connected: boolean } /** 当前已连接设备(顶部卡片) */ interface CurrentDevice { id: string name: string } /** 密码态选中的 WiFi */ interface SelectedWifi { ssid: string } /** 页面状态 */ type WifiStatus = 'idle' | 'searching' | 'list' | 'empty' | 'password' | 'configuring' Page({ /** 配网协议版本,两种都支持,默认 domain2(有鉴权) */ _wifiVersion: 'domain2' as WifiVersion, data: { /** * 页面状态 * - idle: 未搜索 * - searching: 正在从设备获取 WiFi 列表 * - list: 列表已就绪 * - empty: 设备未扫描到任何 WiFi * - password: 选中某项,正在输入密码 * - configuring: 正在将 WiFi 写入设备 */ status: 'idle' as WifiStatus, /** 顶部固定卡片(从上一页状态中读取,当前先用占位) */ currentDevice: { id: '', name: '智能体重秤', } as CurrentDevice, /** WiFi 列表 */ wifiList: [] as WifiItem[], /** 是否已有任一 WiFi 配网成功 */ hasConnected: false, /** 当前密码态选中的 WiFi */ selectedWifi: { ssid: '' } as SelectedWifi, /** 密码输入框值 */ selectWifiPWD: '', /** 密码框明文/密文切换:true 为密文(默认) */ type: true, }, onLoad() { // idle 起步,通过统一入口触发搜索 this.onStartSearch() }, onUnload() { // 页面卸载时不调用 stopScan,蓝牙连接由 home 页维持 }, /** 从设备获取 WiFi 列表 */ onStartSearch() { this.setData({ status: 'searching', wifiList: [] }) lefuService.getWifiList() .then((items: LeFuWifiItem[]) => { if (!items.length) { this.setData({ status: 'empty' }) return } const list: WifiItem[] = items.map(item => ({ ssid: item.ssid, connected: false, })) this.setData({ status: 'list', wifiList: list }) }) .catch(() => { this.setData({ status: 'empty' }) }) }, /** 空态刷新 */ onRefresh() { this.onStartSearch() }, /** 点击 WiFi 项 → 进密码态 */ onTapWifi(e: WechatMiniprogram.TouchEvent) { const ssid = e.currentTarget.dataset.ssid as string const target = this.data.wifiList.find(item => item.ssid === ssid) if (!target || target.connected) return this.setData({ status: 'password', selectedWifi: { ssid }, selectWifiPWD: '', type: true, }) }, /** 密码输入 */ passwordInput(e: WechatMiniprogram.Input) { this.setData({ selectWifiPWD: e.detail.value }) }, /** 明文/密文切换 */ inputTypeChange() { this.setData({ type: !this.data.type }) }, /** 密码态「取消」→ 回列表 */ onCancelPwd() { this.setData({ status: 'list', selectedWifi: { ssid: '' }, selectWifiPWD: '', }) }, /** 密码态「连接」→ 将 WiFi 写入设备 */ onConfirmPwd() { const { selectedWifi, selectWifiPWD } = this.data if (!selectedWifi.ssid) return this.setData({ status: 'configuring' }) wx.showLoading({ title: '正在配网...', mask: true }) lefuService.configWifi(selectedWifi.ssid, selectWifiPWD, this._wifiVersion) .then(() => { wx.hideLoading() // 配网成功:标记该 WiFi,回列表态 const next = this.data.wifiList.map(item => ({ ...item, connected: item.ssid === selectedWifi.ssid, })) this.setData({ status: 'list', wifiList: next, hasConnected: true, selectedWifi: { ssid: '' }, selectWifiPWD: '', }) }) .catch((err: Error) => { wx.hideLoading() wx.showToast({ title: err.message || '配网失败,请重试', icon: 'none' }) this.setData({ status: 'password' }) }) }, /** 底部「确认」:已有 WiFi 配网成功才可点击 */ onConfirm() { if (!this.data.hasConnected) return wx.navigateTo({ url: '/pages/supplementPersonal/supplementPersonal' }) }, })