Web: Files: added new hotkeys support

This commit is contained in:
Nikita Gopienko 2022-02-03 17:49:17 +03:00
parent 42f3f650b7
commit 4b6bd34222
2 changed files with 265 additions and 177 deletions

View File

@ -1,10 +1,12 @@
import React from "react";
import { useHotkeys } from "react-hotkeys-hook";
import { observer, inject } from "mobx-react";
import SettingsStore from "@appserver/common/store/SettingsStore";
const withHotkeys = (Component) => {
const WithHotkeys = (props) => {
const {
t,
selection,
setSelection,
firstFile,
@ -22,6 +24,10 @@ const withHotkeys = (Component) => {
hotkeyCaretStart,
setHotkeyCaretStart,
setHotkeyPanelVisible,
confirmDelete,
setDeleteDialogVisible,
deleteAction,
isAvailableOption,
} = props;
//Select item
@ -205,13 +211,87 @@ const withHotkeys = (Component) => {
setSelected("none");
});
//Move down without changing selection
useHotkeys(
"ctrl+DOWN",
() => {
if (viewAs === "tile") setHotkeyCaret(nextForTileDown);
else if (nextFile) setHotkeyCaret(nextFile);
},
[nextFile, nextForTileDown]
);
//Move up without changing selection
useHotkeys(
"ctrl+UP",
() => {
if (viewAs === "tile") setHotkeyCaret(prevForTileUp);
else if (nextFile) setHotkeyCaret(prevFile);
},
[prevFile, prevForTileUp]
);
//Move left without changing selection
useHotkeys(
"ctrl+LEFT",
() => {
if (prevFile) setHotkeyCaret(prevFile);
},
[prevFile]
);
//Move right without changing selection
useHotkeys(
"ctrl+RIGHT",
() => {
if (nextFile) setHotkeyCaret(nextFile);
},
[prevFile]
);
//Open item
useHotkeys("Enter", () => selection.length === 1 && alert("Open"), [
selection,
]);
//Delete selection
useHotkeys(
"Delete, shift+3",
() => {
if (isAvailableOption("delete")) {
if (confirmDelete) setDeleteDialogVisible(true);
else {
const translations = {
deleteOperation: t("Translations:DeleteOperation"),
deleteFromTrash: t("Translations:DeleteFromTrash"),
deleteSelectedElem: t("Translations:DeleteSelectedElem"),
FileRemoved: t("Home:FileRemoved"),
FolderRemoved: t("Home:FolderRemoved"),
};
deleteAction(translations).catch((err) => toastr.error(err));
}
}
},
[confirmDelete]
);
//Undo the last action
useHotkeys("Ctrl+z", () => alert("Undo the last action"), []);
//Redo the last undone action
useHotkeys("Ctrl+Shift+z", () => alert("Redo the last undone action"), []);
//Open hotkeys panel
useHotkeys("Ctrl+num_divide, Ctrl+/", () => setHotkeyPanelVisible(true));
return <Component {...props} />;
};
return inject(({ filesStore, dialogsStore }, { sectionWidth }) => {
return inject(
(
{ filesStore, dialogsStore, settingsStore, filesActionsStore },
{ sectionWidth }
) => {
const {
selection,
setSelection,
@ -227,6 +307,9 @@ const withHotkeys = (Component) => {
folders,
} = filesStore;
const { setHotkeyPanelVisible, setDeleteDialogVisible } = dialogsStore;
const { isAvailableOption, deleteAction } = filesActionsStore;
const minTileWidth = 220 + 16;
const countTilesInRow = Math.floor(sectionWidth / minTileWidth);
const foldersLength = folders.length;
@ -401,9 +484,14 @@ const withHotkeys = (Component) => {
setHotkeyCaretStart,
hotkeyCaretStart,
setHotkeyPanelVisible: dialogsStore.setHotkeyPanelVisible,
setHotkeyPanelVisible,
setDeleteDialogVisible,
confirmDelete: settingsStore.confirmDelete,
deleteAction,
isAvailableOption,
};
})(observer(WithHotkeys));
}
)(observer(WithHotkeys));
};
export default withHotkeys;

View File

@ -343,17 +343,17 @@ class FilesActionStore {
setSelected,
setSelection,
setHotkeyCaretStart,
filesList,
} = this.filesStore;
/* selected === "close" && */ setSelected("none");
if (!id) return;
const item = this.filesStore[isFolder ? "folders" : "files"].find(
(elm) => elm.id === id
const item = filesList.find(
(elm) => elm.id === id && elm.isFolder === isFolder
);
if (item) {
item.isFolder = isFolder;
if (isBuffer) setBufferSelection(item);
else {
setSelection([item]);