import { useState, useEffect } from "react"; import PropTypes from "prop-types"; import { saveFormat, deleteFormat, getRegexes } from "../../api/api"; import ConditionModal from "../condition/ConditionModal"; import ConditionCard from "../condition/ConditionCard"; import Modal from "../ui/Modal"; import Alert from "../ui/Alert"; function FormatModal({ format: initialFormat, isOpen, onClose, onSave, isCloning = false, }) { const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [conditions, setConditions] = useState([]); const [isConditionModalOpen, setIsConditionModalOpen] = useState(false); const [selectedCondition, setSelectedCondition] = useState(null); const [regexes, setRegexes] = useState([]); const [error, setError] = useState(""); const [tags, setTags] = useState([]); const [newTag, setNewTag] = useState(""); const [isDeleting, setIsDeleting] = useState(false); const [modalTitle, setModalTitle] = useState(""); useEffect(() => { if (isOpen) { if (isCloning) { setModalTitle("Clone Custom Format"); } else if (initialFormat && initialFormat.id !== 0) { setModalTitle("Edit Custom Format"); } else { setModalTitle("Add Custom Format"); } if (initialFormat && (initialFormat.id !== 0 || isCloning)) { setName(initialFormat.name); setDescription(initialFormat.description); setConditions(initialFormat.conditions || []); setTags(initialFormat.tags || []); } else { setName(""); setDescription(""); setConditions([]); setTags([]); } setError(""); setNewTag(""); setIsDeleting(false); fetchRegexes(); } }, [isOpen, initialFormat, isCloning]); const fetchRegexes = async () => { try { const fetchedRegexes = await getRegexes(); setRegexes(fetchedRegexes); } catch (error) { console.error("Error fetching regexes:", error); setError("Failed to fetch regexes. Please try again."); } }; const handleSave = async () => { if (!name.trim() || !description.trim() || conditions.length === 0) { setError("Name, description, and at least one condition are required."); return; } try { await saveFormat({ id: initialFormat ? initialFormat.id : 0, name, description, conditions, tags, }); onSave(); onClose(); } catch (error) { console.error("Error saving format:", error); setError("Failed to save format. Please try again."); } }; const handleDelete = async () => { if (isDeleting) { try { console.log("Attempting to delete format with ID:", initialFormat.id); const response = await deleteFormat(initialFormat.id); console.log("Delete response:", response); if (response.error) { Alert.error(`Cannot delete: ${response.message}`); } else { Alert.success("Format deleted successfully"); onSave(); onClose(); } } catch (error) { console.error("Error deleting format:", error); Alert.error("Failed to delete format. Please try again."); } finally { setIsDeleting(false); } } else { setIsDeleting(true); } }; const handleOpenConditionModal = (condition = null) => { setSelectedCondition(condition); setIsConditionModalOpen(true); }; const handleCloseConditionModal = () => { setIsConditionModalOpen(false); }; const handleSaveCondition = (newCondition) => { if (selectedCondition) { setConditions( conditions.map((c) => (c === selectedCondition ? newCondition : c)) ); } else { setConditions([...conditions, newCondition]); } setIsConditionModalOpen(false); }; const handleDeleteCondition = (conditionToDelete) => { setConditions(conditions.filter((c) => c !== conditionToDelete)); }; const handleAddTag = () => { if (newTag.trim() && !tags.includes(newTag.trim())) { setTags([...tags, newTag.trim()]); setNewTag(""); } }; const handleRemoveTag = (tagToRemove) => { setTags(tags.filter((tag) => tag !== tagToRemove)); }; return ( <> {error &&
{error}
}
setName(e.target.value)} placeholder="Enter format name" className="w-full p-3 border rounded dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600" />
setDescription(e.target.value)} placeholder="Enter description" className="w-full p-3 border rounded dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600" />
{tags.map((tag) => ( {tag} ))}
setNewTag(e.target.value)} placeholder="Add a tag" className="flex-grow p-2 border rounded-l dark:bg-gray-700 dark:text-gray-200 dark:border-gray-600" />

Conditions:

{conditions.map((condition, index) => ( handleOpenConditionModal(condition)} /> ))}
{initialFormat && initialFormat.id !== 0 && ( )}
); } FormatModal.propTypes = { format: PropTypes.shape({ id: PropTypes.number, name: PropTypes.string.isRequired, description: PropTypes.string.isRequired, conditions: PropTypes.arrayOf( PropTypes.shape({ name: PropTypes.string.isRequired, negate: PropTypes.bool, required: PropTypes.bool, }) ).isRequired, tags: PropTypes.arrayOf(PropTypes.string), }), isOpen: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, onSave: PropTypes.func.isRequired, isCloning: PropTypes.bool, }; export default FormatModal;