// @flow import * as React from 'react'; import Button from 'component/button'; import { FormField } from 'component/common/form'; type Props = { type: string, currentPath?: ?string, onFileChosen: WebFile => void, label?: string, placeholder?: string, accept?: string, error?: string, disabled?: boolean, autoFocus?: boolean, }; class FileSelector extends React.PureComponent { static defaultProps = { autoFocus: false, }; componentDidUpdate(prevProps: Props) { // If the form has just been cleared, // clear the file input if (prevProps.currentPath && !this.props.currentPath) { this.fileInput.current.value = null; } } static defaultProps = { type: 'file', }; fileInput: React.ElementRef; constructor() { super(); this.fileInput = React.createRef(); this.handleFileInputSelection = this.handleFileInputSelection.bind(this); this.fileInputButton = this.fileInputButton.bind(this); } handleFileInputSelection = () => { const { files } = this.fileInput.current; if (!files) { return; } const file = files[0]; if (this.props.onFileChosen) { this.props.onFileChosen(file); } }; fileInputButton = () => { this.fileInput.current.click(); }; input: ?HTMLInputElement; render() { const { type, currentPath, label, placeholder, accept, error, disabled, autoFocus = false } = this.props; const placeHolder = currentPath || placeholder; return ( } /> this.handleFileInputSelection()} webkitdirectory={type === 'openDirectory' ? 'True' : null} /> ); } } export default FileSelector;