From ec09bdc3f0119871491066bebc126536851b5ffb Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:13:33 +0000 Subject: [PATCH] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/lib/prompt-filename.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/lib/prompt-filename.ts diff --git a/src/lib/prompt-filename.ts b/src/lib/prompt-filename.ts new file mode 100644 index 0000000..5dcaee2 --- /dev/null +++ b/src/lib/prompt-filename.ts @@ -0,0 +1,17 @@ +/** + * Prompts the user for a filename before download. Returns the chosen base + * name (without extension) sanitized for filesystem use, or null if cancelled. + * + * @param defaultName Suggested base name (no extension) + * @param ext Extension shown to the user, e.g. "pdf", "docx", "csv" + */ +export function promptFilename(defaultName: string, ext: string): string | null { + const sanitize = (s: string) => s.replace(/[\\/:*?"<>|]+/g, "_").trim(); + const cleanDefault = sanitize(defaultName).replace(new RegExp(`\\.${ext}$`, "i"), "") || "Document"; + const input = typeof window !== "undefined" + ? window.prompt(`File name (.${ext})`, cleanDefault) + : cleanDefault; + if (input === null) return null; // user cancelled + const cleaned = sanitize(input).replace(new RegExp(`\\.${ext}$`, "i"), ""); + return cleaned || cleanDefault; +}