v0.12.25 FCM bug fixes

This commit is contained in:
2026-03-24 18:13:15 -04:00
parent 7276228a98
commit 225dcd718b
6 changed files with 45 additions and 13 deletions

View File

@@ -211,7 +211,8 @@ function PushDebugTab() {
const [testing, setTesting] = useState(false);
const permission = (typeof Notification !== 'undefined') ? Notification.permission : 'unsupported';
const cachedToken = localStorage.getItem('rc_fcm_token');
const [cachedToken, setCachedToken] = useState(localStorage.getItem('rc_fcm_token'));
const [lastError, setLastError] = useState(localStorage.getItem('rc_fcm_error'));
const load = async () => {
setLoading(true);
@@ -245,9 +246,21 @@ function PushDebugTab() {
const clearToken = () => {
localStorage.removeItem('rc_fcm_token');
localStorage.removeItem('rc_fcm_error');
setCachedToken(null);
setLastError(null);
toast('Cached token cleared — reload to re-register with server', 'info');
};
const reregister = () => {
localStorage.removeItem('rc_fcm_token');
localStorage.removeItem('rc_fcm_error');
setCachedToken(null);
setLastError(null);
window.dispatchEvent(new CustomEvent('rosterchirp:push-init'));
toast('Re-registering push subscription…', 'info');
};
const box = { background: 'var(--surface-variant)', border: '1px solid var(--border)', borderRadius: 'var(--radius)', padding: '12px 14px', marginBottom: 14 };
const sectionLabel = { fontSize: 11, fontWeight: 600, color: 'var(--text-tertiary)', textTransform: 'uppercase', letterSpacing: '0.5px', marginBottom: 8 };
@@ -263,8 +276,12 @@ function PushDebugTab() {
<DebugRow label="Cached FCM token" value={cachedToken ? cachedToken.slice(0, 36) + '…' : 'None'} ok={!!cachedToken} bad={!cachedToken} />
{debugData && <DebugRow label="FCM env vars" value={debugData.fcmConfigured ? 'Present' : 'Missing'} ok={debugData.fcmConfigured} bad={!debugData.fcmConfigured} />}
{debugData && <DebugRow label="Firebase Admin" value={debugData.firebaseAdminReady ? 'Ready' : 'Not ready'} ok={debugData.firebaseAdminReady} bad={!debugData.firebaseAdminReady} />}
{lastError && <DebugRow label="Last reg. error" value={lastError} bad={true} />}
</div>
<div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
<button className="btn btn-sm btn-primary" onClick={reregister}>Re-register</button>
<button className="btn btn-sm btn-secondary" onClick={clearToken}>Clear cached token</button>
</div>
<button className="btn btn-sm btn-secondary" onClick={clearToken}>Clear cached token</button>
</div>
{/* Test push */}

View File

@@ -132,12 +132,22 @@ export default function Chat() {
// deliver. Passing serviceWorkerRegistration directly to getToken() is enough
// for Firebase to return the existing valid token without needing a refresh.
console.log('[Push] Requesting FCM token...');
const fcmToken = await getToken(firebaseMessaging, {
vapidKey,
serviceWorkerRegistration: reg,
});
let fcmToken;
try {
fcmToken = await getToken(firebaseMessaging, {
vapidKey,
serviceWorkerRegistration: reg,
});
} catch (tokenErr) {
const msg = tokenErr.message || 'getToken() threw an error';
console.warn('[Push] getToken() threw:', msg);
localStorage.setItem('rc_fcm_error', msg);
return;
}
if (!fcmToken) {
console.warn('[Push] getToken() returned null — notification permission may not be granted at OS level, or VAPID key is wrong');
const msg = 'getToken() returned null — check VAPID key and OS notification permission';
console.warn('[Push]', msg);
localStorage.setItem('rc_fcm_error', msg);
return;
}
console.log('[Push] FCM token obtained:', fcmToken.slice(0, 30) + '...');
@@ -147,6 +157,7 @@ export default function Chat() {
const cachedToken = localStorage.getItem('rc_fcm_token');
if (cachedToken === fcmToken) {
console.log('[Push] Token unchanged — skipping subscribe');
localStorage.removeItem('rc_fcm_error');
return;
}
@@ -158,13 +169,17 @@ export default function Chat() {
});
if (!subRes.ok) {
const err = await subRes.json().catch(() => ({}));
console.warn('[Push] Subscribe failed:', err.error || subRes.status);
const msg = `Subscribe failed: ${err.error || subRes.status}`;
console.warn('[Push]', msg);
localStorage.setItem('rc_fcm_error', msg);
} else {
localStorage.setItem('rc_fcm_token', fcmToken);
localStorage.removeItem('rc_fcm_error');
console.log('[Push] FCM subscription registered successfully');
}
} catch (e) {
console.warn('[Push] FCM subscription failed:', e.message);
localStorage.setItem('rc_fcm_error', e.message);
}
};