add push settings
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
'use client';
|
||||
|
||||
import { useEffect, useRef } from 'react';
|
||||
import { useAuth } from '@/components/id/auth-provider';
|
||||
import { usePublicSettings } from '@/components/id/public-settings-provider';
|
||||
import { registerFirebasePush, subscribeFirebaseForegroundMessages } from '@/lib/firebase-push';
|
||||
|
||||
export function FirebasePushBridge() {
|
||||
const { token, user, isPinLocked, isLoading, isContentReady } = useAuth();
|
||||
const { firebaseConfig } = usePublicSettings();
|
||||
const registeredRef = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (!token || !user?.id || isPinLocked || isLoading || !isContentReady || !firebaseConfig) {
|
||||
registeredRef.current = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (registeredRef.current) return;
|
||||
|
||||
let cancelled = false;
|
||||
const timer = window.setTimeout(() => {
|
||||
void registerFirebasePush(token, firebaseConfig)
|
||||
.then((fcmToken) => {
|
||||
if (!cancelled && fcmToken) {
|
||||
registeredRef.current = true;
|
||||
}
|
||||
})
|
||||
.catch(() => undefined);
|
||||
}, 1200);
|
||||
|
||||
return () => {
|
||||
cancelled = true;
|
||||
window.clearTimeout(timer);
|
||||
};
|
||||
}, [firebaseConfig, isContentReady, isLoading, isPinLocked, token, user?.id]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!firebaseConfig || !token || isPinLocked) return undefined;
|
||||
|
||||
const unsubscribe = subscribeFirebaseForegroundMessages((payload) => {
|
||||
if (!('Notification' in window) || Notification.permission !== 'granted') return;
|
||||
const notification = new Notification(payload.title, {
|
||||
body: payload.message
|
||||
});
|
||||
notification.onclick = () => {
|
||||
window.focus();
|
||||
notification.close();
|
||||
};
|
||||
});
|
||||
|
||||
return unsubscribe;
|
||||
}, [firebaseConfig, isPinLocked, token]);
|
||||
|
||||
return null;
|
||||
}
|
||||
Reference in New Issue
Block a user