67 lines
1.5 KiB
TypeScript
67 lines
1.5 KiB
TypeScript
/**
|
|
* Solicita permissão para notificações desktop
|
|
*/
|
|
export async function requestNotificationPermission(): Promise<NotificationPermission> {
|
|
if (!("Notification" in window)) {
|
|
console.warn("Este navegador não suporta notificações desktop");
|
|
return "denied";
|
|
}
|
|
|
|
if (Notification.permission === "granted") {
|
|
return "granted";
|
|
}
|
|
|
|
if (Notification.permission !== "denied") {
|
|
return await Notification.requestPermission();
|
|
}
|
|
|
|
return Notification.permission;
|
|
}
|
|
|
|
/**
|
|
* Mostra uma notificação desktop
|
|
*/
|
|
export function showNotification(title: string, options?: NotificationOptions): Notification | null {
|
|
if (!("Notification" in window)) {
|
|
return null;
|
|
}
|
|
|
|
if (Notification.permission !== "granted") {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
return new Notification(title, {
|
|
icon: "/favicon.png",
|
|
badge: "/favicon.png",
|
|
...options,
|
|
});
|
|
} catch (error) {
|
|
console.error("Erro ao exibir notificação:", error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Toca o som de notificação
|
|
*/
|
|
export function playNotificationSound() {
|
|
try {
|
|
const audio = new Audio("/sounds/notification.mp3");
|
|
audio.volume = 0.5;
|
|
audio.play().catch((err) => {
|
|
console.warn("Não foi possível reproduzir o som de notificação:", err);
|
|
});
|
|
} catch (error) {
|
|
console.error("Erro ao tocar som de notificação:", error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Verifica se o usuário está na aba ativa
|
|
*/
|
|
export function isTabActive(): boolean {
|
|
return !document.hidden;
|
|
}
|
|
|