'use client'; import { FolderType, FoldersMessages } from '@/types/folder'; import { useState, useEffect, useContext } from 'react'; import { Button, Listbox, ListboxItem } from '@nextui-org/react'; import { Folder, Plus } from 'lucide-react'; import { usePathname, useRouter } from '@/src/navigation'; import { TokenContext } from '@/utils/TokenProvider'; import useGetCurrentIds from '@/utils/useGetCurrentIds'; import FolderDialog from './FolderDialog'; import FolderEditMenu from './FolderEditMenu'; import DeleteConfirmDialog from '@/components/DeleteConfirmDialog'; import { fetchFolders, createFolder, updateFolder, deleteFolder } from './foldersControl'; type Props = { projectId: string; messages: FoldersMessages; locale: string; }; export default function FoldersPane({ projectId, messages, locale }: Props) { const router = useRouter(); const pathname = usePathname(); const context = useContext(TokenContext); const [folders, setFolders] = useState([]); const [selectedFolder, setSelectedFolder] = useState(null); const { folderId } = useGetCurrentIds(); const [isFolderDialogOpen, setIsFolderDialogOpen] = useState(false); const [editingFolder, setEditingFolder] = useState(null); useEffect(() => { async function fetchDataEffect() { if (!context.isSignedIn()) { return; } try { const folders: FolderType[] = await fetchFolders(context.token.access_token, Number(projectId)); setFolders(folders); // no folder on project if (folders.length === 0) { return; } const selectedFolderFromUrl = folders.find((folder) => folder.id === folderId); setSelectedFolder(selectedFolderFromUrl ? selectedFolderFromUrl : null); // Redirect to the smallest folder ID page if the path is "projects/[projectId]/folders if (pathname === `/projects/${projectId}/folders`) { const smallestFolderId = Math.min(...folders.map((folder) => folder.id)); router.push(`/projects/${projectId}/folders/${smallestFolderId}/cases`, { locale: locale }); } } catch (error: any) { console.error('Error in effect:', error.message); } } fetchDataEffect(); }, [context, folderId]); const openDialogForCreate = () => { setIsFolderDialogOpen(true); setEditingFolder(null); }; const closeDialog = () => { setIsFolderDialogOpen(false); setEditingFolder(null); }; const onSubmit = async (name: string, detail: string) => { if (editingFolder) { const updatedProject = await updateFolder( context.token.access_token, editingFolder.id, name, detail, projectId, null ); const updatedProjects = folders.map((project) => (project.id === updatedProject.id ? updatedProject : project)); setFolders(updatedProjects); } else { const newProject = await createFolder(context.token.access_token, name, detail, projectId, null); setFolders([...folders, newProject]); } closeDialog(); }; const onEditClick = (folder: FolderType) => { setEditingFolder(folder); setIsFolderDialogOpen(true); }; // Delete confirm dialog const [isDeleteConfirmDialogOpen, setIsDeleteConfirmDialogOpen] = useState(false); const [deleteFolderId, setDeleteFolderId] = useState(null); const closeDeleteConfirmDialog = () => { setIsDeleteConfirmDialogOpen(false); setDeleteFolderId(null); }; const onDeleteClick = (deleteFolderId: number) => { setDeleteFolderId(deleteFolderId); setIsDeleteConfirmDialogOpen(true); }; const onConfirm = async () => { if (deleteFolderId) { await deleteFolder(context.token.access_token, deleteFolderId); router.push(`/projects/${projectId}/folders`, { locale: locale }); closeDeleteConfirmDialog(); } }; const baseClass = ''; const selectedClass = `${baseClass} bg-neutral-200 dark:bg-neutral-700`; return ( <>
{folders.map((folder, index) => ( router.push(`/projects/${projectId}/folders/${folder.id}/cases`, { locale: locale })} startContent={} className={selectedFolder && folder.id === selectedFolder.id ? selectedClass : baseClass} endContent={ } > {folder.name} ))}
); }