fix(push notification): menghindari duplikasi subscription
This commit is contained in:
parent
5816d9032a
commit
163a90b857
@ -253,14 +253,25 @@ protected function loadStats()
|
|||||||
#[On('notification:subscribe')]
|
#[On('notification:subscribe')]
|
||||||
public function notificationSubscribe(string $subscription)
|
public function notificationSubscribe(string $subscription)
|
||||||
{
|
{
|
||||||
|
$subscription = json_decode($subscription, true);
|
||||||
|
|
||||||
|
$isExist = PushNotification::where('user_id', auth()->id())
|
||||||
|
->whereJsonContains('subscriptions->keys->auth', $subscription['keys']['auth'])
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($isExist) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$userId = auth()->id();
|
$userId = auth()->id();
|
||||||
|
|
||||||
|
$encodedSubscription = json_encode($subscription);
|
||||||
PushNotification::updateOrCreate(
|
PushNotification::updateOrCreate(
|
||||||
[
|
[
|
||||||
'user_id' => $userId,
|
'user_id' => $userId,
|
||||||
'subscriptions' => $subscription,
|
'subscriptions' => $encodedSubscription,
|
||||||
],
|
],
|
||||||
['subscriptions' => $subscription]
|
['subscriptions' => $encodedSubscription],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,24 +24,38 @@
|
|||||||
|
|
||||||
@fluxScripts
|
@fluxScripts
|
||||||
<script>
|
<script>
|
||||||
|
let isSubscribed = false;
|
||||||
|
|
||||||
document.addEventListener('livewire:navigated', () => {
|
document.addEventListener('livewire:navigated', () => {
|
||||||
Notification.requestPermission().then((permission) => {
|
if (isSubscribed) return;
|
||||||
if (permission === 'granted') {
|
|
||||||
navigator.serviceWorker.ready.then((sw) => {
|
if (Notification.permission === 'granted') {
|
||||||
sw.pushManager.subscribe({
|
subscribePush();
|
||||||
userVisibleOnly: true,
|
isSubscribed = true;
|
||||||
applicationServerKey: '{{ config('services.vapid.public_key') }}',
|
} else if (Notification.permission !== 'denied') {
|
||||||
}).then((subscription) => {
|
Notification.requestPermission().then((permission) => {
|
||||||
const json = JSON.stringify(subscription)
|
if (permission === 'granted' && !isSubscribed) {
|
||||||
Livewire.dispatch('notification:subscribe', {
|
subscribePush();
|
||||||
subscription: json
|
isSubscribed = true;
|
||||||
})
|
}
|
||||||
})
|
});
|
||||||
})
|
}
|
||||||
}
|
|
||||||
})
|
|
||||||
navigator.serviceWorker.register('{{ URL::asset('service-worker.js') }}');
|
navigator.serviceWorker.register('{{ URL::asset('service-worker.js') }}');
|
||||||
})
|
});
|
||||||
|
|
||||||
|
function subscribePush() {
|
||||||
|
navigator.serviceWorker.ready.then((sw) => {
|
||||||
|
sw.pushManager.subscribe({
|
||||||
|
userVisibleOnly: true,
|
||||||
|
applicationServerKey: '{{ config('services.vapid.public_key') }}',
|
||||||
|
}).then((subscription) => {
|
||||||
|
Livewire.dispatch('notification:subscribe', {
|
||||||
|
subscription: JSON.stringify(subscription)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user