668bdaad7d
Web fixes from the Wave-2 bug-hunt (findings in LOTUS_TODO): - F1 (security): wipe the decrypted-plaintext search index on SERVER-FORCED logout too (token expiry / remote sign-out) — only manual logout did before. F4: the delete no longer reports success while onblocked (waits, 3s cap). - M1/M2 (data-loss): useBookmarks + useUserNotes account-data writes are now serialized at MODULE scope (single queue + latestRef per client, echo-driven), fixing the cross-instance lost-update clobber (useBookmarks mounts per message row, so a per-instance queue was insufficient — caught in review). - M6: room-history export gets a 200-page cap + Cancel + unmount-abort + correct date-range early-break (raw paginated ts). M4: image compression skips PNG (was flattening transparency to black), bakes EXIF orientation via createImageBitmap, .jpg-renames, and falls back to the original on decode failure instead of dropping the file. M5: MediaGallery lightbox opens the right item (shared thumb guard). M8: audio speed survives async decrypt. - Desktop web wiring: D2 badge sums leaf rooms only (space double-count, like the favicon fix); D3 useTauriDnd re-hydrates from get_tray_dnd on mount; D5 updater has a terminal state. Reviewed; M7 reverted (past-time clamp is an intentional, tested contract). tsc/eslint/prettier clean, build OK, 678 tests. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.4 KiB
TypeScript
36 lines
1.4 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { useSetAtom } from 'jotai';
|
|
import { manualDndAtom } from '../state/manualDnd';
|
|
import { tauriInvoke, useTauriEvent } from './useTauri';
|
|
|
|
/** Detail shape of the `lotus-dnd-changed` event emitted by the native side. */
|
|
type DndChangedDetail = {
|
|
active: boolean;
|
|
};
|
|
|
|
/**
|
|
* P6-1 — Tray "Do Not Disturb" → notification suppression (desktop). Subscribes
|
|
* to the native `lotus-dnd-changed` event (emitted when the user toggles the
|
|
* tray "Do Not Disturb" item, `{ active }`) and mirrors it into `manualDndAtom`,
|
|
* which the notification gate reads to suppress notifications while DND is on.
|
|
* Inert in the browser, since `useTauriEvent` only listens under Tauri.
|
|
*/
|
|
export function useTauriDnd(): void {
|
|
const setDnd = useSetAtom(manualDndAtom);
|
|
|
|
useTauriEvent<DndChangedDetail>('lotus-dnd-changed', ({ active }) => setDnd(active));
|
|
|
|
// Re-hydrate on mount. The tray CheckMenuItem persists its checkstate, but
|
|
// `manualDndAtom` is in-memory and resets to false on every reload (the
|
|
// custom-chrome toggle, logout). Without this the tray could show DND ON while
|
|
// notifications resume firing. Query the native tray state (`get_tray_dnd`) so
|
|
// they stay in sync. No-op in the browser.
|
|
useEffect(() => {
|
|
tauriInvoke()?.('get_tray_dnd')
|
|
.then((active) => {
|
|
if (typeof active === 'boolean') setDnd(active);
|
|
})
|
|
.catch(() => undefined);
|
|
}, [setDnd]);
|
|
}
|