diff --git a/frontend/components/Tag/TagDetails.tsx b/frontend/components/Tag/TagDetails.tsx index ffa5ea1..bfd6a9d 100644 --- a/frontend/components/Tag/TagDetails.tsx +++ b/frontend/components/Tag/TagDetails.tsx @@ -1,6 +1,7 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import { useParams, Link, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; +import { usePersistedModal } from '../../hooks/usePersistedModal'; import { CheckIcon, BookOpenIcon, @@ -14,6 +15,7 @@ import { Note } from '../../entities/Note'; import { Project } from '../../entities/Project'; import TaskList from '../Task/TaskList'; import ProjectItem from '../Project/ProjectItem'; +import ProjectShareModal from '../Project/ProjectShareModal'; import TagModal from './TagModal'; import ConfirmDialog from '../Shared/ConfirmDialog'; @@ -45,10 +47,22 @@ const TagDetails: React.FC = () => { const [hoveredNoteId, setHoveredNoteId] = useState(null); const [, setProjectToDelete] = useState(null); - // State for tag edit/delete - const [isTagModalOpen, setIsTagModalOpen] = useState(false); + // State for tag edit/delete - use persisted modal state that survives component remounts + const { + isOpen: isTagModalOpen, + openModal: openTagModal, + closeModal: closeTagModal, + } = usePersistedModal(tag?.id); + const editButtonRef = useRef(null); const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false); + + // State for project sharing + const [shareModal, setShareModal] = useState<{ + isOpen: boolean; + project: Project | null; + }>({ isOpen: false, project: null }); + const navigate = useNavigate(); useEffect(() => { @@ -87,6 +101,23 @@ const TagDetails: React.FC = () => { fetchTagData(); }, [uidSlug, t]); + // Setup native event listener for edit button to avoid React event system conflicts + useEffect(() => { + const button = editButtonRef.current; + if (button) { + const handleClick = (e: Event) => { + e.preventDefault(); + e.stopPropagation(); + openTagModal(); + }; + + button.addEventListener('click', handleClick); + return () => { + button.removeEventListener('click', handleClick); + }; + } + }, [openTagModal]); + // Task handlers const handleTaskUpdate = async (updatedTask: Task) => { try { @@ -165,17 +196,13 @@ const TagDetails: React.FC = () => { }; // Tag handlers - const handleEditTag = () => { - setIsTagModalOpen(true); - }; - const handleSaveTag = async (tagData: Tag) => { try { if (tag && tag.uid) { const updatedTag = await updateTag(tag.uid, tagData); setTag(updatedTag); } - setIsTagModalOpen(false); + closeTagModal(); } catch (error) { console.error('Error updating tag:', error); throw error; @@ -225,7 +252,8 @@ const TagDetails: React.FC = () => {