feat: add NotificationPermissionPrompt component for handling push notification permissions

This commit is contained in:
Yoga Pangestu 2026-08-14 05:44:51 +07:00
parent 8ad735fbf9
commit 5fd0ab135d
4 changed files with 35 additions and 0 deletions

View File

@ -54,6 +54,7 @@ public function share(Request $request): array
'image' => url('/assets/logo.png'),
'url' => $request->url(),
],
'vapidPublicKey' => config('webpush.vapid.public_key'),
];
}
}

View File

@ -1,4 +1,5 @@
export { default as AlertError } from './alert-error';
export { FlashToast } from './flash-toast';
export { NotificationBell } from './notification-bell';
export { NotificationPermissionPrompt } from './notification-permission-prompt';
export { PWAUpdateToast } from './pwa-update-toast';

View File

@ -0,0 +1,31 @@
import { usePage } from '@inertiajs/react';
import { useEffect, useRef } from 'react';
import { usePushNotification } from '@/hooks/use-push-notification';
export function NotificationPermissionPrompt() {
const { vapidPublicKey } = usePage().props as { vapidPublicKey?: string };
const hasRequested = useRef(false);
const { isSupported, requestPermission, subscribe } =
usePushNotification();
useEffect(() => {
if (!isSupported || hasRequested.current) {
return;
}
if (Notification.permission !== 'default') {
return;
}
hasRequested.current = true;
void requestPermission().then(async (result) => {
if (result === 'granted' && vapidPublicKey) {
await subscribe(vapidPublicKey);
}
});
}, [isSupported, requestPermission, subscribe, vapidPublicKey]);
return null;
}

View File

@ -1,3 +1,4 @@
import { NotificationPermissionPrompt } from '@/components/notifications/notification-permission-prompt';
import { Toaster } from '@/components/ui/sonner';
import AppLayoutTemplate from '@/layouts/app/app-sidebar-layout';
import type { BreadcrumbItem } from '@/types';
@ -13,6 +14,7 @@ export default function AppLayout({
<AppLayoutTemplate breadcrumbs={breadcrumbs}>
{children}
<Toaster />
<NotificationPermissionPrompt />
</AppLayoutTemplate>
);
}