import React, { createRef, useEffect, useState } from "react"; import PropTypes from "prop-types"; import ReactCSSTransitionGroup from "react-addons-css-transition-group"; import { NgIf, Icon, EventEmitter, Dropdown, DropdownButton, DropdownList, DropdownItem, Container, Loader, } from "../../components/"; import { debounce, alert, confirm, prompt, notify } from "../../helpers/"; import { Files } from "../../model/"; import { t } from "../../locales/"; import "./submenu.scss"; class SubmenuComponent extends React.Component { constructor(props) { super(props); this.state = { search_input_visible: false, search_keyword: "", }; this.$input = createRef(); this.onSearchChange_Backpressure = debounce(this.onSearchChange, 400); this._onKeyPress = (e) => { if (e.keyCode === 27) { // escape key this.setState({ search_keyword: "", search_input_visible: false, }); if (this.$input.current) this.$input.current.blur(); this.props.onSearch(null); } else if (e.ctrlKey && e.keyCode === 70) { // 'Ctrl F' shortcut to search e.preventDefault(); this.setState({ search_input_visible: true, }); if (this.$input.current) this.$input.current.focus(); } else if (e.altKey && (e.keyCode === 49 || e.keyCode === 50)) { // 'alt 1' 'alt 2' shortcut e.preventDefault(); this.onViewChange(); } }; } componentDidMount() { window.addEventListener("keydown", this._onKeyPress); } componentWillUnmount() { window.removeEventListener("keydown", this._onKeyPress); } onNew(type) { this.props.emit("new::"+type); } onDelete(arrayOfPaths) { prompt.now( t("Confirm by typing") + " \"remove\"", (answer) => { if (answer !== "remove") { return Promise.resolve(); } this.props.emit("file.delete.multiple", arrayOfPaths); return Promise.resolve(); }, () => {/* click on cancel */}, ); } onDownload(arrayOfPaths) { this.props.emit("file.download.multiple", arrayOfPaths); } onExtract(arrayOfPaths) { alert.now(); } onViewChange() { requestAnimationFrame(() => this.props.onViewUpdate()); } onSortChange(e) { this.props.onSortUpdate(e); } onSearchChange(search, e) { this.props.onSearch(search.trim()); } onSearchToggle() { if (new Date() - this.search_last_toggle < 200) { // avoid bluring event cancelling out the toogle return; } if (this.$input.current) this.$input.current.focus(); this.setState({ search_input_visible: !this.state.search_input_visible, }, () => { if (this.state.search_input_visible == false) { this.props.onSearch(null); this.setState({ search_keyword: "" }); } }); } closeIfEmpty() { if (this.state.search_keyword.trim().length > 0) return; this.search_last_toggle = new Date(); this.setState({ search_input_visible: false, search_keyword: "", }); this.props.onSearch(null); } onSearchKeypress(s, backpressure = true, e) { if (backpressure) { this.onSearchChange_Backpressure(s); } else { this.onSearchChange(s); } this.setState({ search_keyword: s }); if (e && e.preventDefault) { e.preventDefault(); } } render() { return (
0 || this.state.search_input_visible ? " sticky" : "")}>
{ window.innerWidth < 410 && t("New File").length > 10 ? t("New File", null, "NEW_FILE::SHORT") : t("New File") } { window.innerWidth < 410 && t("New Folder").length > 10 ? t("New Folder", null, "NEW_FOLDER::SHORT") : t("New Folder") } 0} type="inline" onMouseDown={this.onDownload.bind(this, this.props.selected)}> { t("Download") } 0 && this.props.accessRight.can_delete !== false} type="inline" onMouseDown={this.onDelete.bind(this, this.props.selected)}> { t("Remove") } { t("Extract") } { this.props.selected.length === 0 && ( { t("Sort By Type") } { t("Sort By Date") } { t("Sort By Name") }
this.onSearchKeypress(this.state.search_keyword, false, e)}> this.onSearchKeypress(e.target.value, true)} type="text" id="search" placeholder={ t("search") } name="search" autoComplete="off" />
) }
); }; } SubmenuComponent.propTypes = { accessRight: PropTypes.object, onSortUpdate: PropTypes.func.isRequired, sort: PropTypes.string.isRequired, }; function ExtractZipRequest({ paths, refresh }) { const [error, setError] = useState(null); useEffect(() => { const controller = new AbortController(); Files.unzip(paths, controller.signal) .then((a) => { refresh(); document.querySelector("#modal-box").click(); }) .catch((err) => { refresh(); setError(t(err && err.message)) }); return () => controller.abort(); }, []); return (
{ error === null ? ( ) : (
{ error }
) }
) } export const Submenu = EventEmitter(SubmenuComponent);