import React, { useState, useEffect } from "react"; import FormatCard from "./FormatCard"; import FormatModal from "./FormatModal"; import AddNewCard from "../ui/AddNewCard"; import { getFormats } from "../../api/api"; import FilterMenu from "../ui/FilterMenu"; import SortMenu from "../ui/SortMenu"; import { Loader } from "lucide-react"; function FormatPage() { const [formats, setFormats] = useState([]); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedFormat, setSelectedFormat] = useState(null); const [sortBy, setSortBy] = useState("title"); const [filterType, setFilterType] = useState("none"); const [filterValue, setFilterValue] = useState(""); const [allTags, setAllTags] = useState([]); const [isCloning, setIsCloning] = useState(false); const [isLoading, setIsLoading] = useState(true); const loadingMessages = [ "Decoding the custom format matrix...", "Parsing the digital alphabet soup...", "Untangling the format spaghetti...", "Calibrating the format-o-meter...", "Indexing your media DNA...", ]; useEffect(() => { fetchFormats(); }, []); const fetchFormats = async () => { try { const fetchedFormats = await getFormats(); setFormats(fetchedFormats); const tags = [ ...new Set(fetchedFormats.flatMap((format) => format.tags || [])), ]; setAllTags(tags); } catch (error) { console.error("Error fetching formats:", error); } finally { setIsLoading(false); } }; const handleOpenModal = (format = null) => { setSelectedFormat(format); setIsModalOpen(true); setIsCloning(false); }; const handleCloseModal = () => { setSelectedFormat(null); setIsModalOpen(false); setIsCloning(false); }; const handleCloneFormat = (format) => { const clonedFormat = { ...format, id: 0, name: `${format.name} [COPY]`, }; setSelectedFormat(clonedFormat); setIsModalOpen(true); setIsCloning(true); }; const handleSaveFormat = () => { fetchFormats(); handleCloseModal(); }; const formatDate = (dateString) => { return new Date(dateString).toLocaleString(); }; const sortedAndFilteredFormats = formats .filter((format) => { if (filterType === "tag") { return format.tags && format.tags.includes(filterValue); } if (filterType === "date") { const formatDate = new Date(format.date_modified); const filterDate = new Date(filterValue); return formatDate.toDateString() === filterDate.toDateString(); } return true; }) .sort((a, b) => { if (sortBy === "title") return a.name.localeCompare(b.name); if (sortBy === "dateCreated") return new Date(b.date_created) - new Date(a.date_created); if (sortBy === "dateModified") return new Date(b.date_modified) - new Date(a.date_modified); return 0; }); if (isLoading) { return (

{loadingMessages[Math.floor(Math.random() * loadingMessages.length)]}

); } return (

Manage Custom Formats

{sortedAndFilteredFormats.map((format) => ( handleOpenModal(format)} onClone={handleCloneFormat} // Pass the clone handler showDate={sortBy !== "title"} formatDate={formatDate} /> ))} handleOpenModal()} />
); } export default FormatPage;