[dyad] Add custom filename input - wrote 1 file(s)

This commit is contained in:
[dyad]
2026-01-18 10:55:23 +01:00
parent a17f013483
commit 2edde3e39e

View File

@@ -27,6 +27,7 @@ import { cn } from "@/lib/utils";
export function ImageConverter() { export function ImageConverter() {
const [images, setImages] = useState<File[]>([]); const [images, setImages] = useState<File[]>([]);
const [previewUrls, setPreviewUrls] = useState<string[]>([]); const [previewUrls, setPreviewUrls] = useState<string[]>([]);
const [filenames, setFilenames] = useState<string[]>([]);
const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>( const [selectedImageIndex, setSelectedImageIndex] = useState<number | null>(
null null
); );
@@ -75,9 +76,14 @@ export function ImageConverter() {
...previewUrls, ...previewUrls,
...imageFiles.map((file) => URL.createObjectURL(file)), ...imageFiles.map((file) => URL.createObjectURL(file)),
]; ];
const newFilenames = [
...filenames,
...imageFiles.map(file => file.name.substring(0, file.name.lastIndexOf('.')))
];
setImages(newImages); setImages(newImages);
setPreviewUrls(newPreviewUrls); setPreviewUrls(newPreviewUrls);
setFilenames(newFilenames);
if (selectedImageIndex === null) { if (selectedImageIndex === null) {
setSelectedImageIndex(images.length); setSelectedImageIndex(images.length);
@@ -110,9 +116,11 @@ export function ImageConverter() {
URL.revokeObjectURL(previewUrls[indexToRemove]); URL.revokeObjectURL(previewUrls[indexToRemove]);
const newImages = images.filter((_, i) => i !== indexToRemove); const newImages = images.filter((_, i) => i !== indexToRemove);
const newPreviewUrls = previewUrls.filter((_, i) => i !== indexToRemove); const newPreviewUrls = previewUrls.filter((_, i) => i !== indexToRemove);
const newFilenames = filenames.filter((_, i) => i !== indexToRemove);
setImages(newImages); setImages(newImages);
setPreviewUrls(newPreviewUrls); setPreviewUrls(newPreviewUrls);
setFilenames(newFilenames);
if (selectedImageIndex === indexToRemove) { if (selectedImageIndex === indexToRemove) {
setSelectedImageIndex(newImages.length > 0 ? Math.max(0, indexToRemove - 1) : null); setSelectedImageIndex(newImages.length > 0 ? Math.max(0, indexToRemove - 1) : null);
@@ -125,15 +133,27 @@ export function ImageConverter() {
previewUrls.forEach((url) => URL.revokeObjectURL(url)); previewUrls.forEach((url) => URL.revokeObjectURL(url));
setImages([]); setImages([]);
setPreviewUrls([]); setPreviewUrls([]);
setFilenames([]);
setSelectedImageIndex(null); setSelectedImageIndex(null);
toast.info("All images cleared."); toast.info("All images cleared.");
}; };
const handleFilenameChange = (e: ChangeEvent<HTMLInputElement>) => {
if (selectedImageIndex === null) return;
const newFilenames = [...filenames];
newFilenames[selectedImageIndex] = e.target.value;
setFilenames(newFilenames);
};
const handleConvertAndDownload = () => { const handleConvertAndDownload = () => {
if (selectedImageIndex === null || !width || !height) { if (selectedImageIndex === null || !width || !height) {
toast.error("Please select an image and set dimensions."); toast.error("Please select an image and set dimensions.");
return; return;
} }
if (!filenames[selectedImageIndex] || filenames[selectedImageIndex].trim() === "") {
toast.error("Please enter a filename.");
return;
}
setIsConverting(true); setIsConverting(true);
const image = images[selectedImageIndex]; const image = images[selectedImageIndex];
@@ -153,8 +173,8 @@ export function ImageConverter() {
const dataUrl = canvas.toDataURL(`image/${format}`); const dataUrl = canvas.toDataURL(`image/${format}`);
const link = document.createElement("a"); const link = document.createElement("a");
link.href = dataUrl; link.href = dataUrl;
const originalName = image.name.substring(0, image.name.lastIndexOf('.')); const customName = filenames[selectedImageIndex];
link.download = `${originalName}_${width}x${height}.${format}`; link.download = `${customName}_${width}x${height}.${format}`;
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
document.body.removeChild(link); document.body.removeChild(link);
@@ -205,6 +225,17 @@ export function ImageConverter() {
</SelectContent> </SelectContent>
</Select> </Select>
</div> </div>
<div className="space-y-2">
<Label htmlFor="filename">Filename</Label>
<Input
id="filename"
type="text"
placeholder="Enter filename"
value={isImageSelected ? filenames[selectedImageIndex] : ""}
onChange={handleFilenameChange}
disabled={!isImageSelected}
/>
</div>
</CardContent> </CardContent>
<CardFooter className="flex justify-between"> <CardFooter className="flex justify-between">
<Button variant="outline" onClick={() => fileInputRef.current?.click()}><Upload className="mr-2 h-4 w-4" />Upload Images</Button> <Button variant="outline" onClick={() => fileInputRef.current?.click()}><Upload className="mr-2 h-4 w-4" />Upload Images</Button>