import React, {useState, useEffect} from 'react'; import {useNavigate} from 'react-router-dom'; import FormatCard from './FormatCard'; import FormatModal from './FormatModal'; import AddNewCard from '../ui/AddNewCard'; import {getGitStatus} from '../../api/api'; import {CustomFormats} from '@api/data'; import FilterMenu from '../ui/FilterMenu'; import SortMenu from '../ui/SortMenu'; import {Loader} from 'lucide-react'; import Alert from '@ui/Alert'; import {useFormatModal} from '@hooks/useFormatModal'; function FormatPage() { // Basic state management 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 [mergeConflicts, setMergeConflicts] = useState([]); const navigate = useNavigate(); // Format modal hook integration const { name, description, tags, conditions, tests, error, activeTab, isDeleting, isRunningTests, setName, setDescription, setTags, setConditions, setTests, setActiveTab, setIsDeleting, initializeForm, handleSave, handleRunTests, handleDelete // Added this } = useFormatModal(selectedFormat, () => { fetchFormats(); handleCloseModal(); }); const loadingMessages = [ 'Loading custom formats...', 'Analyzing format conditions...', 'Preparing format library...', 'Syncing format database...', 'Organizing media formats...' ]; useEffect(() => { fetchGitStatus(); }, []); const fetchGitStatus = async () => { try { const result = await getGitStatus(); if (result.success) { setMergeConflicts(result.data.merge_conflicts || []); if (result.data.merge_conflicts.length === 0) { fetchFormats(); } else { setIsLoading(false); } } } catch (error) { console.error('Error fetching Git status:', error); Alert.error('Failed to check repository status'); setIsLoading(false); } }; const fetchFormats = async () => { try { const response = await CustomFormats.getAll(); const formatsData = response.map(item => ({ file_name: item.file_name, modified_date: item.modified_date, created_date: item.created_date, content: { ...item.content, name: item.file_name.replace('.yml', '') } })); setFormats(formatsData); // Extract all unique tags const tags = new Set( formatsData.flatMap(format => format.content.tags || []) ); setAllTags(Array.from(tags)); } catch (error) { console.error('Error fetching formats:', error); Alert.error('Failed to load custom formats'); } finally { setIsLoading(false); } }; const handleOpenModal = (format = null) => { setSelectedFormat(format); setIsModalOpen(true); setIsCloning(false); initializeForm(format?.content, false); }; const handleCloseModal = () => { setSelectedFormat(null); setIsModalOpen(false); setIsCloning(false); }; const handleCloneFormat = format => { const clonedFormat = { ...format, content: { ...format.content, name: `${format.content.name} [COPY]` } }; setSelectedFormat(clonedFormat); setIsModalOpen(true); setIsCloning(true); initializeForm(clonedFormat.content, true); }; const formatDate = dateString => { return new Date(dateString).toLocaleString(); }; const getFilteredAndSortedFormats = () => { let filtered = [...formats]; // Apply filters if (filterType === 'tag' && filterValue) { filtered = filtered.filter(format => format.content.tags?.includes(filterValue) ); } else if (filterType === 'name' && filterValue) { filtered = filtered.filter(format => format.content.name .toLowerCase() .includes(filterValue.toLowerCase()) ); } // Apply sorting return filtered.sort((a, b) => { switch (sortBy) { case 'dateModified': return ( new Date(b.modified_date) - new Date(a.modified_date) ); case 'dateCreated': return new Date(b.created_date) - new Date(a.created_date); case 'name': default: return a.content.name.localeCompare(b.content.name); } }); }; if (isLoading) { return (

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

); } const hasConflicts = mergeConflicts.length > 0; if (hasConflicts) { return (

Merge Conflicts Detected

What Happened?

This page is locked because there are unresolved merge conflicts. You need to address these conflicts in the settings page before continuing.

); } return (
{getFilteredAndSortedFormats().map(format => ( handleOpenModal(format)} onClone={handleCloneFormat} sortBy={sortBy} /> ))} handleOpenModal()} />
); } export default FormatPage;