import { open } from '@tauri-apps/plugin-dialog'; import classNames from 'classnames'; import mime from 'mime'; import type { ReactNode } from 'react'; import type { ButtonProps } from './core/Button'; import { Button } from './core/Button'; import { IconButton } from './core/IconButton'; import { IconTooltip } from './core/IconTooltip'; import { Label } from './core/Label'; import { HStack } from './core/Stacks'; type Props = Omit & { onChange: (value: { filePath: string | null; contentType: string | null }) => void; filePath: string | null; directory?: boolean; inline?: boolean; noun?: string; help?: ReactNode; label?: ReactNode; }; // Special character to insert ltr text in rtl element const rtlEscapeChar = <>‎; export function SelectFile({ onChange, filePath, inline, className, directory, noun, size = 'sm', label, help, ...props }: Props) { const handleClick = async () => { const filePath = await open({ title: directory ? 'Select Folder' : '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 (
{label && ( )} {!inline && ( <> {filePath && ( )}
{rtlEscapeChar} {filePath ?? `No ${itemLabel.toLowerCase()} selected`}
{filePath == null && help && !label && } )}
); }