/** * 브라우저 알림 서비스 */ let notificationPermission: NotificationPermission = 'default'; /** * 알림 권한 요청 */ export const requestNotificationPermission = async (): Promise => { if (!('Notification' in window)) { console.warn('이 브라우저는 알림을 지원하지 않습니다.'); return false; } if (Notification.permission === 'granted') { notificationPermission = 'granted'; return true; } if (Notification.permission === 'denied') { notificationPermission = 'denied'; return false; } try { const permission = await Notification.requestPermission(); notificationPermission = permission; return permission === 'granted'; } catch (error) { console.error('알림 권한 요청 실패:', error); return false; } }; /** * 브라우저 알림 표시 */ export const showNotification = (title: string, options?: NotificationOptions): Notification | null => { if (!('Notification' in window)) { console.warn('이 브라우저는 알림을 지원하지 않습니다.'); return null; } if (Notification.permission !== 'granted') { console.warn('알림 권한이 허용되지 않았습니다.'); return null; } try { const notification = new Notification(title, { icon: '/favicon.ico', badge: '/favicon.ico', ...options, }); // 알림 클릭 시 창 포커스 notification.onclick = () => { window.focus(); notification.close(); // 알림 페이지로 이동 (옵션) if (options?.data?.page) { window.location.hash = options.data.page; } }; return notification; } catch (error) { console.error('알림 표시 실패:', error); return null; } }; /** * 알림 권한 상태 확인 */ export const getNotificationPermission = (): NotificationPermission => { if (!('Notification' in window)) { return 'denied'; } return Notification.permission; }; /** * 알림 지원 여부 확인 */ export const isNotificationSupported = (): boolean => { return 'Notification' in window; }; export default { requestNotificationPermission, showNotification, getNotificationPermission, isNotificationSupported, };