"use client"; import { useState, useEffect, useCallback, useMemo } from "react"; import { useTranslations } from "next-intl"; import { Folder, FolderOpen, FileText, FileCode, ImageIcon, FileAudio, File, Home, ChevronRight, ChevronDown } from "lucide-react"; import { SettingsSection, SettingItem, ToggleSwitch, RadioGroup } from "./settings-section"; import { loadFilesSettings, saveFilesSettings, type FilesSettings, type FolderLayout } from "@/components/files/files-settings-dialog"; import { cn } from "@/lib/utils"; interface SampleFile { name: string; isFolder: boolean; size: number; modified: string; hidden?: boolean; thumbnailUrl?: string; } const SAMPLE_FILES: SampleFile[] = [ { name: "Documents", isFolder: true, size: 0, modified: "2026-03-10" }, { name: "Photos", isFolder: true, size: 0, modified: "2026-03-14" }, { name: "report.pdf", isFolder: false, size: 245000, modified: "2026-03-15" }, { name: "notes.md", isFolder: false, size: 1200, modified: "2026-03-12" }, { name: "vacation.jpg", isFolder: false, size: 3400000, modified: "2026-03-08", thumbnailUrl: "/branding/Bulwark_Logo_Color.png" }, { name: "song.mp3", isFolder: false, size: 5200000, modified: "2026-03-01" }, { name: ".config", isFolder: false, size: 340, modified: "2026-02-20", hidden: true }, ]; function getPreviewIcon(file: SampleFile, colored: boolean, size: "sm" | "lg") { const cls = size === "sm" ? "w-4 h-4 flex-shrink-0" : "w-8 h-8 flex-shrink-0"; if (file.isFolder) { return ; } const ext = file.name.split(".").pop()?.toLowerCase(); switch (ext) { case "jpg": case "png": case "gif": return ; case "mp3": case "wav": return ; case "pdf": return ; case "md": case "json": case "js": case "ts": return ; default: return ; } } function formatSize(bytes: number): string { if (bytes === 0) return "-"; if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; } function FilesSettingsPreview({ settings }: { settings: FilesSettings }) { const sortedFiles = useMemo(() => { let files = SAMPLE_FILES.filter((f) => { if (!settings.showHiddenFiles && f.hidden) return false; if (settings.folderLayout === "sidebar" && f.isFolder) return false; return true; }); files.sort((a, b) => { // Folders first if (a.isFolder !== b.isFolder) return a.isFolder ? -1 : 1; let cmp = 0; switch (settings.defaultSortKey) { case "name": cmp = a.name.localeCompare(b.name); break; case "size": cmp = a.size - b.size; break; case "modified": cmp = a.modified.localeCompare(b.modified); break; } return settings.defaultSortDir === "desc" ? -cmp : cmp; }); return files; }, [settings.showHiddenFiles, settings.folderLayout, settings.defaultSortKey, settings.defaultSortDir]); const listView = (
Name Size Modified
{sortedFiles.map((file) => (
{settings.showThumbnails && file.thumbnailUrl ? ( ) : settings.showIcons ? ( getPreviewIcon(file, settings.coloredIcons, "sm") ) : null} {file.name} {formatSize(file.size)} {file.modified.slice(5)}
))}
); const gridView = (
{sortedFiles.map((file) => (
{settings.showThumbnails && file.thumbnailUrl ? ( ) : settings.showIcons ? ( getPreviewIcon(file, settings.coloredIcons, "lg") ) : (
)} {file.name}
))}
); const sidebar = settings.folderLayout === "sidebar" && (
Files
Documents
Photos
); return (
{sidebar} {settings.defaultViewMode === "grid" ? gridView : listView}
); } export function FilesSettingsComponent() { const t = useTranslations("settings.files"); const [settings, setSettings] = useState(loadFilesSettings); // Listen for external changes (e.g. if file-browser updates settings) useEffect(() => { const handleStorage = (e: StorageEvent) => { if (e.key === "files-settings") { setSettings(loadFilesSettings()); } }; window.addEventListener("storage", handleStorage); return () => window.removeEventListener("storage", handleStorage); }, []); const update = useCallback((patch: Partial) => { setSettings(prev => { const next = { ...prev, ...patch }; saveFilesSettings(next); return next; }); }, []); return (

{t("preview.label")}

update({ folderLayout: v as FolderLayout })} options={[ { value: "inline", label: t("folder_layout.inline") }, { value: "sidebar", label: t("folder_layout.sidebar") }, ]} /> update({ defaultViewMode: v as "list" | "grid" })} options={[ { value: "list", label: t("default_view.list") }, { value: "grid", label: t("default_view.grid") }, ]} /> update({ defaultSortKey: v as "name" | "size" | "modified" })} options={[ { value: "name", label: t("default_sort.name") }, { value: "size", label: t("default_sort.size") }, { value: "modified", label: t("default_sort.modified") }, ]} /> update({ defaultSortDir: v as "asc" | "desc" })} options={[ { value: "asc", label: t("sort_direction.ascending") }, { value: "desc", label: t("sort_direction.descending") }, ]} /> update({ showIcons: v })} /> update({ coloredIcons: v })} disabled={!settings.showIcons} /> update({ showThumbnails: v })} /> update({ showHiddenFiles: v })} />
); }