import React, { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { useTranslation } from "react-i18next"; import { Folder, Server, Cloud, Database, Box, Package, Layers, Archive, HardDrive, Globe, } from "lucide-react"; interface FolderEditDialogProps { folderName: string; currentColor?: string; currentIcon?: string; open: boolean; onOpenChange: (open: boolean) => void; onSave: (color: string, icon: string) => Promise; } const AVAILABLE_COLORS = [ { value: "#ef4444", label: "Red" }, { value: "#f97316", label: "Orange" }, { value: "#eab308", label: "Yellow" }, { value: "#22c55e", label: "Green" }, { value: "#3b82f6", label: "Blue" }, { value: "#a855f7", label: "Purple" }, { value: "#ec4899", label: "Pink" }, { value: "#6b7280", label: "Gray" }, ]; const AVAILABLE_ICONS = [ { value: "Folder", label: "Folder", Icon: Folder }, { value: "Server", label: "Server", Icon: Server }, { value: "Cloud", label: "Cloud", Icon: Cloud }, { value: "Database", label: "Database", Icon: Database }, { value: "Box", label: "Box", Icon: Box }, { value: "Package", label: "Package", Icon: Package }, { value: "Layers", label: "Layers", Icon: Layers }, { value: "Archive", label: "Archive", Icon: Archive }, { value: "HardDrive", label: "HardDrive", Icon: HardDrive }, { value: "Globe", label: "Globe", Icon: Globe }, ]; export function FolderEditDialog({ folderName, currentColor, currentIcon, open, onOpenChange, onSave, }: FolderEditDialogProps) { const { t } = useTranslation(); const [selectedColor, setSelectedColor] = useState(currentColor || AVAILABLE_COLORS[0].value); const [selectedIcon, setSelectedIcon] = useState(currentIcon || AVAILABLE_ICONS[0].value); const [loading, setLoading] = useState(false); useEffect(() => { if (open) { setSelectedColor(currentColor || AVAILABLE_COLORS[0].value); setSelectedIcon(currentIcon || AVAILABLE_ICONS[0].value); } }, [open, currentColor, currentIcon]); const handleSave = async () => { setLoading(true); try { await onSave(selectedColor, selectedIcon); onOpenChange(false); } catch (error) { console.error("Failed to save folder metadata:", error); } finally { setLoading(false); } }; return ( {t("hosts.editFolderAppearance")} {t("hosts.editFolderAppearanceDesc")}: {folderName}
{/* Color Selection */}
{AVAILABLE_COLORS.map((color) => (
{/* Icon Selection */}
{AVAILABLE_ICONS.map(({ value, label, Icon }) => ( ))}
{/* Preview */}
{(() => { const IconComponent = AVAILABLE_ICONS.find( (i) => i.value === selectedIcon )?.Icon || Folder; return ( ); })()} {folderName}
); }