|
1 | 1 | import type { Ref } from 'vue-demi' |
2 | | -import { ref } from 'vue-demi' |
| 2 | +import { shallowRef, toRaw } from 'vue-demi' |
3 | 3 | import { createSingletonPromise } from '@vueuse/shared' |
4 | 4 | import { useEventListener } from '../useEventListener' |
5 | 5 | import type { ConfigurableNavigator } from '../_configurable' |
@@ -67,32 +67,36 @@ export function usePermission( |
67 | 67 | } = options |
68 | 68 |
|
69 | 69 | const isSupported = useSupported(() => navigator && 'permissions' in navigator) |
70 | | - let permissionStatus: PermissionStatus | undefined |
| 70 | + const permissionStatus = shallowRef<PermissionStatus>() |
71 | 71 |
|
72 | 72 | const desc = typeof permissionDesc === 'string' |
73 | 73 | ? { name: permissionDesc } as PermissionDescriptor |
74 | 74 | : permissionDesc as PermissionDescriptor |
75 | | - const state = ref<PermissionState | undefined>() |
| 75 | + const state = shallowRef<PermissionState | undefined>() |
76 | 76 |
|
77 | 77 | const onChange = () => { |
78 | | - if (permissionStatus) |
79 | | - state.value = permissionStatus.state |
| 78 | + if (permissionStatus.value) |
| 79 | + state.value = permissionStatus.value.state |
80 | 80 | } |
81 | 81 |
|
| 82 | + useEventListener(permissionStatus, 'change', onChange) |
| 83 | + |
82 | 84 | const query = createSingletonPromise(async () => { |
83 | 85 | if (!isSupported.value) |
84 | 86 | return |
85 | | - if (!permissionStatus) { |
| 87 | + |
| 88 | + if (!permissionStatus.value) { |
86 | 89 | try { |
87 | | - permissionStatus = await navigator!.permissions.query(desc) |
88 | | - useEventListener(permissionStatus, 'change', onChange) |
| 90 | + permissionStatus.value = await navigator!.permissions.query(desc) |
89 | 91 | onChange() |
90 | 92 | } |
91 | 93 | catch { |
92 | 94 | state.value = 'prompt' |
93 | 95 | } |
94 | 96 | } |
95 | | - return permissionStatus |
| 97 | + |
| 98 | + if (controls) |
| 99 | + return toRaw(permissionStatus.value) |
96 | 100 | }) |
97 | 101 |
|
98 | 102 | query() |
|
0 commit comments