Skip to content

Commit 876ccb8

Browse files
committed
feat: More shortcut actions
1 parent b8e2b5d commit 876ccb8

File tree

3 files changed

+61
-47
lines changed

3 files changed

+61
-47
lines changed

src/features/instance/applications/components/ApplicationsSidebar/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ export function ApplicationsSidebar() {
3838
}
3939
}, [openedEntry, focusedItem, items]);
4040

41-
// TODO: application command with shortcuts for creation and deletion
4241
// TODO: consistently drive file and folder selection through context (particularly during creation and deletion)
4342
// TODO: Split all this logic up into smaller files, right?
4443
// TODO: onRenameItem f2 handling

src/features/instance/applications/components/TextEditorView/index.tsx

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export function TextEditorView() {
6969
}
7070
}, [updateFileContent, saveFile, instanceParams, openedEntry]);
7171

72-
const onDiscardClick = useCallback(() => {
72+
const onRevertChangesClicked = useCallback(() => {
7373
if (openedEntryContents) {
7474
setUpdateFileContent(openedEntryContents);
7575
}
@@ -83,39 +83,22 @@ export function TextEditorView() {
8383
mountedRef.current = [editor, monaco];
8484
}, [mountedRef, onSaveClick]);
8585

86-
useEffect(() => {
87-
if (!mountedRef.current) {
88-
return;
89-
}
90-
const [editor, monaco] = mountedRef.current;
91-
const disposables = [
92-
editor.addAction({
93-
id: 'save-file',
94-
label: 'Save Changes',
95-
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS],
96-
run: onSaveClick,
97-
}),
98-
editor.addAction({
99-
id: 'revert-file',
100-
label: 'Revert File',
101-
run: onDiscardClick,
102-
}),
103-
];
104-
return () => {
105-
for (const disposable of disposables) {
106-
disposable?.dispose();
107-
}
108-
};
109-
}, [mountedRef, onSaveClick, onDiscardClick]);
110-
11186
const {
11287
toggled: isAddingDirectory,
11388
toggleOn: onAddDirectoryClicked,
11489
toggleOff: hideAddingDirectory,
11590
} = useToggler(false);
11691
const { toggled: isAddingFile, toggleOn: onAddFileClicked, toggleOff: hideAddingFile } = useToggler(false);
117-
const { toggled: isDeleteDirectoryOrFileClicked, toggleOn: onDeleteClick, setToggled: setIsDeleteDirectoryOrFileClicked } = useToggler(false);
118-
const { toggled: isRedeployApplicationClicked, toggleOn: onRedeployClicked, setToggled: setIsRedeployApplicationClicked } = useToggler(false);
92+
const {
93+
toggled: isDeleteDirectoryOrFileClicked,
94+
toggleOn: onDeleteClick,
95+
setToggled: setIsDeleteDirectoryOrFileClicked,
96+
} = useToggler(false);
97+
const {
98+
toggled: isRedeployApplicationClicked,
99+
toggleOn: onRedeployClicked,
100+
setToggled: setIsRedeployApplicationClicked,
101+
} = useToggler(false);
119102

120103
const onHideAddDirectoryModal = useCallback(() => {
121104
hideAddingDirectory();
@@ -164,6 +147,48 @@ export function TextEditorView() {
164147
|| openedEntry.package?.includes('github.com/HarperFast/status-check-fabric');
165148
}, [openedEntry?.package]);
166149

150+
useEffect(() => {
151+
if (!mountedRef.current) {
152+
return;
153+
}
154+
const [editor, monaco] = mountedRef.current;
155+
const disposables = [
156+
editor.addAction({
157+
id: 'new-file',
158+
label: 'New File',
159+
keybindings: [monaco.KeyMod.WinCtrl | monaco.KeyMod.Alt | monaco.KeyCode.KeyN],
160+
run: onAddFileClicked,
161+
}),
162+
editor.addAction({
163+
id: 'new-directory',
164+
label: 'New Directory',
165+
keybindings: [monaco.KeyMod.WinCtrl | monaco.KeyMod.Alt | monaco.KeyMod.Shift | monaco.KeyCode.KeyN],
166+
run: onAddDirectoryClicked,
167+
}),
168+
editor.addAction({
169+
id: 'save-file',
170+
label: 'Save Changes',
171+
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS],
172+
run: onSaveClick,
173+
}),
174+
editor.addAction({
175+
id: 'revert-file',
176+
label: 'Revert File',
177+
run: onRevertChangesClicked,
178+
}),
179+
editor.addAction({
180+
id: 'delete-file',
181+
label: 'Delete File',
182+
run: onDeleteClick,
183+
}),
184+
];
185+
return () => {
186+
for (const disposable of disposables) {
187+
disposable?.dispose();
188+
}
189+
};
190+
}, [mountedRef, onSaveClick, onRevertChangesClicked]);
191+
167192
if (!openedEntry) {
168193
return null;
169194
}
@@ -205,7 +230,6 @@ export function TextEditorView() {
205230
updateFileContent === openedEntryContents ||
206231
isSavingFile
207232
}
208-
accessKey="s"
209233
>
210234
<SaveIcon />
211235
<span className="hidden lg:inline-block"><u>S</u>ave</span>
@@ -220,7 +244,6 @@ export function TextEditorView() {
220244
updateFileContent === openedEntryContents ||
221245
isSavingFile
222246
}
223-
accessKey="s"
224247
>
225248
<PencilIcon />
226249
<span className="hidden lg:inline-block"><u>R</u>ename</span>
@@ -230,7 +253,6 @@ export function TextEditorView() {
230253
variant="ghost"
231254
className="rounded-none"
232255
onClick={onAddFileClicked}
233-
accessKey="n"
234256
>
235257
<FileIcon />
236258
<span className="hidden lg:inline-block"><u>N</u>ew File</span>
@@ -240,7 +262,6 @@ export function TextEditorView() {
240262
variant="ghost"
241263
className="rounded-none"
242264
onClick={onAddDirectoryClicked}
243-
accessKey="n"
244265
>
245266
<FolderIcon />
246267
<span className="hidden lg:inline-block"><u>A</u>dd Directory</span>
@@ -250,7 +271,6 @@ export function TextEditorView() {
250271
variant="ghost"
251272
className="rounded-none"
252273
onClick={onRedeployClicked}
253-
accessKey="n"
254274
>
255275
<PackageIcon />
256276
<span>Redeploy <u>P</u>ackage</span>
@@ -270,7 +290,6 @@ export function TextEditorView() {
270290
variant="destructiveGhost"
271291
className="rounded-none"
272292
onClick={onDeleteClick}
273-
accessKey="n"
274293
>
275294
<TrashIcon />
276295
<span className="hidden xl:inline-block"><u>D</u>elete</span>
@@ -279,16 +298,15 @@ export function TextEditorView() {
279298
{!isDirectory(openedEntry) && !openedEntry.package && <Button
280299
variant="ghost"
281300
className="rounded-none"
282-
onClick={onDiscardClick}
301+
onClick={onRevertChangesClicked}
283302
disabled={
284303
updateFileContent === undefined ||
285304
updateFileContent === openedEntryContents ||
286305
isSavingFile
287306
}
288-
accessKey="d"
289307
>
290308
<Undo2Icon />
291-
<span className="hidden xl:inline-block"><u>D</u>iscard Changes</span>
309+
<span className="hidden xl:inline-block">Revert Changes</span>
292310
</Button>}
293311

294312
</div>

src/hooks/useToggler.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,19 @@ import { MouseEvent, useCallback, useMemo, useState } from 'react';
22

33
export function useToggler(defaultValue?: boolean) {
44
const [toggled, setToggled] = useState<boolean>(defaultValue || false);
5-
const toggle = useCallback((e: MouseEvent) => {
6-
e.preventDefault();
5+
const toggle = useCallback((e?: MouseEvent | unknown) => {
6+
(e as MouseEvent)?.preventDefault?.();
77
setToggled((checked: boolean) => {
88
return !checked;
99
});
10-
return false;
1110
}, []);
12-
const toggleOn = useCallback((e?: MouseEvent) => {
13-
e?.preventDefault();
11+
const toggleOn = useCallback((e?: MouseEvent | unknown) => {
12+
(e as MouseEvent)?.preventDefault?.();
1413
setToggled(true);
15-
return false;
1614
}, []);
17-
const toggleOff = useCallback((e?: MouseEvent) => {
18-
e?.preventDefault();
15+
const toggleOff = useCallback((e?: MouseEvent | unknown) => {
16+
(e as MouseEvent)?.preventDefault?.();
1917
setToggled(false);
20-
return false;
2118
}, []);
2219
return useMemo(() => {
2320
return {

0 commit comments

Comments
 (0)