import { BookText, Eye, EyeOff, GithubLogo, LiamLogoMark, Megaphone, MessagesSquare, Sidebar, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuItem, } from '@liam-hq/ui' import { useNodes } from '@xyflow/react' import { useCallback, useMemo } from 'react' import { useVersionOrThrow } from '../../../../../providers' import { useUserEditingOrThrow } from '../../../../../stores' import { useCustomReactflow } from '../../../../reactflow/hooks' import { isTableNode } from '../../../utils' import { updateNodesHiddenState } from '../../ERDContent/utils' import { useTableVisibility } from '../hooks' import { CopyLinkButton } from './CopyLinkButton' import styles from './LeftPane.module.css' import { MenuItemLink, type Props as MenuItemLinkProps } from './MenuItemLink' import { TableNameMenuButton } from './TableNameMenuButton' export const LeftPane = () => { const { version } = useVersionOrThrow() const { selectedNodeIds, setHiddenNodeIds } = useUserEditingOrThrow() const { setNodes } = useCustomReactflow() const menuItemLinks = useMemo( (): MenuItemLinkProps[] => [ { label: 'Release Notes', href: 'https://github.com/liam-hq/liam/releases', noreferrer: true, target: '_blank', icon: , }, { label: 'Documentation', href: 'https://liambx.com/docs', noreferrer: version.displayedOn === 'cli', target: '_blank', icon: , }, { label: 'Community Forum', href: 'https://github.com/liam-hq/liam/discussions', noreferrer: true, target: '_blank', icon: , }, { label: 'Go to Homepage', href: 'https://liambx.com/', noreferrer: version.displayedOn === 'cli', target: '_blank', icon: , }, { label: 'Go to GitHub', href: 'https://github.com/liam-hq/liam', noreferrer: true, target: '_blank', icon: , }, ], [version.displayedOn], ) const nodes = useNodes() const tableNodes = useMemo(() => { return nodes.filter(isTableNode).sort((a, b) => { const nameA = a.data.table.name const nameB = b.data.table.name if (nameA < nameB) { return -1 } if (nameA > nameB) { return 1 } return 0 }) }, [nodes]) const allCount = tableNodes.length const visibleCount = tableNodes.filter((node) => !node.hidden).length const { visibilityStatus, showAllNodes, hideAllNodes } = useTableVisibility() const showSelectedTables = useCallback(() => { if (selectedNodeIds.size > 0) { const hiddenNodeIds = nodes .filter((node) => !selectedNodeIds.has(node.id)) .map((node) => node.id) const updatedNodes = updateNodesHiddenState({ nodes, hiddenNodeIds, shouldHideGroupNodeId: true, }) setNodes(updatedNodes) setHiddenNodeIds(hiddenNodeIds) } }, [nodes, selectedNodeIds, setNodes, setHiddenNodeIds]) return ( Tables {visibilityStatus === 'all-visible' ? ( Hide All ({visibleCount}/{allCount} visible) ) : ( Show All ({visibleCount}/{allCount} visible) )} {tableNodes.map((node) => ( ))} {menuItemLinks.map((item) => ( ))} {`${ version.version } + ${version.gitHash.slice(0, 7)} (${version.date})`} ) }