import { Label, Text } from '@primer/react' import { LoadingIndicator } from 'components/LoadingIndicator' import { SearchBar } from 'components/SearchBar' import * as React from 'react' import { cx } from 'utils/cx' import { run } from 'utils/general' import { useLoadedContext } from 'utils/hooks/useLoadedContext' import { VisibleNodes } from 'utils/VisibleNodesGenerator' import { SideBarStateContext } from '../../containers/SideBarState' import { SizeObserver } from '../SizeObserver' import { useFocusFileExplorerOnFirstRender } from './hooks/useFocusFileExplorerOnFirstRender' import { useGetCurrentPath } from './hooks/useGetCurrentPath' import { useHandleKeyDown } from './hooks/useHandleKeyDown' import { useNodeRenderContext } from './hooks/useNodeRenderContext' import { NodeRenderer, useNodeRenderers, useRenderFileCommentAmounts, useRenderFileStatus, useRenderFindInFolderButton, useRenderGoToButton } from './hooks/useNodeRenderers' import { useHandleNodeClick } from './hooks/useOnNodeClick' import { useOnSearch } from './hooks/useOnSearch' import { useVisibleNodesGeneratorMethods } from './hooks/useOnVisibleNodesGeneratorReady' import { useRenderLabelText } from './hooks/useRenderLabelText' import { useVisibleNodesGenerator } from './hooks/useSetupTree' import { ListView } from './ListView' import { useHandleNodeFocus } from './useHandleNodeFocus' import { useVisibleNodes } from './useVisibleNodes' export type NodeRendererContext = { onNodeClick: (event: React.MouseEvent, node: TreeNode) => void onNodeFocus: (event: React.FocusEvent, node: TreeNode) => void renderLabelText: NodeRenderer renderActions: NodeRenderer | undefined visibleNodes: VisibleNodes } type Props = { metaData: MetaData freeze: boolean } export function FileExplorer({ freeze, metaData }: Props) { const visibleNodesGenerator = useVisibleNodesGenerator(metaData) const visibleNodes = useVisibleNodes(visibleNodesGenerator) const [searchKey, updateSearchKey] = React.useState('') const searched = !!searchKey const onSearch = useOnSearch(updateSearchKey, visibleNodesGenerator) const getCurrentPath = useGetCurrentPath(metaData) const methods = useVisibleNodesGeneratorMethods( visibleNodesGenerator, getCurrentPath, updateSearchKey, ) const { expandTo, goTo, focusNode } = methods const handleNodeClick = useHandleNodeClick(methods) const handleNodeFocus = useHandleNodeFocus(methods) const handleKeyDown = useHandleKeyDown(visibleNodes, methods, searched) const handleFocusSearchBar = () => focusNode(null) const renderActions = useNodeRenderers([ useRenderGoToButton(searched, goTo), useRenderFindInFolderButton(onSearch), useRenderFileCommentAmounts(), useRenderFileStatus(), ]) const renderLabelText = useRenderLabelText(searchKey) const nodeRendererContext = useNodeRenderContext( visibleNodes, handleNodeClick, handleNodeFocus, renderActions, renderLabelText, ) const state = useLoadedContext(SideBarStateContext).value useFocusFileExplorerOnFirstRender() return (
{run(() => { switch (state) { case 'tree-loading': return case 'tree-rendering': return case 'tree-rendered': return ( visibleNodes && nodeRendererContext && ( <> {visibleNodesGenerator?.defer && (
)} {searched && visibleNodes.nodes.length === 0 && ( <> No results found. {visibleNodesGenerator?.defer && ( Search results are limited to loaded folders in Lazy Mode. )} )} {visibleNodes.nodes.length > 0 && ( > {({ width = 0, height = 0 }, ref) => (
)} )} ) ) } })}
) }