Files
goldenChart/frontend_golden/src/services/notificationService.ts
T
2026-05-23 15:11:48 +09:00

99 lines
2.2 KiB
TypeScript

/**
* 브라우저 알림 서비스
*/
let notificationPermission: NotificationPermission = 'default';
/**
* 알림 권한 요청
*/
export const requestNotificationPermission = async (): Promise<boolean> => {
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,
};