'use client' import React, { Fragment, useRef, useState } from 'react' import { Menu, Transition } from '@headlessui/react' import { BellIcon } from '@heroicons/react/24/outline' import { MagnifyingGlassIcon, PlusIcon, XMarkIcon } from '@heroicons/react/20/solid' import { GetDocuments, RequestAddDocument, RequestAddDocumentGroup } from '../../wailsjs/wailsjs/go/ipc/Channel' import { LogPrint } from '../../wailsjs/wailsjs/runtime/runtime' import { ipc } from '../../wailsjs/wailsjs/go/models' type NavigationItem = { id: string, name: string, children: { id: string, name: string }[] } const userNavigation = [ { name: 'Your Profile' }, { name: 'Settings' }, { name: 'Sign out' }, ] const getNavigationProps = (documentsAndGroups: ipc.GetDocumentsResponse): NavigationItem[] => { const { documents, documentGroups } = documentsAndGroups const groupsWithDocuments = documentGroups.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 } ] } const initDocumentsAndGroups = new ipc.GetDocumentsResponse({ documents: [], documentGroups: [] }) function classNames(...classes: any[]) { return classes.filter(Boolean).join(' ') } function WorkspaceNavigation() { const [selectedItemId, setSelectedItemId] = useState('') const [selectedGroupId, setSelectedGroupId] = useState('') const [isAddNewDocumentInputShowing, setIsAddNewDocumentInputShowing] = useState(false) const [isAddNewGroupInputShowing, setIsAddNewGroupInputShowing] = useState(false) const [documentsAndGroups, setDocumentsAndGroups] = useState(initDocumentsAndGroups) const addDocumentTextInput = useRef(null) const addGroupTextInput = useRef(null) const navigation = getNavigationProps(documentsAndGroups) const updateDocuments = async () => { GetDocuments().then(response => { LogPrint(JSON.stringify(response, null, 2)) setDocumentsAndGroups(response) Promise.resolve(response) }) } if (!documentsAndGroups.documents.length || !documentsAndGroups.documentGroups.length) { updateDocuments() } 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 let newDocumentsAndGroups = new ipc.GetDocumentsResponse(documentsAndGroups) newDocumentsAndGroups.documents.push(response) setDocumentsAndGroups(newDocumentsAndGroups) 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 let newDocumentsAndGroups = new ipc.GetDocumentsResponse(documentsAndGroups) newDocumentsAndGroups.documentGroups.push(response) setDocumentsAndGroups(newDocumentsAndGroups) setSelectedGroupId(response.id) setIsAddNewGroupInputShowing(false) } const renderAddGroupInput = () => { return isAddNewGroupInputShowing ?
: } const renderAddNewDocument = (groupId: string) => { return isAddNewDocumentInputShowing && selectedGroupId === groupId ?
: onAddNewDocumentLineItemClickHandler(groupId)} > } const renderNavigationItems = () => ( ) return ( <>
{/* Sidebar component */}
Textualize
{renderNavigationItems()}
{/* Profile dropdown */}
Open user menu
{userNavigation.map((item) => ( {({ active }) => ( {item.name} )} ))}
) } export default WorkspaceNavigation