// SPDX-License-Identifier: MIT // Copyright (c) 2022 The Pybricks Authors // A file explorer control. import './explorer.scss'; import { Button, ButtonGroup, Divider, HotkeyConfig, IconName, useHotkeys, } from '@blueprintjs/core'; import React, { useCallback, useMemo, useState } from 'react'; import { useId } from 'react-aria'; import { ControlledTreeEnvironment, LiveDescriptors, Tree, TreeItem, TreeItemIndex, useTree, useTreeEnvironment, } from 'react-complex-tree'; import { useDispatch } from 'react-redux'; import { Toolbar } from '../components/toolbar/Toolbar'; import { useToolbarItemFocus } from '../components/toolbar/aria'; import { UUID } from '../fileStorage'; import { useFileStorageMetadata } from '../fileStorage/hooks'; import { isMacOS } from '../utils/os'; import { TreeItemContext, TreeItemData, renderers } from '../utils/tree-renderer'; import { explorerArchiveAllFiles, explorerCreateNewFile, explorerDeleteFile, explorerDuplicateFile, explorerExportFile, explorerImportFiles, explorerRenameFile, explorerUserActivateFile, } from './actions'; import DeleteFileAlert from './deleteFileAlert/DeleteFileAlert'; import DuplicateFileDialog from './duplicateFileDialog/DuplicateFileDialog'; import { useI18n } from './i18n'; import NewFileWizard from './newFileWizard/NewFileWizard'; import RenameFileDialog from './renameFileDialog/RenameFileDialog'; type ActionButtonProps = { /** The DOM id for this instance. */ id: string; /** The icon to use for the button. */ icon: IconName; /** The tooltip/title text. */ tooltip: string; /** Callback for button click event. */ onClick: () => void; }; const ActionButton: React.VoidFunctionComponent = ({ id, icon, tooltip, onClick, }) => { const handleClick = useCallback( (e) => { // prevent click on treeitem too e.stopPropagation(); onClick(); }, [onClick], ); const { toolbarItemFocusProps, excludeFromTabOrder } = useToolbarItemFocus({ id }); return (