Added app badge support for the guest PWA and wired it to the existing counts (unread notifications + upload queue + pending uploads). When the total hits zero, the badge is cleared; when it’s >0, it’s set.

This commit is contained in:
Codex Agent
2025-12-27 14:15:14 +01:00
parent 1a48c9458e
commit a8b54b75ea
3 changed files with 103 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
import { afterEach, describe, expect, it, vi } from 'vitest';
import { supportsBadging, updateAppBadge } from '../badges';
const originalSet = (navigator as any).setAppBadge;
const originalClear = (navigator as any).clearAppBadge;
const hadSet = 'setAppBadge' in navigator;
const hadClear = 'clearAppBadge' in navigator;
function restoreNavigator() {
if (hadSet) {
Object.defineProperty(navigator, 'setAppBadge', { configurable: true, value: originalSet });
} else {
delete (navigator as any).setAppBadge;
}
if (hadClear) {
Object.defineProperty(navigator, 'clearAppBadge', { configurable: true, value: originalClear });
} else {
delete (navigator as any).clearAppBadge;
}
}
describe('badges', () => {
afterEach(() => {
restoreNavigator();
});
it('sets the badge count when supported', async () => {
const setAppBadge = vi.fn();
Object.defineProperty(navigator, 'setAppBadge', { configurable: true, value: setAppBadge });
Object.defineProperty(navigator, 'clearAppBadge', { configurable: true, value: vi.fn() });
expect(supportsBadging()).toBe(true);
await updateAppBadge(4);
expect(setAppBadge).toHaveBeenCalledWith(4);
});
it('clears the badge when count is zero', async () => {
const clearAppBadge = vi.fn();
Object.defineProperty(navigator, 'setAppBadge', { configurable: true, value: vi.fn() });
Object.defineProperty(navigator, 'clearAppBadge', { configurable: true, value: clearAppBadge });
await updateAppBadge(0);
expect(clearAppBadge).toHaveBeenCalled();
});
it('no-ops when unsupported', async () => {
delete (navigator as any).setAppBadge;
delete (navigator as any).clearAppBadge;
expect(supportsBadging()).toBe(false);
await updateAppBadge(3);
});
});