950b8a8128
Add sticky?: boolean to ToastNotif — sticky toasts skip the 4s auto-dismiss timer entirely, staying until the user clicks or manually dismisses. Sticky toasts also use cyan accent/glow (vs orange for messages) and allow the body to wrap rather than truncate, so longer action-oriented copy is fully readable. Update the Tauri update toast to: sticky: true, ⬆ prefix on the title, "Click to install and restart" as explicit call to action. Fixes: auto-dismiss before user noticed it, no visual distinction from a regular message notification. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
32 lines
912 B
TypeScript
32 lines
912 B
TypeScript
import { atom } from 'jotai';
|
|
|
|
export type ToastNotif = {
|
|
id: string;
|
|
avatarUrl?: string;
|
|
displayName: string;
|
|
body: string;
|
|
roomName: string;
|
|
roomId: string;
|
|
hashPath?: string; // overrides window.location.hash navigation when set
|
|
onClick?: () => void; // custom click handler; skips hash navigation when set
|
|
sticky?: boolean; // when true, does not auto-dismiss — use for action toasts that require a click
|
|
};
|
|
|
|
const baseAtom = atom<ToastNotif[]>([]);
|
|
|
|
// Write-only setter used in ClientNonUIFeatures
|
|
export const toastQueueAtom = atom<ToastNotif[], [ToastNotif | null], void>(
|
|
(get) => get(baseAtom),
|
|
(get, set, notif) => {
|
|
if (notif === null) return; // no-op guard
|
|
set(baseAtom, [...get(baseAtom), notif]);
|
|
},
|
|
);
|
|
|
|
export const dismissToastAtom = atom<null, [string], void>(null, (get, set, id) =>
|
|
set(
|
|
baseAtom,
|
|
get(baseAtom).filter((t) => t.id !== id),
|
|
),
|
|
);
|