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:
@@ -171,7 +171,11 @@ function ToastCard({ toast }: ToastCardProps) {
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter' || e.key === ' ') handleCardClick();
|
||||
}}
|
||||
aria-label={`Notification from ${toast.displayName} in ${toast.roomName}`}
|
||||
aria-label={
|
||||
toast.roomName
|
||||
? `Notification from ${toast.displayName} in ${toast.roomName}`
|
||||
: `${toast.displayName}: ${toast.body}`
|
||||
}
|
||||
>
|
||||
<span style={{ position: 'absolute', top: config.space.S100, right: config.space.S100 }}>
|
||||
<IconButton
|
||||
@@ -187,7 +191,11 @@ function ToastCard({ toast }: ToastCardProps) {
|
||||
</IconButton>
|
||||
</span>
|
||||
<div style={rowStyle}>
|
||||
{toast.avatarUrl ? (
|
||||
{toast.iconSrc ? (
|
||||
<div style={initialsStyle} aria-hidden="true">
|
||||
<Icon size="100" src={toast.iconSrc} />
|
||||
</div>
|
||||
) : toast.avatarUrl ? (
|
||||
<img src={toast.avatarUrl} alt="" style={avatarStyle} aria-hidden="true" />
|
||||
) : (
|
||||
<div style={initialsStyle} aria-hidden="true">
|
||||
@@ -197,7 +205,7 @@ function ToastCard({ toast }: ToastCardProps) {
|
||||
<span style={nameStyle}>{toast.displayName}</span>
|
||||
</div>
|
||||
<div style={bodyStyle}>{toast.body}</div>
|
||||
<div style={roomNameStyle}>{toast.roomName}</div>
|
||||
{toast.roomName && <div style={roomNameStyle}>{toast.roomName}</div>}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user