import { FC, useCallback, useEffect, useState, } from 'react'; import { useTranslation } from 'next-i18next'; import { DropdownToggle } from 'reactstrap'; import { toastError, toastSuccess } from '~/client/util/apiNotification'; import { apiv3Delete, apiv3Post, apiv3Put } from '~/client/util/apiv3-client'; import CountBadge from '~/components/Common/CountBadge'; import FolderIcon from '~/components/Icons/FolderIcon'; import TriangleIcon from '~/components/Icons/TriangleIcon'; import { BookmarkFolderItems } from '~/interfaces/bookmark-info'; import { useSWRxBookamrkFolderAndChild } from '~/stores/bookmark-folder'; import BookmarkFolderItemControl from './BookmarkFolderItemControl'; import BookmarkFolderNameInput from './BookmarkFolderNameInput'; import DeleteBookmarkFolderModal from './DeleteBookmarkFolderModal'; type BookmarkFolderItemProps = { bookmarkFolder: BookmarkFolderItems isOpen?: boolean } const BookmarkFolderItem: FC = (props: BookmarkFolderItemProps) => { const { bookmarkFolder, isOpen: _isOpen = false } = props; const { t } = useTranslation(); const { name, _id: folderId, children, parent, } = bookmarkFolder; const [currentChildren, setCurrentChildren] = useState(); const [targetFolder, setTargetFolder] = useState(folderId); const [isOpen, setIsOpen] = useState(_isOpen); const { data: childBookmarkFolderData, mutate: mutateChildBookmarkData } = useSWRxBookamrkFolderAndChild(targetFolder); const { mutate: mutateParentBookmarkFolder } = useSWRxBookamrkFolderAndChild(parent); const [isRenameAction, setIsRenameAction] = useState(false); const [isCreateAction, setIsCreateAction] = useState(false); const [isDeleteFolderModalShown, setIsDeleteFolderModalShown] = useState(false); const getChildCount = useCallback((): number => { if (currentChildren != null && currentChildren.length > children.length) { return currentChildren.length; } return children.length; }, [children.length, currentChildren]); useEffect(() => { if (childBookmarkFolderData != null) { mutateChildBookmarkData(); setCurrentChildren(childBookmarkFolderData); } }, [childBookmarkFolderData, mutateChildBookmarkData]); const hasChildren = useCallback((): boolean => { if (currentChildren != null && currentChildren.length > children.length) { return currentChildren.length > 0; } return children.length > 0; }, [children.length, currentChildren]); const loadChildFolder = useCallback(async() => { setIsOpen(!isOpen); setTargetFolder(folderId); }, [folderId, isOpen]); const loadParent = useCallback(async() => { if (!isRenameAction) { if (parent != null) { await mutateParentBookmarkFolder(); } // Reload root folder structure setTargetFolder(null); } else { await mutateParentBookmarkFolder(); } }, [isRenameAction, mutateParentBookmarkFolder, parent]); // Rename for bookmark folder handler const onPressEnterHandlerForRename = useCallback(async(folderName: string) => { try { await apiv3Put('/bookmark-folder', { bookmarkFolderId: folderId, name: folderName, parent }); loadParent(); setIsRenameAction(false); toastSuccess(t('toaster.update_successed', { target: t('bookmark_folder.bookmark_folder') })); } catch (err) { toastError(err); } }, [folderId, loadParent, parent, t]); // Create new folder / subfolder handler const onPressEnterHandlerForCreate = useCallback(async(folderName: string) => { try { await apiv3Post('/bookmark-folder', { name: folderName, parent: targetFolder }); setIsOpen(true); setIsCreateAction(false); mutateChildBookmarkData(); toastSuccess(t('toaster.create_succeeded', { target: t('bookmark_folder.bookmark_folder') })); } catch (err) { toastError(err); } }, [mutateChildBookmarkData, t, targetFolder]); // Delete Fodler handler const onClickDeleteButtonHandler = useCallback(async() => { try { await apiv3Delete(`/bookmark-folder/${folderId}`); setIsDeleteFolderModalShown(false); loadParent(); toastSuccess(t('toaster.delete_succeeded', { target: t('bookmark_folder.bookmark_folder') })); } catch (err) { toastError(err); } }, [folderId, loadParent, t]); const onClickPlusButton = useCallback(async(e) => { e.stopPropagation(); if (!isOpen && hasChildren()) { setIsOpen(true); } setIsCreateAction(true); }, [hasChildren, isOpen]); const renderChildFolder = () => { return isOpen && currentChildren?.map((childFolder) => { return (
); }); }; const onClickRenameHandler = useCallback(() => { setIsRenameAction(true); }, []); const onClickDeleteHandler = useCallback(() => { setIsDeleteFolderModalShown(true); }, []); const onDeleteFolderModalClose = useCallback(() => { setIsDeleteFolderModalShown(false); }, []); return (
  • {hasChildren() && ( )}
    {
    } { isRenameAction ? ( setIsRenameAction(false)} onPressEnter={onPressEnterHandlerForRename} value={name} /> ) : ( <>

    {name}

    {hasChildren() && (
    )} ) }
    e.stopPropagation()}>
  • {isCreateAction && (
    setIsCreateAction(false)} onPressEnter={onPressEnterHandlerForCreate} />
    )} { renderChildFolder() }
    ); }; export default BookmarkFolderItem;