From 1a96abc2d13e2bb9b588b12fb9edf904f2acb86f Mon Sep 17 00:00:00 2001 From: "[dyad]" Date: Sun, 18 Jan 2026 11:08:49 +0100 Subject: [PATCH] [dyad] Add batch filename settings panel - wrote 1 file(s) --- src/components/image-converter.tsx | 90 +++++++++++++++++++++--------- 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/src/components/image-converter.tsx b/src/components/image-converter.tsx index 8a28a62..1ace19b 100644 --- a/src/components/image-converter.tsx +++ b/src/components/image-converter.tsx @@ -23,14 +23,21 @@ import { ScrollArea } from "@/components/ui/scroll-area"; import { Upload, Download, X, Trash2 } from "lucide-react"; import { toast } from "sonner"; import { cn } from "@/lib/utils"; +import { Switch } from "@/components/ui/switch"; export function ImageConverter() { const [images, setImages] = useState([]); const [previewUrls, setPreviewUrls] = useState([]); - const [filenames, setFilenames] = useState([]); + const [originalFilenames, setOriginalFilenames] = useState([]); const [width, setWidth] = useState(""); const [height, setHeight] = useState(""); const [format, setFormat] = useState<"png" | "jpeg" | "webp">("png"); + + const [prefix, setPrefix] = useState(""); + const [suffix, setSuffix] = useState(""); + const [useCounter, setUseCounter] = useState(true); + const [counterDigits, setCounterDigits] = useState(3); + const [isConverting, setIsConverting] = useState(false); const [isDraggingOver, setIsDraggingOver] = useState(false); const fileInputRef = useRef(null); @@ -58,8 +65,8 @@ export function ImageConverter() { ...previewUrls, ...imageFiles.map((file) => URL.createObjectURL(file)), ]; - const newFilenames = [ - ...filenames, + const newOriginalFilenames = [ + ...originalFilenames, ...imageFiles.map((file) => file.name.substring(0, file.name.lastIndexOf(".")) ), @@ -67,7 +74,7 @@ export function ImageConverter() { setImages(newImages); setPreviewUrls(newPreviewUrls); - setFilenames(newFilenames); + setOriginalFilenames(newOriginalFilenames); toast.success(`${imageFiles.length} image(s) added.`); }; @@ -97,28 +104,28 @@ export function ImageConverter() { URL.revokeObjectURL(previewUrls[indexToRemove]); const newImages = images.filter((_, i) => i !== indexToRemove); const newPreviewUrls = previewUrls.filter((_, i) => i !== indexToRemove); - const newFilenames = filenames.filter((_, i) => i !== indexToRemove); + const newOriginalFilenames = originalFilenames.filter((_, i) => i !== indexToRemove); setImages(newImages); setPreviewUrls(newPreviewUrls); - setFilenames(newFilenames); + setOriginalFilenames(newOriginalFilenames); }; const handleClearAll = () => { previewUrls.forEach((url) => URL.revokeObjectURL(url)); setImages([]); setPreviewUrls([]); - setFilenames([]); + setOriginalFilenames([]); toast.info("All images cleared."); }; - const handleFilenameChange = ( - e: ChangeEvent, - index: number - ) => { - const newFilenames = [...filenames]; - newFilenames[index] = e.target.value; - setFilenames(newFilenames); + const generateFinalFilename = (index: number) => { + if (useCounter) { + const counter = (index + 1).toString().padStart(counterDigits, '0'); + return `${prefix}${counter}${suffix}`; + } + const originalName = originalFilenames[index] || "filename"; + return `${prefix}${originalName}${suffix}`; }; const handleConvertAndDownload = async () => { @@ -127,11 +134,6 @@ export function ImageConverter() { return; } - if (filenames.some((name) => name.trim() === "")) { - toast.error("Please ensure all images have a filename."); - return; - } - setIsConverting(true); toast.info(`Starting conversion for ${images.length} images...`); @@ -153,8 +155,8 @@ export function ImageConverter() { const dataUrl = canvas.toDataURL(`image/${format}`); const link = document.createElement("a"); link.href = dataUrl; - const customName = filenames[index]; - link.download = `${customName}_${width}x${height}.${format}`; + const finalFilename = generateFinalFilename(index); + link.download = `${finalFilename}_${width}x${height}.${format}`; document.body.appendChild(link); link.click(); document.body.removeChild(link); @@ -226,6 +228,41 @@ export function ImageConverter() { + + + + Filename Settings + Customize the output filenames. + + +
+ + setPrefix(e.target.value)} disabled={!hasImages} /> +
+
+ + setSuffix(e.target.value)} disabled={!hasImages} /> +
+
+ + +
+ {useCounter && ( +
+ + +
+ )} +
+
@@ -261,14 +298,13 @@ export function ImageConverter() { {previewUrls.map((url, index) => (
{`Preview -
+

- Source: {images[index].name} + {images[index].name} +

+

+ New name: {generateFinalFilename(index)}

-
- - handleFilenameChange(e, index)} /> -