'use client' import React, { useRef, useState } from 'react' import { PlusIcon, XMarkIcon } from '@heroicons/react/20/solid' import { ipc } from '../../wailsjs/wailsjs/go/models' import { useProject } from '../../context/Project/provider' type NavigationItem = { id: string, name: string, children: { id: string, name: string }[] } const getNavigationProps = (documents: ipc.Document[], groups: ipc.Group[]): NavigationItem[] => { const groupsWithDocuments = groups.map(g => { const childrenDocuments = documents .filter(d => d.groupId === g.id) .map(d => ({ id: d.id, name: d.name })) return { id: g.id, name: g.name, children: childrenDocuments } }) const documentsWithoutGroup = documents .filter(d => !d.groupId || d.groupId === 'Uncategorized') .map(d => ({ id: d.id, name: d.name })) return [ ...groupsWithDocuments, { id: 'Uncategorized', name: 'Uncategorized', children: documentsWithoutGroup } ] } function classNames(...classes: any[]) { return classes.filter(Boolean).join(' ') } function Sidebar() { const [selectedItemId, setSelectedItemId] = useState('') const [selectedGroupId, setSelectedGroupId] = useState('') const [isAddNewDocumentInputShowing, setIsAddNewDocumentInputShowing] = useState(false) const [isAddNewGroupInputShowing, setIsAddNewGroupInputShowing] = useState(false) const addDocumentTextInput = useRef(null) const addGroupTextInput = useRef(null) const { documents, groups, requestAddDocument, requestAddDocumentGroup } = useProject() const navigation = getNavigationProps(documents, groups) const getParentGroupIdFromItemId = (itemId: string) => { let parentGroupId = '' navigation.forEach(n => { const foundItem = n.children.find(c => c.id === itemId) if (foundItem) parentGroupId = n.id }) return parentGroupId } const onAddNewDocumentLineItemClickHandler = (groupId: string) => { setSelectedGroupId(groupId) setIsAddNewDocumentInputShowing(true) setIsAddNewGroupInputShowing(false) } const onAddNewGroupLineItemClickHandler = () => { setIsAddNewGroupInputShowing(true) setIsAddNewDocumentInputShowing(false) } const onItemClickHandler = (itemId: string) => { setSelectedItemId(itemId) setSelectedGroupId(getParentGroupIdFromItemId(itemId)) setIsAddNewDocumentInputShowing(false) setIsAddNewGroupInputShowing(false) } const onCancelAddGroupClickHandler = () => { setIsAddNewGroupInputShowing(false) } const onCancelAddItemClickHandler = () => { setIsAddNewDocumentInputShowing(false) } const onConfirmAddDocumentClickHandler = async (groupId: string) => { const documentName = addDocumentTextInput.current?.value if (!documentName) return const response = await requestAddDocument(groupId, documentName) if (!response.id) return setSelectedItemId(response.id) setSelectedGroupId(groupId) setIsAddNewDocumentInputShowing(false) } const onConfirmAddGroupClickHandler = async(e: React.MouseEvent) => { const groupName = addGroupTextInput.current?.value if (!groupName) return const response = await requestAddDocumentGroup(groupName) if (!response.id) return setSelectedGroupId(response.id) setIsAddNewGroupInputShowing(false) } const renderAddGroupInput = () => { return isAddNewGroupInputShowing ?
: } const renderAddNewDocument = (groupId: string) => { return isAddNewDocumentInputShowing && selectedGroupId === groupId ?
: onAddNewDocumentLineItemClickHandler(groupId)} > } const renderNavigationItems = () => ( ) return ( <>
Textualize
{renderNavigationItems()}
) } export default Sidebar