Files
cinny/src/app/hooks/usePermission.ts
T

43 lines
1.2 KiB
TypeScript
Raw Normal View History

2025-02-10 21:02:33 +11:00
import { useEffect, useState } from 'react';
export const getNotificationState = (): PermissionState => {
if ('Notification' in window) {
if (window.Notification.permission === 'default') {
return 'prompt';
}
return window.Notification.permission;
}
return 'denied';
};
export function usePermissionState(name: PermissionName, initialValue: PermissionState = 'prompt') {
const [permissionState, setPermissionState] = useState<PermissionState>(initialValue);
useEffect(() => {
let permissionStatus: PermissionStatus;
function handlePermissionChange(this: PermissionStatus) {
setPermissionState(this.state);
}
navigator.permissions
.query({ name })
.then((permStatus: PermissionStatus) => {
permissionStatus = permStatus;
handlePermissionChange.apply(permStatus);
2025-02-10 21:02:33 +11:00
permStatus.addEventListener('change', handlePermissionChange);
})
.catch(() => {
// Silence error since FF doesn't support microphone permission
});
return () => {
2025-02-10 21:02:33 +11:00
permissionStatus?.removeEventListener('change', handlePermissionChange);
};
}, [name]);
return permissionState;
2025-02-10 21:02:33 +11:00
}