import React from "react"; const { remote } = require("electron"); class FileSelector extends React.PureComponent { static propTypes = { type: React.PropTypes.oneOf(["file", "directory"]), initPath: React.PropTypes.string, onFileChosen: React.PropTypes.func, }; static defaultProps = { type: "file", }; constructor(props) { super(props); this._inputElem = null; } componentWillMount() { this.setState({ path: this.props.initPath || null, }); } handleButtonClick() { remote.dialog.showOpenDialog( { properties: this.props.type == "file" ? ["openFile"] : ["openDirectory", "createDirectory"], }, paths => { if (!paths) { // User hit cancel, so do nothing return; } const path = paths[0]; this.setState({ path: path, }); if (this.props.onFileChosen) { this.props.onFileChosen(path); } } ); } render() { return ( <div className="file-selector"> <button type="button" className="button-block button-alt file-selector__choose-button" onClick={() => this.handleButtonClick()} > <span className="button__content"> <span className="button-label"> {this.props.type == "file" ? __("Choose File") : __("Choose Directory")} </span> </span> </button> {" "} <span className="file-selector__path"> <input className="input-copyable" type="text" ref={input => { this._inputElem = input; }} onFocus={() => { this._inputElem.select(); }} readOnly="readonly" value={this.state.path || __("No File Chosen")} /> </span> </div> ); } } export default FileSelector;