// 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 { I18n, useI18n } from '@shopify/react-i18n'; import React, { useCallback, useMemo, useState } from 'react'; import { ControlledTreeEnvironment, LiveDescriptors, Tree, TreeItem, TreeItemIndex, useTree, useTreeEnvironment, } from 'react-complex-tree'; import { useDispatch } from 'react-redux'; import { useSelector } from '../reducers'; import { isMacOS } from '../utils/os'; import { preventBrowserNativeContextMenu } from '../utils/react'; import { TreeItemContext, TreeItemData, renderers } from '../utils/tree-renderer'; import { explorerActivateFile, explorerArchiveAllFiles, explorerCreateNewFile, explorerDeleteFile, explorerExportFile, explorerImportFiles, explorerRenameFile, } from './actions'; import DeleteFileAlert from './deleteFileAlert/DeleteFileAlert'; import { I18nId } from './i18n'; import NewFileWizard from './newFileWizard/NewFileWizard'; import RenameFileDialog from './renameFileDialog/RenameFileDialog'; type ActionButtonProps = { /** The icon to use for the button. */ icon: IconName; /** The tooltip/title text. */ tooltip: string; /** If provided, controls button disabled state. */ disabled?: boolean; /** If false, prevent focus. Default is true. */ focusable?: boolean; /** Callback for button click event. */ onClick: () => void; }; const ActionButton: React.VoidFunctionComponent = ({ icon, tooltip, disabled, focusable, onClick, }) => { const handleClick = useCallback( (e) => { // prevent click on treeitem too e.stopPropagation(); onClick(); }, [onClick], ); return (