(record: WorkspaceFileRecord)
| 1 | import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace' |
| 2 | |
| 3 | export async function triggerFileDownload(record: WorkspaceFileRecord): Promise<void> { |
| 4 | const isMarkdown = |
| 5 | record.type === 'text/markdown' || |
| 6 | record.type === 'text/x-markdown' || |
| 7 | /\.(?:md|markdown)$/i.test(record.name) |
| 8 | |
| 9 | const url = isMarkdown |
| 10 | ? `/api/files/export/${encodeURIComponent(record.id)}` |
| 11 | : `/api/files/serve/${encodeURIComponent(record.key)}?context=workspace&t=${Date.now()}` |
| 12 | |
| 13 | const response = await fetch(url, { cache: 'no-store' }) |
| 14 | if (!response.ok) throw new Error(`Failed to download file: ${response.statusText}`) |
| 15 | |
| 16 | const blob = await response.blob() |
| 17 | const objectUrl = URL.createObjectURL(blob) |
| 18 | const a = document.createElement('a') |
| 19 | a.href = objectUrl |
| 20 | a.download = |
| 21 | response.headers.get('Content-Disposition')?.match(/filename="([^"]+)"/)?.[1] ?? record.name |
| 22 | document.body.appendChild(a) |
| 23 | a.click() |
| 24 | document.body.removeChild(a) |
| 25 | URL.revokeObjectURL(objectUrl) |
| 26 | } |
no test coverage detected