import React, { useState, useEffect, useRef, useCallback } from 'react'; import TagInput from '../Tag/TagInput'; import { Note } from '../../entities/Note'; import { useDataContext } from '../../contexts/DataContext'; interface NoteModalProps { isOpen: boolean; onClose: () => void; note?: Note | null; onSave?: (note: Note) => void; } const NoteModal: React.FC = ({ isOpen, onClose, note }) => { const { createNote, updateNote } = useDataContext(); const [formData, setFormData] = useState( note || { title: '', content: '', tags: [], } ); const [availableTags, setAvailableTags] = useState([]); const [error, setError] = useState(null); const modalRef = useRef(null); useEffect(() => { if (isOpen) { const fetchAvailableTags = async () => { try { const response = await fetch('/api/tags', { credentials: 'include', headers: { Accept: 'application/json', }, }); if (response.ok) { const data = await response.json(); setAvailableTags(data.map((tag: { name: string }) => tag.name)); } else { console.error('Failed to fetch available tags'); } } catch (err) { console.error('Error fetching available tags:', err); } }; fetchAvailableTags(); } }, [isOpen]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (modalRef.current && !modalRef.current.contains(event.target as Node)) { onClose(); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); } return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [isOpen, onClose]); const handleChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value, })); }; const handleTagsChange = useCallback((newTags: string[]) => { setFormData((prev) => ({ ...prev, tags: newTags.map((tagName) => ({ id: -1, name: tagName })), })); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.title.trim() || !formData.content.trim()) { setError('Title and Content are required.'); return; } try { if (note?.id) { await updateNote(note.id, formData); } else { await createNote(formData); } onClose(); } catch (err) { console.error('Error saving note:', err); setError('Failed to save note.'); } }; if (!isOpen) return null; return (
{/* Note Title */}
{/* Note Content */}