feat(download): show a toast + button check when a file is saved
The desktop (Tauri) app has no native download UI, so FileSaver.saveAs saved files silently — no visual or audio confirmation. Users re-clicked because nothing said it worked (one report: 5 copies of the same file). Add a small useSaveFile() hook that saves AND raises a 'Downloaded <filename>' toast, and route every download call site through it (file attachments, image viewer, PDF viewer, plus the recovery-key / key-backup exports). The file-message download button also shows a green check on success. Toast system extended with an optional iconSrc so system toasts render an icon instead of an avatar/initials, and an empty roomName is no longer rendered. Tests: createDownloadToast covered; 701/701 pass; typecheck + build clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
import { useCallback } from 'react';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { Icons } from 'folds';
|
||||
import FileSaver from 'file-saver';
|
||||
import { createDownloadToast, toastQueueAtom } from '../state/toast';
|
||||
|
||||
/**
|
||||
* Save a blob/URL to disk AND surface a "Downloaded <filename>" toast.
|
||||
*
|
||||
* The desktop (Tauri) app has no native download UI, so `FileSaver.saveAs` saved
|
||||
* files silently — users re-clicked because nothing confirmed success. This gives
|
||||
* uniform, visible feedback across web + desktop for every download call site.
|
||||
*/
|
||||
export const useSaveFile = () => {
|
||||
const setToast = useSetAtom(toastQueueAtom);
|
||||
|
||||
return useCallback(
|
||||
(data: Blob | string, filename: string) => {
|
||||
FileSaver.saveAs(data, filename);
|
||||
setToast(createDownloadToast(filename, Icons.Check));
|
||||
},
|
||||
[setToast],
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user