@quec/panel-device-kit 1.0.9 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/DeviceConfig.ts","../src/DeviceKitParamsManager.ts","../src/utils/to.ts","../src/SDK/getDeviceOnlineState.ts","../src/SDK/getPropertyDataListWithParams.ts","../src/utils/stringUtils.ts","../src/SDK/subscriDevice.ts","../src/deviceListStore.ts","../src/API/deviceApi.ts","../src/API/productManual.ts","../src/types/Error.ts","../src/utils/empty.ts","../src/utils/numberUtils.ts","../src/deviceStore.ts","../src/initDeviceOnlineEvent.ts","../src/device-list-utils.ts","../src/initDeviceListUpdate.ts","../src/initDeviceRefreshEvent.ts","../src/API/offlineReminder.ts","../src/API/otaPlan.ts","../src/API/timeZone.ts","../src/API/unbindDevice.ts"],"names":["onlineStatus","QuecRNDeviceModule","initialState","create","selectFromStore","deviceListStore","deviceStore","NativeEventEmitter","NativeModules","useEffect","removeListener","refreshDeviceListListener","panelEventEmitter"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * 设备连接状态---不在连接中\r\n */\r\nexport const NOT_CONNECTING = 0\r\n/**\r\n * 设备类型---绑定\r\n */\r\nexport const DEVICE_TYPE_BIND = 1\r\n/**\r\n * 设备类型---分享\r\n */\r\nexport const DEVICE_TYPE_SHARE = 2\r\n/**\r\n * 设备类型---直连设备\r\n */\r\nexport const DEVICE_ACCESS_TYPE_DIRECTLY = 0\r\n/**\r\n * 设备类型---网关设备\r\n */\r\nexport const DEVICE_ACCESS_TYPE_GATEWAY = 1\r\n/**\r\n * 设备类型---网关子设备\r\n */\r\nexport const DEVICE_ACCESS_TYPE_GATEWAY_CHILD = 2\r\n/**\r\n * 设备名称--长度\r\n */\r\nexport const DEVICE_NAME_MAX_LENGTH = 14\r\n\r\n/** 设备在线状态枚举 */\r\nexport enum onlineStatus {\r\n ALL_OFFLINE = 0, // 全部离线\r\n WS_ONLINE = 1, // 仅 WebSocket 在线\r\n WIFI_ONLINE = 1 << 1, // 仅 Wi-Fi 在线\r\n WS_WIFI_ONLINE = 3, // WebSocket + Wi-Fi 在线\r\n BLE_ONLINE = 1 << 2, // 仅蓝牙在线\r\n WS_BLE_ONLINE = 5, // WebSocket + 蓝牙在线\r\n WIFI_BLE_ONLINE = 6, // Wi-Fi + 蓝牙在线\r\n ALL_ONLINE = 7, // 全部在线\r\n}\r\n\r\n/**\r\n * loading超时时间\r\n */\r\nexport const LOADING_SEND_TIMEOUT = 60000\r\n","// src/utils/DeviceKitParamsManager.ts\r\nimport QuecRNLogModule from '@quec/rn-log-module/src/module'\r\n\r\nconst BASE_TAG = '💫 Quec_Device_Kit '\r\n\r\ntype LoadingCallback = () => void\r\ntype TipCallback = (message: string) => void\r\n\r\ninterface LogModule {\r\n i: (tag: string, message: string) => void\r\n e: (tag: string, message: string) => void\r\n}\r\n\r\nclass DeviceKitParamsManager {\r\n private static useInternalStore = true // 是否使用内部 store,默认 true\r\n\r\n private static loadingCallback: LoadingCallback | null = null\r\n private static loadingDismissCallback: LoadingCallback | null = null\r\n private static tipCallback: TipCallback | null = null\r\n private static logModule: LogModule | null = QuecRNLogModule // 默认使用 QuecRNLogModule\r\n private static autoConnectCurrentDevice: boolean | null\r\n\r\n /** 是否使用内部管理器 */\r\n static setTSLStore() {}\r\n\r\n /** 注册回调 */\r\n public registerCallbacks({\r\n loadingCallback,\r\n loadingDismissCallback,\r\n tipCallback,\r\n }: {\r\n loadingCallback?: LoadingCallback\r\n loadingDismissCallback?: LoadingCallback\r\n tipCallback?: TipCallback\r\n }) {\r\n if (loadingCallback) DeviceKitParamsManager.loadingCallback = loadingCallback\r\n if (loadingDismissCallback)\r\n DeviceKitParamsManager.loadingDismissCallback = loadingDismissCallback\r\n if (tipCallback) DeviceKitParamsManager.tipCallback = tipCallback\r\n }\r\n\r\n /** 触发 Loading */\r\n public loading() {\r\n DeviceKitParamsManager.loadingCallback?.()\r\n }\r\n\r\n /** 关闭 Loading */\r\n public loadingDismiss() {\r\n DeviceKitParamsManager.loadingDismissCallback?.()\r\n }\r\n\r\n /** 触发提示 */\r\n public tip(message: string) {\r\n DeviceKitParamsManager.tipCallback?.(message)\r\n }\r\n\r\n public setAutoConnectCurrentDevice(autoConnectCurrentDevice: boolean) {\r\n DeviceKitParamsManager.autoConnectCurrentDevice = autoConnectCurrentDevice\r\n }\r\n\r\n public getAutoConnectCurrentDevice() {\r\n return DeviceKitParamsManager.autoConnectCurrentDevice === true\r\n }\r\n\r\n /** 设置外部日志模块 */\r\n public static setLogger(logModule: LogModule) {\r\n this.logModule = logModule\r\n }\r\n /** 自动关闭所有 console 输出(仅限生产环境) */\r\n public static autoDisableLog() {\r\n const isProduction = !__DEV__\r\n if (isProduction) {\r\n const noop = () => {}\r\n console.log = noop\r\n console.info = noop\r\n console.warn = noop\r\n console.error = noop\r\n console.debug = noop\r\n console.trace = noop\r\n }\r\n }\r\n\r\n /** 通用日志方法 */\r\n private log(level: 'i' | 'e', tag: string, message: any) {\r\n if (typeof message === 'object') {\r\n message = JSON.stringify(message)\r\n }\r\n\r\n if (DeviceKitParamsManager.logModule) {\r\n DeviceKitParamsManager.logModule[level](BASE_TAG + tag, '' + message)\r\n }\r\n console.log(`${BASE_TAG}${tag} ${level} ==> ${'' + message}`)\r\n }\r\n\r\n /** info日志方法 */\r\n public info(tag: string, message: any) {\r\n this.log('i', tag, message)\r\n }\r\n\r\n /** err日志方法 */\r\n public error(tag: string, message: any) {\r\n this.log('e', tag, message)\r\n }\r\n}\r\n\r\nexport const deviceKitParamsManager = new DeviceKitParamsManager()\r\n","// 捕获错误并返回\r\n/**\r\n * @param { Promise } promise\r\n * @param { Object= } errorExt 额外的错误信息\r\n * @return { Promise }\r\n */\r\nexport async function to<T, U = Error>(\r\n promise: Promise<T>,\r\n errorExt?: object\r\n): Promise<[U, undefined] | [null, T]> {\r\n return promise\r\n .then<[null, T]>((data: T) => [null, data])\r\n .catch<[U, undefined]>((err: U) => {\r\n if (errorExt) {\r\n const parsedError = Object.assign({}, err, errorExt)\r\n return [parsedError, undefined]\r\n }\r\n\r\n return [err, undefined]\r\n })\r\n}\r\n\r\nexport default to\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport to from '../utils/to'\r\n\r\n// 请求设备在线状态\r\nexport const getDeviceOnline = async ({\r\n pk,\r\n dk,\r\n}: {\r\n pk: string\r\n dk: string\r\n}) => {\r\n const [err, res] = await to<{ onlineState: number | string }, any>(\r\n QuecRNDeviceModule.getDeviceOnlineState(pk, dk)\r\n )\r\n if (err) {\r\n deviceKitParamsManager.error(\r\n '❌ ❔ getDeviceOnlineState 获取设备状态失败',\r\n 'error ==> ' + err\r\n )\r\n return false\r\n }\r\n if (res) {\r\n deviceKitParamsManager.info(\r\n ' ✅ ❔ getDeviceOnlineState 获取设备状态成功',\r\n 'res ==> ' + pk + '_' + dk + JSON.stringify(res)\r\n )\r\n if (Number(res.onlineState) !== 0) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n// 请求设备通道状态\r\nexport const getDeviceOnlineState = async ({\r\n pk,\r\n dk,\r\n}: {\r\n pk: string\r\n dk: string\r\n}) => {\r\n const [err, res] = await to<{ onlineState: number | string }, any>(\r\n QuecRNDeviceModule.getDeviceOnlineState(pk, dk)\r\n )\r\n if (err) {\r\n deviceKitParamsManager.error(\r\n '❌ ❔ getDeviceOnlineState 获取设备状态失败',\r\n 'error ==> ' + err\r\n )\r\n return undefined\r\n }\r\n if (res) {\r\n deviceKitParamsManager.info(\r\n ' ✅ ❔ getDeviceOnlineState 获取设备状态成功',\r\n 'res ==> ' + pk + '_' + dk + JSON.stringify(res)\r\n )\r\n if (Number(res.onlineState) !== 0) {\r\n return res.onlineState\r\n }\r\n }\r\n return undefined\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport to from '../utils/to'\r\n\r\ntype ResType = {\r\n data: {\r\n customizeTslInfo:\r\n | null\r\n | {\r\n // createTime?: string\r\n resourceValce?: string\r\n // dataType?: string\r\n // subType?: string\r\n name?: string\r\n // type?: string\r\n resourceCode?: string\r\n abId?: number | string\r\n }[]\r\n deviceData: null\r\n deviceLocateInfo: null\r\n }\r\n}\r\n\r\n/**\r\n * 获取设备属性信息\r\n */\r\nexport const getPropertyDataListWithParams = async (params: {\r\n productKey: string\r\n deviceKey: string\r\n codeList: string[]\r\n}) => {\r\n const { productKey, deviceKey, codeList } = params\r\n deviceKitParamsManager.info(\r\n 'getPropertyDataListWithParams',\r\n '===获取设备属性信息:' + productKey + '_' + deviceKey\r\n )\r\n const [err, res] = await to<ResType, any>(\r\n QuecRNDeviceModule.getDeviceBusinessAttributesWithProductKey({\r\n ...params,\r\n codeList: codeList.join(','),\r\n type: '2',\r\n })\r\n )\r\n if (err) {\r\n deviceKitParamsManager.error('getDeviceList', 'error ==> ' + err)\r\n deviceKitParamsManager.loadingDismiss()\r\n if (err.code && err.code.length > 0) {\r\n deviceKitParamsManager.tip(err.message)\r\n }\r\n return\r\n }\r\n if (\r\n res &&\r\n res.data &&\r\n Array.isArray(res.data?.customizeTslInfo) &&\r\n res.data?.customizeTslInfo?.length > 0\r\n ) {\r\n deviceKitParamsManager.info(\r\n '获取设备属性信息',\r\n productKey + '_' + deviceKey + '===>' + JSON.stringify(res)\r\n )\r\n let propertyValueArr: { [key: string]: any } = {}\r\n codeList.forEach(code => {\r\n const findRes = res.data.customizeTslInfo?.find(\r\n item => item.resourceCode === code\r\n )\r\n propertyValueArr[code] = findRes?.resourceValce\r\n propertyValueArr[code + 'Id'] = findRes?.abId\r\n })\r\n return propertyValueArr\r\n }\r\n}\r\n","import { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nexport const strToObj = (str: string | object): Record<string, any> => {\r\n if (typeof str === 'object' && str !== null) {\r\n return str as Record<string, any>\r\n }\r\n\r\n if (typeof str === 'string' && str.trim() !== '') {\r\n try {\r\n const res = JSON.parse(str)\r\n if (typeof res === 'object' && res !== null) {\r\n return res\r\n }\r\n } catch (error) {\r\n deviceKitParamsManager.error('strToObj', error)\r\n }\r\n }\r\n\r\n return {}\r\n}\r\n\r\nconst getCircularReplacer = () => {\r\n const seen = new WeakSet()\r\n return (_key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (seen.has(value)) {\r\n return '[Circular]'\r\n }\r\n seen.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\nexport const objToStr = (obj: any): string => {\r\n if (obj instanceof Error) {\r\n return obj.stack || obj.message || 'Unknown Error'\r\n }\r\n\r\n if (typeof obj === 'object') {\r\n try {\r\n return JSON.stringify(obj, getCircularReplacer(), 2)\r\n } catch (e) {\r\n return '[Cannot stringify object]'\r\n }\r\n }\r\n\r\n if (typeof obj === 'undefined') {\r\n return 'undefined'\r\n }\r\n\r\n if (obj === null) {\r\n return 'null'\r\n }\r\n\r\n return String(obj)\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 订阅设备\r\n */\r\nexport const subscribeDevice = (pk: string, dk: string) => {\r\n try {\r\n QuecRNDeviceModule.subscribeDevice(pk, dk)\r\n deviceKitParamsManager.info(\r\n '✅ 🤝 subscribeDevice 成功订阅设备',\r\n 'pk_dk===>' + pk + '_' + dk\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ 🤝 subscribeDevice 订阅设备失败',\r\n 'pk_dk===>' + pk + '_' + dk + ' ===> 失败原因:' + objToStr(error)\r\n )\r\n }\r\n}\r\n/**\r\n * 取消订阅\r\n */\r\nexport const unSubscribeDevice = (pk: string, dk: string) => {\r\n try {\r\n QuecRNDeviceModule.unSubscribeDevice(pk, dk)\r\n deviceKitParamsManager.info(\r\n '✅ 🤚 ✋ unSubscribeDevice 取消订阅设备成功',\r\n '===取消设备订阅:' + pk + '_' + dk\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.info(\r\n '❌ 🤚 ✋ unSubscribeDevice 取消订阅设备失败',\r\n '===取消设备订阅:' +\r\n pk +\r\n '_' +\r\n dk +\r\n ' ===> 失败原因:' +\r\n objToStr(error)\r\n )\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport camelCase from 'lodash.camelcase'\r\nimport { create, StoreApi, UseBoundStore } from 'zustand'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceOnline } from './SDK/getDeviceOnlineState'\r\nimport { getPropertyDataListWithParams } from './SDK/getPropertyDataListWithParams'\r\nimport { subscribeDevice } from './SDK/subscriDevice'\r\nimport { DeviceModel } from './types/deviceModel'\r\nimport { objToStr } from './utils/stringUtils'\r\nimport to from './utils/to'\r\nimport { DPS } from './types/dps.type'\r\n// TODO deviceListStore\r\n\r\n/** 默认页数 */\r\nlet DEFAULT_PAGE_NUM = 1\r\n/** 默认页大小 */\r\nlet DEFAULT_PAGE_SIZE = 15\r\n\r\ntype SubscribeDevicesType = {\r\n pk: string\r\n dk: string\r\n}\r\ninterface States {\r\n networkError: boolean\r\n listIsEmpty: boolean\r\n deviceList: DeviceModel[] | []\r\n total: number | null\r\n deviceListPlus: DeviceListPlusDeviceType[] | []\r\n /** 已订阅设备列表 */\r\n subscribeDevicesList: SubscribeDevicesType[] | []\r\n /** 页数 */\r\n pageNum: number\r\n /** 页大小 */\r\n pageSize: number\r\n /** 是否可以继续加载 */\r\n canLoadMore: boolean\r\n}\r\ntype getDeviceListResType = {\r\n data: {\r\n total: number\r\n pageSize: number\r\n pageNum: number\r\n isFirstPage: boolean\r\n list: DeviceModel[]\r\n }\r\n}\r\n\r\ninterface Actions {\r\n getDeviceList: (\r\n pageNum: number,\r\n paseSize: number,\r\n successCallback?: (deviceList: DeviceModel[], canLoadMore: boolean) => any,\r\n failCallback?: (err: any) => any\r\n ) => void\r\n refreshDeviceList: (\r\n successCallback?: (deviceList: DeviceModel[]) => any,\r\n failCallback?: (err: any) => any\r\n ) => void\r\n loadMoreDeviceList: (\r\n successCallback?: (deviceList: DeviceModel[]) => any,\r\n failCallback?: (err: any) => any\r\n ) => void\r\n updateDeviceList: (deviceList: DeviceModel[]) => void\r\n updateDeviceListPlus: (deviceArr: DeviceModel[]) => void\r\n addSubscribeDeviceList: (pk: string, dk: string) => void\r\n updateDeviceOnlineState: (event: {\r\n device: {\r\n deviceKey: string\r\n productKey: string\r\n }\r\n onlineState: number | string\r\n }) => void\r\n updateDeviceDPSData: (event: {\r\n dps: Array<DPS>\r\n [key: string]: any\r\n deviceKey?: string\r\n productKey?: string\r\n dk?: string\r\n pk?: string\r\n }) => void\r\n}\r\nconst initialState: States = {\r\n deviceList: [],\r\n total: null,\r\n networkError: false,\r\n listIsEmpty: false,\r\n deviceListPlus: [], //提供给自己想要简化device的数据的开发\r\n subscribeDevicesList: [],\r\n pageNum: DEFAULT_PAGE_NUM,\r\n pageSize: DEFAULT_PAGE_SIZE,\r\n canLoadMore: false,\r\n}\r\n\r\nexport type DeviceListStoreType = StoreApi<States & Actions>\r\nlet deviceListStore: UseBoundStore<StoreApi<States & Actions>> | null = null\r\n\r\ninterface DeviceListPlusDeviceType {\r\n deviceKey: string\r\n productKey: string\r\n isOnline: boolean\r\n onlineState: number\r\n subscribeModel: {\r\n [key: string]: any\r\n }\r\n}\r\ntype DeviceListStoreCreateParamsType = {\r\n pageSize: number\r\n // isGetAllDevicesOnce: boolean //是否一次性请求所有的设备\r\n isSubScribeAllDevice: boolean //是否要订阅所有已请求到列表的设备\r\n processDeviceList?: <T extends DeviceListPlusDeviceType>(deviceList: DeviceModel) => T\r\n subscribeCodeList?: string[] //订阅所有设备物模型code列表\r\n}\r\n\r\n/**\r\n * 初始化创建设备列表Store\r\n *\r\n * @param {DeviceListStoreCreateParamsType|undefined} [params] - 配置对象(非必选)\r\n * @param {number} [params.pageSize] - 每页设备数量(10)\r\n * @param {boolean} [params.isSubScribeAllDevice] - 是否订阅所有设备(false)\r\n * @param {Function} [params.processDeviceList] - 处理设备列表的回调函数 (根据自己的使用习惯将设备列表数据处理成自己想要的格式)\r\n * @param {string[]} [params.subscribeCodeList] - 订阅所有设备物模型code列表\r\n *\r\n * @example\r\n * ```ts\r\n * // APP.ts\r\n * import { createDeviceListStore } from './deviceListStore'\r\n * createDeviceListStore()\r\n * ```\r\n */\r\nexport const createDeviceListStore = (params?: DeviceListStoreCreateParamsType) => {\r\n const {\r\n pageSize = DEFAULT_PAGE_SIZE,\r\n processDeviceList,\r\n isSubScribeAllDevice = false,\r\n subscribeCodeList,\r\n } = params || {}\r\n // pageSize如果不是正整数且大于1,则报错\r\n if (pageSize <= 1 || !Number.isInteger(pageSize)) {\r\n throw new Error('❌ pageSize要求是正整数且大于等于1')\r\n } else {\r\n DEFAULT_PAGE_SIZE = pageSize\r\n }\r\n if (!deviceListStore) {\r\n deviceListStore = create<States & Actions>((set, get) => ({\r\n ...initialState,\r\n // 刷新设备列表\r\n refreshDeviceList(successCallback, failCallback) {\r\n let deviceList: DeviceModel[] = []\r\n set({\r\n deviceList,\r\n pageNum: 1,\r\n canLoadMore: false,\r\n })\r\n get().getDeviceList(\r\n 1,\r\n get().pageSize,\r\n (list, canLoadMore) => {\r\n // ✅ 成功后自己控制页码\r\n\r\n successCallback && successCallback(list)\r\n },\r\n failCallback\r\n )\r\n },\r\n // 加载更多设备列表\r\n loadMoreDeviceList(successCallback, failCallback) {\r\n if (get().canLoadMore) {\r\n get().getDeviceList(\r\n get().pageNum,\r\n get().pageSize,\r\n (list, canLoadMore) => {\r\n // ✅ 成功后自己控制页码\r\n\r\n successCallback && successCallback(list)\r\n },\r\n failCallback\r\n )\r\n } else {\r\n // deviceKitParamsManager.tip(i18n('no_more_devices'))\r\n }\r\n },\r\n // 请求设备列表\r\n async getDeviceList(pageNum, paseSize, successCallback, failCallback) {\r\n deviceKitParamsManager.loading()\r\n const [err, res] = await to<getDeviceListResType, any>(\r\n QuecRNDeviceModule.getDeviceListWithPageNumber(pageNum, paseSize)\r\n )\r\n // 请求失败\r\n if (err) {\r\n deviceKitParamsManager.error('❌ getDeviceList', '获取设备列表error ==> ' + err)\r\n deviceKitParamsManager.loadingDismiss()\r\n if (err.code && err.code.length > 0) {\r\n deviceKitParamsManager.tip(err.message)\r\n }\r\n set({\r\n networkError: true,\r\n })\r\n failCallback && failCallback(err)\r\n return\r\n }\r\n\r\n let returnSuccessDeviceList: DeviceModel[] = []\r\n // 注意提示无设备\r\n if (res && res.data && res.data.list && Array.isArray(res.data?.list)) {\r\n deviceKitParamsManager.info('getDeviceList', 'res ==> ' + objToStr(res))\r\n\r\n const { data } = res\r\n const { list } = data\r\n // 记录总数\r\n set({ total: data.total })\r\n // 下拉刷新\r\n if (pageNum === 1) {\r\n // 第一页\r\n await get().updateDeviceList(list)\r\n returnSuccessDeviceList = list\r\n successCallback && successCallback(returnSuccessDeviceList, data.total > list.length)\r\n if (deviceKitParamsManager.getAutoConnectCurrentDevice() && list.length > 0) {\r\n deviceKitParamsManager.info('getDeviceList', 'auto connect device')\r\n QuecRNDeviceModule.connectChannel(0)\r\n }\r\n set({\r\n canLoadMore: data.total > list.length,\r\n pageNum: data.total > list.length ? pageNum + 1 : 1,\r\n })\r\n } else {\r\n // 加载更多页\r\n const nextListRes = list\r\n const preDevicesList = [...get().deviceList, ...nextListRes]\r\n await get().updateDeviceList(preDevicesList)\r\n returnSuccessDeviceList = list\r\n successCallback &&\r\n successCallback(returnSuccessDeviceList, data.total > preDevicesList.length)\r\n set({\r\n canLoadMore: data.total > preDevicesList.length,\r\n pageNum: data.total > preDevicesList.length ? pageNum + 1 : pageNum,\r\n })\r\n }\r\n } else {\r\n deviceKitParamsManager.error('getDeviceList', 'no res ==> ' + objToStr(res))\r\n failCallback && failCallback(null)\r\n }\r\n deviceKitParamsManager.loadingDismiss()\r\n },\r\n // 更新设备列表\r\n async updateDeviceList(deviceList) {\r\n // deviceList为[] 则是空设备列表\r\n set({\r\n listIsEmpty: Array.isArray(deviceList) && deviceList.length === 0,\r\n deviceList: deviceList,\r\n networkError: deviceList === undefined,\r\n })\r\n if (!!processDeviceList && processDeviceList instanceof Function) {\r\n await get().updateDeviceListPlus(deviceList)\r\n }\r\n },\r\n // 处理更新的设备列表数据使其符合自己使用的习惯\r\n async updateDeviceListPlus(devicesArr) {\r\n const deviceListPlus = devicesArr\r\n .filter(\r\n item =>\r\n item.deviceKey !== undefined &&\r\n item.productKey !== undefined &&\r\n item.deviceKey !== null &&\r\n item.productKey !== null\r\n )\r\n .map(item => (processDeviceList as Function)(item))\r\n\r\n if (!isSubScribeAllDevice) {\r\n // 不需要订阅设备,直接返回\r\n set({\r\n deviceListPlus,\r\n })\r\n return\r\n }\r\n // 循环\r\n // 订阅新增设备,\r\n // 逐个请求列表设备通道状态,\r\n // 并请求设备最近的一次属性数据\r\n for (let i = 0; i < deviceListPlus.length; i++) {\r\n const item = deviceListPlus[i]\r\n // 订阅设备\r\n get().addSubscribeDeviceList(item.productKey, item.deviceKey)\r\n // 请求设备通道状态\r\n const isOnline = await getDeviceOnline({\r\n pk: item.productKey,\r\n dk: item.deviceKey,\r\n })\r\n item.isOnline = isOnline\r\n\r\n // 不需要查设备列表的物模型数据直接返回\r\n if (!(subscribeCodeList && subscribeCodeList?.length > 0)) {\r\n return\r\n }\r\n\r\n // 获取设备订阅的物模型属性\r\n const propertyData = await getPropertyDataListWithParams({\r\n productKey: item.productKey,\r\n deviceKey: item.deviceKey,\r\n codeList: subscribeCodeList,\r\n })\r\n for (let index = 0; index < subscribeCodeList.length; index++) {\r\n const subscribeModelCode = subscribeCodeList[index]\r\n\r\n if (propertyData && propertyData[subscribeModelCode]) {\r\n deviceListPlus[i].subscribeModel[camelCase(subscribeModelCode)] = Number(\r\n propertyData[subscribeModelCode]\r\n )\r\n deviceListPlus[i].subscribeModel[camelCase(subscribeModelCode) + 'Id'] = Number(\r\n propertyData[subscribeModelCode + 'Id']\r\n )\r\n }\r\n }\r\n }\r\n set({\r\n deviceListPlus,\r\n })\r\n },\r\n /**\r\n * 更新列表中单个设备的在离线状态\r\n * @param event\r\n */\r\n updateDeviceOnlineState(event) {\r\n const deviceListPlus = [...get().deviceListPlus]\r\n const eventDevice =\r\n typeof event?.device === 'object' ? event?.device : JSON.parse(event?.device ?? '{}')\r\n deviceListPlus.forEach(item => {\r\n if (\r\n item.deviceKey === eventDevice?.deviceKey &&\r\n item.productKey === eventDevice?.productKey &&\r\n event?.onlineState !== undefined &&\r\n !Number.isNaN(Number(event.onlineState))\r\n ) {\r\n item.isOnline = Number(event.onlineState) !== 0\r\n item.onlineState = Number(event.onlineState)\r\n }\r\n })\r\n set({\r\n deviceListPlus,\r\n })\r\n },\r\n /**\r\n * 更新列表中单个设备的物模型\r\n * @param deviceListPlus\r\n */\r\n updateDeviceDPSData(event) {\r\n if (!isSubScribeAllDevice || !subscribeCodeList || subscribeCodeList?.length <= 0) {\r\n return\r\n }\r\n const { dps, dk, pk } = event\r\n if (\r\n dps === undefined ||\r\n dps === null ||\r\n dk === undefined ||\r\n dk === null ||\r\n pk === undefined ||\r\n pk === null\r\n ) {\r\n return\r\n } else {\r\n const deviceListPlus = [...get().deviceListPlus]\r\n deviceListPlus.forEach(device => {\r\n // 判断对应设备\r\n if (device.deviceKey === event.dk && device.productKey === event.pk) {\r\n dps.map((item: any) => {\r\n // subscribeModel :{ codeCode1: any , codeCode1Id: number ,codeCode2: any , codeCode2Id: number }\r\n Object.entries(device.subscribeModel).forEach(([key, value]) => {\r\n if (key.endsWith('Id')) {\r\n const modelId = value\r\n if (modelId === item.id) {\r\n // TODO 给不同的物模型赋值处理\r\n device.subscribeModel[key] = item.value\r\n }\r\n }\r\n })\r\n })\r\n }\r\n })\r\n\r\n set({\r\n deviceListPlus,\r\n })\r\n }\r\n },\r\n\r\n /**\r\n * 增加已订阅设备列表并订阅设备\r\n * @param deviceList\r\n */\r\n addSubscribeDeviceList(pk: string, dk: string) {\r\n const subscribeDevicesListCopy = [...get().subscribeDevicesList]\r\n if (\r\n subscribeDevicesListCopy.find(item => {\r\n item.dk === dk && item.pk === pk\r\n }) === undefined\r\n ) {\r\n subscribeDevicesListCopy.push({ pk, dk })\r\n subscribeDevice(pk, dk)\r\n }\r\n set({\r\n subscribeDevicesList: subscribeDevicesListCopy,\r\n })\r\n },\r\n }))\r\n }\r\n return deviceListStore\r\n}\r\n\r\nexport const getDeviceListStore = () => {\r\n if (!deviceListStore) {\r\n throw new Error('❗请先调用 createDeviceListStore() 初始化 Store')\r\n }\r\n return deviceListStore\r\n}\r\nexport const getDeviceListStoreWithoutError = () => {\r\n if (!deviceListStore) {\r\n return null\r\n }\r\n return deviceListStore\r\n}\r\nconst selectFromStore = <T>(selector: (state: States & Actions) => T): T => {\r\n const store = getDeviceListStore()\r\n return store(selector)\r\n}\r\n\r\n/**\r\n * 获取设备列表状态管理器内容\r\n *\r\n * @example\r\n * ```ts\r\n * const deviceListState = useDeviceListStoreState()\r\n * ```\r\n *\r\n * @returns {State} state - 设备列表状态集合\r\n *\r\n * @returns {DeviceModel[]} state.deviceList - 设备列表\r\n * @returns {DeviceListPlusDeviceType[]} state.deviceListPlus - 设备列表扩展信息\r\n * @returns {SubscribeDevicesType[]} state.subscribeDevicesList - 已订阅设备列表\r\n * @returns {number} state.pageNum - 当前页数(默认为 `1`)\r\n * @returns {number} state.pageSize - 每页设备数量(默认为 `10`)\r\n * @returns {boolean} state.canLoadMore - 是否可以继续加载更多设备\r\n *\r\n */\r\nexport const useDeviceListStoreState = () => {\r\n return selectFromStore(state => state)\r\n}\r\n\r\n/**\r\n * 获取设备列表\r\n *\r\n * @example\r\n * ```ts\r\n * const deviceList = useDeviceListStoreState()\r\n * console.log(deviceList) // 设备列表\r\n * ```\r\n *\r\n * @returns 设备列表\r\n */\r\nexport const useDeviceList = () => {\r\n return selectFromStore(state => state.deviceList)\r\n}\r\n\r\n/**\r\n * FN 加载下一页设备列表s\r\n *\r\n * @example\r\n * ```ts\r\n * const loadMoreDeviceList = useDeviceListLoadMore();\r\n * loadMoreDeviceList()\r\n * ```\r\n *\r\n */\r\nexport const useDeviceListLoadMore = () => {\r\n return selectFromStore(state => state.loadMoreDeviceList) // 返回加载更多设备列表的函数\r\n}\r\n\r\n/**\r\n * FN 刷新设备列表\r\n *\r\n *@example\r\n * ```ts\r\n * const freshDeviceList = useDeviceListRefresh();\r\n * freshDeviceList()\r\n * ```\r\n *\r\n */\r\nexport const useDeviceListRefresh = () => {\r\n return selectFromStore(state => state.refreshDeviceList) // 返回刷新设备列表的函数\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取设备的在线状态\r\n *\r\n * @param deviceKey 设备的 DeviceKey(暂未使用,可扩展)\r\n * @param productKey 产品的 ProductKey(暂未使用,可扩展)\r\n * @returns Promise<number | null> 返回设备的在线状态,失败返回 null\r\n *\r\n * - onlineState 通常的含义:\r\n * 回调 callback {\"onlineState\": 0/1/2/3/4/5/6/7}\r\n * onlineStateMaskWS = 1 << 0,\r\n * onlineStateMaskWifi = 1 << 1,\r\n * onlineStateMaskBle = 1 << 2,\r\n * 0: all offline,\r\n * 1: websocket online,\r\n * 2 : wifi online,\r\n * 3: wifi + websocket online,\r\n * 4: ble online,\r\n * 5: websocket + ble online,\r\n * 6: ble + wifi online ,\r\n * 7: wifi + ble + ws online\r\n */\r\nexport const getDeviceOnlineState = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n const { onlineState } = await QuecRNDeviceModule.getDeviceOnlineState(productKey, deviceKey)\r\n deviceKitParamsManager.info(\r\n '🔎QuecRNDeviceModule.getDeviceOnlineState....',\r\n '获取设备状态 ===> onlineState:' + onlineState\r\n )\r\n return onlineState\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌QuecRNDeviceModule.getDeviceOnlineState(获取设备状态失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * 获取设备通道连接中状态\r\n *\r\n * @returns Promise<number | null>\r\n *\r\n * connectingState 说明:\r\n * false : 非连接中\r\n * true : 连接中\r\n *\r\n * @since 1.8.0\r\n * @platform all\r\n */\r\nexport const getDeviceConnectingState = async (): Promise<number | null> => {\r\n try {\r\n const result = await QuecRNDeviceModule.getDeviceConnectingState()\r\n deviceKitParamsManager.info(\r\n '📶 QuecRNDeviceModule.getDeviceConnectingState',\r\n `当前连接状态:${result?.connectingState}`\r\n )\r\n return result?.connectingState\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getDeviceConnectingState(获取连接状态失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw null\r\n }\r\n}\r\n\r\n/**\r\n * 断开设备连接通道\r\n *\r\n * @param type 通道类型,0: 关闭所有通道 2:wifi 3:ble\r\n *\r\n * @since 1.4.0\r\n * @platform all\r\n */\r\nexport const disconnectChannel = (type: 0 | 2 | 3) => {\r\n try {\r\n QuecRNDeviceModule.disconnectChannel(type)\r\n deviceKitParamsManager.info(\r\n '🔂 QuecRNDeviceModule.disconnectChannel',\r\n `断开设备连接通道成功,通道类型:${type}`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.disconnectChannel(断开设备连接通道失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * 建立设备连接通道\r\n *\r\n * @param mode 建立通道模式:\r\n * 0 auto,\r\n * 1: websocket\r\n * 2:wifi\r\n * 3:ble\r\n * 注意:1,建立的通通与已连接通道不同时,已连接通道会断开。2,当设备不具备相应通道,建立其不具备的通道会失败。不会再自动建立其他通道\r\n *\r\n * @since 1.4.0\r\n * @platform all\r\n */\r\nexport const connectChannel = (mode: 0 | 2 | 3) => {\r\n try {\r\n QuecRNDeviceModule.connectChannel(mode)\r\n deviceKitParamsManager.info(\r\n '🔂 QuecRNDeviceModule.connectChannel',\r\n `建立设备连接通道成功,通道类型:${mode}`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.connectChannel(建立设备连接通道失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取产品说明书地址\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @returns url: string|null\r\n *\r\n * @since 2.10.0\r\n * @platform all\r\n */\r\nexport const getProductDescription = async (productKey: string): Promise<string | null> => {\r\n try {\r\n const { data } = await QuecRNDeviceModule.getProductDescription(productKey)\r\n deviceKitParamsManager.info(\r\n '📘 QuecRNDeviceModule.getProductDescription',\r\n `说明书地址:${objToStr(data)}`\r\n )\r\n if (data?.url === undefined || data?.url === '') {\r\n return null\r\n }\r\n return data.url\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getProductDescription(获取说明书失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n return null\r\n }\r\n}\r\n","type ErrorCode = string\r\n\r\nfunction createCustomError<TCode extends ErrorCode>(name: string, defaultCode: TCode) {\r\n return class CustomError extends Error {\r\n code: TCode\r\n\r\n constructor(code: TCode, message: string) {\r\n super(message)\r\n this.name = name\r\n this.code = code\r\n // 修复继承Error后,instanceof失效问题(尤其在ES5环境)\r\n Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n }\r\n}\r\n\r\nexport const GetDeviceInfoError = createCustomError<'invalid_param' | 'no_device' | 'un_know'>(\r\n '📺 GetDeviceInfoError',\r\n 'un_know'\r\n)\r\n","const EmptyARR = [null, undefined, '']\r\n\r\nexport const isEmpty = (value: any): value is null | undefined | '' => {\r\n // 检查 EmptyARR 中的所有情况\r\n return EmptyARR.some(empty => {\r\n // 处理空对象情况\r\n if (typeof empty === 'object' && empty !== null) {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n !Array.isArray(value) &&\r\n Object.keys(value).length === 0\r\n )\r\n }\r\n // 处理其他基础类型空值情况\r\n return value === empty\r\n })\r\n}\r\n","/**\r\n * 处理数字,如果参数是 NaN, 自定义返回\r\n */\r\nexport const handlerNumberVal = <T = any>(val: any, final?: T): T => {\r\n let nextNumber: any = Number(val)\r\n nextNumber = Number.isNaN(nextNumber) ? final : nextNumber\r\n return nextNumber\r\n}\r\n\r\n/**\r\n * 一定是数字\r\n */\r\nexport const trueNumber = (val: any, final: number = 0): number => {\r\n return handlerNumberVal(val, final)\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { create, StoreApi, UseBoundStore } from 'zustand'\r\nimport { getDeviceConnectingState } from './API/deviceApi'\r\nimport { getProductDescription } from './API/productManual'\r\nimport { onlineStatus } from './config/DeviceConfig'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { DeviceModel } from './types/deviceModel'\r\nimport { GetDeviceInfoError } from './types/Error'\r\nimport { FamilyModel } from './types/familyModel'\r\nimport { PropsModel } from './types/propsModel'\r\nimport { isEmpty } from './utils/empty'\r\nimport { trueNumber } from './utils/numberUtils'\r\nimport { objToStr, strToObj } from './utils/stringUtils'\r\nimport to from './utils/to'\r\n\r\ninterface States {\r\n device: DeviceModel | null\r\n props: PropsModel | null\r\n isOnlyBle: boolean //是否为纯蓝牙设备\r\n productUrl: string | null\r\n area: string | null\r\n family: FamilyModel | null\r\n endUserId?: string //终端用户id\r\n userAccount?: string //当前用户的账号(优先邮箱 没有就手机号, 都没有就null)\r\n\r\n // 设备状态\r\n deviceSate: number\r\n connectingState: number\r\n deviceIsEmpty: boolean\r\n online: boolean\r\n // 频道(通信路线)状态\r\n wsOnline: boolean\r\n lanOnline: boolean //局域网\r\n bleOnline: boolean\r\n}\r\ninterface Actions {\r\n useSetProps: (propsSource: unknown) => PropsModel | null //处理初始传入参数\r\n updateDevice: (device: unknown) => void //处理设备信息\r\n updateDeviceName: (newName: string) => void //更新设备名称\r\n getDeviceState: () => Promise<number | null> //请求当前设备状态\r\n getDeviceConnectingState: () => Promise<void> //请求当前设备状态\r\n getProductManual: (productKey?: string) => Promise<void> //产品名说明书\r\n updateOnlineStatus: (deviceSate: number) => void //更新设备在线状态\r\n updateConnectingState: (connectingState: number) => void //更新设备在线状态\r\n checkCurrentDeviceExist: () => Promise<undefined | boolean> //检查当前设备是否存在\r\n //获取设备信息,不传参的话就是获取当前设备信息\r\n getDeviceInfo: (deviceKey?: string, productKey?: string) => Promise<DeviceModel>\r\n //获取分享设备信息,不传参的话就是获取当前分享设备信息\r\n getShareDeviceInfo: (shareCode?: string) => Promise<DeviceModel>\r\n}\r\nconst initialState: States = {\r\n device: null,\r\n props: null,\r\n isOnlyBle: false,\r\n productUrl: null,\r\n family: null,\r\n area: null,\r\n\r\n deviceIsEmpty: false,\r\n deviceSate: 1,\r\n connectingState: 0,\r\n\r\n online: true,\r\n wsOnline: true,\r\n lanOnline: false,\r\n bleOnline: false,\r\n}\r\n\r\nexport type DeviceStore = StoreApi<States & Actions>\r\nlet deviceStore: UseBoundStore<StoreApi<States & Actions>> | null = null\r\n\r\n/**\r\n * 初始化 deviceStore 设备状态管理器\r\n *\r\n * @description 不初始化管理器,使用相关hook会报错\r\n *\r\n * @example\r\n * ```ts\r\n * // APP.ts\r\n * createDeviceStore({\r\n * offlineTip: () => console.log('设备离线提示'),\r\n * onlineTip: () => console.log('设备在线提示'),\r\n * })\r\n * ```\r\n */\r\nexport const createDeviceStore = ({\r\n offlineTip,\r\n onlineTip,\r\n}: {\r\n offlineTip?: Function\r\n onlineTip?: Function\r\n}) => {\r\n if (!deviceStore) {\r\n deviceStore = create<States & Actions>((set, get) => ({\r\n ...initialState,\r\n useSetProps: propsSource => {\r\n if (isEmpty(propsSource)) {\r\n deviceKitParamsManager.error(\r\n '❌处理props失败',\r\n '当前props没有初始化,app传入的信息为空 props ==>' + objToStr(propsSource)\r\n )\r\n return null\r\n } else {\r\n deviceKitParamsManager.info(' 🚀处理props ▶ ', propsSource)\r\n }\r\n let props: PropsModel | null =\r\n typeof propsSource === 'string' || typeof propsSource === 'object'\r\n ? strToObj(propsSource)\r\n : null\r\n set({\r\n props: props as PropsModel,\r\n })\r\n if (props?.area) {\r\n set({\r\n area: props.area,\r\n })\r\n }\r\n if (props?.endUserId) {\r\n set({\r\n endUserId: props.endUserId,\r\n })\r\n }\r\n if (props?.userAccount) {\r\n set({\r\n userAccount: props.userAccount,\r\n })\r\n }\r\n if (props?.familyModeEnabled && props?.familyRole) {\r\n set({\r\n family: {\r\n familyModeEnabled: props?.familyModeEnabled,\r\n familyRole: props?.familyRole,\r\n },\r\n })\r\n }\r\n //接受原生传递的设备属性\r\n let deviceSource = props?.device\r\n let device = deviceSource === undefined ? null : (strToObj(deviceSource) as DeviceModel)\r\n if (isEmpty(device)) {\r\n deviceKitParamsManager.error(\r\n '❌处理device失败',\r\n '当前device没有初始化,设备信息为空 device ==>' + objToStr(device)\r\n )\r\n set({ deviceIsEmpty: true })\r\n return props\r\n } else {\r\n set({ deviceIsEmpty: false })\r\n deviceKitParamsManager.info(' 🚀处理device ▶ ', device)\r\n get().getProductManual(device.productKey)\r\n }\r\n set({\r\n device,\r\n isOnlyBle:\r\n ((device?.capabilitiesBitmask && 4) === 4 && device?.verified === '0') ||\r\n device?.capabilitiesBitmask === 4,\r\n })\r\n return props\r\n },\r\n updateDevice: device => {\r\n if (isEmpty(device)) {\r\n deviceKitParamsManager.error(\r\n '❌处理device失败',\r\n 'device为空 newDevice ==>' + objToStr(device)\r\n )\r\n set({ deviceIsEmpty: true })\r\n return\r\n }\r\n set({ deviceIsEmpty: false })\r\n const newDevice =\r\n typeof device === 'string' ? (strToObj(device) as DeviceModel) : (device as DeviceModel)\r\n deviceKitParamsManager.info('✅ 新的device ▶ ', newDevice)\r\n set({\r\n device: newDevice,\r\n })\r\n get().getProductManual(newDevice.productKey)\r\n get().getDeviceState()\r\n },\r\n updateDeviceName: newName => {\r\n if (isEmpty(newName) || isEmpty(get().device)) {\r\n deviceKitParamsManager.error(\r\n '❌处理deviceName失败',\r\n 'newName或者device为空 newName ==>' + objToStr(newName)\r\n )\r\n return\r\n }\r\n deviceKitParamsManager.info('✅ 新的deviceName ▶ ', newName)\r\n const deviceNew = get().device\r\n if (deviceNew) {\r\n deviceNew.deviceName = newName\r\n set({\r\n device: deviceNew as DeviceModel,\r\n })\r\n }\r\n },\r\n getDeviceState: async () => {\r\n try {\r\n const { onlineState } = await QuecRNDeviceModule.getOnlineState()\r\n deviceKitParamsManager.info(\r\n '🔎QuecRNDeviceModule.getOnlineState....',\r\n '获取设备状态 ===> onlineState:' + onlineState\r\n )\r\n get().updateOnlineStatus(onlineState)\r\n return onlineState\r\n } catch (error) {\r\n deviceKitParamsManager.error('❌获取设备状态失败', '失败原因===> ' + objToStr(error))\r\n return null\r\n }\r\n },\r\n updateOnlineStatus: deviceSate => {\r\n deviceSate = Number(deviceSate)\r\n let nextOnlineState = trueNumber(deviceSate, onlineStatus.ALL_OFFLINE)\r\n if (nextOnlineState === get().deviceSate) {\r\n return\r\n }\r\n const online = nextOnlineState !== onlineStatus.ALL_OFFLINE\r\n if (!online) {\r\n offlineTip && offlineTip()\r\n } else {\r\n onlineTip && onlineTip()\r\n }\r\n set({\r\n deviceSate,\r\n online: online,\r\n wsOnline: (deviceSate & onlineStatus.WS_ONLINE) === onlineStatus.WS_ONLINE,\r\n lanOnline: (deviceSate & onlineStatus.WIFI_ONLINE) === onlineStatus.WIFI_ONLINE,\r\n bleOnline: (deviceSate & onlineStatus.BLE_ONLINE) === onlineStatus.BLE_ONLINE,\r\n })\r\n },\r\n getDeviceConnectingState: async () => {\r\n const connectingState = await getDeviceConnectingState()\r\n set({\r\n connectingState: connectingState ?? 0,\r\n })\r\n },\r\n updateConnectingState: connectingState => {\r\n set({\r\n connectingState,\r\n })\r\n },\r\n getProductManual: async productKey => {\r\n const finalProductKey = productKey ?? get().device?.productKey\r\n if (finalProductKey === undefined) {\r\n deviceKitParamsManager.error(\r\n '📖getProductManual',\r\n `❌ getProductDescription error====(获取说明书错误)==> there is not productKey(value:${productKey}) for getProductManual params`\r\n )\r\n return\r\n }\r\n const url = await getProductDescription(finalProductKey)\r\n set({ productUrl: url })\r\n },\r\n checkCurrentDeviceExist: async (): Promise<boolean | undefined> => {\r\n const currentDevice = get().device\r\n\r\n deviceKitParamsManager.info(\r\n '📺 checkCurrentDeviceExist device.name ▶',\r\n currentDevice?.deviceName\r\n )\r\n\r\n if (!currentDevice) {\r\n deviceKitParamsManager.error('📺 当前没有选中的设备', currentDevice)\r\n return undefined\r\n }\r\n\r\n try {\r\n const res =\r\n currentDevice?.isShared === true\r\n ? await get().getShareDeviceInfo()\r\n : await get().getDeviceInfo()\r\n\r\n const exist = !!res\r\n deviceKitParamsManager.info('📺 当前设备是否存在 ▶', exist)\r\n return exist\r\n } catch (e: any) {\r\n if (e instanceof GetDeviceInfoError) {\r\n switch (e.code) {\r\n case 'request_failed':\r\n case 'no_device':\r\n deviceKitParamsManager.info('📺 设备不存在或请求失败,判定为不存在', e.message)\r\n return false\r\n case 'invalid_param':\r\n deviceKitParamsManager.error('📺 参数无效,无法判断设备是否存在', e.message)\r\n return undefined\r\n default:\r\n deviceKitParamsManager.error('📺 未知错误码', e)\r\n return undefined\r\n }\r\n } else {\r\n deviceKitParamsManager.error('📺 非预期错误', e)\r\n return undefined\r\n }\r\n }\r\n },\r\n getDeviceInfo: async (deviceKey?: string, productKey?: string): Promise<DeviceModel> => {\r\n const finalDeviceKey = deviceKey || get().device?.deviceKey\r\n const finalProductKey = productKey || get().device?.productKey\r\n\r\n deviceKitParamsManager.info(\r\n '📺 getDeviceInfoByDeviceKey params ▶',\r\n `${finalDeviceKey}_${finalProductKey}`\r\n )\r\n\r\n if (!finalDeviceKey || !finalProductKey) {\r\n throw new GetDeviceInfoError('invalid_param', 'deviceKey 或 productKey 不完整')\r\n }\r\n\r\n const [err, res] = await to<DeviceModel>(\r\n QuecRNDeviceModule.getDeviceInfoByDeviceKey(finalDeviceKey, finalProductKey)\r\n )\r\n\r\n if (err) {\r\n throw new GetDeviceInfoError(\r\n 'no_device',\r\n `请求失败,设备不存在或已被移除: ${err.message || err}`\r\n )\r\n }\r\n\r\n if (!res) {\r\n throw new GetDeviceInfoError('no_device', '设备不存在或已被移除')\r\n }\r\n\r\n deviceKitParamsManager.info('📺 getDeviceInfoByDeviceKey res ▶', res)\r\n\r\n return res\r\n },\r\n\r\n getShareDeviceInfo: async (shareCode?: string): Promise<DeviceModel> => {\r\n deviceKitParamsManager.info('📺 getShareDeviceInfo shareCode ▶', shareCode)\r\n\r\n const finalShareCode = shareCode || get().device?.shareCode\r\n\r\n if (!finalShareCode) {\r\n throw new GetDeviceInfoError('invalid_param', '参数无效:缺少 shareCode')\r\n }\r\n\r\n const [err, res] = await to<DeviceModel>(\r\n QuecRNDeviceModule.getDeviceInfoByShareCode(finalShareCode)\r\n )\r\n\r\n if (err) {\r\n throw new GetDeviceInfoError(\r\n 'no_device',\r\n `请求失败,设备不存在或已被移除: ${err.message || err}`\r\n )\r\n }\r\n\r\n if (!res) {\r\n throw new GetDeviceInfoError('no_device', '设备不存在或已被移除')\r\n }\r\n\r\n deviceKitParamsManager.info('📺 getShareDeviceInfo res ▶', res)\r\n\r\n return res\r\n },\r\n }))\r\n }\r\n return deviceStore\r\n}\r\n\r\nexport const getDeviceStore = () => {\r\n if (!deviceStore) {\r\n throw new Error('❗请先调用 createDeviceStore() 初始化 deviceStore')\r\n }\r\n return deviceStore\r\n}\r\nexport const getDeviceStoreWithoutError = () => {\r\n if (!deviceStore) {\r\n return null\r\n }\r\n return deviceStore\r\n}\r\n\r\nconst selectFromStore = <T>(selector: (state: States & Actions) => T): T => {\r\n const store = getDeviceStore()\r\n return store(selector)\r\n}\r\n\r\n/**\r\n * useDeviceStoreState\r\n *\r\n * 💢❗❗❗ PS: 使用这个会导致任一对象刷新引起你使用的变量刷新,尽量不要使用\r\n *\r\n * 描述:在创建deviceStore后可获取状态管理器里的所有状态state。\r\n *\r\n * 示例:\r\n * ```ts\r\n * const deviceState = useDeviceStoreState()\r\n * ```\r\n *\r\n * @returns 返回整个 device store 状态对象,包含如下字段:\r\n * ```ts\r\n * {\r\n * device: DeviceModel | null\r\n * props: PropsModel | null\r\n * deviceState: number\r\n * online: boolean\r\n * isOnlyBle: boolean\r\n * productUrl: string | null\r\n * family: FamilyModel | null\r\n * area: string | null\r\n * wsOnline: boolean\r\n * lanOnline: boolean\r\n * bleOnline: boolean\r\n * // 可能还包括一些方法,如 updateDevice、getDeviceState、getProductManual 等\r\n * }\r\n * ```\r\n *\r\n * @see README.md\r\n */\r\nexport const useDeviceStoreState = () => selectFromStore(state => state)\r\n\r\n/**\r\n * 获取当前设备信息\r\n *\r\n * @returns 当前设备的信息,类型为 `DeviceModel | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const device = useDevice()\r\n * ```\r\n */\r\nexport const useDevice = () => selectFromStore(state => state.device)\r\n\r\n/**\r\n * 获取 app传入的props\r\n *\r\n * @returns app传入的props,类型为 `PropsModel | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const props = useDeviceProps()\r\n * ```\r\n */\r\nexport const useDeviceProps = () => selectFromStore(state => state.props)\r\n\r\n/**\r\n * 获取设备的家庭模式信息\r\n *\r\n * @returns 当前设备所属的家庭信息,类型为 `FamilyModel | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const family = useDeviceFamily()\r\n * ```\r\n */\r\nexport const useDeviceFamily = () => selectFromStore(state => state.family)\r\n\r\n/**\r\n * 获取设备所在区域\r\n *\r\n * @returns 区域字符串,类型为 `string | null`,例如 'china'\r\n *\r\n * @example\r\n * ```ts\r\n * const area = useDeviceArea()\r\n * ```\r\n */\r\nexport const useDeviceArea = () => selectFromStore(state => state.area)\r\n\r\n/**\r\n * 获取产品说明书链接\r\n *\r\n * @returns 说明书的 URL,类型为 `string | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const productUrl = useDeviceProductUrl()\r\n * ```\r\n */\r\nexport const useDeviceProductUrl = () => selectFromStore(state => state.productUrl)\r\n\r\n/**\r\n * 获取 endUserId (获取 ownerId)\r\n *\r\n * @returns endUserId\r\n *\r\n * @example\r\n * ```ts\r\n * const endUserId = useEndUserId()\r\n * ```\r\n */\r\nexport const useEndUserId = () => selectFromStore(state => state.endUserId)\r\n\r\n/**\r\n * 获取当前用户账号\r\n *\r\n * @returns userAccount\r\n *\r\n * @example\r\n * ```ts\r\n * const userAccount = useUserAccount()\r\n * ```\r\n */\r\nexport const useUserAccount = () => selectFromStore(state => state.userAccount)\r\n/**\r\n\r\n * 获取 设备是否为纯蓝牙设备\r\n *\r\n * @returns boolean\r\n *\r\n * @example\r\n * ```ts\r\n * const isOnlyBle = useDeviceIsOnlyBle()\r\n * ```\r\n */\r\nexport const useDeviceIsOnlyBle = () => selectFromStore(state => state.isOnlyBle)\r\n\r\n/**\r\n * 获取设备是否在线\r\n *\r\n * @returns 在线状态布尔值,类型为 `boolean`\r\n *\r\n * @example\r\n * ```ts\r\n * const online = useDeviceOnline()\r\n * console.log(online ? '设备在线' : '设备离线')\r\n * ```\r\n */\r\nexport const useDeviceOnline = () => selectFromStore(state => state.online)\r\n\r\n/**\r\n * 获取设备状态\r\n * @returns onlineStatus\r\n */\r\nexport const useDeviceState = () => selectFromStore(state => state.deviceSate)\r\n\r\n/**\r\n * 获取设备WS链路状态\r\n * @returns boolean\r\n */\r\nexport const useDeviceWsOnline = () => selectFromStore(state => state.wsOnline)\r\n/**\r\n * 获取设备局域网链路状态\r\n * @returns boolean\r\n */\r\nexport const useDeviceLanOnline = () => selectFromStore(state => state.lanOnline)\r\n/**\r\n * 获取设备蓝牙链路状态\r\n * @returns boolean\r\n */\r\nexport const useDeviceBleOnline = () => selectFromStore(state => state.bleOnline)\r\n\r\n/**\r\n * 获取设备是否正在连接中\r\n *\r\n * @returns 状态布尔值,类型为 `boolean`\r\n *\r\n * @example\r\n * ```ts\r\n * const isConnecting = useDeviceIsConnecting()\r\n * ```\r\n */\r\nexport const useDeviceIsConnecting = () =>\r\n selectFromStore(state => Number(state.connectingState) !== 0)\r\n\r\n/**\r\n * async FN 主动获取当前设备状态的方法\r\n *\r\n * @describe 用于主动获取设备当前状态的异步函数\r\n * @returns {Promise<设备状态的数字>}\r\n *\r\n * @example\r\n * ```ts\r\n * const getStatus = useGetDeviceStatus()\r\n * getStatus()\r\n * const res = await getStatus()\r\n * ```\r\n */\r\nexport const useGetDeviceStatus = () => selectFromStore(state => state.getDeviceState)\r\n\r\n/**\r\n * FN 更新设备连接中状态\r\n * @params connectingState: number\r\n * @returns void\r\n *\r\n */\r\nexport const useUpdateDeviceConnectingState = () =>\r\n selectFromStore(state => state.updateConnectingState)\r\n\r\n/**\r\n * FN 设置初始化数据\r\n *\r\n * @describe 在 APP.ts 用于接收初始数据\r\n * @param {PropsModel} [props] - 设备对象\r\n *\r\n * @example\r\n * ```ts\r\n * // APP.ts\r\n * const setProps = useSetProps()\r\n * setProps(props)\r\n * ```\r\n */\r\nexport const useSetProps = () => selectFromStore(state => state.useSetProps)\r\n\r\n/**\r\n * 更新设备对象信息\r\n *\r\n * @describe 用于更新 `device` 对象的内容\r\n * @param {DeviceModel} [device] - 设备对象\r\n *\r\n * @example\r\n * ```ts\r\n * const updateDevice = useUpdateDevice()\r\n * updateDevice(device)\r\n * ```\r\n */\r\nexport const useUpdateDevice = () => selectFromStore(state => state.updateDevice)\r\n\r\n/**\r\n * 更新设备名称\r\n *\r\n * @describe 用于更新 `device` 设备名称\r\n * @param {string} [deviceName] - 设备名称\r\n *\r\n * @example\r\n * ```ts\r\n * const updateDevice = useUpdateDevice()\r\n * updateDevice(deviceName)\r\n * ```\r\n */\r\nexport const useUpdateDeviceName = () => selectFromStore(state => state.updateDeviceName)\r\n\r\n/**\r\n * FN 更新设备在线状态\r\n *\r\n * @describe 用于更新设备在线状态\r\n *\r\n * @param {number} [onlineState] - 状态码\r\n * @returns void\r\n *\r\n * @example\r\n * ```ts\r\n * const updateOnline = useUpdateOnlineStatus()\r\n * updateOnline(3)\r\n * ```\r\n */\r\nexport const useUpdateOnlineStatus = () => selectFromStore(state => state.updateOnlineStatus)\r\n\r\n/**\r\n * FN 检查当前设备是否还存在\r\n *\r\n * @describe 检查当前设备是否还存在\r\n *\r\n * @returns Promise<boolean |undefined>\r\n *\r\n * @example\r\n * ```ts\r\n * const checkCurrentDeviceExist = useCheckCurrentDeviceExist()\r\n * checkCurrentDeviceExist()\r\n * ```\r\n */\r\nexport const useCheckCurrentDeviceExist = () =>\r\n selectFromStore(state => state.checkCurrentDeviceExist)\r\n","import { useEffect } from 'react'\r\nimport { EmitterSubscription, NativeEventEmitter, NativeModules } from 'react-native'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceListStoreWithoutError } from './deviceListStore'\r\nimport { getDeviceStoreWithoutError } from './deviceStore'\r\nimport { isEmpty } from './utils/empty'\r\nimport { objToStr, strToObj } from './utils/stringUtils'\r\nimport { Null } from './types/common.type'\r\n/**\r\n * 事件类型---设备在线状态\r\n * @type {string}\r\n */\r\nexport const EVENT_TYPE_DEVICE_ONLINE = 'onDeviceOnlineState'\r\n/**\r\n * 事件类型---设备连接状态\r\n * @type {string}\r\n */\r\nexport const EVENT_TYPE_DEVICE_CONNECTING = 'onDeviceConnectingState'\r\n\r\n\r\nlet eventEmitter: any = new NativeEventEmitter(NativeModules.QuecRNDeviceModule)\r\nlet onDeviceStateUpdateListener: EmitterSubscription | Null\r\nlet onDeviceConnectingStateUpdateListener: EmitterSubscription | Null\r\n\r\n/**\r\n * 设备状态监听事件\r\n *\r\n * @param {(event: any) => void|undefined} [updateDeviceStateCallback] - 状态更新回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n *\r\n * @example\r\n * ```ts\r\n * // AppContainer.ts\r\n * useInitUpdateDeviceStateEvent()\r\n * ```\r\n */\r\nexport const useInitUpdateDeviceStateEvent = (\r\n updateDeviceStateCallback?: (event: any) => void,\r\n updateDeviceConnectingStateCallback?: (event: any) => void\r\n) => {\r\n const deviceListStore = getDeviceListStoreWithoutError() // ✅ 放在顶层\r\n const deviceListStoreState = deviceListStore ? deviceListStore(state => state) : null\r\n if (deviceListStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceListStore '\r\n )\r\n }\r\n const updateDeviceOnlineState = deviceListStoreState?.updateDeviceOnlineState ?? null\r\n\r\n const deviceStore = getDeviceStoreWithoutError() // ✅ 放在顶层\r\n const deviceStoreState = deviceStore ? deviceStore(state => state) : null\r\n if (deviceStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备列表信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceStore '\r\n )\r\n }\r\n const updateOnlineStatus = deviceStoreState?.updateOnlineStatus ?? null\r\n const updateConnectingState = deviceStoreState?.updateConnectingState ?? null\r\n const device = deviceStoreState?.device ?? null\r\n /**\r\n * 设备状态上报监听\r\n */\r\n useEffect(() => {\r\n removeListener(onDeviceStateUpdateListener)\r\n onDeviceStateUpdateListener = eventEmitter.addListener(\r\n EVENT_TYPE_DEVICE_ONLINE,\r\n (event: any) => {\r\n deviceKitParamsManager.info(\r\n EVENT_TYPE_DEVICE_ONLINE,\r\n ' 🤝 ==OnlineState==' + objToStr(event)\r\n )\r\n if (isEmpty(event)) {\r\n return\r\n }\r\n const eventDevice = strToObj(event.device)\r\n if (\r\n device?.deviceKey === eventDevice?.deviceKey &&\r\n device?.productKey === eventDevice?.productKey &&\r\n updateOnlineStatus\r\n ) {\r\n updateOnlineStatus(event.onlineState)\r\n }\r\n if (updateDeviceOnlineState) {\r\n updateDeviceOnlineState(event)\r\n }\r\n updateDeviceStateCallback && updateDeviceStateCallback(event)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(onDeviceStateUpdateListener)\r\n onDeviceStateUpdateListener = null\r\n }\r\n }, [updateDeviceOnlineState, updateOnlineStatus, device])\r\n /**\r\n * 设备连接中状态上报监听\r\n */\r\n useEffect(() => {\r\n removeListener(onDeviceConnectingStateUpdateListener)\r\n onDeviceConnectingStateUpdateListener = eventEmitter.addListener(\r\n EVENT_TYPE_DEVICE_ONLINE,\r\n (event: any) => {\r\n deviceKitParamsManager.info(\r\n EVENT_TYPE_DEVICE_CONNECTING,\r\n ' ⚡ ==ConnectingState==' + objToStr(event)\r\n )\r\n const connectingState = isNaN(event?.connectingState) ? 0 : Number(event?.connectingState)\r\n updateConnectingState && updateConnectingState(connectingState)\r\n updateDeviceConnectingStateCallback && updateDeviceConnectingStateCallback(event)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(onDeviceConnectingStateUpdateListener)\r\n onDeviceConnectingStateUpdateListener = null\r\n }\r\n }, [updateConnectingState, updateDeviceConnectingStateCallback])\r\n}\r\n\r\nconst removeListener = (listener: EmitterSubscription | Null) => {\r\n if (listener) {\r\n listener.remove()\r\n listener = undefined\r\n }\r\n}\r\n","// @ts-ignore\r\nimport QuecRNBusinessPanelModule from '@quec/rn-businesspanel-module'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { DeviceModel } from './types'\r\n/**\r\n * 更新当前面板(或者只更新设备)\r\n *\r\n * @description\r\n * (向APP发起)主动更改设备面板;\r\n * 如果新设备面板依旧是此面板,(APP)只会发出更新设备信息事件(''QuecRefreshDeviceInfo'')的通知;\r\n * 反之,会重载面板,刷新到新的面板去;\r\n * 所以请配合使用useInitDeviceInfoUpdateEvent这个hook\r\n * @example\r\n * ```ts\r\n * changeDevicePanel(newDevice)\r\n * ```\r\n *\r\n */\r\nexport const changeDevicePanel = (newDevice: DeviceModel) => {\r\n deviceKitParamsManager.info(\r\n 'changeDevicePanel',\r\n '__更换设备面板 => 设备:' + newDevice.deviceName\r\n )\r\n QuecRNBusinessPanelModule.changeBusinessPanel({\r\n device: JSON.stringify(newDevice),\r\n })\r\n}\r\n/**\r\n * 切换托底面板\r\n *\r\n * @description 当设备列表没有一个设备时,需要主动调用来切换托底面板\r\n * @example\r\n * ```ts\r\n * checkoutEmptyPanel()\r\n * ```\r\n *\r\n */\r\nexport const checkoutEmptyPanel = () => {\r\n deviceKitParamsManager.info('checkoutEmptyPanel', '__更换托底面板')\r\n QuecRNBusinessPanelModule.switchBusinessPanel()\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport { EmitterSubscription, NativeEventEmitter, NativeModules } from 'react-native'\r\nimport { changeDevicePanel, checkoutEmptyPanel } from './device-list-utils'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceListStoreWithoutError } from './deviceListStore'\r\nimport { getDeviceStoreWithoutError } from './deviceStore'\r\nimport { DeviceModel } from './types'\r\nimport { Null } from './types/common.type'\r\n\r\nexport const EVENT_TYPE_REFRESH_DEVICE_LIST = 'QuecRefreshDeviceList'\r\n\r\nlet refreshDeviceListListener: EmitterSubscription | Null\r\nlet panelEventEmitter: any = new NativeEventEmitter(NativeModules.QuecRNBusinessPanelModule)\r\n/**\r\n * 设备列表更新监听事件\r\n *\r\n * @param {(event: any) => void|undefined} [refreshDeviceListEventCallback] - 状态更新回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n * @param {(list: DeviceModel) => void|undefined} [refreshDeviceListSuccessCallback] - 列表刷新后的回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n * @param {boolean} [enableAutoCheckoutDevice] - 打开自动检测并切换设备\r\n *\r\n * @example\r\n * ```ts\r\n * // AppContainer.ts\r\n * useInitDeviceListUpdateEvent({\r\n * refreshDeviceListEventCallback: (event) => {},\r\n * refreshDeviceListSuccessCallback: (list) => {}\r\n * enableAutoCheckoutDevice:true\r\n * })\r\n * ```\r\n */\r\nexport const useInitDeviceListUpdateEvent = (params?: {\r\n refreshDeviceListEventCallback?: (event: any) => void\r\n refreshDeviceListSuccessCallback?: (list: DeviceModel[]) => void\r\n enableAutoCheckoutDevice?: boolean\r\n}) => {\r\n const {\r\n refreshDeviceListEventCallback,\r\n refreshDeviceListSuccessCallback,\r\n enableAutoCheckoutDevice,\r\n } = params ?? {}\r\n const deviceListStore = getDeviceListStoreWithoutError() // ✅ 放在顶层\r\n const deviceListStoreState = deviceListStore ? deviceListStore(state => state) : null\r\n if (deviceListStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备列表信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceListStore '\r\n )\r\n }\r\n\r\n const deviceStore = getDeviceStoreWithoutError() // ✅ 放在顶层\r\n const deviceStoreState = deviceStore ? deviceStore(state => state) : null\r\n\r\n if (deviceStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceStore '\r\n )\r\n }\r\n\r\n const listIsEmpty = deviceListStoreState?.listIsEmpty ?? null\r\n const refreshDeviceList = deviceListStoreState?.refreshDeviceList ?? null\r\n\r\n const device = deviceStoreState?.device ?? null\r\n const deviceIsEmpty = deviceStoreState?.deviceIsEmpty ?? null\r\n const checkCurrentDeviceExist = deviceStoreState?.checkCurrentDeviceExist ?? null\r\n\r\n const [onceCheckNowDevice, setOnceCheckNowDevice] = useState(true)\r\n /**\r\n * 设备列表刷新监听\r\n */\r\n useEffect(() => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = panelEventEmitter.addListener(\r\n EVENT_TYPE_REFRESH_DEVICE_LIST,\r\n (event: any) => {\r\n deviceKitParamsManager.info(EVENT_TYPE_REFRESH_DEVICE_LIST, '==refresh device list 🔄==')\r\n // 可能是添加了新设备或者删除了设备(可能删除了当前设备),\r\n // 此时需要请求当前设备的信息,查看当前设备是否还存在\r\n refreshDeviceList &&\r\n refreshDeviceList(list => {\r\n refreshDeviceListSuccessCallback && refreshDeviceListSuccessCallback(list)\r\n if (checkCurrentDeviceExist && enableAutoCheckoutDevice) {\r\n checkCurrentDeviceExist().then(res => {\r\n if (res === false && list?.length > 0) {\r\n // 当前设备已经不复存在,更换列表第一个设备\r\n // 列表如果为空要跳转托底面板(useAutoRedirectDevice)(用这个hook就可以了)\r\n changeDevicePanel(list[0])\r\n }\r\n })\r\n }\r\n })\r\n refreshDeviceListEventCallback && refreshDeviceListEventCallback(event)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = null\r\n }\r\n }, [refreshDeviceList])\r\n\r\n // 设备列表或当前设备为空时,跳转到业务面板\r\n useEffect(() => {\r\n if (!enableAutoCheckoutDevice) return\r\n if (deviceIsEmpty === true || listIsEmpty === true) {\r\n checkoutEmptyPanel()\r\n }\r\n }, [deviceIsEmpty, listIsEmpty, enableAutoCheckoutDevice])\r\n\r\n // TODO 进来面板就马上检查当前设备是否还可用\r\n // 防止有操作者在设备管理页删除设备后,立即杀APP进程,然后再次进来\r\n useEffect(() => {\r\n if (!enableAutoCheckoutDevice) return\r\n if (device && onceCheckNowDevice) {\r\n setOnceCheckNowDevice(false)\r\n if (checkCurrentDeviceExist && enableAutoCheckoutDevice) {\r\n checkCurrentDeviceExist().then(res => {\r\n if (res === false) {\r\n // 当前设备已经不复存在,更换列表第一个设备\r\n // 列表如果为空要跳转托底面板(useAutoRedirectDevice)(用这个hook就可以了)\r\n refreshDeviceList &&\r\n refreshDeviceList(list => {\r\n if (list[0]) {\r\n changeDevicePanel(list[0])\r\n }\r\n })\r\n }\r\n })\r\n }\r\n }\r\n }, [device, onceCheckNowDevice, enableAutoCheckoutDevice])\r\n}\r\nconst removeListener = (listener: EmitterSubscription | Null) => {\r\n if (listener) {\r\n listener.remove()\r\n listener = undefined\r\n }\r\n}\r\n","import { useEffect } from 'react'\r\nimport { EmitterSubscription, NativeEventEmitter, NativeModules } from 'react-native'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceStoreWithoutError } from './deviceStore'\r\nimport { DeviceModel } from './types'\r\nimport { Null } from './types/common.type'\r\nexport const EVENT_TYPE_REFRESH_DEVICE = 'QuecRefreshDeviceInfo'\r\n\r\nlet refreshDeviceListListener: EmitterSubscription | Null\r\nlet panelEventEmitter: any = new NativeEventEmitter(NativeModules.QuecRNBusinessPanelModule)\r\n/**\r\n * 设备更新事件\r\n *\r\n * @param {(event: any) => void|undefined} [refreshDeviceEventCallback] - 状态更新回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n *\r\n * @example\r\n * ```ts\r\n * // AppContainer.ts\r\n * useInitDeviceInfoUpdateEvent()\r\n * ```\r\n */\r\nexport const useInitDeviceInfoUpdateEvent = (refreshDeviceEventCallback?: (event: any) => void) => {\r\n const deviceStore = getDeviceStoreWithoutError() // ✅ 放在顶层\r\n const deviceStoreState = deviceStore ? deviceStore(state => state) : null\r\n if (deviceStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备列表信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceStore '\r\n )\r\n }\r\n const updateDevice = deviceStoreState?.updateDevice ?? null\r\n /**\r\n * 设备状态上报监听\r\n */\r\n useEffect(() => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = panelEventEmitter.addListener(\r\n EVENT_TYPE_REFRESH_DEVICE,\r\n (e: { device: string | DeviceModel }) => {\r\n deviceKitParamsManager.info(EVENT_TYPE_REFRESH_DEVICE, '📞 ==refresh device info 🔄==')\r\n let newDevice = {}\r\n try {\r\n newDevice = typeof e.device === 'string' ? JSON.parse(e.device) : e.device\r\n } catch (error) {\r\n deviceKitParamsManager.info(\r\n EVENT_TYPE_REFRESH_DEVICE +\r\n ' 📞 ==refresh device info get new device info ERROR ❌==',\r\n error\r\n )\r\n }\r\n updateDevice && updateDevice(newDevice)\r\n refreshDeviceEventCallback && refreshDeviceEventCallback(e)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = null\r\n }\r\n }, [updateDevice])\r\n}\r\nconst removeListener = (listener: EmitterSubscription | Null) => {\r\n if (listener) {\r\n listener.remove()\r\n listener = undefined\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 设置离线提醒开关\r\n *\r\n * @param enableOfflineReminder 开关 0-关闭 1-开启\r\n * @param deviceKey 设备的 DeviceKey(暂未使用,可扩展)\r\n * @param productKey 产品的 ProductKey(暂未使用,可扩展)\r\n * @returns Promise<null>\r\n *\r\n */\r\nexport const setOfflineReminder = async ({\r\n enableOfflineReminder,\r\n deviceKey,\r\n productKey,\r\n}: {\r\n enableOfflineReminder: 1 | 0\r\n deviceKey: string\r\n productKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.setOfflineReminder(enableOfflineReminder, productKey, deviceKey)\r\n deviceKitParamsManager.info('🔎 QuecRNDeviceModule.setOfflineReminder....', '设置离线提醒开关')\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.setOfflineReminder(获取设备状态失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * 查询离线提醒开关状态\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<boolean> true-开启 false-关闭\r\n *\r\n * @since 2.4.0\r\n * @platform all\r\n */\r\nexport const getOfflineReminderInfo = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n const result = await QuecRNDeviceModule.getOfflineReminderInfo(productKey, deviceKey)\r\n deviceKitParamsManager.info('🔍 QuecRNDeviceModule.getOfflineReminderInfo', result)\r\n return +result?.data === 1\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getOfflineReminderInfo(查询失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw false\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { DeviceModel } from '../types'\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取设备是否有 OTA 升级计划\r\n *\r\n * @param device 设备信息对象\r\n * @returns Promise<boolean> true-有升级计划 false-没有升级计划\r\n *\r\n * @since 2.4.0\r\n * @platform all\r\n */\r\nexport const checkDeviceUpdatePlan = async (device: DeviceModel) => {\r\n try {\r\n await QuecRNDeviceModule.checkDeviceUpdatePlan(device)\r\n deviceKitParamsManager.info('🔍 QuecRNDeviceModule.checkDeviceUpdatePlan', '有升级计划')\r\n return true\r\n } catch (error) {\r\n deviceKitParamsManager.info('🔍 QuecRNDeviceModule.checkDeviceUpdatePlan', '无升级计划')\r\n throw false\r\n }\r\n}\r\n/**\r\n * 打开设备 OTA 详情页\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<void>\r\n *\r\n * @since 2.4.0\r\n * @platform all\r\n */\r\nexport const openDeviceOTAPage = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.openDeviceOTAPage(productKey, deviceKey)\r\n deviceKitParamsManager.info('📂 QuecRNDeviceModule.openDeviceOTAPage', '已打开设备OTA详情页')\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.openDeviceOTAPage(打开失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取当前手机设置的时区与 GMT 的差值\r\n *\r\n * @returns Promise<string>\r\n *\r\n * @since 2.5.7\r\n * @platform all\r\n */\r\nexport const getTimeDifferenceWithGMT = async () => {\r\n try {\r\n const result = await QuecRNDeviceModule.getTimeDifferenceWithGMT()\r\n deviceKitParamsManager.info(\r\n '🕒 QuecRNDeviceModule.getTimeDifferenceWithGMT(获取当前手机设置的时区与 GMT 的差值) ==>',\r\n result\r\n )\r\n return result\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getTimeDifferenceWithGMT(获取当前手机设置的时区与 GMT 的差值失败) ==>',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * 获取设备设置的时区\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<string>\r\n *\r\n * @since 2.5.7\r\n * @platform all\r\n */\r\nexport const getDeviceTimeZone = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n const result = await QuecRNDeviceModule.getDeviceTimeZone(productKey, deviceKey)\r\n deviceKitParamsManager.info(\r\n '🌍 QuecRNDeviceModule.getDeviceTimeZone(获取设备设置的时区) ==>',\r\n result\r\n )\r\n return result\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getDeviceTimeZone(获取设备设置的时区失败) ==>',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * 设置设备的时区\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @param timezone 设置的时区字符串\r\n * @returns Promise<void>\r\n *\r\n * @since 2.5.7\r\n * @platform all\r\n */\r\nexport const setDeviceTimeZone = async ({\r\n productKey,\r\n deviceKey,\r\n timezone,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n timezone: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.setDeviceTimeZone(productKey, deviceKey, timezone)\r\n deviceKitParamsManager.info(\r\n '✅ QuecRNDeviceModule.setDeviceTimeZone',\r\n `已设置时区为 ${timezone}`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.setDeviceTimeZone(设置失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * 设备校时(仅支持纯蓝牙设备)\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<void>\r\n *\r\n * @since 2.11.0\r\n * @platform all\r\n */\r\nexport const timeZoneSyncForBleDevice = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.timeZoneSync(productKey, deviceKey)\r\n deviceKitParamsManager.info(\r\n '⏱️ QuecRNDeviceModule.timeZoneSync',\r\n `设备已校时(productKey: ${productKey}, deviceKey: ${deviceKey})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.timeZoneSync(设备校时失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 纯蓝牙设备解绑\r\n *\r\n@param productKey {string} - string productKey\r\n@param deviceKey {string} - string deviceKey\r\n@param isInit {boolean} - boolean 是否重置设备\r\n@param random {string} - string 非必传 random\r\n@param pureBtResetCredentials {string} - string 非必传 重置凭证\r\n * @returns Promise<void>\r\n *\r\n * @since 2.11.0\r\n * @platform all\r\n */\r\nexport const unbindBleDevice = async ({\r\n productKey,\r\n deviceKey,\r\n isInit,\r\n random,\r\n pureBtResetCredentials,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n isInit: boolean\r\n random?: string\r\n pureBtResetCredentials?: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.unbindlingPureBtDevice(\r\n productKey,\r\n deviceKey,\r\n isInit,\r\n random,\r\n pureBtResetCredentials\r\n )\r\n deviceKitParamsManager.info(\r\n '🔓 QuecRNDeviceModule.unbindlingPureBtDevice',\r\n `解绑成功(productKey: ${productKey}, deviceKey: ${deviceKey})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.unbindlingPureBtDevice(解绑失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n\r\n// 以下方法都要求有外网的情况下进行解绑\r\n/**\r\n * 分享设备设备解绑(已弃用)\r\n *\r\n * @deprecated 此方法已弃用并不再维护,如遇问题请联系开发者\r\n *\r\n * @param shareCode 分享码\r\n * @returns Promise<void>\r\n *\r\n * @since 1.0.0\r\n * @platform all\r\n */\r\nexport const unbindShareDevice = async ({ shareCode }: { shareCode: string }) => {\r\n try {\r\n await QuecRNDeviceModule.unShareDeviceByShareUserWithShareCode(shareCode)\r\n deviceKitParamsManager.info(\r\n '🔓 QuecRNDeviceModule.unShareDeviceByShareUserWithShareCode',\r\n `解绑成功(shareCode: ${shareCode})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.unShareDeviceByShareUserWithShareCode(解绑失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * (非分享)设备解绑(已弃用)\r\n *\r\n * @deprecated 此方法已弃用并不再维护,如遇问题请联系开发者\r\n *\r\n * @param deviceKey 设备 DeviceKey\r\n * @param productKey 产品 ProductKey\r\n * @returns Promise<void>\r\n *\r\n * @since 1.0.0\r\n * @platform all\r\n */\r\nexport const unbindDevice = async ({\r\n deviceKey,\r\n productKey,\r\n}: {\r\n deviceKey: string\r\n productKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.unbindDeviceWithDeviceKey(deviceKey, productKey)\r\n deviceKitParamsManager.info(\r\n '🔓 QuecRNDeviceModule.unbindDeviceWithDeviceKey',\r\n `解绑成功(deviceKey: ${deviceKey}, productKey: ${productKey})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.unbindDeviceWithDeviceKey(解绑失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/config/DeviceConfig.ts","../src/DeviceKitParamsManager.ts","../src/utils/to.ts","../src/SDK/getDeviceOnlineState.ts","../src/SDK/getPropertyDataListWithParams.ts","../src/utils/stringUtils.ts","../src/SDK/subscriDevice.ts","../src/deviceListStore.ts","../src/API/deviceApi.ts","../src/API/productManual.ts","../src/types/Error.ts","../src/utils/empty.ts","../src/utils/numberUtils.ts","../src/deviceStore.ts","../src/initDeviceOnlineEvent.ts","../src/device-list-utils.ts","../src/initDeviceListUpdate.ts","../src/initDeviceRefreshEvent.ts","../src/API/offlineReminder.ts","../src/API/otaPlan.ts","../src/API/timeZone.ts","../src/API/unbindDevice.ts"],"names":["onlineStatus","QuecRNDeviceModule","initialState","create","selectFromStore","deviceListStore","deviceStore","NativeEventEmitter","NativeModules","useEffect","removeListener","refreshDeviceListListener","panelEventEmitter"],"mappings":";;;;;;;;;AAGO,IAAM,cAAA,GAAiB;AAIvB,IAAM,gBAAA,GAAmB;AAIzB,IAAM,iBAAA,GAAoB;AAI1B,IAAM,2BAAA,GAA8B;AAIpC,IAAM,0BAAA,GAA6B;AAInC,IAAM,gCAAA,GAAmC;AAIzC,IAAM,sBAAA,GAAyB;AAG/B,IAAK,YAAA,qBAAAA,aAAAA,KAAL;AACL,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,iBAAc,CAAA,CAAA,GAAd,aAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,eAAY,CAAA,CAAA,GAAZ,WAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,iBAAc,CAAA,CAAA,GAAd,aAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,gBAAa,CAAA,CAAA,GAAb,YAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,qBAAkB,CAAA,CAAA,GAAlB,iBAAA;AACA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,gBAAa,CAAA,CAAA,GAAb,YAAA;AARU,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAcL,IAAM,oBAAA,GAAuB;ACzCpC,IAAM,QAAA,GAAW,6BAAA;AAUjB,IAAM,uBAAA,GAAN,MAAM,uBAAA,CAAuB;AAAA;AAAA,EAU3B,OAAO,WAAA,GAAc;AAAA,EAAC;AAAA;AAAA,EAGf,iBAAA,CAAkB;AAAA,IACvB,eAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF,EAIG;AACD,IAAA,IAAI,eAAA,0BAAwC,eAAA,GAAkB,eAAA;AAC9D,IAAA,IAAI,sBAAA;AACF,MAAA,uBAAA,CAAuB,sBAAA,GAAyB,sBAAA;AAClD,IAAA,IAAI,WAAA,0BAAoC,WAAA,GAAc,WAAA;AAAA,EACxD;AAAA;AAAA,EAGO,OAAA,GAAU;AACf,IAAA,uBAAA,CAAuB,eAAA,IAAkB;AAAA,EAC3C;AAAA;AAAA,EAGO,cAAA,GAAiB;AACtB,IAAA,uBAAA,CAAuB,sBAAA,IAAyB;AAAA,EAClD;AAAA;AAAA,EAGO,IAAI,OAAA,EAAiB;AAC1B,IAAA,uBAAA,CAAuB,cAAc,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEO,4BAA4B,wBAAA,EAAmC;AACpE,IAAA,uBAAA,CAAuB,wBAAA,GAA2B,wBAAA;AAAA,EACpD;AAAA,EAEO,2BAAA,GAA8B;AACnC,IAAA,OAAO,wBAAuB,wBAAA,KAA6B,IAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,OAAc,UAAU,SAAA,EAAsB;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA,EAEA,OAAc,cAAA,GAAiB;AAC7B,IAAA,MAAM,eAAe,CAAC,OAAA;AACtB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,OAAO,MAAM;AAAA,MAAC,CAAA;AACpB,MAAA,OAAA,CAAQ,GAAA,GAAM,IAAA;AACd,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA;AACf,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA;AACf,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAChB,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAChB,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGQ,GAAA,CAAI,KAAA,EAAkB,GAAA,EAAa,OAAA,EAAc;AACvD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,OAAA,GAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,wBAAuB,SAAA,EAAW;AACpC,MAAA,uBAAA,CAAuB,UAAU,KAAK,CAAA,CAAE,QAAA,GAAW,GAAA,EAAK,KAAK,OAAO,CAAA;AAAA,IACtE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,EAAG,GAAG,IAAI,KAAK,CAAA,KAAA,EAAQ,EAAA,GAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EAC9D;AAAA;AAAA,EAGO,IAAA,CAAK,KAAa,OAAA,EAAc;AACrC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAA,EAAK,OAAO,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGO,KAAA,CAAM,KAAa,OAAA,EAAc;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAA,EAAK,OAAO,CAAA;AAAA,EAC5B;AACF,CAAA;AA1FM,uBAAA,CACW,gBAAA,GAAmB,IAAA;AAAA;AAD9B,uBAAA,CAGW,eAAA,GAA0C,IAAA;AAHrD,uBAAA,CAIW,sBAAA,GAAiD,IAAA;AAJ5D,uBAAA,CAKW,WAAA,GAAkC,IAAA;AAL7C,uBAAA,CAMW,SAAA,GAA8B,eAAA;AAN/C,IAAM,sBAAA,GAAN,uBAAA;AA4FO,IAAM,sBAAA,GAAyB,IAAI,sBAAA;;;ACnG1C,eAAsB,EAAA,CACpB,SACA,QAAA,EACqC;AACrC,EAAA,OAAO,OAAA,CACJ,IAAA,CAAgB,CAAC,IAAA,KAAY,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA,CACzC,KAAA,CAAsB,CAAC,GAAA,KAAW;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,KAAK,QAAQ,CAAA;AACnD,MAAA,OAAO,CAAC,aAAa,MAAS,CAAA;AAAA,IAChC;AAEA,IAAA,OAAO,CAAC,KAAK,MAAS,CAAA;AAAA,EACxB,CAAC,CAAA;AACL;AAEA,IAAO,UAAA,GAAQ,EAAA;;;ACjBR,IAAM,kBAAkB,OAAO;AAAA,EACpC,EAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,MAAM,UAAA;AAAA,IACvBC,mBAAA,CAAmB,oBAAA,CAAqB,EAAA,EAAI,EAAE;AAAA,GAChD;AACA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,qFAAA;AAAA,MACA,YAAA,GAAe;AAAA,KACjB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,sFAAA;AAAA,MACA,aAAa,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,IAAA,CAAK,UAAU,GAAG;AAAA,KACjD;AACA,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,KAAM,CAAA,EAAG;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT,CAAA;ACNO,IAAM,6BAAA,GAAgC,OAAO,MAAA,KAI9C;AACJ,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,QAAA,EAAS,GAAI,MAAA;AAC5C,EAAA,sBAAA,CAAuB,IAAA;AAAA,IACrB,+BAAA;AAAA,IACA,sDAAA,GAAiB,aAAa,GAAA,GAAM;AAAA,GACtC;AACA,EAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,MAAM,UAAA;AAAA,IACvBA,oBAAmB,yCAAA,CAA0C;AAAA,MAC3D,GAAG,MAAA;AAAA,MACH,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,MAC3B,IAAA,EAAM;AAAA,KACP;AAAA,GACH;AACA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,sBAAA,CAAuB,KAAA,CAAM,eAAA,EAAiB,YAAA,GAAe,GAAG,CAAA;AAChE,IAAA,sBAAA,CAAuB,cAAA,EAAe;AACtC,IAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnC,MAAA,sBAAA,CAAuB,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,IACxC;AACA,IAAA;AAAA,EACF;AACA,EAAA,IACE,GAAA,IACA,GAAA,CAAI,IAAA,IACJ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,gBAAgB,CAAA,IACxC,GAAA,CAAI,IAAA,EAAM,gBAAA,EAAkB,SAAS,CAAA,EACrC;AACA,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,kDAAA;AAAA,MACA,aAAa,GAAA,GAAM,SAAA,GAAY,MAAA,GAAS,IAAA,CAAK,UAAU,GAAG;AAAA,KAC5D;AACA,IAAA,IAAI,mBAA2C,EAAC;AAChD,IAAA,QAAA,CAAS,QAAQ,CAAA,IAAA,KAAQ;AACvB,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,gBAAA,EAAkB,IAAA;AAAA,QACzC,CAAA,IAAA,KAAQ,KAAK,YAAA,KAAiB;AAAA,OAChC;AACA,MAAA,gBAAA,CAAiB,IAAI,IAAI,OAAA,EAAS,aAAA;AAClC,MAAA,gBAAA,CAAiB,IAAA,GAAO,IAAI,CAAA,GAAI,OAAA,EAAS,IAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,OAAO,gBAAA;AAAA,EACT;AACF,CAAA;;;ACrEO,IAAM,QAAA,GAAW,CAAC,GAAA,KAA8C;AACrE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,sBAAA,CAAuB,KAAA,CAAM,YAAY,KAAK,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,OAAO,EAAC;AACV,CAAA;AAEA,IAAM,sBAAsB,MAAM;AAChC,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAQ;AACzB,EAAA,OAAO,CAAC,MAAc,KAAA,KAAe;AACnC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,IAChB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACF,CAAA;AAEO,IAAM,QAAA,GAAW,CAAC,GAAA,KAAqB;AAC5C,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,OAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,OAAA,IAAW,eAAA;AAAA,EACrC;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,mBAAA,IAAuB,CAAC,CAAA;AAAA,IACrD,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,2BAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,QAAQ,WAAA,EAAa;AAC9B,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,GAAG,CAAA;AACnB,CAAA;;;ACjDO,IAAM,eAAA,GAAkB,CAAC,EAAA,EAAY,EAAA,KAAe;AACzD,EAAA,IAAI;AACF,IAAAA,mBAAAA,CAAmB,eAAA,CAAgB,EAAA,EAAI,EAAE,CAAA;AACzC,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,uEAAA;AAAA,MACA,WAAA,GAAc,KAAK,GAAA,GAAM;AAAA,KAC3B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,uEAAA;AAAA,MACA,cAAc,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,wCAAA,GAAkB,SAAS,KAAK;AAAA,KAChE;AAAA,EACF;AACF,CAAA;;;ACNA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,IAAI,iBAAA,GAAoB,EAAA;AAiExB,IAAM,YAAA,GAAuB;AAAA,EAC3B,YAAY,EAAC;AAAA,EACb,KAAA,EAAO,IAAA;AAAA,EACP,YAAA,EAAc,KAAA;AAAA,EACd,WAAA,EAAa,KAAA;AAAA,EACb,gBAAgB,EAAC;AAAA;AAAA,EACjB,sBAAsB,EAAC;AAAA,EACvB,OAAA,EAAS,gBAAA;AAAA,EACT,QAAA,EAAU,iBAAA;AAAA,EACV,WAAA,EAAa;AACf,CAAA;AAGA,IAAI,eAAA,GAAoE,IAAA;AAmCjE,IAAM,qBAAA,GAAwB,CAAC,MAAA,KAA6C;AACjF,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,iBAAA;AAAA,IACX,iBAAA;AAAA,IACA,oBAAA,GAAuB,KAAA;AAAA,IACvB;AAAA,GACF,GAAI,UAAU,EAAC;AAEf,EAAA,IAAI,YAAY,CAAA,IAAK,CAAC,MAAA,CAAO,SAAA,CAAU,QAAQ,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,MAAM,qFAAyB,CAAA;AAAA,EAC3C,CAAA,MAAO;AACL,IAAA,iBAAA,GAAoB,QAAA;AAAA,EACtB;AACA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,MAAA,CAAyB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,MACxD,GAAG,YAAA;AAAA;AAAA,MAEH,iBAAA,CAAkB,iBAAiB,YAAA,EAAc;AAC/C,QAAA,IAAI,aAA4B,EAAC;AACjC,QAAA,GAAA,CAAI;AAAA,UACF,UAAA;AAAA,UACA,OAAA,EAAS,CAAA;AAAA,UACT,WAAA,EAAa;AAAA,SACd,CAAA;AACD,QAAA,GAAA,EAAI,CAAE,aAAA;AAAA,UACJ,CAAA;AAAA,UACA,KAAI,CAAE,QAAA;AAAA,UACN,CAAC,MAAM,WAAA,KAAgB;AAGrB,YAAA,eAAA,IAAmB,gBAAgB,IAAI,CAAA;AAAA,UACzC,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA;AAAA;AAAA,MAEA,kBAAA,CAAmB,iBAAiB,YAAA,EAAc;AAChD,QAAA,IAAI,GAAA,GAAM,WAAA,EAAa;AACrB,UAAA,GAAA,EAAI,CAAE,aAAA;AAAA,YACJ,KAAI,CAAE,OAAA;AAAA,YACN,KAAI,CAAE,QAAA;AAAA,YACN,CAAC,MAAM,WAAA,KAAgB;AAGrB,cAAA,eAAA,IAAmB,gBAAgB,IAAI,CAAA;AAAA,YACzC,CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAEA,MACF,CAAA;AAAA;AAAA,MAEA,MAAM,aAAA,CAAc,OAAA,EAAS,QAAA,EAAU,iBAAiB,YAAA,EAAc;AACpE,QAAA,sBAAA,CAAuB,OAAA,EAAQ;AAC/B,QAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,MAAM,UAAA;AAAA,UACvBA,mBAAAA,CAAmB,2BAAA,CAA4B,OAAA,EAAS,QAAQ;AAAA,SAClE;AAEA,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,sBAAA,CAAuB,KAAA,CAAM,uBAAA,EAAoB,gDAAA,GAAqB,GAAG,CAAA;AACzE,UAAA,sBAAA,CAAuB,cAAA,EAAe;AACtC,UAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnC,YAAA,sBAAA,CAAuB,GAAA,CAAI,IAAI,OAAO,CAAA;AAAA,UACxC;AACA,UAAA,GAAA,CAAI;AAAA,YACF,YAAA,EAAc;AAAA,WACf,CAAA;AACD,UAAA,YAAA,IAAgB,aAAa,GAAG,CAAA;AAChC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,0BAAyC,EAAC;AAE9C,QAAA,IAAI,GAAA,IAAO,GAAA,CAAI,IAAA,IAAQ,GAAA,CAAI,IAAA,CAAK,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA,EAAG;AACrE,UAAA,sBAAA,CAAuB,IAAA,CAAK,eAAA,EAAiB,UAAA,GAAa,QAAA,CAAS,GAAG,CAAC,CAAA;AAEvE,UAAA,MAAM,EAAE,MAAK,GAAI,GAAA;AACjB,UAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AAEjB,UAAA,GAAA,CAAI,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAEzB,UAAA,IAAI,YAAY,CAAA,EAAG;AAEjB,YAAA,MAAM,GAAA,EAAI,CAAE,gBAAA,CAAiB,IAAI,CAAA;AACjC,YAAA,uBAAA,GAA0B,IAAA;AAC1B,YAAA,eAAA,IAAmB,eAAA,CAAgB,uBAAA,EAAyB,IAAA,CAAK,KAAA,GAAQ,KAAK,MAAM,CAAA;AACpF,YAAA,IAAI,sBAAA,CAAuB,2BAAA,EAA4B,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC3E,cAAA,sBAAA,CAAuB,IAAA,CAAK,iBAAiB,qBAAqB,CAAA;AAClE,cAAAA,mBAAAA,CAAmB,eAAe,CAAC,CAAA;AAAA,YACrC;AACA,YAAA,GAAA,CAAI;AAAA,cACF,WAAA,EAAa,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA;AAAA,cAC/B,SAAS,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,UAAU,CAAA,GAAI;AAAA,aACnD,CAAA;AAAA,UACH,CAAA,MAAO;AAEL,YAAA,MAAM,WAAA,GAAc,IAAA;AACpB,YAAA,MAAM,iBAAiB,CAAC,GAAG,KAAI,CAAE,UAAA,EAAY,GAAG,WAAW,CAAA;AAC3D,YAAA,MAAM,GAAA,EAAI,CAAE,gBAAA,CAAiB,cAAc,CAAA;AAC3C,YAAA,uBAAA,GAA0B,IAAA;AAC1B,YAAA,eAAA,IACE,eAAA,CAAgB,uBAAA,EAAyB,IAAA,CAAK,KAAA,GAAQ,eAAe,MAAM,CAAA;AAC7E,YAAA,GAAA,CAAI;AAAA,cACF,WAAA,EAAa,IAAA,CAAK,KAAA,GAAQ,cAAA,CAAe,MAAA;AAAA,cACzC,SAAS,IAAA,CAAK,KAAA,GAAQ,cAAA,CAAe,MAAA,GAAS,UAAU,CAAA,GAAI;AAAA,aAC7D,CAAA;AAAA,UACH;AAAA,QACF,CAAA,MAAO;AACL,UAAA,sBAAA,CAAuB,KAAA,CAAM,eAAA,EAAiB,aAAA,GAAgB,QAAA,CAAS,GAAG,CAAC,CAAA;AAC3E,UAAA,YAAA,IAAgB,aAAa,IAAI,CAAA;AAAA,QACnC;AACA,QAAA,sBAAA,CAAuB,cAAA,EAAe;AAAA,MACxC,CAAA;AAAA;AAAA,MAEA,MAAM,iBAAiB,UAAA,EAAY;AAEjC,QAAA,GAAA,CAAI;AAAA,UACF,aAAa,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,IAAK,WAAW,MAAA,KAAW,CAAA;AAAA,UAChE,UAAA;AAAA,UACA,cAAc,UAAA,KAAe;AAAA,SAC9B,CAAA;AACD,QAAA,IAAI,CAAC,CAAC,iBAAA,IAAqB,iBAAA,YAA6B,QAAA,EAAU;AAChE,UAAA,MAAM,GAAA,EAAI,CAAE,oBAAA,CAAqB,UAAU,CAAA;AAAA,QAC7C;AAAA,MACF,CAAA;AAAA;AAAA,MAEA,MAAM,qBAAqB,UAAA,EAAY;AACrC,QAAA,MAAM,iBAAiB,UAAA,CACpB,MAAA;AAAA,UACC,CAAA,IAAA,KACE,IAAA,CAAK,SAAA,KAAc,MAAA,IACnB,IAAA,CAAK,UAAA,KAAe,MAAA,IACpB,IAAA,CAAK,SAAA,KAAc,IAAA,IACnB,IAAA,CAAK,UAAA,KAAe;AAAA,SACxB,CACC,GAAA,CAAI,CAAA,IAAA,KAAS,iBAAA,CAA+B,IAAI,CAAC,CAAA;AAEpD,QAAA,IAAI,CAAC,oBAAA,EAAsB;AAEzB,UAAA,GAAA,CAAI;AAAA,YACF;AAAA,WACD,CAAA;AACD,UAAA;AAAA,QACF;AAKA,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,UAAA,MAAM,IAAA,GAAO,eAAe,CAAC,CAAA;AAE7B,UAAA,GAAA,EAAI,CAAE,sBAAA,CAAuB,IAAA,CAAK,UAAA,EAAY,KAAK,SAAS,CAAA;AAE5D,UAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB;AAAA,YACrC,IAAI,IAAA,CAAK,UAAA;AAAA,YACT,IAAI,IAAA,CAAK;AAAA,WACV,CAAA;AACD,UAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAGhB,UAAA,IAAI,EAAE,iBAAA,IAAqB,iBAAA,EAAmB,MAAA,GAAS,CAAA,CAAA,EAAI;AACzD,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,YAAA,GAAe,MAAM,6BAAA,CAA8B;AAAA,YACvD,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,QAAA,EAAU;AAAA,WACX,CAAA;AACD,UAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,iBAAA,CAAkB,QAAQ,KAAA,EAAA,EAAS;AAC7D,YAAA,MAAM,kBAAA,GAAqB,kBAAkB,KAAK,CAAA;AAElD,YAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,kBAAkB,CAAA,EAAG;AACpD,cAAA,cAAA,CAAe,CAAC,CAAA,CAAE,cAAA,CAAe,SAAA,CAAU,kBAAkB,CAAC,CAAA,GAAI,MAAA;AAAA,gBAChE,aAAa,kBAAkB;AAAA,eACjC;AACA,cAAA,cAAA,CAAe,CAAC,CAAA,CAAE,cAAA,CAAe,UAAU,kBAAkB,CAAA,GAAI,IAAI,CAAA,GAAI,MAAA;AAAA,gBACvE,YAAA,CAAa,qBAAqB,IAAI;AAAA,eACxC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,QAAA,GAAA,CAAI;AAAA,UACF;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,KAAA,EAAO;AAC7B,QAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,GAAA,GAAM,cAAc,CAAA;AAC/C,QAAA,MAAM,WAAA,GACJ,OAAO,KAAA,EAAO,MAAA,KAAW,QAAA,GAAW,KAAA,EAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,MAAA,IAAU,IAAI,CAAA;AACtF,QAAA,cAAA,CAAe,QAAQ,CAAA,IAAA,KAAQ;AAC7B,UAAA,IACE,KAAK,SAAA,KAAc,WAAA,EAAa,aAChC,IAAA,CAAK,UAAA,KAAe,aAAa,UAAA,IACjC,KAAA,EAAO,WAAA,KAAgB,MAAA,IACvB,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,KAAA,CAAM,WAAW,CAAC,CAAA,EACvC;AACA,YAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,KAAM,CAAA;AAC9C,YAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAAA,UAC7C;AAAA,QACF,CAAC,CAAA;AACD,QAAA,GAAA,CAAI;AAAA,UACF;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,oBAAoB,KAAA,EAAO;AACzB,QAAA,IAAI,CAAC,oBAAA,IAAwB,CAAC,iBAAA,IAAqB,iBAAA,EAAmB,UAAU,CAAA,EAAG;AACjF,UAAA;AAAA,QACF;AACA,QAAA,MAAM,EAAE,GAAA,EAAK,EAAA,EAAI,EAAA,EAAG,GAAI,KAAA;AACxB,QAAA,IACE,GAAA,KAAQ,MAAA,IACR,GAAA,KAAQ,IAAA,IACR,EAAA,KAAO,MAAA,IACP,EAAA,KAAO,IAAA,IACP,EAAA,KAAO,MAAA,IACP,EAAA,KAAO,IAAA,EACP;AACA,UAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,GAAA,GAAM,cAAc,CAAA;AAC/C,UAAA,cAAA,CAAe,QAAQ,CAAA,MAAA,KAAU;AAE/B,YAAA,IAAI,OAAO,SAAA,KAAc,KAAA,CAAM,MAAM,MAAA,CAAO,UAAA,KAAe,MAAM,EAAA,EAAI;AACnE,cAAA,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAc;AAErB,gBAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,cAAc,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC9D,kBAAA,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACtB,oBAAA,MAAM,OAAA,GAAU,KAAA;AAChB,oBAAA,IAAI,OAAA,KAAY,KAAK,EAAA,EAAI;AAEvB,sBAAA,MAAA,CAAO,cAAA,CAAe,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA;AAAA,oBACpC;AAAA,kBACF;AAAA,gBACF,CAAC,CAAA;AAAA,cACH,CAAC,CAAA;AAAA,YACH;AAAA,UACF,CAAC,CAAA;AAED,UAAA,GAAA,CAAI;AAAA,YACF;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,sBAAA,CAAuB,IAAY,EAAA,EAAY;AAC7C,QAAA,MAAM,wBAAA,GAA2B,CAAC,GAAG,GAAA,GAAM,oBAAoB,CAAA;AAC/D,QAAA,IACE,wBAAA,CAAyB,KAAK,CAAA,IAAA,KAAQ;AACpC,UAAA,IAAA,CAAK,EAAA,KAAO,EAAA,IAAM,IAAA,CAAK,EAAA,KAAO,EAAA;AAAA,QAChC,CAAC,MAAM,MAAA,EACP;AACA,UAAA,wBAAA,CAAyB,IAAA,CAAK,EAAE,EAAA,EAAI,EAAA,EAAI,CAAA;AACxC,UAAA,eAAA,CAAgB,IAAI,EAAE,CAAA;AAAA,QACxB;AACA,QAAA,GAAA,CAAI;AAAA,UACF,oBAAA,EAAsB;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,KACF,CAAE,CAAA;AAAA,EACJ;AACA,EAAA,OAAO,eAAA;AACT;AAEO,IAAM,qBAAqB,MAAM;AACtC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,MAAM,IAAI,MAAM,iFAAyC,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,eAAA;AACT;AACO,IAAM,iCAAiC,MAAM;AAClD,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,eAAA;AACT;AACA,IAAM,eAAA,GAAkB,CAAI,QAAA,KAAgD;AAC1E,EAAA,MAAM,QAAQ,kBAAA,EAAmB;AACjC,EAAA,OAAO,MAAM,QAAQ,CAAA;AACvB,CAAA;AAoBO,IAAM,0BAA0B,MAAM;AAC3C,EAAA,OAAO,eAAA,CAAgB,WAAS,KAAK,CAAA;AACvC;AAaO,IAAM,gBAAgB,MAAM;AACjC,EAAA,OAAO,eAAA,CAAgB,CAAA,KAAA,KAAS,KAAA,CAAM,UAAU,CAAA;AAClD;AAYO,IAAM,wBAAwB,MAAM;AACzC,EAAA,OAAO,eAAA,CAAgB,CAAA,KAAA,KAAS,KAAA,CAAM,kBAAkB,CAAA;AAC1D;AAYO,IAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO,eAAA,CAAgB,CAAA,KAAA,KAAS,KAAA,CAAM,iBAAiB,CAAA;AACzD;AC9cO,IAAM,uBAAuB,OAAO;AAAA,EACzC,UAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAMA,mBAAAA,CAAmB,oBAAA,CAAqB,YAAY,SAAS,CAAA;AAC3F,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,sDAAA;AAAA,MACA,wDAAA,GAA6B;AAAA,KAC/B;AACA,IAAA,OAAO,WAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,iGAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAcO,IAAM,2BAA2B,YAAoC;AAC1E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMA,mBAAAA,CAAmB,wBAAA,EAAyB;AACjE,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,uDAAA;AAAA,MACA,CAAA,0CAAA,EAAU,QAAQ,eAAe,CAAA;AAAA,KACnC;AACA,IAAA,OAAO,MAAA,EAAQ,eAAA;AAAA,EACjB,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,sGAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,IAAA;AAAA,EACR;AACF;AAUO,IAAM,iBAAA,GAAoB,CAAC,IAAA,KAAoB;AACpD,EAAA,IAAI;AACF,IAAAA,mBAAAA,CAAmB,kBAAkB,IAAI,CAAA;AACzC,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,gDAAA;AAAA,MACA,mGAAmB,IAAI,CAAA;AAAA,KACzB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,2GAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AAAA,EACF;AACF;AAeO,IAAM,cAAA,GAAiB,CAAC,IAAA,KAAoB;AACjD,EAAA,IAAI;AACF,IAAAA,mBAAAA,CAAmB,eAAe,IAAI,CAAA;AACtC,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,6CAAA;AAAA,MACA,mGAAmB,IAAI,CAAA;AAAA,KACzB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,wGAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AAAA,EACF;AACF;AChHO,IAAM,qBAAA,GAAwB,OAAO,UAAA,KAA+C;AACzF,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAMA,mBAAAA,CAAmB,sBAAsB,UAAU,CAAA;AAC1E,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,oDAAA;AAAA,MACA,CAAA,oCAAA,EAAS,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,KACzB;AACA,IAAA,IAAI,IAAA,EAAM,GAAA,KAAQ,KAAA,CAAA,IAAa,IAAA,EAAM,QAAQ,EAAA,EAAI;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,6FAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9BA,SAAS,iBAAA,CAA2C,MAAc,WAAA,EAAoB;AACpF,EAAA,OAAO,MAAM,oBAAoB,KAAA,CAAM;AAAA,IAGrC,WAAA,CAAY,MAAa,OAAA,EAAiB;AACxC,MAAA,KAAA,CAAM,OAAO,CAAA;AACb,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAEZ,MAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,IAClD;AAAA,GACF;AACF;AAEO,IAAM,kBAAA,GAAqB,iBAAA;AAAA,EAChC,8BAEF,CAAA;;;ACnBA,IAAM,QAAA,GAAW,CAAC,IAAA,EAAM,MAAA,EAAW,EAAE,CAAA;AAE9B,IAAM,OAAA,GAAU,CAAC,KAAA,KAA+C;AAErE,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,KAAA,KAAS;AAE5B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,QACV,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IACpB,MAAA,CAAO,IAAA,CAAK,KAAK,EAAE,MAAA,KAAW,CAAA;AAAA,IAElC;AAEA,IAAA,OAAO,KAAA,KAAU,KAAA;AAAA,EACnB,CAAC,CAAA;AACH,CAAA;;;ACdO,IAAM,gBAAA,GAAmB,CAAU,GAAA,EAAU,KAAA,KAAiB;AACnE,EAAA,IAAI,UAAA,GAAkB,OAAO,GAAG,CAAA;AAChC,EAAA,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA,GAAI,KAAA,GAAQ,UAAA;AAChD,EAAA,OAAO,UAAA;AACT,CAAA;AAKO,IAAM,UAAA,GAAa,CAAC,GAAA,EAAU,KAAA,GAAgB,CAAA,KAAc;AACjE,EAAA,OAAO,gBAAA,CAAiB,KAAK,KAAK,CAAA;AACpC,CAAA;;;ACoCA,IAAMC,aAAAA,GAAuB;AAAA,EAC3B,MAAA,EAAQ,IAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY,IAAA;AAAA,EACZ,MAAA,EAAQ,IAAA;AAAA,EACR,IAAA,EAAM,IAAA;AAAA,EAEN,aAAA,EAAe,KAAA;AAAA,EACf,UAAA,EAAY,CAAA;AAAA,EACZ,eAAA,EAAiB,CAAA;AAAA,EAEjB,MAAA,EAAQ,IAAA;AAAA,EACR,QAAA,EAAU,IAAA;AAAA,EACV,SAAA,EAAW,KAAA;AAAA,EACX,SAAA,EAAW;AACb,CAAA;AAGA,IAAI,WAAA,GAAgE,IAAA;AAgB7D,IAAM,oBAAoB,CAAC;AAAA,EAChC,UAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,WAAA,GAAcC,MAAAA,CAAyB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,MACpD,GAAGD,aAAAA;AAAA,MACH,aAAa,CAAA,WAAA,KAAe;AAC1B,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,sBAAA,CAAuB,KAAA;AAAA,YACrB,qCAAA;AAAA,YACA,8GAAA,GAAsC,SAAS,WAAW;AAAA,WAC5D;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,MAAO;AACL,UAAA,sBAAA,CAAuB,IAAA,CAAK,uCAAiB,WAAW,CAAA;AAAA,QAC1D;AACA,QAAA,IAAI,KAAA,GACF,OAAO,WAAA,KAAgB,QAAA,IAAY,OAAO,WAAA,KAAgB,QAAA,GACtD,QAAA,CAAS,WAAW,CAAA,GACpB,IAAA;AACN,QAAA,GAAA,CAAI;AAAA,UACF;AAAA,SACD,CAAA;AACD,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,GAAA,CAAI;AAAA,YACF,MAAM,KAAA,CAAM;AAAA,WACb,CAAA;AAAA,QACH;AACA,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,GAAA,CAAI;AAAA,YACF,WAAW,KAAA,CAAM;AAAA,WAClB,CAAA;AAAA,QACH;AACA,QAAA,IAAI,OAAO,WAAA,EAAa;AACtB,UAAA,GAAA,CAAI;AAAA,YACF,aAAa,KAAA,CAAM;AAAA,WACpB,CAAA;AAAA,QACH;AACA,QAAA,IAAI,KAAA,EAAO,iBAAA,IAAqB,KAAA,EAAO,UAAA,EAAY;AACjD,UAAA,GAAA,CAAI;AAAA,YACF,MAAA,EAAQ;AAAA,cACN,mBAAmB,KAAA,EAAO,iBAAA;AAAA,cAC1B,YAAY,KAAA,EAAO;AAAA;AACrB,WACD,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,eAAe,KAAA,EAAO,MAAA;AAC1B,QAAA,IAAI,MAAA,GAAS,YAAA,KAAiB,MAAA,GAAY,IAAA,GAAQ,SAAS,YAAY,CAAA;AACvE,QAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AACnB,UAAA,sBAAA,CAAuB,KAAA;AAAA,YACrB,sCAAA;AAAA,YACA,uGAAA,GAAoC,SAAS,MAAM;AAAA,WACrD;AACA,UAAA,GAAA,CAAI,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAC3B,UAAA,OAAO,KAAA;AAAA,QACT,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAC5B,UAAA,sBAAA,CAAuB,IAAA,CAAK,wCAAkB,MAAM,CAAA;AACpD,UAAA,GAAA,EAAI,CAAE,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA;AAAA,QAC1C;AACA,QAAA,GAAA,CAAI;AAAA,UACF,MAAA;AAAA,UACA,SAAA,EAAA,CACI,QAAQ,mBAAA,IAAuB,CAAA,MAAO,KAAK,MAAA,EAAQ,QAAA,KAAa,GAAA,IAClE,MAAA,EAAQ,mBAAA,KAAwB;AAAA,SACnC,CAAA;AACD,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAAA,MACA,cAAc,CAAA,MAAA,KAAU;AACtB,QAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AACnB,UAAA,sBAAA,CAAuB,KAAA;AAAA,YACrB,sCAAA;AAAA,YACA,kCAAA,GAA2B,SAAS,MAAM;AAAA,WAC5C;AACA,UAAA,GAAA,CAAI,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAC3B,UAAA;AAAA,QACF;AACA,QAAA,GAAA,CAAI,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAC5B,QAAA,MAAM,YACJ,OAAO,MAAA,KAAW,QAAA,GAAY,QAAA,CAAS,MAAM,CAAA,GAAqB,MAAA;AACpE,QAAA,sBAAA,CAAuB,IAAA,CAAK,qCAAiB,SAAS,CAAA;AACtD,QAAA,GAAA,CAAI;AAAA,UACF,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,GAAA,EAAI,CAAE,gBAAA,CAAiB,SAAA,CAAU,UAAU,CAAA;AAC3C,QAAA,GAAA,GAAM,cAAA,EAAe;AAAA,MACvB,CAAA;AAAA,MACA,kBAAkB,CAAA,OAAA,KAAW;AAC3B,QAAA,IAAI,QAAQ,OAAO,CAAA,IAAK,QAAQ,GAAA,EAAI,CAAE,MAAM,CAAA,EAAG;AAC7C,UAAA,sBAAA,CAAuB,KAAA;AAAA,YACrB,0CAAA;AAAA,YACA,mDAAA,GAAkC,SAAS,OAAO;AAAA,WACpD;AACA,UAAA;AAAA,QACF;AACA,QAAA,sBAAA,CAAuB,IAAA,CAAK,yCAAqB,OAAO,CAAA;AACxD,QAAA,MAAM,SAAA,GAAY,KAAI,CAAE,MAAA;AACxB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,UAAA,GAAa,OAAA;AACvB,UAAA,GAAA,CAAI;AAAA,YACF,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAAA,MACA,gBAAgB,YAAY;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAMD,oBAAmB,cAAA,EAAe;AAChE,UAAA,sBAAA,CAAuB,IAAA;AAAA,YACrB,gDAAA;AAAA,YACA,wDAAA,GAA6B;AAAA,WAC/B;AACA,UAAA,GAAA,EAAI,CAAE,mBAAmB,WAAW,CAAA;AACpC,UAAA,OAAO,WAAA;AAAA,QACT,SAAS,KAAA,EAAO;AACd,UAAA,sBAAA,CAAuB,KAAA,CAAM,wDAAA,EAAa,+BAAA,GAAc,QAAA,CAAS,KAAK,CAAC,CAAA;AACvE,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA;AAAA,MACA,oBAAoB,CAAA,UAAA,KAAc;AAChC,QAAA,UAAA,GAAa,OAAO,UAAU,CAAA;AAC9B,QAAA,IAAI,eAAA,GAAkB,WAAW,UAAA,EAAA,CAAA,mBAAoC;AACrE,QAAA,IAAI,eAAA,KAAoB,GAAA,EAAI,CAAE,UAAA,EAAY;AACxC,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,eAAA,KAAA,CAAA;AACf,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,UAAA,IAAc,UAAA,EAAW;AAAA,QAC3B,CAAA,MAAO;AACL,UAAA,SAAA,IAAa,SAAA,EAAU;AAAA,QACzB;AACA,QAAA,GAAA,CAAI;AAAA,UACF,UAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA,EAAA,CAAW,UAAA,GAAA,CAAA,sBAAA,CAAA;AAAA,UACX,SAAA,EAAA,CAAY,UAAA,GAAA,CAAA,wBAAA,CAAA;AAAA,UACZ,SAAA,EAAA,CAAY,UAAA,GAAA,CAAA,uBAAA,CAAA;AAAA,SACb,CAAA;AAAA,MACH,CAAA;AAAA,MACA,0BAA0B,YAAY;AACpC,QAAA,MAAM,eAAA,GAAkB,MAAM,wBAAA,EAAyB;AACvD,QAAA,GAAA,CAAI;AAAA,UACF,iBAAiB,eAAA,IAAmB;AAAA,SACrC,CAAA;AAAA,MACH,CAAA;AAAA,MACA,uBAAuB,CAAA,eAAA,KAAmB;AACxC,QAAA,GAAA,CAAI;AAAA,UACF;AAAA,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,gBAAA,EAAkB,OAAM,UAAA,KAAc;AACpC,QAAA,MAAM,eAAA,GAAkB,UAAA,IAAc,GAAA,EAAI,CAAE,MAAA,EAAQ,UAAA;AACpD,QAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,UAAA,sBAAA,CAAuB,KAAA;AAAA,YACrB,2BAAA;AAAA,YACA,kIAAgF,UAAU,CAAA,6BAAA;AAAA,WAC5F;AACA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,qBAAA,CAAsB,eAAe,CAAA;AACvD,QAAA,GAAA,CAAI,EAAE,UAAA,EAAY,GAAA,EAAK,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,yBAAyB,YAA0C;AACjE,QAAA,MAAM,aAAA,GAAgB,KAAI,CAAE,MAAA;AAE5B,QAAA,sBAAA,CAAuB,IAAA;AAAA,UACrB,sDAAA;AAAA,UACA,aAAA,EAAe;AAAA,SACjB;AAEA,QAAA,IAAI,CAAC,aAAA,EAAe;AAClB,UAAA,sBAAA,CAAuB,KAAA,CAAM,oEAAgB,aAAa,CAAA;AAC1D,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GACJ,aAAA,EAAe,QAAA,KAAa,IAAA,GACxB,MAAM,GAAA,EAAI,CAAE,kBAAA,EAAmB,GAC/B,MAAM,GAAA,EAAI,CAAE,aAAA,EAAc;AAEhC,UAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,GAAA;AAChB,UAAA,sBAAA,CAAuB,IAAA,CAAK,qEAAiB,KAAK,CAAA;AAClD,UAAA,OAAO,KAAA;AAAA,QACT,SAAS,CAAA,EAAQ;AACf,UAAA,IAAI,aAAa,kBAAA,EAAoB;AACnC,YAAA,QAAQ,EAAE,IAAA;AAAM,cACd,KAAK,gBAAA;AAAA,cACL,KAAK,WAAA;AACH,gBAAA,sBAAA,CAAuB,IAAA,CAAK,kHAAA,EAAwB,CAAA,CAAE,OAAO,CAAA;AAC7D,gBAAA,OAAO,KAAA;AAAA,cACT,KAAK,eAAA;AACH,gBAAA,sBAAA,CAAuB,KAAA,CAAM,sGAAA,EAAsB,CAAA,CAAE,OAAO,CAAA;AAC5D,gBAAA,OAAO,MAAA;AAAA,cACT;AACE,gBAAA,sBAAA,CAAuB,KAAA,CAAM,4CAAY,CAAC,CAAA;AAC1C,gBAAA,OAAO,MAAA;AAAA;AACX,UACF,CAAA,MAAO;AACL,YAAA,sBAAA,CAAuB,KAAA,CAAM,4CAAY,CAAC,CAAA;AAC1C,YAAA,OAAO,MAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,aAAA,EAAe,OAAO,SAAA,EAAoB,UAAA,KAA8C;AACtF,QAAA,MAAM,cAAA,GAAiB,SAAA,IAAa,GAAA,EAAI,CAAE,MAAA,EAAQ,SAAA;AAClD,QAAA,MAAM,eAAA,GAAkB,UAAA,IAAc,GAAA,EAAI,CAAE,MAAA,EAAQ,UAAA;AAEpD,QAAA,sBAAA,CAAuB,IAAA;AAAA,UACrB,kDAAA;AAAA,UACA,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,eAAe,CAAA;AAAA,SACtC;AAEA,QAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,eAAA,EAAiB;AACvC,UAAA,MAAM,IAAI,kBAAA,CAAmB,eAAA,EAAiB,gDAA4B,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,MAAM,UAAA;AAAA,UACvBA,mBAAAA,CAAmB,wBAAA,CAAyB,cAAA,EAAgB,eAAe;AAAA,SAC7E;AAEA,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAM,IAAI,kBAAA;AAAA,YACR,WAAA;AAAA,YACA,CAAA,uFAAA,EAAoB,GAAA,CAAI,OAAA,IAAW,GAAG,CAAA;AAAA,WACxC;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,MAAM,IAAI,kBAAA,CAAmB,WAAA,EAAa,8DAAY,CAAA;AAAA,QACxD;AAEA,QAAA,sBAAA,CAAuB,IAAA,CAAK,iDAAqC,GAAG,CAAA;AAEpE,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,MAEA,kBAAA,EAAoB,OAAO,SAAA,KAA6C;AACtE,QAAA,sBAAA,CAAuB,IAAA,CAAK,iDAAqC,SAAS,CAAA;AAE1E,QAAA,MAAM,cAAA,GAAiB,SAAA,IAAa,GAAA,EAAI,CAAE,MAAA,EAAQ,SAAA;AAElD,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,MAAM,IAAI,kBAAA,CAAmB,eAAA,EAAiB,sDAAmB,CAAA;AAAA,QACnE;AAEA,QAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,MAAM,UAAA;AAAA,UACvBA,mBAAAA,CAAmB,yBAAyB,cAAc;AAAA,SAC5D;AAEA,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAM,IAAI,kBAAA;AAAA,YACR,WAAA;AAAA,YACA,CAAA,uFAAA,EAAoB,GAAA,CAAI,OAAA,IAAW,GAAG,CAAA;AAAA,WACxC;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,MAAM,IAAI,kBAAA,CAAmB,WAAA,EAAa,8DAAY,CAAA;AAAA,QACxD;AAEA,QAAA,sBAAA,CAAuB,IAAA,CAAK,2CAA+B,GAAG,CAAA;AAE9D,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,KACF,CAAE,CAAA;AAAA,EACJ;AACA,EAAA,OAAO,WAAA;AACT;AAEO,IAAM,iBAAiB,MAAM;AAClC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,mFAA2C,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,WAAA;AACT;AACO,IAAM,6BAA6B,MAAM;AAC9C,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,WAAA;AACT;AAEA,IAAMG,gBAAAA,GAAkB,CAAI,QAAA,KAAgD;AAC1E,EAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,EAAA,OAAO,MAAM,QAAQ,CAAA;AACvB,CAAA;AAkCO,IAAM,mBAAA,GAAsB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,KAAK;AAYhE,IAAM,SAAA,GAAY,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,MAAM;AAY7D,IAAM,cAAA,GAAiB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,KAAK;AAYjE,IAAM,eAAA,GAAkB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,MAAM;AAYnE,IAAM,aAAA,GAAgB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,IAAI;AAY/D,IAAM,mBAAA,GAAsB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,UAAU;AAY3E,IAAM,YAAA,GAAe,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,SAAS;AAYnE,IAAM,cAAA,GAAiB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,WAAW;AAYvE,IAAM,kBAAA,GAAqB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,SAAS;AAazE,IAAM,eAAA,GAAkB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,MAAM;AAMnE,IAAM,cAAA,GAAiB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,UAAU;AAMtE,IAAM,iBAAA,GAAoB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,QAAQ;AAKvE,IAAM,kBAAA,GAAqB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,SAAS;AAKzE,IAAM,kBAAA,GAAqB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,SAAS;AAYzE,IAAM,qBAAA,GAAwB,MACnCA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,OAAO,KAAA,CAAM,eAAe,MAAM,CAAC;AAevD,IAAM,kBAAA,GAAqB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,cAAc;AAQ9E,IAAM,8BAAA,GAAiC,MAC5CA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,qBAAqB;AAe/C,IAAM,WAAA,GAAc,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,WAAW;AAcpE,IAAM,eAAA,GAAkB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,YAAY;AAczE,IAAM,mBAAA,GAAsB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,gBAAgB;AAgBjF,IAAM,qBAAA,GAAwB,MAAMA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,kBAAkB;AAerF,IAAM,0BAAA,GAA6B,MACxCA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,MAAM,uBAAuB;AChoBjD,IAAM,wBAAA,GAA2B;AAKjC,IAAM,4BAAA,GAA+B;AAG5C,IAAI,YAAA,GAAoB,IAAI,kBAAA,CAAmB,aAAA,CAAc,kBAAkB,CAAA;AAC/E,IAAI,2BAAA;AACJ,IAAI,qCAAA;AAcG,IAAM,6BAAA,GAAgC,CAC3C,yBAAA,EACA,mCAAA,KACG;AACH,EAAA,MAAMC,mBAAkB,8BAAA,EAA+B;AACvD,EAAA,MAAM,oBAAA,GAAuBA,gBAAAA,GAAkBA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,KAAK,CAAA,GAAI,IAAA;AACjF,EAAA,IAAI,yBAAyB,IAAA,EAAM;AACjC,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,wIAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,uBAAA,GAA0B,sBAAsB,uBAAA,IAA2B,IAAA;AAEjF,EAAA,MAAMC,eAAc,0BAAA,EAA2B;AAC/C,EAAA,MAAM,gBAAA,GAAmBA,YAAAA,GAAcA,YAAAA,CAAY,CAAA,KAAA,KAAS,KAAK,CAAA,GAAI,IAAA;AACrE,EAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,oJAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,kBAAA,GAAqB,kBAAkB,kBAAA,IAAsB,IAAA;AACnE,EAAA,MAAM,qBAAA,GAAwB,kBAAkB,qBAAA,IAAyB,IAAA;AACzE,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAA,IAAU,IAAA;AAI3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,2BAA2B,CAAA;AAC1C,IAAA,2BAAA,GAA8B,YAAA,CAAa,WAAA;AAAA,MACzC,wBAAA;AAAA,MACA,CAAC,KAAA,KAAe;AACd,QAAA,sBAAA,CAAuB,IAAA;AAAA,UACrB,wBAAA;AAAA,UACA,4BAAA,GAAwB,SAAS,KAAK;AAAA,SACxC;AACA,QAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACzC,QAAA,IACE,MAAA,EAAQ,cAAc,WAAA,EAAa,SAAA,IACnC,QAAQ,UAAA,KAAe,WAAA,EAAa,cACpC,kBAAA,EACA;AACA,UAAA,kBAAA,CAAmB,MAAM,WAAW,CAAA;AAAA,QACtC;AACA,QAAA,IAAI,uBAAA,EAAyB;AAC3B,UAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,QAC/B;AACA,QAAA,yBAAA,IAA6B,0BAA0B,KAAK,CAAA;AAAA,MAC9D;AAAA,KACF;AAGA,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,CAAe,2BAA2B,CAAA;AAC1C,MAAA,2BAAA,GAA8B,IAAA;AAAA,IAChC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,uBAAA,EAAyB,kBAAA,EAAoB,MAAM,CAAC,CAAA;AAIxD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,qCAAqC,CAAA;AACpD,IAAA,qCAAA,GAAwC,YAAA,CAAa,WAAA;AAAA,MACnD,wBAAA;AAAA,MACA,CAAC,KAAA,KAAe;AACd,QAAA,sBAAA,CAAuB,IAAA;AAAA,UACrB,4BAAA;AAAA,UACA,8BAAA,GAA4B,SAAS,KAAK;AAAA,SAC5C;AACA,QAAA,MAAM,eAAA,GAAkB,MAAM,KAAA,EAAO,eAAe,IAAI,CAAA,GAAI,MAAA,CAAO,OAAO,eAAe,CAAA;AACzF,QAAA,qBAAA,IAAyB,sBAAsB,eAAe,CAAA;AAC9D,QAAA,mCAAA,IAAuC,oCAAoC,KAAK,CAAA;AAAA,MAClF;AAAA,KACF;AAGA,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,CAAe,qCAAqC,CAAA;AACpD,MAAA,qCAAA,GAAwC,IAAA;AAAA,IAC1C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,qBAAA,EAAuB,mCAAmC,CAAC,CAAA;AACjE;AAEA,IAAM,cAAA,GAAiB,CAAC,QAAA,KAAyC;AAC/D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,QAAA,GAAW,MAAA;AAAA,EACb;AACF,CAAA;AC9GO,IAAM,iBAAA,GAAoB,CAAC,SAAA,KAA2B;AAC3D,EAAA,sBAAA,CAAuB,IAAA;AAAA,IACrB,mBAAA;AAAA,IACA,iEAAoB,SAAA,CAAU;AAAA,GAChC;AACA,EAAA,yBAAA,CAA0B,mBAAA,CAAoB;AAAA,IAC5C,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,SAAS;AAAA,GACjC,CAAA;AACH;AAWO,IAAM,qBAAqB,MAAM;AACtC,EAAA,sBAAA,CAAuB,IAAA,CAAK,sBAAsB,wCAAU,CAAA;AAC5D,EAAA,yBAAA,CAA0B,mBAAA,EAAoB;AAChD;;;AC/BO,IAAM,8BAAA,GAAiC;AAE9C,IAAI,yBAAA;AACJ,IAAI,iBAAA,GAAyB,IAAIC,kBAAAA,CAAmBC,aAAAA,CAAc,yBAAyB,CAAA;AAoBpF,IAAM,4BAAA,GAA+B,CAAC,MAAA,KAIvC;AACJ,EAAA,MAAM;AAAA,IACJ,8BAAA;AAAA,IACA,gCAAA;AAAA,IACA;AAAA,GACF,GAAI,UAAU,EAAC;AACf,EAAA,MAAMH,mBAAkB,8BAAA,EAA+B;AACvD,EAAA,MAAM,oBAAA,GAAuBA,gBAAAA,GAAkBA,gBAAAA,CAAgB,CAAA,KAAA,KAAS,KAAK,CAAA,GAAI,IAAA;AACjF,EAAA,IAAI,yBAAyB,IAAA,EAAM;AACjC,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,oJAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAMC,eAAc,0BAAA,EAA2B;AAC/C,EAAA,MAAM,gBAAA,GAAmBA,YAAAA,GAAcA,YAAAA,CAAY,CAAA,KAAA,KAAS,KAAK,CAAA,GAAI,IAAA;AAErE,EAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,wIAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,sBAAsB,WAAA,IAAe,IAAA;AACzD,EAAA,MAAM,iBAAA,GAAoB,sBAAsB,iBAAA,IAAqB,IAAA;AAErE,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAA,IAAU,IAAA;AAC3C,EAAA,MAAM,aAAA,GAAgB,kBAAkB,aAAA,IAAiB,IAAA;AACzD,EAAA,MAAM,uBAAA,GAA0B,kBAAkB,uBAAA,IAA2B,IAAA;AAE7E,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,SAAS,IAAI,CAAA;AAIjE,EAAAG,UAAU,MAAM;AACd,IAAAC,gBAAe,yBAAyB,CAAA;AACxC,IAAA,yBAAA,GAA4B,iBAAA,CAAkB,WAAA;AAAA,MAC5C,8BAAA;AAAA,MACA,CAAC,KAAA,KAAe;AACd,QAAA,sBAAA,CAAuB,IAAA,CAAK,gCAAgC,mCAA4B,CAAA;AAGxF,QAAA,iBAAA,IACE,kBAAkB,CAAA,IAAA,KAAQ;AACxB,UAAA,gCAAA,IAAoC,iCAAiC,IAAI,CAAA;AACzE,UAAA,IAAI,2BAA2B,wBAAA,EAA0B;AACvD,YAAA,uBAAA,EAAwB,CAAE,KAAK,CAAA,GAAA,KAAO;AACpC,cAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,CAAA,EAAG;AAGrC,gBAAA,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,cAC3B;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AACH,QAAA,8BAAA,IAAkC,+BAA+B,KAAK,CAAA;AAAA,MACxE;AAAA,KACF;AAGA,IAAA,OAAO,MAAM;AACX,MAAAA,gBAAe,yBAAyB,CAAA;AACxC,MAAA,yBAAA,GAA4B,IAAA;AAAA,IAC9B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAGtB,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,wBAAA,EAA0B;AAC/B,IAAA,IAAI,aAAA,KAAkB,IAAA,IAAQ,WAAA,KAAgB,IAAA,EAAM;AAClD,MAAA,kBAAA,EAAmB;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,WAAA,EAAa,wBAAwB,CAAC,CAAA;AAIzD,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,wBAAA,EAA0B;AAC/B,IAAA,IAAI,UAAU,kBAAA,EAAoB;AAChC,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,MAAA,IAAI,2BAA2B,wBAAA,EAA0B;AACvD,QAAA,uBAAA,EAAwB,CAAE,KAAK,CAAA,GAAA,KAAO;AACpC,UAAA,IAAI,QAAQ,KAAA,EAAO;AAGjB,YAAA,iBAAA,IACE,kBAAkB,CAAA,IAAA,KAAQ;AACxB,cAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG;AACX,gBAAA,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,cAC3B;AAAA,YACF,CAAC,CAAA;AAAA,UACL;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,kBAAA,EAAoB,wBAAwB,CAAC,CAAA;AAC3D;AACA,IAAMC,eAAAA,GAAiB,CAAC,QAAA,KAAyC;AAC/D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,QAAA,GAAW,MAAA;AAAA,EACb;AACF,CAAA;ACtIO,IAAM,yBAAA,GAA4B;AAEzC,IAAIC,0BAAAA;AACJ,IAAIC,kBAAAA,GAAyB,IAAIL,kBAAAA,CAAmBC,aAAAA,CAAc,yBAAyB,CAAA;AAapF,IAAM,4BAAA,GAA+B,CAAC,0BAAA,KAAsD;AACjG,EAAA,MAAMF,eAAc,0BAAA,EAA2B;AAC/C,EAAA,MAAM,gBAAA,GAAmBA,YAAAA,GAAcA,YAAAA,CAAY,CAAA,KAAA,KAAS,KAAK,CAAA,GAAI,IAAA;AACrE,EAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,oJAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,YAAA,GAAe,kBAAkB,YAAA,IAAgB,IAAA;AAIvD,EAAAG,UAAU,MAAM;AACd,IAAAC,gBAAeC,0BAAyB,CAAA;AACxC,IAAAA,6BAA4BC,kBAAAA,CAAkB,WAAA;AAAA,MAC5C,yBAAA;AAAA,MACA,CAAC,CAAA,KAAwC;AACvC,QAAA,sBAAA,CAAuB,IAAA,CAAK,2BAA2B,6CAA+B,CAAA;AACtF,QAAA,IAAI,YAAY,EAAC;AACjB,QAAA,IAAI;AACF,UAAA,SAAA,GAAY,OAAO,EAAE,MAAA,KAAW,QAAA,GAAW,KAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA;AAAA,QACtE,SAAS,KAAA,EAAO;AACd,UAAA,sBAAA,CAAuB,IAAA;AAAA,YACrB,yBAAA,GACE,uEAAA;AAAA,YACF;AAAA,WACF;AAAA,QACF;AACA,QAAA,YAAA,IAAgB,aAAa,SAAS,CAAA;AACtC,QAAA,0BAAA,IAA8B,2BAA2B,CAAC,CAAA;AAAA,MAC5D;AAAA,KACF;AAGA,IAAA,OAAO,MAAM;AACX,MAAAF,gBAAeC,0BAAyB,CAAA;AACxC,MAAAA,0BAAAA,GAA4B,IAAA;AAAA,IAC9B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AACnB;AACA,IAAMD,eAAAA,GAAiB,CAAC,QAAA,KAAyC;AAC/D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,MAAA,EAAO;AAChB,IAAA,QAAA,GAAW,MAAA;AAAA,EACb;AACF,CAAA;ACtDO,IAAM,qBAAqB,OAAO;AAAA,EACvC,qBAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,IAAI;AACF,IAAA,MAAMT,mBAAAA,CAAmB,kBAAA,CAAmB,qBAAA,EAAuB,UAAA,EAAY,SAAS,CAAA;AACxF,IAAA,sBAAA,CAAuB,IAAA,CAAK,uDAAgD,kDAAU,CAAA;AAAA,EACxF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,gGAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AAAA,EACF;AACF;AAYO,IAAM,yBAAyB,OAAO;AAAA,EAC3C,UAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMA,mBAAAA,CAAmB,sBAAA,CAAuB,YAAY,SAAS,CAAA;AACpF,IAAA,sBAAA,CAAuB,IAAA,CAAK,uDAAgD,MAAM,CAAA;AAClF,IAAA,OAAO,CAAC,QAAQ,IAAA,KAAS,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,4EAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AC/CO,IAAM,qBAAA,GAAwB,OAAO,MAAA,KAAwB;AAClE,EAAA,IAAI;AACF,IAAA,MAAMA,mBAAAA,CAAmB,sBAAsB,MAAM,CAAA;AACrD,IAAA,sBAAA,CAAuB,IAAA,CAAK,sDAA+C,gCAAO,CAAA;AAClF,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,IAAA,CAAK,sDAA+C,gCAAO,CAAA;AAClF,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAWO,IAAM,oBAAoB,OAAO;AAAA,EACtC,UAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,IAAI;AACF,IAAA,MAAMA,mBAAAA,CAAmB,iBAAA,CAAkB,UAAA,EAAY,SAAS,CAAA;AAChE,IAAA,sBAAA,CAAuB,IAAA,CAAK,kDAA2C,qDAAa,CAAA;AAAA,EACtF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,uEAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;ACvCO,IAAM,2BAA2B,YAAY;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMA,mBAAAA,CAAmB,wBAAA,EAAyB;AACjE,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,4JAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,sKAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAWO,IAAM,oBAAoB,OAAO;AAAA,EACtC,UAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMA,mBAAAA,CAAmB,iBAAA,CAAkB,YAAY,SAAS,CAAA;AAC/E,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,4GAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,qHAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAYO,IAAM,oBAAoB,OAAO;AAAA,EACtC,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,IAAI;AACF,IAAA,MAAMA,mBAAAA,CAAmB,iBAAA,CAAkB,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAA;AAC1E,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,6CAAA;AAAA,MACA,wCAAU,QAAQ,CAAA;AAAA,KACpB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,uEAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAWO,IAAM,2BAA2B,OAAO;AAAA,EAC7C,UAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,IAAI;AACF,IAAA,MAAMA,mBAAAA,CAAmB,YAAA,CAAa,UAAA,EAAY,SAAS,CAAA;AAC3D,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,8CAAA;AAAA,MACA,CAAA,gDAAA,EAAqB,UAAU,CAAA,aAAA,EAAgB,SAAS,CAAA,MAAA;AAAA,KAC1D;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,8EAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AC3GO,IAAM,kBAAkB,OAAO;AAAA,EACpC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAMM;AACJ,EAAA,IAAI;AACF,IAAA,MAAMA,mBAAAA,CAAmB,sBAAA;AAAA,MACvB,UAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,qDAAA;AAAA,MACA,CAAA,0CAAA,EAAoB,UAAU,CAAA,aAAA,EAAgB,SAAS,CAAA,MAAA;AAAA,KACzD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,4EAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAcO,IAAM,iBAAA,GAAoB,OAAO,EAAE,SAAA,EAAU,KAA6B;AAC/E,EAAA,IAAI;AACF,IAAA,MAAMA,mBAAAA,CAAmB,sCAAsC,SAAS,CAAA;AACxE,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,oEAAA;AAAA,MACA,4CAAmB,SAAS,CAAA,MAAA;AAAA,KAC9B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,2FAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAaO,IAAM,eAAe,OAAO;AAAA,EACjC,SAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,IAAI;AACF,IAAA,MAAMA,mBAAAA,CAAmB,yBAAA,CAA0B,SAAA,EAAW,UAAU,CAAA;AACxE,IAAA,sBAAA,CAAuB,IAAA;AAAA,MACrB,wDAAA;AAAA,MACA,CAAA,yCAAA,EAAmB,SAAS,CAAA,cAAA,EAAiB,UAAU,CAAA,MAAA;AAAA,KACzD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,sBAAA,CAAuB,KAAA;AAAA,MACrB,+EAAA;AAAA,MACA,+BAAA,GAAc,SAAS,KAAK;AAAA,KAC9B;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF","file":"index.js","sourcesContent":["/**\r\n * 设备连接状态---不在连接中\r\n */\r\nexport const NOT_CONNECTING = 0\r\n/**\r\n * 设备类型---绑定\r\n */\r\nexport const DEVICE_TYPE_BIND = 1\r\n/**\r\n * 设备类型---分享\r\n */\r\nexport const DEVICE_TYPE_SHARE = 2\r\n/**\r\n * 设备类型---直连设备\r\n */\r\nexport const DEVICE_ACCESS_TYPE_DIRECTLY = 0\r\n/**\r\n * 设备类型---网关设备\r\n */\r\nexport const DEVICE_ACCESS_TYPE_GATEWAY = 1\r\n/**\r\n * 设备类型---网关子设备\r\n */\r\nexport const DEVICE_ACCESS_TYPE_GATEWAY_CHILD = 2\r\n/**\r\n * 设备名称--长度\r\n */\r\nexport const DEVICE_NAME_MAX_LENGTH = 14\r\n\r\n/** 设备在线状态枚举 */\r\nexport enum onlineStatus {\r\n ALL_OFFLINE = 0, // 全部离线\r\n WS_ONLINE = 1, // 仅 WebSocket 在线\r\n WIFI_ONLINE = 1 << 1, // 仅 Wi-Fi 在线\r\n WS_WIFI_ONLINE = 3, // WebSocket + Wi-Fi 在线\r\n BLE_ONLINE = 1 << 2, // 仅蓝牙在线\r\n WS_BLE_ONLINE = 5, // WebSocket + 蓝牙在线\r\n WIFI_BLE_ONLINE = 6, // Wi-Fi + 蓝牙在线\r\n ALL_ONLINE = 7, // 全部在线\r\n}\r\n\r\n/**\r\n * loading超时时间\r\n */\r\nexport const LOADING_SEND_TIMEOUT = 60000\r\n","// src/utils/DeviceKitParamsManager.ts\r\nimport QuecRNLogModule from '@quec/rn-log-module/src/module'\r\n\r\nconst BASE_TAG = '💫 Quec_Device_Kit '\r\n\r\ntype LoadingCallback = () => void\r\ntype TipCallback = (message: string) => void\r\n\r\ninterface LogModule {\r\n i: (tag: string, message: string) => void\r\n e: (tag: string, message: string) => void\r\n}\r\n\r\nclass DeviceKitParamsManager {\r\n private static useInternalStore = true // 是否使用内部 store,默认 true\r\n\r\n private static loadingCallback: LoadingCallback | null = null\r\n private static loadingDismissCallback: LoadingCallback | null = null\r\n private static tipCallback: TipCallback | null = null\r\n private static logModule: LogModule | null = QuecRNLogModule // 默认使用 QuecRNLogModule\r\n private static autoConnectCurrentDevice: boolean | null\r\n\r\n /** 是否使用内部管理器 */\r\n static setTSLStore() {}\r\n\r\n /** 注册回调 */\r\n public registerCallbacks({\r\n loadingCallback,\r\n loadingDismissCallback,\r\n tipCallback,\r\n }: {\r\n loadingCallback?: LoadingCallback\r\n loadingDismissCallback?: LoadingCallback\r\n tipCallback?: TipCallback\r\n }) {\r\n if (loadingCallback) DeviceKitParamsManager.loadingCallback = loadingCallback\r\n if (loadingDismissCallback)\r\n DeviceKitParamsManager.loadingDismissCallback = loadingDismissCallback\r\n if (tipCallback) DeviceKitParamsManager.tipCallback = tipCallback\r\n }\r\n\r\n /** 触发 Loading */\r\n public loading() {\r\n DeviceKitParamsManager.loadingCallback?.()\r\n }\r\n\r\n /** 关闭 Loading */\r\n public loadingDismiss() {\r\n DeviceKitParamsManager.loadingDismissCallback?.()\r\n }\r\n\r\n /** 触发提示 */\r\n public tip(message: string) {\r\n DeviceKitParamsManager.tipCallback?.(message)\r\n }\r\n\r\n public setAutoConnectCurrentDevice(autoConnectCurrentDevice: boolean) {\r\n DeviceKitParamsManager.autoConnectCurrentDevice = autoConnectCurrentDevice\r\n }\r\n\r\n public getAutoConnectCurrentDevice() {\r\n return DeviceKitParamsManager.autoConnectCurrentDevice === true\r\n }\r\n\r\n /** 设置外部日志模块 */\r\n public static setLogger(logModule: LogModule) {\r\n this.logModule = logModule\r\n }\r\n /** 自动关闭所有 console 输出(仅限生产环境) */\r\n public static autoDisableLog() {\r\n const isProduction = !__DEV__\r\n if (isProduction) {\r\n const noop = () => {}\r\n console.log = noop\r\n console.info = noop\r\n console.warn = noop\r\n console.error = noop\r\n console.debug = noop\r\n console.trace = noop\r\n }\r\n }\r\n\r\n /** 通用日志方法 */\r\n private log(level: 'i' | 'e', tag: string, message: any) {\r\n if (typeof message === 'object') {\r\n message = JSON.stringify(message)\r\n }\r\n\r\n if (DeviceKitParamsManager.logModule) {\r\n DeviceKitParamsManager.logModule[level](BASE_TAG + tag, '' + message)\r\n }\r\n console.log(`${BASE_TAG}${tag} ${level} ==> ${'' + message}`)\r\n }\r\n\r\n /** info日志方法 */\r\n public info(tag: string, message: any) {\r\n this.log('i', tag, message)\r\n }\r\n\r\n /** err日志方法 */\r\n public error(tag: string, message: any) {\r\n this.log('e', tag, message)\r\n }\r\n}\r\n\r\nexport const deviceKitParamsManager = new DeviceKitParamsManager()\r\n","// 捕获错误并返回\r\n/**\r\n * @param { Promise } promise\r\n * @param { Object= } errorExt 额外的错误信息\r\n * @return { Promise }\r\n */\r\nexport async function to<T, U = Error>(\r\n promise: Promise<T>,\r\n errorExt?: object\r\n): Promise<[U, undefined] | [null, T]> {\r\n return promise\r\n .then<[null, T]>((data: T) => [null, data])\r\n .catch<[U, undefined]>((err: U) => {\r\n if (errorExt) {\r\n const parsedError = Object.assign({}, err, errorExt)\r\n return [parsedError, undefined]\r\n }\r\n\r\n return [err, undefined]\r\n })\r\n}\r\n\r\nexport default to\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport to from '../utils/to'\r\n\r\n// 请求设备在线状态\r\nexport const getDeviceOnline = async ({\r\n pk,\r\n dk,\r\n}: {\r\n pk: string\r\n dk: string\r\n}) => {\r\n const [err, res] = await to<{ onlineState: number | string }, any>(\r\n QuecRNDeviceModule.getDeviceOnlineState(pk, dk)\r\n )\r\n if (err) {\r\n deviceKitParamsManager.error(\r\n '❌ ❔ getDeviceOnlineState 获取设备状态失败',\r\n 'error ==> ' + err\r\n )\r\n return false\r\n }\r\n if (res) {\r\n deviceKitParamsManager.info(\r\n ' ✅ ❔ getDeviceOnlineState 获取设备状态成功',\r\n 'res ==> ' + pk + '_' + dk + JSON.stringify(res)\r\n )\r\n if (Number(res.onlineState) !== 0) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n// 请求设备通道状态\r\nexport const getDeviceOnlineState = async ({\r\n pk,\r\n dk,\r\n}: {\r\n pk: string\r\n dk: string\r\n}) => {\r\n const [err, res] = await to<{ onlineState: number | string }, any>(\r\n QuecRNDeviceModule.getDeviceOnlineState(pk, dk)\r\n )\r\n if (err) {\r\n deviceKitParamsManager.error(\r\n '❌ ❔ getDeviceOnlineState 获取设备状态失败',\r\n 'error ==> ' + err\r\n )\r\n return undefined\r\n }\r\n if (res) {\r\n deviceKitParamsManager.info(\r\n ' ✅ ❔ getDeviceOnlineState 获取设备状态成功',\r\n 'res ==> ' + pk + '_' + dk + JSON.stringify(res)\r\n )\r\n if (Number(res.onlineState) !== 0) {\r\n return res.onlineState\r\n }\r\n }\r\n return undefined\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport to from '../utils/to'\r\n\r\ntype ResType = {\r\n data: {\r\n customizeTslInfo:\r\n | null\r\n | {\r\n // createTime?: string\r\n resourceValce?: string\r\n // dataType?: string\r\n // subType?: string\r\n name?: string\r\n // type?: string\r\n resourceCode?: string\r\n abId?: number | string\r\n }[]\r\n deviceData: null\r\n deviceLocateInfo: null\r\n }\r\n}\r\n\r\n/**\r\n * 获取设备属性信息\r\n */\r\nexport const getPropertyDataListWithParams = async (params: {\r\n productKey: string\r\n deviceKey: string\r\n codeList: string[]\r\n}) => {\r\n const { productKey, deviceKey, codeList } = params\r\n deviceKitParamsManager.info(\r\n 'getPropertyDataListWithParams',\r\n '===获取设备属性信息:' + productKey + '_' + deviceKey\r\n )\r\n const [err, res] = await to<ResType, any>(\r\n QuecRNDeviceModule.getDeviceBusinessAttributesWithProductKey({\r\n ...params,\r\n codeList: codeList.join(','),\r\n type: '2',\r\n })\r\n )\r\n if (err) {\r\n deviceKitParamsManager.error('getDeviceList', 'error ==> ' + err)\r\n deviceKitParamsManager.loadingDismiss()\r\n if (err.code && err.code.length > 0) {\r\n deviceKitParamsManager.tip(err.message)\r\n }\r\n return\r\n }\r\n if (\r\n res &&\r\n res.data &&\r\n Array.isArray(res.data?.customizeTslInfo) &&\r\n res.data?.customizeTslInfo?.length > 0\r\n ) {\r\n deviceKitParamsManager.info(\r\n '获取设备属性信息',\r\n productKey + '_' + deviceKey + '===>' + JSON.stringify(res)\r\n )\r\n let propertyValueArr: { [key: string]: any } = {}\r\n codeList.forEach(code => {\r\n const findRes = res.data.customizeTslInfo?.find(\r\n item => item.resourceCode === code\r\n )\r\n propertyValueArr[code] = findRes?.resourceValce\r\n propertyValueArr[code + 'Id'] = findRes?.abId\r\n })\r\n return propertyValueArr\r\n }\r\n}\r\n","import { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nexport const strToObj = (str: string | object): Record<string, any> => {\r\n if (typeof str === 'object' && str !== null) {\r\n return str as Record<string, any>\r\n }\r\n\r\n if (typeof str === 'string' && str.trim() !== '') {\r\n try {\r\n const res = JSON.parse(str)\r\n if (typeof res === 'object' && res !== null) {\r\n return res\r\n }\r\n } catch (error) {\r\n deviceKitParamsManager.error('strToObj', error)\r\n }\r\n }\r\n\r\n return {}\r\n}\r\n\r\nconst getCircularReplacer = () => {\r\n const seen = new WeakSet()\r\n return (_key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (seen.has(value)) {\r\n return '[Circular]'\r\n }\r\n seen.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\nexport const objToStr = (obj: any): string => {\r\n if (obj instanceof Error) {\r\n return obj.stack || obj.message || 'Unknown Error'\r\n }\r\n\r\n if (typeof obj === 'object') {\r\n try {\r\n return JSON.stringify(obj, getCircularReplacer(), 2)\r\n } catch (e) {\r\n return '[Cannot stringify object]'\r\n }\r\n }\r\n\r\n if (typeof obj === 'undefined') {\r\n return 'undefined'\r\n }\r\n\r\n if (obj === null) {\r\n return 'null'\r\n }\r\n\r\n return String(obj)\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 订阅设备\r\n */\r\nexport const subscribeDevice = (pk: string, dk: string) => {\r\n try {\r\n QuecRNDeviceModule.subscribeDevice(pk, dk)\r\n deviceKitParamsManager.info(\r\n '✅ 🤝 subscribeDevice 成功订阅设备',\r\n 'pk_dk===>' + pk + '_' + dk\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ 🤝 subscribeDevice 订阅设备失败',\r\n 'pk_dk===>' + pk + '_' + dk + ' ===> 失败原因:' + objToStr(error)\r\n )\r\n }\r\n}\r\n/**\r\n * 取消订阅\r\n */\r\nexport const unSubscribeDevice = (pk: string, dk: string) => {\r\n try {\r\n QuecRNDeviceModule.unSubscribeDevice(pk, dk)\r\n deviceKitParamsManager.info(\r\n '✅ 🤚 ✋ unSubscribeDevice 取消订阅设备成功',\r\n '===取消设备订阅:' + pk + '_' + dk\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.info(\r\n '❌ 🤚 ✋ unSubscribeDevice 取消订阅设备失败',\r\n '===取消设备订阅:' +\r\n pk +\r\n '_' +\r\n dk +\r\n ' ===> 失败原因:' +\r\n objToStr(error)\r\n )\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport camelCase from 'lodash.camelcase'\r\nimport { create, StoreApi, UseBoundStore } from 'zustand'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceOnline } from './SDK/getDeviceOnlineState'\r\nimport { getPropertyDataListWithParams } from './SDK/getPropertyDataListWithParams'\r\nimport { subscribeDevice } from './SDK/subscriDevice'\r\nimport { DeviceModel } from './types/deviceModel'\r\nimport { objToStr } from './utils/stringUtils'\r\nimport to from './utils/to'\r\nimport { DPS } from './types/dps.type'\r\n// TODO deviceListStore\r\n\r\n/** 默认页数 */\r\nlet DEFAULT_PAGE_NUM = 1\r\n/** 默认页大小 */\r\nlet DEFAULT_PAGE_SIZE = 15\r\n\r\ntype SubscribeDevicesType = {\r\n pk: string\r\n dk: string\r\n}\r\ninterface States {\r\n networkError: boolean\r\n listIsEmpty: boolean\r\n deviceList: DeviceModel[] | []\r\n total: number | null\r\n deviceListPlus: DeviceListPlusDeviceType[] | []\r\n /** 已订阅设备列表 */\r\n subscribeDevicesList: SubscribeDevicesType[] | []\r\n /** 页数 */\r\n pageNum: number\r\n /** 页大小 */\r\n pageSize: number\r\n /** 是否可以继续加载 */\r\n canLoadMore: boolean\r\n}\r\ntype getDeviceListResType = {\r\n data: {\r\n total: number\r\n pageSize: number\r\n pageNum: number\r\n isFirstPage: boolean\r\n list: DeviceModel[]\r\n }\r\n}\r\n\r\ninterface Actions {\r\n getDeviceList: (\r\n pageNum: number,\r\n paseSize: number,\r\n successCallback?: (deviceList: DeviceModel[], canLoadMore: boolean) => any,\r\n failCallback?: (err: any) => any\r\n ) => void\r\n refreshDeviceList: (\r\n successCallback?: (deviceList: DeviceModel[]) => any,\r\n failCallback?: (err: any) => any\r\n ) => void\r\n loadMoreDeviceList: (\r\n successCallback?: (deviceList: DeviceModel[]) => any,\r\n failCallback?: (err: any) => any\r\n ) => void\r\n updateDeviceList: (deviceList: DeviceModel[]) => void\r\n updateDeviceListPlus: (deviceArr: DeviceModel[]) => void\r\n addSubscribeDeviceList: (pk: string, dk: string) => void\r\n updateDeviceOnlineState: (event: {\r\n device: {\r\n deviceKey: string\r\n productKey: string\r\n }\r\n onlineState: number | string\r\n }) => void\r\n updateDeviceDPSData: (event: {\r\n dps: Array<DPS>\r\n [key: string]: any\r\n deviceKey?: string\r\n productKey?: string\r\n dk?: string\r\n pk?: string\r\n }) => void\r\n}\r\nconst initialState: States = {\r\n deviceList: [],\r\n total: null,\r\n networkError: false,\r\n listIsEmpty: false,\r\n deviceListPlus: [], //提供给自己想要简化device的数据的开发\r\n subscribeDevicesList: [],\r\n pageNum: DEFAULT_PAGE_NUM,\r\n pageSize: DEFAULT_PAGE_SIZE,\r\n canLoadMore: false,\r\n}\r\n\r\nexport type DeviceListStoreType = StoreApi<States & Actions>\r\nlet deviceListStore: UseBoundStore<StoreApi<States & Actions>> | null = null\r\n\r\ninterface DeviceListPlusDeviceType {\r\n deviceKey: string\r\n productKey: string\r\n isOnline: boolean\r\n onlineState: number\r\n subscribeModel: {\r\n [key: string]: any\r\n }\r\n}\r\ntype DeviceListStoreCreateParamsType = {\r\n pageSize: number\r\n // isGetAllDevicesOnce: boolean //是否一次性请求所有的设备\r\n isSubScribeAllDevice: boolean //是否要订阅所有已请求到列表的设备\r\n processDeviceList?: <T extends DeviceListPlusDeviceType>(deviceList: DeviceModel) => T\r\n subscribeCodeList?: string[] //订阅所有设备物模型code列表\r\n}\r\n\r\n/**\r\n * 初始化创建设备列表Store\r\n *\r\n * @param {DeviceListStoreCreateParamsType|undefined} [params] - 配置对象(非必选)\r\n * @param {number} [params.pageSize] - 每页设备数量(10)\r\n * @param {boolean} [params.isSubScribeAllDevice] - 是否订阅所有设备(false)\r\n * @param {Function} [params.processDeviceList] - 处理设备列表的回调函数 (根据自己的使用习惯将设备列表数据处理成自己想要的格式)\r\n * @param {string[]} [params.subscribeCodeList] - 订阅所有设备物模型code列表\r\n *\r\n * @example\r\n * ```ts\r\n * // APP.ts\r\n * import { createDeviceListStore } from './deviceListStore'\r\n * createDeviceListStore()\r\n * ```\r\n */\r\nexport const createDeviceListStore = (params?: DeviceListStoreCreateParamsType) => {\r\n const {\r\n pageSize = DEFAULT_PAGE_SIZE,\r\n processDeviceList,\r\n isSubScribeAllDevice = false,\r\n subscribeCodeList,\r\n } = params || {}\r\n // pageSize如果不是正整数且大于1,则报错\r\n if (pageSize <= 1 || !Number.isInteger(pageSize)) {\r\n throw new Error('❌ pageSize要求是正整数且大于等于1')\r\n } else {\r\n DEFAULT_PAGE_SIZE = pageSize\r\n }\r\n if (!deviceListStore) {\r\n deviceListStore = create<States & Actions>((set, get) => ({\r\n ...initialState,\r\n // 刷新设备列表\r\n refreshDeviceList(successCallback, failCallback) {\r\n let deviceList: DeviceModel[] = []\r\n set({\r\n deviceList,\r\n pageNum: 1,\r\n canLoadMore: false,\r\n })\r\n get().getDeviceList(\r\n 1,\r\n get().pageSize,\r\n (list, canLoadMore) => {\r\n // ✅ 成功后自己控制页码\r\n\r\n successCallback && successCallback(list)\r\n },\r\n failCallback\r\n )\r\n },\r\n // 加载更多设备列表\r\n loadMoreDeviceList(successCallback, failCallback) {\r\n if (get().canLoadMore) {\r\n get().getDeviceList(\r\n get().pageNum,\r\n get().pageSize,\r\n (list, canLoadMore) => {\r\n // ✅ 成功后自己控制页码\r\n\r\n successCallback && successCallback(list)\r\n },\r\n failCallback\r\n )\r\n } else {\r\n // deviceKitParamsManager.tip(i18n('no_more_devices'))\r\n }\r\n },\r\n // 请求设备列表\r\n async getDeviceList(pageNum, paseSize, successCallback, failCallback) {\r\n deviceKitParamsManager.loading()\r\n const [err, res] = await to<getDeviceListResType, any>(\r\n QuecRNDeviceModule.getDeviceListWithPageNumber(pageNum, paseSize)\r\n )\r\n // 请求失败\r\n if (err) {\r\n deviceKitParamsManager.error('❌ getDeviceList', '获取设备列表error ==> ' + err)\r\n deviceKitParamsManager.loadingDismiss()\r\n if (err.code && err.code.length > 0) {\r\n deviceKitParamsManager.tip(err.message)\r\n }\r\n set({\r\n networkError: true,\r\n })\r\n failCallback && failCallback(err)\r\n return\r\n }\r\n\r\n let returnSuccessDeviceList: DeviceModel[] = []\r\n // 注意提示无设备\r\n if (res && res.data && res.data.list && Array.isArray(res.data?.list)) {\r\n deviceKitParamsManager.info('getDeviceList', 'res ==> ' + objToStr(res))\r\n\r\n const { data } = res\r\n const { list } = data\r\n // 记录总数\r\n set({ total: data.total })\r\n // 下拉刷新\r\n if (pageNum === 1) {\r\n // 第一页\r\n await get().updateDeviceList(list)\r\n returnSuccessDeviceList = list\r\n successCallback && successCallback(returnSuccessDeviceList, data.total > list.length)\r\n if (deviceKitParamsManager.getAutoConnectCurrentDevice() && list.length > 0) {\r\n deviceKitParamsManager.info('getDeviceList', 'auto connect device')\r\n QuecRNDeviceModule.connectChannel(0)\r\n }\r\n set({\r\n canLoadMore: data.total > list.length,\r\n pageNum: data.total > list.length ? pageNum + 1 : 1,\r\n })\r\n } else {\r\n // 加载更多页\r\n const nextListRes = list\r\n const preDevicesList = [...get().deviceList, ...nextListRes]\r\n await get().updateDeviceList(preDevicesList)\r\n returnSuccessDeviceList = list\r\n successCallback &&\r\n successCallback(returnSuccessDeviceList, data.total > preDevicesList.length)\r\n set({\r\n canLoadMore: data.total > preDevicesList.length,\r\n pageNum: data.total > preDevicesList.length ? pageNum + 1 : pageNum,\r\n })\r\n }\r\n } else {\r\n deviceKitParamsManager.error('getDeviceList', 'no res ==> ' + objToStr(res))\r\n failCallback && failCallback(null)\r\n }\r\n deviceKitParamsManager.loadingDismiss()\r\n },\r\n // 更新设备列表\r\n async updateDeviceList(deviceList) {\r\n // deviceList为[] 则是空设备列表\r\n set({\r\n listIsEmpty: Array.isArray(deviceList) && deviceList.length === 0,\r\n deviceList: deviceList,\r\n networkError: deviceList === undefined,\r\n })\r\n if (!!processDeviceList && processDeviceList instanceof Function) {\r\n await get().updateDeviceListPlus(deviceList)\r\n }\r\n },\r\n // 处理更新的设备列表数据使其符合自己使用的习惯\r\n async updateDeviceListPlus(devicesArr) {\r\n const deviceListPlus = devicesArr\r\n .filter(\r\n item =>\r\n item.deviceKey !== undefined &&\r\n item.productKey !== undefined &&\r\n item.deviceKey !== null &&\r\n item.productKey !== null\r\n )\r\n .map(item => (processDeviceList as Function)(item))\r\n\r\n if (!isSubScribeAllDevice) {\r\n // 不需要订阅设备,直接返回\r\n set({\r\n deviceListPlus,\r\n })\r\n return\r\n }\r\n // 循环\r\n // 订阅新增设备,\r\n // 逐个请求列表设备通道状态,\r\n // 并请求设备最近的一次属性数据\r\n for (let i = 0; i < deviceListPlus.length; i++) {\r\n const item = deviceListPlus[i]\r\n // 订阅设备\r\n get().addSubscribeDeviceList(item.productKey, item.deviceKey)\r\n // 请求设备通道状态\r\n const isOnline = await getDeviceOnline({\r\n pk: item.productKey,\r\n dk: item.deviceKey,\r\n })\r\n item.isOnline = isOnline\r\n\r\n // 不需要查设备列表的物模型数据直接返回\r\n if (!(subscribeCodeList && subscribeCodeList?.length > 0)) {\r\n return\r\n }\r\n\r\n // 获取设备订阅的物模型属性\r\n const propertyData = await getPropertyDataListWithParams({\r\n productKey: item.productKey,\r\n deviceKey: item.deviceKey,\r\n codeList: subscribeCodeList,\r\n })\r\n for (let index = 0; index < subscribeCodeList.length; index++) {\r\n const subscribeModelCode = subscribeCodeList[index]\r\n\r\n if (propertyData && propertyData[subscribeModelCode]) {\r\n deviceListPlus[i].subscribeModel[camelCase(subscribeModelCode)] = Number(\r\n propertyData[subscribeModelCode]\r\n )\r\n deviceListPlus[i].subscribeModel[camelCase(subscribeModelCode) + 'Id'] = Number(\r\n propertyData[subscribeModelCode + 'Id']\r\n )\r\n }\r\n }\r\n }\r\n set({\r\n deviceListPlus,\r\n })\r\n },\r\n /**\r\n * 更新列表中单个设备的在离线状态\r\n * @param event\r\n */\r\n updateDeviceOnlineState(event) {\r\n const deviceListPlus = [...get().deviceListPlus]\r\n const eventDevice =\r\n typeof event?.device === 'object' ? event?.device : JSON.parse(event?.device ?? '{}')\r\n deviceListPlus.forEach(item => {\r\n if (\r\n item.deviceKey === eventDevice?.deviceKey &&\r\n item.productKey === eventDevice?.productKey &&\r\n event?.onlineState !== undefined &&\r\n !Number.isNaN(Number(event.onlineState))\r\n ) {\r\n item.isOnline = Number(event.onlineState) !== 0\r\n item.onlineState = Number(event.onlineState)\r\n }\r\n })\r\n set({\r\n deviceListPlus,\r\n })\r\n },\r\n /**\r\n * 更新列表中单个设备的物模型\r\n * @param deviceListPlus\r\n */\r\n updateDeviceDPSData(event) {\r\n if (!isSubScribeAllDevice || !subscribeCodeList || subscribeCodeList?.length <= 0) {\r\n return\r\n }\r\n const { dps, dk, pk } = event\r\n if (\r\n dps === undefined ||\r\n dps === null ||\r\n dk === undefined ||\r\n dk === null ||\r\n pk === undefined ||\r\n pk === null\r\n ) {\r\n return\r\n } else {\r\n const deviceListPlus = [...get().deviceListPlus]\r\n deviceListPlus.forEach(device => {\r\n // 判断对应设备\r\n if (device.deviceKey === event.dk && device.productKey === event.pk) {\r\n dps.map((item: any) => {\r\n // subscribeModel :{ codeCode1: any , codeCode1Id: number ,codeCode2: any , codeCode2Id: number }\r\n Object.entries(device.subscribeModel).forEach(([key, value]) => {\r\n if (key.endsWith('Id')) {\r\n const modelId = value\r\n if (modelId === item.id) {\r\n // TODO 给不同的物模型赋值处理\r\n device.subscribeModel[key] = item.value\r\n }\r\n }\r\n })\r\n })\r\n }\r\n })\r\n\r\n set({\r\n deviceListPlus,\r\n })\r\n }\r\n },\r\n\r\n /**\r\n * 增加已订阅设备列表并订阅设备\r\n * @param deviceList\r\n */\r\n addSubscribeDeviceList(pk: string, dk: string) {\r\n const subscribeDevicesListCopy = [...get().subscribeDevicesList]\r\n if (\r\n subscribeDevicesListCopy.find(item => {\r\n item.dk === dk && item.pk === pk\r\n }) === undefined\r\n ) {\r\n subscribeDevicesListCopy.push({ pk, dk })\r\n subscribeDevice(pk, dk)\r\n }\r\n set({\r\n subscribeDevicesList: subscribeDevicesListCopy,\r\n })\r\n },\r\n }))\r\n }\r\n return deviceListStore\r\n}\r\n\r\nexport const getDeviceListStore = () => {\r\n if (!deviceListStore) {\r\n throw new Error('❗请先调用 createDeviceListStore() 初始化 Store')\r\n }\r\n return deviceListStore\r\n}\r\nexport const getDeviceListStoreWithoutError = () => {\r\n if (!deviceListStore) {\r\n return null\r\n }\r\n return deviceListStore\r\n}\r\nconst selectFromStore = <T>(selector: (state: States & Actions) => T): T => {\r\n const store = getDeviceListStore()\r\n return store(selector)\r\n}\r\n\r\n/**\r\n * 获取设备列表状态管理器内容\r\n *\r\n * @example\r\n * ```ts\r\n * const deviceListState = useDeviceListStoreState()\r\n * ```\r\n *\r\n * @returns {State} state - 设备列表状态集合\r\n *\r\n * @returns {DeviceModel[]} state.deviceList - 设备列表\r\n * @returns {DeviceListPlusDeviceType[]} state.deviceListPlus - 设备列表扩展信息\r\n * @returns {SubscribeDevicesType[]} state.subscribeDevicesList - 已订阅设备列表\r\n * @returns {number} state.pageNum - 当前页数(默认为 `1`)\r\n * @returns {number} state.pageSize - 每页设备数量(默认为 `10`)\r\n * @returns {boolean} state.canLoadMore - 是否可以继续加载更多设备\r\n *\r\n */\r\nexport const useDeviceListStoreState = () => {\r\n return selectFromStore(state => state)\r\n}\r\n\r\n/**\r\n * 获取设备列表\r\n *\r\n * @example\r\n * ```ts\r\n * const deviceList = useDeviceListStoreState()\r\n * console.log(deviceList) // 设备列表\r\n * ```\r\n *\r\n * @returns 设备列表\r\n */\r\nexport const useDeviceList = () => {\r\n return selectFromStore(state => state.deviceList)\r\n}\r\n\r\n/**\r\n * FN 加载下一页设备列表s\r\n *\r\n * @example\r\n * ```ts\r\n * const loadMoreDeviceList = useDeviceListLoadMore();\r\n * loadMoreDeviceList()\r\n * ```\r\n *\r\n */\r\nexport const useDeviceListLoadMore = () => {\r\n return selectFromStore(state => state.loadMoreDeviceList) // 返回加载更多设备列表的函数\r\n}\r\n\r\n/**\r\n * FN 刷新设备列表\r\n *\r\n *@example\r\n * ```ts\r\n * const freshDeviceList = useDeviceListRefresh();\r\n * freshDeviceList()\r\n * ```\r\n *\r\n */\r\nexport const useDeviceListRefresh = () => {\r\n return selectFromStore(state => state.refreshDeviceList) // 返回刷新设备列表的函数\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取设备的在线状态\r\n *\r\n * @param deviceKey 设备的 DeviceKey(暂未使用,可扩展)\r\n * @param productKey 产品的 ProductKey(暂未使用,可扩展)\r\n * @returns Promise<number | null> 返回设备的在线状态,失败返回 null\r\n *\r\n * - onlineState 通常的含义:\r\n * 回调 callback {\"onlineState\": 0/1/2/3/4/5/6/7}\r\n * onlineStateMaskWS = 1 << 0,\r\n * onlineStateMaskWifi = 1 << 1,\r\n * onlineStateMaskBle = 1 << 2,\r\n * 0: all offline,\r\n * 1: websocket online,\r\n * 2 : wifi online,\r\n * 3: wifi + websocket online,\r\n * 4: ble online,\r\n * 5: websocket + ble online,\r\n * 6: ble + wifi online ,\r\n * 7: wifi + ble + ws online\r\n */\r\nexport const getDeviceOnlineState = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n const { onlineState } = await QuecRNDeviceModule.getDeviceOnlineState(productKey, deviceKey)\r\n deviceKitParamsManager.info(\r\n '🔎QuecRNDeviceModule.getDeviceOnlineState....',\r\n '获取设备状态 ===> onlineState:' + onlineState\r\n )\r\n return onlineState\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌QuecRNDeviceModule.getDeviceOnlineState(获取设备状态失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * 获取设备通道连接中状态\r\n *\r\n * @returns Promise<number | null>\r\n *\r\n * connectingState 说明:\r\n * false : 非连接中\r\n * true : 连接中\r\n *\r\n * @since 1.8.0\r\n * @platform all\r\n */\r\nexport const getDeviceConnectingState = async (): Promise<number | null> => {\r\n try {\r\n const result = await QuecRNDeviceModule.getDeviceConnectingState()\r\n deviceKitParamsManager.info(\r\n '📶 QuecRNDeviceModule.getDeviceConnectingState',\r\n `当前连接状态:${result?.connectingState}`\r\n )\r\n return result?.connectingState\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getDeviceConnectingState(获取连接状态失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw null\r\n }\r\n}\r\n\r\n/**\r\n * 断开设备连接通道\r\n *\r\n * @param type 通道类型,0: 关闭所有通道 2:wifi 3:ble\r\n *\r\n * @since 1.4.0\r\n * @platform all\r\n */\r\nexport const disconnectChannel = (type: 0 | 2 | 3) => {\r\n try {\r\n QuecRNDeviceModule.disconnectChannel(type)\r\n deviceKitParamsManager.info(\r\n '🔂 QuecRNDeviceModule.disconnectChannel',\r\n `断开设备连接通道成功,通道类型:${type}`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.disconnectChannel(断开设备连接通道失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * 建立设备连接通道\r\n *\r\n * @param mode 建立通道模式:\r\n * 0 auto,\r\n * 1: websocket\r\n * 2:wifi\r\n * 3:ble\r\n * 注意:1,建立的通通与已连接通道不同时,已连接通道会断开。2,当设备不具备相应通道,建立其不具备的通道会失败。不会再自动建立其他通道\r\n *\r\n * @since 1.4.0\r\n * @platform all\r\n */\r\nexport const connectChannel = (mode: 0 | 2 | 3) => {\r\n try {\r\n QuecRNDeviceModule.connectChannel(mode)\r\n deviceKitParamsManager.info(\r\n '🔂 QuecRNDeviceModule.connectChannel',\r\n `建立设备连接通道成功,通道类型:${mode}`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.connectChannel(建立设备连接通道失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取产品说明书地址\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @returns url: string|null\r\n *\r\n * @since 2.10.0\r\n * @platform all\r\n */\r\nexport const getProductDescription = async (productKey: string): Promise<string | null> => {\r\n try {\r\n const { data } = await QuecRNDeviceModule.getProductDescription(productKey)\r\n deviceKitParamsManager.info(\r\n '📘 QuecRNDeviceModule.getProductDescription',\r\n `说明书地址:${objToStr(data)}`\r\n )\r\n if (data?.url === undefined || data?.url === '') {\r\n return null\r\n }\r\n return data.url\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getProductDescription(获取说明书失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n return null\r\n }\r\n}\r\n","type ErrorCode = string\r\n\r\nfunction createCustomError<TCode extends ErrorCode>(name: string, defaultCode: TCode) {\r\n return class CustomError extends Error {\r\n code: TCode\r\n\r\n constructor(code: TCode, message: string) {\r\n super(message)\r\n this.name = name\r\n this.code = code\r\n // 修复继承Error后,instanceof失效问题(尤其在ES5环境)\r\n Object.setPrototypeOf(this, new.target.prototype)\r\n }\r\n }\r\n}\r\n\r\nexport const GetDeviceInfoError = createCustomError<'invalid_param' | 'no_device' | 'un_know'>(\r\n '📺 GetDeviceInfoError',\r\n 'un_know'\r\n)\r\n","const EmptyARR = [null, undefined, '']\r\n\r\nexport const isEmpty = (value: any): value is null | undefined | '' => {\r\n // 检查 EmptyARR 中的所有情况\r\n return EmptyARR.some(empty => {\r\n // 处理空对象情况\r\n if (typeof empty === 'object' && empty !== null) {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n !Array.isArray(value) &&\r\n Object.keys(value).length === 0\r\n )\r\n }\r\n // 处理其他基础类型空值情况\r\n return value === empty\r\n })\r\n}\r\n","/**\r\n * 处理数字,如果参数是 NaN, 自定义返回\r\n */\r\nexport const handlerNumberVal = <T = any>(val: any, final?: T): T => {\r\n let nextNumber: any = Number(val)\r\n nextNumber = Number.isNaN(nextNumber) ? final : nextNumber\r\n return nextNumber\r\n}\r\n\r\n/**\r\n * 一定是数字\r\n */\r\nexport const trueNumber = (val: any, final: number = 0): number => {\r\n return handlerNumberVal(val, final)\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { create, StoreApi, UseBoundStore } from 'zustand'\r\nimport { getDeviceConnectingState } from './API/deviceApi'\r\nimport { getProductDescription } from './API/productManual'\r\nimport { onlineStatus } from './config/DeviceConfig'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { DeviceModel } from './types/deviceModel'\r\nimport { GetDeviceInfoError } from './types/Error'\r\nimport { FamilyModel } from './types/familyModel'\r\nimport { PropsModel } from './types/propsModel'\r\nimport { isEmpty } from './utils/empty'\r\nimport { trueNumber } from './utils/numberUtils'\r\nimport { objToStr, strToObj } from './utils/stringUtils'\r\nimport to from './utils/to'\r\n\r\ninterface States {\r\n device: DeviceModel | null\r\n props: PropsModel | null\r\n isOnlyBle: boolean //是否为纯蓝牙设备\r\n productUrl: string | null\r\n area: string | null\r\n family: FamilyModel | null\r\n endUserId?: string //终端用户id\r\n userAccount?: string //当前用户的账号(优先邮箱 没有就手机号, 都没有就null)\r\n\r\n // 设备状态\r\n deviceSate: number\r\n connectingState: number\r\n deviceIsEmpty: boolean\r\n online: boolean\r\n // 频道(通信路线)状态\r\n wsOnline: boolean\r\n lanOnline: boolean //局域网\r\n bleOnline: boolean\r\n}\r\ninterface Actions {\r\n useSetProps: (propsSource: unknown) => PropsModel | null //处理初始传入参数\r\n updateDevice: (device: unknown) => void //处理设备信息\r\n updateDeviceName: (newName: string) => void //更新设备名称\r\n getDeviceState: () => Promise<number | null> //请求当前设备状态\r\n getDeviceConnectingState: () => Promise<void> //请求当前设备状态\r\n getProductManual: (productKey?: string) => Promise<void> //产品名说明书\r\n updateOnlineStatus: (deviceSate: number) => void //更新设备在线状态\r\n updateConnectingState: (connectingState: number) => void //更新设备在线状态\r\n checkCurrentDeviceExist: () => Promise<undefined | boolean> //检查当前设备是否存在\r\n //获取设备信息,不传参的话就是获取当前设备信息\r\n getDeviceInfo: (deviceKey?: string, productKey?: string) => Promise<DeviceModel>\r\n //获取分享设备信息,不传参的话就是获取当前分享设备信息\r\n getShareDeviceInfo: (shareCode?: string) => Promise<DeviceModel>\r\n}\r\nconst initialState: States = {\r\n device: null,\r\n props: null,\r\n isOnlyBle: false,\r\n productUrl: null,\r\n family: null,\r\n area: null,\r\n\r\n deviceIsEmpty: false,\r\n deviceSate: 1,\r\n connectingState: 0,\r\n\r\n online: true,\r\n wsOnline: true,\r\n lanOnline: false,\r\n bleOnline: false,\r\n}\r\n\r\nexport type DeviceStore = StoreApi<States & Actions>\r\nlet deviceStore: UseBoundStore<StoreApi<States & Actions>> | null = null\r\n\r\n/**\r\n * 初始化 deviceStore 设备状态管理器\r\n *\r\n * @description 不初始化管理器,使用相关hook会报错\r\n *\r\n * @example\r\n * ```ts\r\n * // APP.ts\r\n * createDeviceStore({\r\n * offlineTip: () => console.log('设备离线提示'),\r\n * onlineTip: () => console.log('设备在线提示'),\r\n * })\r\n * ```\r\n */\r\nexport const createDeviceStore = ({\r\n offlineTip,\r\n onlineTip,\r\n}: {\r\n offlineTip?: Function\r\n onlineTip?: Function\r\n}) => {\r\n if (!deviceStore) {\r\n deviceStore = create<States & Actions>((set, get) => ({\r\n ...initialState,\r\n useSetProps: propsSource => {\r\n if (isEmpty(propsSource)) {\r\n deviceKitParamsManager.error(\r\n '❌处理props失败',\r\n '当前props没有初始化,app传入的信息为空 props ==>' + objToStr(propsSource)\r\n )\r\n return null\r\n } else {\r\n deviceKitParamsManager.info(' 🚀处理props ▶ ', propsSource)\r\n }\r\n let props: PropsModel | null =\r\n typeof propsSource === 'string' || typeof propsSource === 'object'\r\n ? strToObj(propsSource)\r\n : null\r\n set({\r\n props: props as PropsModel,\r\n })\r\n if (props?.area) {\r\n set({\r\n area: props.area,\r\n })\r\n }\r\n if (props?.endUserId) {\r\n set({\r\n endUserId: props.endUserId,\r\n })\r\n }\r\n if (props?.userAccount) {\r\n set({\r\n userAccount: props.userAccount,\r\n })\r\n }\r\n if (props?.familyModeEnabled && props?.familyRole) {\r\n set({\r\n family: {\r\n familyModeEnabled: props?.familyModeEnabled,\r\n familyRole: props?.familyRole,\r\n },\r\n })\r\n }\r\n //接受原生传递的设备属性\r\n let deviceSource = props?.device\r\n let device = deviceSource === undefined ? null : (strToObj(deviceSource) as DeviceModel)\r\n if (isEmpty(device)) {\r\n deviceKitParamsManager.error(\r\n '❌处理device失败',\r\n '当前device没有初始化,设备信息为空 device ==>' + objToStr(device)\r\n )\r\n set({ deviceIsEmpty: true })\r\n return props\r\n } else {\r\n set({ deviceIsEmpty: false })\r\n deviceKitParamsManager.info(' 🚀处理device ▶ ', device)\r\n get().getProductManual(device.productKey)\r\n }\r\n set({\r\n device,\r\n isOnlyBle:\r\n ((device?.capabilitiesBitmask && 4) === 4 && device?.verified === '0') ||\r\n device?.capabilitiesBitmask === 4,\r\n })\r\n return props\r\n },\r\n updateDevice: device => {\r\n if (isEmpty(device)) {\r\n deviceKitParamsManager.error(\r\n '❌处理device失败',\r\n 'device为空 newDevice ==>' + objToStr(device)\r\n )\r\n set({ deviceIsEmpty: true })\r\n return\r\n }\r\n set({ deviceIsEmpty: false })\r\n const newDevice =\r\n typeof device === 'string' ? (strToObj(device) as DeviceModel) : (device as DeviceModel)\r\n deviceKitParamsManager.info('✅ 新的device ▶ ', newDevice)\r\n set({\r\n device: newDevice,\r\n })\r\n get().getProductManual(newDevice.productKey)\r\n get().getDeviceState()\r\n },\r\n updateDeviceName: newName => {\r\n if (isEmpty(newName) || isEmpty(get().device)) {\r\n deviceKitParamsManager.error(\r\n '❌处理deviceName失败',\r\n 'newName或者device为空 newName ==>' + objToStr(newName)\r\n )\r\n return\r\n }\r\n deviceKitParamsManager.info('✅ 新的deviceName ▶ ', newName)\r\n const deviceNew = get().device\r\n if (deviceNew) {\r\n deviceNew.deviceName = newName\r\n set({\r\n device: deviceNew as DeviceModel,\r\n })\r\n }\r\n },\r\n getDeviceState: async () => {\r\n try {\r\n const { onlineState } = await QuecRNDeviceModule.getOnlineState()\r\n deviceKitParamsManager.info(\r\n '🔎QuecRNDeviceModule.getOnlineState....',\r\n '获取设备状态 ===> onlineState:' + onlineState\r\n )\r\n get().updateOnlineStatus(onlineState)\r\n return onlineState\r\n } catch (error) {\r\n deviceKitParamsManager.error('❌获取设备状态失败', '失败原因===> ' + objToStr(error))\r\n return null\r\n }\r\n },\r\n updateOnlineStatus: deviceSate => {\r\n deviceSate = Number(deviceSate)\r\n let nextOnlineState = trueNumber(deviceSate, onlineStatus.ALL_OFFLINE)\r\n if (nextOnlineState === get().deviceSate) {\r\n return\r\n }\r\n const online = nextOnlineState !== onlineStatus.ALL_OFFLINE\r\n if (!online) {\r\n offlineTip && offlineTip()\r\n } else {\r\n onlineTip && onlineTip()\r\n }\r\n set({\r\n deviceSate,\r\n online: online,\r\n wsOnline: (deviceSate & onlineStatus.WS_ONLINE) === onlineStatus.WS_ONLINE,\r\n lanOnline: (deviceSate & onlineStatus.WIFI_ONLINE) === onlineStatus.WIFI_ONLINE,\r\n bleOnline: (deviceSate & onlineStatus.BLE_ONLINE) === onlineStatus.BLE_ONLINE,\r\n })\r\n },\r\n getDeviceConnectingState: async () => {\r\n const connectingState = await getDeviceConnectingState()\r\n set({\r\n connectingState: connectingState ?? 0,\r\n })\r\n },\r\n updateConnectingState: connectingState => {\r\n set({\r\n connectingState,\r\n })\r\n },\r\n getProductManual: async productKey => {\r\n const finalProductKey = productKey ?? get().device?.productKey\r\n if (finalProductKey === undefined) {\r\n deviceKitParamsManager.error(\r\n '📖getProductManual',\r\n `❌ getProductDescription error====(获取说明书错误)==> there is not productKey(value:${productKey}) for getProductManual params`\r\n )\r\n return\r\n }\r\n const url = await getProductDescription(finalProductKey)\r\n set({ productUrl: url })\r\n },\r\n checkCurrentDeviceExist: async (): Promise<boolean | undefined> => {\r\n const currentDevice = get().device\r\n\r\n deviceKitParamsManager.info(\r\n '📺 checkCurrentDeviceExist device.name ▶',\r\n currentDevice?.deviceName\r\n )\r\n\r\n if (!currentDevice) {\r\n deviceKitParamsManager.error('📺 当前没有选中的设备', currentDevice)\r\n return undefined\r\n }\r\n\r\n try {\r\n const res =\r\n currentDevice?.isShared === true\r\n ? await get().getShareDeviceInfo()\r\n : await get().getDeviceInfo()\r\n\r\n const exist = !!res\r\n deviceKitParamsManager.info('📺 当前设备是否存在 ▶', exist)\r\n return exist\r\n } catch (e: any) {\r\n if (e instanceof GetDeviceInfoError) {\r\n switch (e.code) {\r\n case 'request_failed':\r\n case 'no_device':\r\n deviceKitParamsManager.info('📺 设备不存在或请求失败,判定为不存在', e.message)\r\n return false\r\n case 'invalid_param':\r\n deviceKitParamsManager.error('📺 参数无效,无法判断设备是否存在', e.message)\r\n return undefined\r\n default:\r\n deviceKitParamsManager.error('📺 未知错误码', e)\r\n return undefined\r\n }\r\n } else {\r\n deviceKitParamsManager.error('📺 非预期错误', e)\r\n return undefined\r\n }\r\n }\r\n },\r\n getDeviceInfo: async (deviceKey?: string, productKey?: string): Promise<DeviceModel> => {\r\n const finalDeviceKey = deviceKey || get().device?.deviceKey\r\n const finalProductKey = productKey || get().device?.productKey\r\n\r\n deviceKitParamsManager.info(\r\n '📺 getDeviceInfoByDeviceKey params ▶',\r\n `${finalDeviceKey}_${finalProductKey}`\r\n )\r\n\r\n if (!finalDeviceKey || !finalProductKey) {\r\n throw new GetDeviceInfoError('invalid_param', 'deviceKey 或 productKey 不完整')\r\n }\r\n\r\n const [err, res] = await to<DeviceModel>(\r\n QuecRNDeviceModule.getDeviceInfoByDeviceKey(finalDeviceKey, finalProductKey)\r\n )\r\n\r\n if (err) {\r\n throw new GetDeviceInfoError(\r\n 'no_device',\r\n `请求失败,设备不存在或已被移除: ${err.message || err}`\r\n )\r\n }\r\n\r\n if (!res) {\r\n throw new GetDeviceInfoError('no_device', '设备不存在或已被移除')\r\n }\r\n\r\n deviceKitParamsManager.info('📺 getDeviceInfoByDeviceKey res ▶', res)\r\n\r\n return res\r\n },\r\n\r\n getShareDeviceInfo: async (shareCode?: string): Promise<DeviceModel> => {\r\n deviceKitParamsManager.info('📺 getShareDeviceInfo shareCode ▶', shareCode)\r\n\r\n const finalShareCode = shareCode || get().device?.shareCode\r\n\r\n if (!finalShareCode) {\r\n throw new GetDeviceInfoError('invalid_param', '参数无效:缺少 shareCode')\r\n }\r\n\r\n const [err, res] = await to<DeviceModel>(\r\n QuecRNDeviceModule.getDeviceInfoByShareCode(finalShareCode)\r\n )\r\n\r\n if (err) {\r\n throw new GetDeviceInfoError(\r\n 'no_device',\r\n `请求失败,设备不存在或已被移除: ${err.message || err}`\r\n )\r\n }\r\n\r\n if (!res) {\r\n throw new GetDeviceInfoError('no_device', '设备不存在或已被移除')\r\n }\r\n\r\n deviceKitParamsManager.info('📺 getShareDeviceInfo res ▶', res)\r\n\r\n return res\r\n },\r\n }))\r\n }\r\n return deviceStore\r\n}\r\n\r\nexport const getDeviceStore = () => {\r\n if (!deviceStore) {\r\n throw new Error('❗请先调用 createDeviceStore() 初始化 deviceStore')\r\n }\r\n return deviceStore\r\n}\r\nexport const getDeviceStoreWithoutError = () => {\r\n if (!deviceStore) {\r\n return null\r\n }\r\n return deviceStore\r\n}\r\n\r\nconst selectFromStore = <T>(selector: (state: States & Actions) => T): T => {\r\n const store = getDeviceStore()\r\n return store(selector)\r\n}\r\n\r\n/**\r\n * useDeviceStoreState\r\n *\r\n * 💢❗❗❗ PS: 使用这个会导致任一对象刷新引起你使用的变量刷新,尽量不要使用\r\n *\r\n * 描述:在创建deviceStore后可获取状态管理器里的所有状态state。\r\n *\r\n * 示例:\r\n * ```ts\r\n * const deviceState = useDeviceStoreState()\r\n * ```\r\n *\r\n * @returns 返回整个 device store 状态对象,包含如下字段:\r\n * ```ts\r\n * {\r\n * device: DeviceModel | null\r\n * props: PropsModel | null\r\n * deviceState: number\r\n * online: boolean\r\n * isOnlyBle: boolean\r\n * productUrl: string | null\r\n * family: FamilyModel | null\r\n * area: string | null\r\n * wsOnline: boolean\r\n * lanOnline: boolean\r\n * bleOnline: boolean\r\n * // 可能还包括一些方法,如 updateDevice、getDeviceState、getProductManual 等\r\n * }\r\n * ```\r\n *\r\n * @see README.md\r\n */\r\nexport const useDeviceStoreState = () => selectFromStore(state => state)\r\n\r\n/**\r\n * 获取当前设备信息\r\n *\r\n * @returns 当前设备的信息,类型为 `DeviceModel | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const device = useDevice()\r\n * ```\r\n */\r\nexport const useDevice = () => selectFromStore(state => state.device)\r\n\r\n/**\r\n * 获取 app传入的props\r\n *\r\n * @returns app传入的props,类型为 `PropsModel | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const props = useDeviceProps()\r\n * ```\r\n */\r\nexport const useDeviceProps = () => selectFromStore(state => state.props)\r\n\r\n/**\r\n * 获取设备的家庭模式信息\r\n *\r\n * @returns 当前设备所属的家庭信息,类型为 `FamilyModel | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const family = useDeviceFamily()\r\n * ```\r\n */\r\nexport const useDeviceFamily = () => selectFromStore(state => state.family)\r\n\r\n/**\r\n * 获取设备所在区域\r\n *\r\n * @returns 区域字符串,类型为 `string | null`,例如 'china'\r\n *\r\n * @example\r\n * ```ts\r\n * const area = useDeviceArea()\r\n * ```\r\n */\r\nexport const useDeviceArea = () => selectFromStore(state => state.area)\r\n\r\n/**\r\n * 获取产品说明书链接\r\n *\r\n * @returns 说明书的 URL,类型为 `string | null`\r\n *\r\n * @example\r\n * ```ts\r\n * const productUrl = useDeviceProductUrl()\r\n * ```\r\n */\r\nexport const useDeviceProductUrl = () => selectFromStore(state => state.productUrl)\r\n\r\n/**\r\n * 获取 endUserId (获取 ownerId)\r\n *\r\n * @returns endUserId\r\n *\r\n * @example\r\n * ```ts\r\n * const endUserId = useEndUserId()\r\n * ```\r\n */\r\nexport const useEndUserId = () => selectFromStore(state => state.endUserId)\r\n\r\n/**\r\n * 获取当前用户账号\r\n *\r\n * @returns userAccount\r\n *\r\n * @example\r\n * ```ts\r\n * const userAccount = useUserAccount()\r\n * ```\r\n */\r\nexport const useUserAccount = () => selectFromStore(state => state.userAccount)\r\n/**\r\n\r\n * 获取 设备是否为纯蓝牙设备\r\n *\r\n * @returns boolean\r\n *\r\n * @example\r\n * ```ts\r\n * const isOnlyBle = useDeviceIsOnlyBle()\r\n * ```\r\n */\r\nexport const useDeviceIsOnlyBle = () => selectFromStore(state => state.isOnlyBle)\r\n\r\n/**\r\n * 获取设备是否在线\r\n *\r\n * @returns 在线状态布尔值,类型为 `boolean`\r\n *\r\n * @example\r\n * ```ts\r\n * const online = useDeviceOnline()\r\n * console.log(online ? '设备在线' : '设备离线')\r\n * ```\r\n */\r\nexport const useDeviceOnline = () => selectFromStore(state => state.online)\r\n\r\n/**\r\n * 获取设备状态\r\n * @returns onlineStatus\r\n */\r\nexport const useDeviceState = () => selectFromStore(state => state.deviceSate)\r\n\r\n/**\r\n * 获取设备WS链路状态\r\n * @returns boolean\r\n */\r\nexport const useDeviceWsOnline = () => selectFromStore(state => state.wsOnline)\r\n/**\r\n * 获取设备局域网链路状态\r\n * @returns boolean\r\n */\r\nexport const useDeviceLanOnline = () => selectFromStore(state => state.lanOnline)\r\n/**\r\n * 获取设备蓝牙链路状态\r\n * @returns boolean\r\n */\r\nexport const useDeviceBleOnline = () => selectFromStore(state => state.bleOnline)\r\n\r\n/**\r\n * 获取设备是否正在连接中\r\n *\r\n * @returns 状态布尔值,类型为 `boolean`\r\n *\r\n * @example\r\n * ```ts\r\n * const isConnecting = useDeviceIsConnecting()\r\n * ```\r\n */\r\nexport const useDeviceIsConnecting = () =>\r\n selectFromStore(state => Number(state.connectingState) !== 0)\r\n\r\n/**\r\n * async FN 主动获取当前设备状态的方法\r\n *\r\n * @describe 用于主动获取设备当前状态的异步函数\r\n * @returns {Promise<设备状态的数字>}\r\n *\r\n * @example\r\n * ```ts\r\n * const getStatus = useGetDeviceStatus()\r\n * getStatus()\r\n * const res = await getStatus()\r\n * ```\r\n */\r\nexport const useGetDeviceStatus = () => selectFromStore(state => state.getDeviceState)\r\n\r\n/**\r\n * FN 更新设备连接中状态\r\n * @params connectingState: number\r\n * @returns void\r\n *\r\n */\r\nexport const useUpdateDeviceConnectingState = () =>\r\n selectFromStore(state => state.updateConnectingState)\r\n\r\n/**\r\n * FN 设置初始化数据\r\n *\r\n * @describe 在 APP.ts 用于接收初始数据\r\n * @param {PropsModel} [props] - 设备对象\r\n *\r\n * @example\r\n * ```ts\r\n * // APP.ts\r\n * const setProps = useSetProps()\r\n * setProps(props)\r\n * ```\r\n */\r\nexport const useSetProps = () => selectFromStore(state => state.useSetProps)\r\n\r\n/**\r\n * 更新设备对象信息\r\n *\r\n * @describe 用于更新 `device` 对象的内容\r\n * @param {DeviceModel} [device] - 设备对象\r\n *\r\n * @example\r\n * ```ts\r\n * const updateDevice = useUpdateDevice()\r\n * updateDevice(device)\r\n * ```\r\n */\r\nexport const useUpdateDevice = () => selectFromStore(state => state.updateDevice)\r\n\r\n/**\r\n * 更新设备名称\r\n *\r\n * @describe 用于更新 `device` 设备名称\r\n * @param {string} [deviceName] - 设备名称\r\n *\r\n * @example\r\n * ```ts\r\n * const updateDevice = useUpdateDevice()\r\n * updateDevice(deviceName)\r\n * ```\r\n */\r\nexport const useUpdateDeviceName = () => selectFromStore(state => state.updateDeviceName)\r\n\r\n/**\r\n * FN 更新设备在线状态\r\n *\r\n * @describe 用于更新设备在线状态\r\n *\r\n * @param {number} [onlineState] - 状态码\r\n * @returns void\r\n *\r\n * @example\r\n * ```ts\r\n * const updateOnline = useUpdateOnlineStatus()\r\n * updateOnline(3)\r\n * ```\r\n */\r\nexport const useUpdateOnlineStatus = () => selectFromStore(state => state.updateOnlineStatus)\r\n\r\n/**\r\n * FN 检查当前设备是否还存在\r\n *\r\n * @describe 检查当前设备是否还存在\r\n *\r\n * @returns Promise<boolean |undefined>\r\n *\r\n * @example\r\n * ```ts\r\n * const checkCurrentDeviceExist = useCheckCurrentDeviceExist()\r\n * checkCurrentDeviceExist()\r\n * ```\r\n */\r\nexport const useCheckCurrentDeviceExist = () =>\r\n selectFromStore(state => state.checkCurrentDeviceExist)\r\n","import { useEffect } from 'react'\r\nimport { EmitterSubscription, NativeEventEmitter, NativeModules } from 'react-native'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceListStoreWithoutError } from './deviceListStore'\r\nimport { getDeviceStoreWithoutError } from './deviceStore'\r\nimport { isEmpty } from './utils/empty'\r\nimport { objToStr, strToObj } from './utils/stringUtils'\r\nimport { Null } from './types/common.type'\r\n/**\r\n * 事件类型---设备在线状态\r\n * @type {string}\r\n */\r\nexport const EVENT_TYPE_DEVICE_ONLINE = 'onDeviceOnlineState'\r\n/**\r\n * 事件类型---设备连接状态\r\n * @type {string}\r\n */\r\nexport const EVENT_TYPE_DEVICE_CONNECTING = 'onDeviceConnectingState'\r\n\r\n\r\nlet eventEmitter: any = new NativeEventEmitter(NativeModules.QuecRNDeviceModule)\r\nlet onDeviceStateUpdateListener: EmitterSubscription | Null\r\nlet onDeviceConnectingStateUpdateListener: EmitterSubscription | Null\r\n\r\n/**\r\n * 设备状态监听事件\r\n *\r\n * @param {(event: any) => void|undefined} [updateDeviceStateCallback] - 状态更新回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n *\r\n * @example\r\n * ```ts\r\n * // AppContainer.ts\r\n * useInitUpdateDeviceStateEvent()\r\n * ```\r\n */\r\nexport const useInitUpdateDeviceStateEvent = (\r\n updateDeviceStateCallback?: (event: any) => void,\r\n updateDeviceConnectingStateCallback?: (event: any) => void\r\n) => {\r\n const deviceListStore = getDeviceListStoreWithoutError() // ✅ 放在顶层\r\n const deviceListStoreState = deviceListStore ? deviceListStore(state => state) : null\r\n if (deviceListStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceListStore '\r\n )\r\n }\r\n const updateDeviceOnlineState = deviceListStoreState?.updateDeviceOnlineState ?? null\r\n\r\n const deviceStore = getDeviceStoreWithoutError() // ✅ 放在顶层\r\n const deviceStoreState = deviceStore ? deviceStore(state => state) : null\r\n if (deviceStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备列表信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceStore '\r\n )\r\n }\r\n const updateOnlineStatus = deviceStoreState?.updateOnlineStatus ?? null\r\n const updateConnectingState = deviceStoreState?.updateConnectingState ?? null\r\n const device = deviceStoreState?.device ?? null\r\n /**\r\n * 设备状态上报监听\r\n */\r\n useEffect(() => {\r\n removeListener(onDeviceStateUpdateListener)\r\n onDeviceStateUpdateListener = eventEmitter.addListener(\r\n EVENT_TYPE_DEVICE_ONLINE,\r\n (event: any) => {\r\n deviceKitParamsManager.info(\r\n EVENT_TYPE_DEVICE_ONLINE,\r\n ' 🤝 ==OnlineState==' + objToStr(event)\r\n )\r\n if (isEmpty(event)) {\r\n return\r\n }\r\n const eventDevice = strToObj(event.device)\r\n if (\r\n device?.deviceKey === eventDevice?.deviceKey &&\r\n device?.productKey === eventDevice?.productKey &&\r\n updateOnlineStatus\r\n ) {\r\n updateOnlineStatus(event.onlineState)\r\n }\r\n if (updateDeviceOnlineState) {\r\n updateDeviceOnlineState(event)\r\n }\r\n updateDeviceStateCallback && updateDeviceStateCallback(event)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(onDeviceStateUpdateListener)\r\n onDeviceStateUpdateListener = null\r\n }\r\n }, [updateDeviceOnlineState, updateOnlineStatus, device])\r\n /**\r\n * 设备连接中状态上报监听\r\n */\r\n useEffect(() => {\r\n removeListener(onDeviceConnectingStateUpdateListener)\r\n onDeviceConnectingStateUpdateListener = eventEmitter.addListener(\r\n EVENT_TYPE_DEVICE_ONLINE,\r\n (event: any) => {\r\n deviceKitParamsManager.info(\r\n EVENT_TYPE_DEVICE_CONNECTING,\r\n ' ⚡ ==ConnectingState==' + objToStr(event)\r\n )\r\n const connectingState = isNaN(event?.connectingState) ? 0 : Number(event?.connectingState)\r\n updateConnectingState && updateConnectingState(connectingState)\r\n updateDeviceConnectingStateCallback && updateDeviceConnectingStateCallback(event)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(onDeviceConnectingStateUpdateListener)\r\n onDeviceConnectingStateUpdateListener = null\r\n }\r\n }, [updateConnectingState, updateDeviceConnectingStateCallback])\r\n}\r\n\r\nconst removeListener = (listener: EmitterSubscription | Null) => {\r\n if (listener) {\r\n listener.remove()\r\n listener = undefined\r\n }\r\n}\r\n","// @ts-ignore\r\nimport QuecRNBusinessPanelModule from '@quec/rn-businesspanel-module/src/module'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { DeviceModel } from './types'\r\n/**\r\n * 更新当前面板(或者只更新设备)\r\n *\r\n * @description\r\n * (向APP发起)主动更改设备面板;\r\n * 如果新设备面板依旧是此面板,(APP)只会发出更新设备信息事件(''QuecRefreshDeviceInfo'')的通知;\r\n * 反之,会重载面板,刷新到新的面板去;\r\n * 所以请配合使用useInitDeviceInfoUpdateEvent这个hook\r\n * @example\r\n * ```ts\r\n * changeDevicePanel(newDevice)\r\n * ```\r\n *\r\n */\r\nexport const changeDevicePanel = (newDevice: DeviceModel) => {\r\n deviceKitParamsManager.info(\r\n 'changeDevicePanel',\r\n '__更换设备面板 => 设备:' + newDevice.deviceName\r\n )\r\n QuecRNBusinessPanelModule.changeBusinessPanel({\r\n device: JSON.stringify(newDevice),\r\n })\r\n}\r\n/**\r\n * 切换托底面板\r\n *\r\n * @description 当设备列表没有一个设备时,需要主动调用来切换托底面板\r\n * @example\r\n * ```ts\r\n * checkoutEmptyPanel()\r\n * ```\r\n *\r\n */\r\nexport const checkoutEmptyPanel = () => {\r\n deviceKitParamsManager.info('checkoutEmptyPanel', '__更换托底面板')\r\n QuecRNBusinessPanelModule.switchBusinessPanel()\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport { EmitterSubscription, NativeEventEmitter, NativeModules } from 'react-native'\r\nimport { changeDevicePanel, checkoutEmptyPanel } from './device-list-utils'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceListStoreWithoutError } from './deviceListStore'\r\nimport { getDeviceStoreWithoutError } from './deviceStore'\r\nimport { DeviceModel } from './types'\r\nimport { Null } from './types/common.type'\r\n\r\nexport const EVENT_TYPE_REFRESH_DEVICE_LIST = 'QuecRefreshDeviceList'\r\n\r\nlet refreshDeviceListListener: EmitterSubscription | Null\r\nlet panelEventEmitter: any = new NativeEventEmitter(NativeModules.QuecRNBusinessPanelModule)\r\n/**\r\n * 设备列表更新监听事件\r\n *\r\n * @param {(event: any) => void|undefined} [refreshDeviceListEventCallback] - 状态更新回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n * @param {(list: DeviceModel) => void|undefined} [refreshDeviceListSuccessCallback] - 列表刷新后的回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n * @param {boolean} [enableAutoCheckoutDevice] - 打开自动检测并切换设备\r\n *\r\n * @example\r\n * ```ts\r\n * // AppContainer.ts\r\n * useInitDeviceListUpdateEvent({\r\n * refreshDeviceListEventCallback: (event) => {},\r\n * refreshDeviceListSuccessCallback: (list) => {}\r\n * enableAutoCheckoutDevice:true\r\n * })\r\n * ```\r\n */\r\nexport const useInitDeviceListUpdateEvent = (params?: {\r\n refreshDeviceListEventCallback?: (event: any) => void\r\n refreshDeviceListSuccessCallback?: (list: DeviceModel[]) => void\r\n enableAutoCheckoutDevice?: boolean\r\n}) => {\r\n const {\r\n refreshDeviceListEventCallback,\r\n refreshDeviceListSuccessCallback,\r\n enableAutoCheckoutDevice,\r\n } = params ?? {}\r\n const deviceListStore = getDeviceListStoreWithoutError() // ✅ 放在顶层\r\n const deviceListStoreState = deviceListStore ? deviceListStore(state => state) : null\r\n if (deviceListStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备列表信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceListStore '\r\n )\r\n }\r\n\r\n const deviceStore = getDeviceStoreWithoutError() // ✅ 放在顶层\r\n const deviceStoreState = deviceStore ? deviceStore(state => state) : null\r\n\r\n if (deviceStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceStore '\r\n )\r\n }\r\n\r\n const listIsEmpty = deviceListStoreState?.listIsEmpty ?? null\r\n const refreshDeviceList = deviceListStoreState?.refreshDeviceList ?? null\r\n\r\n const device = deviceStoreState?.device ?? null\r\n const deviceIsEmpty = deviceStoreState?.deviceIsEmpty ?? null\r\n const checkCurrentDeviceExist = deviceStoreState?.checkCurrentDeviceExist ?? null\r\n\r\n const [onceCheckNowDevice, setOnceCheckNowDevice] = useState(true)\r\n /**\r\n * 设备列表刷新监听\r\n */\r\n useEffect(() => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = panelEventEmitter.addListener(\r\n EVENT_TYPE_REFRESH_DEVICE_LIST,\r\n (event: any) => {\r\n deviceKitParamsManager.info(EVENT_TYPE_REFRESH_DEVICE_LIST, '==refresh device list 🔄==')\r\n // 可能是添加了新设备或者删除了设备(可能删除了当前设备),\r\n // 此时需要请求当前设备的信息,查看当前设备是否还存在\r\n refreshDeviceList &&\r\n refreshDeviceList(list => {\r\n refreshDeviceListSuccessCallback && refreshDeviceListSuccessCallback(list)\r\n if (checkCurrentDeviceExist && enableAutoCheckoutDevice) {\r\n checkCurrentDeviceExist().then(res => {\r\n if (res === false && list?.length > 0) {\r\n // 当前设备已经不复存在,更换列表第一个设备\r\n // 列表如果为空要跳转托底面板(useAutoRedirectDevice)(用这个hook就可以了)\r\n changeDevicePanel(list[0])\r\n }\r\n })\r\n }\r\n })\r\n refreshDeviceListEventCallback && refreshDeviceListEventCallback(event)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = null\r\n }\r\n }, [refreshDeviceList])\r\n\r\n // 设备列表或当前设备为空时,跳转到业务面板\r\n useEffect(() => {\r\n if (!enableAutoCheckoutDevice) return\r\n if (deviceIsEmpty === true || listIsEmpty === true) {\r\n checkoutEmptyPanel()\r\n }\r\n }, [deviceIsEmpty, listIsEmpty, enableAutoCheckoutDevice])\r\n\r\n // TODO 进来面板就马上检查当前设备是否还可用\r\n // 防止有操作者在设备管理页删除设备后,立即杀APP进程,然后再次进来\r\n useEffect(() => {\r\n if (!enableAutoCheckoutDevice) return\r\n if (device && onceCheckNowDevice) {\r\n setOnceCheckNowDevice(false)\r\n if (checkCurrentDeviceExist && enableAutoCheckoutDevice) {\r\n checkCurrentDeviceExist().then(res => {\r\n if (res === false) {\r\n // 当前设备已经不复存在,更换列表第一个设备\r\n // 列表如果为空要跳转托底面板(useAutoRedirectDevice)(用这个hook就可以了)\r\n refreshDeviceList &&\r\n refreshDeviceList(list => {\r\n if (list[0]) {\r\n changeDevicePanel(list[0])\r\n }\r\n })\r\n }\r\n })\r\n }\r\n }\r\n }, [device, onceCheckNowDevice, enableAutoCheckoutDevice])\r\n}\r\nconst removeListener = (listener: EmitterSubscription | Null) => {\r\n if (listener) {\r\n listener.remove()\r\n listener = undefined\r\n }\r\n}\r\n","import { useEffect } from 'react'\r\nimport { EmitterSubscription, NativeEventEmitter, NativeModules } from 'react-native'\r\nimport { deviceKitParamsManager } from './DeviceKitParamsManager'\r\nimport { getDeviceStoreWithoutError } from './deviceStore'\r\nimport { DeviceModel } from './types'\r\nimport { Null } from './types/common.type'\r\nexport const EVENT_TYPE_REFRESH_DEVICE = 'QuecRefreshDeviceInfo'\r\n\r\nlet refreshDeviceListListener: EmitterSubscription | Null\r\nlet panelEventEmitter: any = new NativeEventEmitter(NativeModules.QuecRNBusinessPanelModule)\r\n/**\r\n * 设备更新事件\r\n *\r\n * @param {(event: any) => void|undefined} [refreshDeviceEventCallback] - 状态更新回调\r\n * 当不想使用该库的状态管理,则自行传入回调函数进行后续处理\r\n *\r\n * @example\r\n * ```ts\r\n * // AppContainer.ts\r\n * useInitDeviceInfoUpdateEvent()\r\n * ```\r\n */\r\nexport const useInitDeviceInfoUpdateEvent = (refreshDeviceEventCallback?: (event: any) => void) => {\r\n const deviceStore = getDeviceStoreWithoutError() // ✅ 放在顶层\r\n const deviceStoreState = deviceStore ? deviceStore(state => state) : null\r\n if (deviceStoreState === null) {\r\n deviceKitParamsManager.info(\r\n 'PS:如果你不使用设备列表信息状态管理,请忽略此警告',\r\n 'WARNING 你未初始化 createDeviceStore '\r\n )\r\n }\r\n const updateDevice = deviceStoreState?.updateDevice ?? null\r\n /**\r\n * 设备状态上报监听\r\n */\r\n useEffect(() => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = panelEventEmitter.addListener(\r\n EVENT_TYPE_REFRESH_DEVICE,\r\n (e: { device: string | DeviceModel }) => {\r\n deviceKitParamsManager.info(EVENT_TYPE_REFRESH_DEVICE, '📞 ==refresh device info 🔄==')\r\n let newDevice = {}\r\n try {\r\n newDevice = typeof e.device === 'string' ? JSON.parse(e.device) : e.device\r\n } catch (error) {\r\n deviceKitParamsManager.info(\r\n EVENT_TYPE_REFRESH_DEVICE +\r\n ' 📞 ==refresh device info get new device info ERROR ❌==',\r\n error\r\n )\r\n }\r\n updateDevice && updateDevice(newDevice)\r\n refreshDeviceEventCallback && refreshDeviceEventCallback(e)\r\n }\r\n )\r\n\r\n // 移除监听事件\r\n return () => {\r\n removeListener(refreshDeviceListListener)\r\n refreshDeviceListListener = null\r\n }\r\n }, [updateDevice])\r\n}\r\nconst removeListener = (listener: EmitterSubscription | Null) => {\r\n if (listener) {\r\n listener.remove()\r\n listener = undefined\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 设置离线提醒开关\r\n *\r\n * @param enableOfflineReminder 开关 0-关闭 1-开启\r\n * @param deviceKey 设备的 DeviceKey(暂未使用,可扩展)\r\n * @param productKey 产品的 ProductKey(暂未使用,可扩展)\r\n * @returns Promise<null>\r\n *\r\n */\r\nexport const setOfflineReminder = async ({\r\n enableOfflineReminder,\r\n deviceKey,\r\n productKey,\r\n}: {\r\n enableOfflineReminder: 1 | 0\r\n deviceKey: string\r\n productKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.setOfflineReminder(enableOfflineReminder, productKey, deviceKey)\r\n deviceKitParamsManager.info('🔎 QuecRNDeviceModule.setOfflineReminder....', '设置离线提醒开关')\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.setOfflineReminder(获取设备状态失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * 查询离线提醒开关状态\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<boolean> true-开启 false-关闭\r\n *\r\n * @since 2.4.0\r\n * @platform all\r\n */\r\nexport const getOfflineReminderInfo = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n const result = await QuecRNDeviceModule.getOfflineReminderInfo(productKey, deviceKey)\r\n deviceKitParamsManager.info('🔍 QuecRNDeviceModule.getOfflineReminderInfo', result)\r\n return +result?.data === 1\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getOfflineReminderInfo(查询失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw false\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { DeviceModel } from '../types'\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取设备是否有 OTA 升级计划\r\n *\r\n * @param device 设备信息对象\r\n * @returns Promise<boolean> true-有升级计划 false-没有升级计划\r\n *\r\n * @since 2.4.0\r\n * @platform all\r\n */\r\nexport const checkDeviceUpdatePlan = async (device: DeviceModel) => {\r\n try {\r\n await QuecRNDeviceModule.checkDeviceUpdatePlan(device)\r\n deviceKitParamsManager.info('🔍 QuecRNDeviceModule.checkDeviceUpdatePlan', '有升级计划')\r\n return true\r\n } catch (error) {\r\n deviceKitParamsManager.info('🔍 QuecRNDeviceModule.checkDeviceUpdatePlan', '无升级计划')\r\n throw false\r\n }\r\n}\r\n/**\r\n * 打开设备 OTA 详情页\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<void>\r\n *\r\n * @since 2.4.0\r\n * @platform all\r\n */\r\nexport const openDeviceOTAPage = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.openDeviceOTAPage(productKey, deviceKey)\r\n deviceKitParamsManager.info('📂 QuecRNDeviceModule.openDeviceOTAPage', '已打开设备OTA详情页')\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.openDeviceOTAPage(打开失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 获取当前手机设置的时区与 GMT 的差值\r\n *\r\n * @returns Promise<string>\r\n *\r\n * @since 2.5.7\r\n * @platform all\r\n */\r\nexport const getTimeDifferenceWithGMT = async () => {\r\n try {\r\n const result = await QuecRNDeviceModule.getTimeDifferenceWithGMT()\r\n deviceKitParamsManager.info(\r\n '🕒 QuecRNDeviceModule.getTimeDifferenceWithGMT(获取当前手机设置的时区与 GMT 的差值) ==>',\r\n result\r\n )\r\n return result\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getTimeDifferenceWithGMT(获取当前手机设置的时区与 GMT 的差值失败) ==>',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * 获取设备设置的时区\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<string>\r\n *\r\n * @since 2.5.7\r\n * @platform all\r\n */\r\nexport const getDeviceTimeZone = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n const result = await QuecRNDeviceModule.getDeviceTimeZone(productKey, deviceKey)\r\n deviceKitParamsManager.info(\r\n '🌍 QuecRNDeviceModule.getDeviceTimeZone(获取设备设置的时区) ==>',\r\n result\r\n )\r\n return result\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.getDeviceTimeZone(获取设备设置的时区失败) ==>',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * 设置设备的时区\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @param timezone 设置的时区字符串\r\n * @returns Promise<void>\r\n *\r\n * @since 2.5.7\r\n * @platform all\r\n */\r\nexport const setDeviceTimeZone = async ({\r\n productKey,\r\n deviceKey,\r\n timezone,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n timezone: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.setDeviceTimeZone(productKey, deviceKey, timezone)\r\n deviceKitParamsManager.info(\r\n '✅ QuecRNDeviceModule.setDeviceTimeZone',\r\n `已设置时区为 ${timezone}`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.setDeviceTimeZone(设置失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * 设备校时(仅支持纯蓝牙设备)\r\n *\r\n * @param productKey 产品的 ProductKey\r\n * @param deviceKey 设备的 DeviceKey\r\n * @returns Promise<void>\r\n *\r\n * @since 2.11.0\r\n * @platform all\r\n */\r\nexport const timeZoneSyncForBleDevice = async ({\r\n productKey,\r\n deviceKey,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.timeZoneSync(productKey, deviceKey)\r\n deviceKitParamsManager.info(\r\n '⏱️ QuecRNDeviceModule.timeZoneSync',\r\n `设备已校时(productKey: ${productKey}, deviceKey: ${deviceKey})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.timeZoneSync(设备校时失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n","import QuecRNDeviceModule from '@quec/rn-device-module/src/module'\r\nimport { deviceKitParamsManager } from '../DeviceKitParamsManager'\r\n\r\nimport { objToStr } from '../utils/stringUtils'\r\n\r\n/**\r\n * 纯蓝牙设备解绑\r\n *\r\n@param productKey {string} - string productKey\r\n@param deviceKey {string} - string deviceKey\r\n@param isInit {boolean} - boolean 是否重置设备\r\n@param random {string} - string 非必传 random\r\n@param pureBtResetCredentials {string} - string 非必传 重置凭证\r\n * @returns Promise<void>\r\n *\r\n * @since 2.11.0\r\n * @platform all\r\n */\r\nexport const unbindBleDevice = async ({\r\n productKey,\r\n deviceKey,\r\n isInit,\r\n random,\r\n pureBtResetCredentials,\r\n}: {\r\n productKey: string\r\n deviceKey: string\r\n isInit: boolean\r\n random?: string\r\n pureBtResetCredentials?: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.unbindlingPureBtDevice(\r\n productKey,\r\n deviceKey,\r\n isInit,\r\n random,\r\n pureBtResetCredentials\r\n )\r\n deviceKitParamsManager.info(\r\n '🔓 QuecRNDeviceModule.unbindlingPureBtDevice',\r\n `解绑成功(productKey: ${productKey}, deviceKey: ${deviceKey})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.unbindlingPureBtDevice(解绑失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n\r\n// 以下方法都要求有外网的情况下进行解绑\r\n/**\r\n * 分享设备设备解绑(已弃用)\r\n *\r\n * @deprecated 此方法已弃用并不再维护,如遇问题请联系开发者\r\n *\r\n * @param shareCode 分享码\r\n * @returns Promise<void>\r\n *\r\n * @since 1.0.0\r\n * @platform all\r\n */\r\nexport const unbindShareDevice = async ({ shareCode }: { shareCode: string }) => {\r\n try {\r\n await QuecRNDeviceModule.unShareDeviceByShareUserWithShareCode(shareCode)\r\n deviceKitParamsManager.info(\r\n '🔓 QuecRNDeviceModule.unShareDeviceByShareUserWithShareCode',\r\n `解绑成功(shareCode: ${shareCode})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.unShareDeviceByShareUserWithShareCode(解绑失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n/**\r\n * (非分享)设备解绑(已弃用)\r\n *\r\n * @deprecated 此方法已弃用并不再维护,如遇问题请联系开发者\r\n *\r\n * @param deviceKey 设备 DeviceKey\r\n * @param productKey 产品 ProductKey\r\n * @returns Promise<void>\r\n *\r\n * @since 1.0.0\r\n * @platform all\r\n */\r\nexport const unbindDevice = async ({\r\n deviceKey,\r\n productKey,\r\n}: {\r\n deviceKey: string\r\n productKey: string\r\n}) => {\r\n try {\r\n await QuecRNDeviceModule.unbindDeviceWithDeviceKey(deviceKey, productKey)\r\n deviceKitParamsManager.info(\r\n '🔓 QuecRNDeviceModule.unbindDeviceWithDeviceKey',\r\n `解绑成功(deviceKey: ${deviceKey}, productKey: ${productKey})`\r\n )\r\n } catch (error) {\r\n deviceKitParamsManager.error(\r\n '❌ QuecRNDeviceModule.unbindDeviceWithDeviceKey(解绑失败)',\r\n '失败原因===> ' + objToStr(error)\r\n )\r\n throw error\r\n }\r\n}\r\n"]}