import { open } from '@tauri-apps/plugin-dialog'; import classNames from 'classnames'; import mime from 'mime'; import type { ButtonProps } from './core/Button'; import { Button } from './core/Button'; import { IconButton } from './core/IconButton'; import { HStack } from './core/Stacks'; type Props = ButtonProps & { onChange: (value: { filePath: string | null; contentType: string | null }) => void; filePath: string | null; directory?: boolean; inline?: boolean; noun?: string; }; // Special character to insert ltr text in rtl element const rtlEscapeChar = <>‎; export function SelectFile({ onChange, filePath, inline, className, directory, noun, size = 'sm', ...props }: Props) { const handleClick = async () => { const filePath = await open({ title: 'Select File', multiple: false, directory, }); if (filePath == null) return; const contentType = filePath ? mime.getType(filePath) : null; onChange({ filePath, contentType }); }; const handleClear = async () => { onChange({ filePath: null, contentType: null }); }; const itemLabel = noun ?? (directory ? 'Folder' : 'File'); const selectOrChange = (filePath ? 'Change ' : 'Select ') + itemLabel; return ( {!inline && ( <> {filePath && ( )}
{rtlEscapeChar} {filePath ?? `No ${itemLabel.toLowerCase()} selected`}
)}
); }