{"version":3,"file":"useDevice.mjs","sources":["../../../../packages/hooks/useDevice.ts"],"sourcesContent":["import { ref, computed, onMounted, onUnmounted } from 'vue'\nimport { getMedia } from '@touchvue/utils'\n\n/**\n * 设备类型\n */\nexport type DeviceType = 'pc' | 'pad' | 'phone'\n\n/**\n * 全局设备检测管理器\n * 使用单例模式避免重复注册resize事件\n */\nclass DeviceManager {\n\tprivate static instance: DeviceManager\n\tprivate deviceType = ref<DeviceType>(getMedia())\n\tprivate listeners = new Set<() => void>()\n\tprivate resizeHandler: (() => void) | null = null\n\n\tprivate constructor() {\n\t\tthis.initResizeListener()\n\t}\n\n\tstatic getInstance(): DeviceManager {\n\t\tif (!DeviceManager.instance) {\n\t\t\tDeviceManager.instance = new DeviceManager()\n\t\t}\n\t\treturn DeviceManager.instance\n\t}\n\n\tprivate initResizeListener() {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tthis.resizeHandler = () => {\n\t\t\t\tconst newDeviceType = getMedia()\n\t\t\t\tif (this.deviceType.value !== newDeviceType) {\n\t\t\t\t\tthis.deviceType.value = newDeviceType\n\t\t\t\t\t// 通知所有监听器\n\t\t\t\t\tthis.listeners.forEach(listener => listener())\n\t\t\t\t}\n\t\t\t}\n\t\t\twindow.addEventListener('resize', this.resizeHandler)\n\t\t}\n\t}\n\n\tgetDeviceType() {\n\t\treturn this.deviceType\n\t}\n\n\taddListener(listener: () => void) {\n\t\tthis.listeners.add(listener)\n\t}\n\n\tremoveListener(listener: () => void) {\n\t\tthis.listeners.delete(listener)\n\n\t\t// 如果没有监听器了，移除resize事件\n\t\tif (this.listeners.size === 0 && this.resizeHandler && typeof window !== 'undefined') {\n\t\t\twindow.removeEventListener('resize', this.resizeHandler)\n\t\t\tthis.resizeHandler = null\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.resizeHandler && typeof window !== 'undefined') {\n\t\t\twindow.removeEventListener('resize', this.resizeHandler)\n\t\t}\n\t\tthis.listeners.clear()\n\t\tthis.resizeHandler = null\n\t}\n}\n\n/**\n * 设备检测 Hook\n * 提供响应式的设备类型判断，替代 Vue2 中的 $phone、$pc、$pad\n * 使用单例模式避免重复注册resize事件监听器\n */\nexport function useDevice() {\n\tconst manager = DeviceManager.getInstance()\n\tconst deviceType = manager.getDeviceType()\n\n\t// 计算属性：是否为手机\n\tconst isPhone = computed(() => deviceType.value === 'phone')\n\n\t// 计算属性：是否为平板\n\tconst isPad = computed(() => deviceType.value === 'pad')\n\n\t// 计算属性：是否为PC\n\tconst isPc = computed(() => deviceType.value === 'pc')\n\n\t// 计算属性：是否为移动设备（手机或平板）\n\tconst isMobile = computed(() => deviceType.value === 'phone' || deviceType.value === 'pad')\n\n\t// 更新设备类型的回调\n\tconst updateCallback = () => {\n\t\t// 这里不需要做任何事情，因为deviceType是响应式的\n\t\t// 当manager更新deviceType时，所有计算属性会自动更新\n\t}\n\n\t// 手动更新设备类型\n\tconst updateDeviceType = () => {\n\t\tconst newDeviceType = getMedia()\n\t\tif (deviceType.value !== newDeviceType) {\n\t\t\t// 直接更新manager中的deviceType\n\t\t\t;(deviceType as any).value = newDeviceType\n\t\t}\n\t}\n\n\t// 组件挂载时添加监听器\n\tonMounted(() => {\n\t\tmanager.addListener(updateCallback)\n\t})\n\n\t// 组件卸载时移除监听器\n\tonUnmounted(() => {\n\t\tmanager.removeListener(updateCallback)\n\t})\n\n\treturn {\n\t\t// 设备类型（响应式）\n\t\tdeviceType,\n\n\t\t// 响应式判断\n\t\tisPhone,\n\t\tisPad,\n\t\tisPc,\n\t\tisMobile,\n\n\t\t// 手动更新设备类型\n\t\tupdateDeviceType\n\t}\n}\n\n/**\n * 获取当前设备类型（非响应式）\n * @returns 设备类型字符串\n */\nexport function getDeviceType(): DeviceType {\n\treturn getMedia()\n}\n\n/**\n * 判断是否为手机设备（非响应式）\n * @returns 是否为手机\n */\nexport function isPhoneDevice(): boolean {\n\treturn getMedia() === 'phone'\n}\n\n/**\n * 判断是否为平板设备（非响应式）\n * @returns 是否为平板\n */\nexport function isPadDevice(): boolean {\n\treturn getMedia() === 'pad'\n}\n\n/**\n * 判断是否为PC设备（非响应式）\n * @returns 是否为PC\n */\nexport function isPcDevice(): boolean {\n\treturn getMedia() === 'pc'\n}\n\n/**\n * 判断是否为移动设备（非响应式）\n * @returns 是否为移动设备（手机或平板）\n */\nexport function isMobileDevice(): boolean {\n\tconst device = getMedia()\n\treturn device === 'phone' || device === 'pad'\n}\n"],"names":[],"mappings":"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"}