99 lines
2.2 KiB
TypeScript
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,
|
|
};
|
|
|