import * as React from "react"; import { BaseFileNavigatorProps, FileNavigatorLayer, NewFileInput } from "./view.pc"; import { Directory, memoize, FSItemTagNames, getNestedTreeNodeById, FSItem, getParentTreeNode, EMPTY_ARRAY, getFileFromUri } from "tandem-common"; import { Dispatch } from "redux"; import { FileNavigatorContext, FileNavigatorContextProps } from "./contexts"; import { fileNavigatorNewFileEntered, fileNavigatorNewFileClicked } from "../../../../../actions"; import { DropdownMenuOption } from "../../../../inputs/dropdown/controller"; import { AddFileType, NewFSItemInfo } from "../../../../../state"; export type Props = { newFSItemInfo: NewFSItemInfo; activeEditorUri: string; rootDirectory: Directory; dispatch: Dispatch; selectedFileNodeIds: string[]; editingFileNameUri: string; }; const generateFileNavigatorContext = memoize( ( newFileInfo: NewFSItemInfo, selectedFileNodeIds: string[], onNewFileChangeComplete: any, onNewFileInputChange: any, onNewFileEscape: any, activeEditorUri: string, editingFileNameUri: string, dispatch: Dispatch ): FileNavigatorContextProps => ({ newFileInfo, selectedFileNodeIds, onNewFileChangeComplete, onNewFileInputChange, onNewFileEscape, dispatch, activeEditorUri, editingFileNameUri }) ); const ADD_FILE_OPTIONS: DropdownMenuOption[] = [ { label: "Directory", value: AddFileType.DIRECTORY }, { label: "Blank file", value: AddFileType.BLANK }, { label: "Component file", value: AddFileType.COMPONENT } ]; export default (Base: React.ComponentClass) => class FileNavigatorController extends React.PureComponent { onAddFolderButtonClick = () => { this.props.dispatch(fileNavigatorNewFileClicked(AddFileType.DIRECTORY)); }; private onFileDropdownComplete = (value: AddFileType) => { this.props.dispatch(fileNavigatorNewFileClicked(value)); }; onNewFileInputChange = (value: string) => {}; onNewFileChangeComplete = (name: string) => { if (!name) { return this.onNewFileEscape(); } const { newFSItemInfo } = this.props; if ( newFSItemInfo.fileType === AddFileType.COMPONENT && !/\.pc$/.test(name) ) { name += ".pc"; } this.props.dispatch( fileNavigatorNewFileEntered( name, newFSItemInfo.fileType === AddFileType.DIRECTORY ? FSItemTagNames.DIRECTORY : FSItemTagNames.FILE, newFSItemInfo.directory.id ) ); }; onNewFileEscape = () => { this.setState({ ...this.state, newFSItemInfo: null }); }; render() { const { dispatch, newFSItemInfo, rootDirectory, selectedFileNodeIds, activeEditorUri, editingFileNameUri, ...rest } = this.props; if (!rootDirectory) { return ; } const { onNewFileChangeComplete, onFileDropdownComplete, onNewFileInputChange, onNewFileEscape } = this; const content = rootDirectory.children.map(child => { return ; }); if (newFSItemInfo && rootDirectory.uri === newFSItemInfo.directory.uri) { content.unshift( ); } return ( ); } };