diff --git a/components/offline/__tests__/offline-settings.test.tsx b/components/offline/__tests__/offline-settings.test.tsx
index 7cace4d96..73e13bbbf 100644
--- a/components/offline/__tests__/offline-settings.test.tsx
+++ b/components/offline/__tests__/offline-settings.test.tsx
@@ -14,6 +14,7 @@ import { useOfflineStore } from '@/lib/offline/state';
import { useAuthStore } from '@/stores/auth-store';
import { usePolicyStore } from '@/stores/policy-store';
import { DEFAULT_ORGANISATION_POLICY } from '@/lib/admin/organisation-policy';
+import { setStoreBackend, type StoreBackend } from '@/lib/store/client/api';
function setNoOffline(noOffline: boolean) {
usePolicyStore.setState({
@@ -24,6 +25,8 @@ function setNoOffline(noOffline: boolean) {
}
beforeEach(() => {
+ // jsdom has no OPFS: the store's page side says it's there, as a browser would.
+ setStoreBackend({ supported: () => true } as unknown as StoreBackend);
offline.enableOffline.mockClear();
offline.disableOffline.mockClear();
useAuthStore.setState({ activeAccountId: 'acc' });
diff --git a/components/offline/offline-banner.tsx b/components/offline/offline-banner.tsx
index c04def228..dc179e362 100644
--- a/components/offline/offline-banner.tsx
+++ b/components/offline/offline-banner.tsx
@@ -24,9 +24,11 @@ export function OfflineBanner() {
const browserOffline = useOfflineStore((s) => s.browserOffline || s.startedOffline);
const serverDown = useOfflineStore((s) => !!server && s.downServers.includes(serverKey(server)));
const waiting = useOfflineStore((s) => s.outbox.length);
+ const conflicts = useOfflineStore((s) => s.conflicts.length);
+ const tConflicts = useTranslations('offlineConflicts');
const [open, setOpen] = useState(false);
const offline = browserOffline || serverDown;
- if (IS_LITE || !active || (!offline && waiting === 0 && !open)) return null;
+ if (IS_LITE || !active || (!offline && waiting === 0 && conflicts === 0 && !open)) return null;
return (
<>
)}
+ {conflicts > 0 && (
+
+ )}