Skip to content

Commit

Permalink
feat(core): add history shortcut (#4595)
Browse files Browse the repository at this point in the history
  • Loading branch information
JimmFly committed Oct 16, 2023
1 parent 07b5d18 commit efca651
Show file tree
Hide file tree
Showing 6 changed files with 209 additions and 100 deletions.
7 changes: 6 additions & 1 deletion apps/core/src/components/root-app-sidebar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ import { forwardRef, useCallback, useEffect, useMemo } from 'react';
import { openWorkspaceListModalAtom } from '../../atoms';
import { useHistoryAtom } from '../../atoms/history';
import { useAppSetting } from '../../atoms/settings';
import { useGeneralShortcuts } from '../../hooks/affine/use-shortcuts';
import { useTrashModalHelper } from '../../hooks/affine/use-trash-modal-helper';
import { useRegisterBlocksuiteEditorCommands } from '../../hooks/use-shortcut-commands';
import type { AllWorkspace } from '../../shared';
import { currentCollectionsAtom } from '../../utils/user-setting';
import { CollectionsList } from '../pure/workspace-slider-bar/collections';
Expand Down Expand Up @@ -105,6 +107,8 @@ export const RootAppSidebar = ({
const [openUserWorkspaceList, setOpenUserWorkspaceList] = useAtom(
openWorkspaceListModalAtom
);
const generalShortcutsInfo = useGeneralShortcuts();

const onClickNewPage = useCallback(async () => {
const page = createPage();
await page.waitForLoaded();
Expand Down Expand Up @@ -161,7 +165,7 @@ export const RootAppSidebar = ({
const closeUserWorkspaceList = useCallback(() => {
setOpenUserWorkspaceList(false);
}, [setOpenUserWorkspaceList]);

useRegisterBlocksuiteEditorCommands(router.back, router.forward);
return (
<>
<AppSidebar
Expand All @@ -173,6 +177,7 @@ export const RootAppSidebar = ({
environment.isMacOs
)
}
generalShortcutsInfo={generalShortcutsInfo}
>
<MoveToTrash.ConfirmModal
open={trashConfirmOpen}
Expand Down
10 changes: 4 additions & 6 deletions apps/core/src/hooks/affine/use-shortcuts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,8 @@ export const useWinGeneralKeyboardShortcuts = (): ShortcutMap => {
// not implement yet
// [t('appendDailyNote')]: 'Ctrl + Alt + A',
[t('expandOrCollapseSidebar')]: ['Ctrl', '/'],
// not implement yet
// [t('goBack')]: 'Ctrl + [',
// [t('goForward')]: 'Ctrl + ]',
[t('goBack')]: ['Ctrl + ['],
[t('goForward')]: ['Ctrl + ]'],
}),
[t]
);
Expand All @@ -98,9 +97,8 @@ export const useMacGeneralKeyboardShortcuts = (): ShortcutMap => {
// not implement yet
// [t('appendDailyNote')]: '⌘ + ⌥ + A',
[t('expandOrCollapseSidebar')]: ['⌘', '/'],
// not implement yet
// [t('goBack')]: '⌘ + [',
// [t('goForward')]: '⌘ + ]',
[t('goBack')]: ['⌘ + ['],
[t('goForward')]: ['⌘ + ]'],
}),
[t]
);
Expand Down
49 changes: 49 additions & 0 deletions apps/core/src/hooks/use-shortcut-commands.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import {
PreconditionStrategy,
registerAffineCommand,
} from '@toeverything/infra/command';
import { useEffect } from 'react';

export function useRegisterBlocksuiteEditorCommands(
back: () => unknown,
forward: () => unknown
) {
useEffect(() => {
const unsubs: Array<() => void> = [];

unsubs.push(
registerAffineCommand({
id: 'affine:shortcut-history-go-back',
category: 'affine:general',
preconditionStrategy: PreconditionStrategy.Never,
icon: 'none',
label: 'go back',
keyBinding: {
binding: '$mod+[',
},
run() {
back();
},
})
);
unsubs.push(
registerAffineCommand({
id: 'affine:shortcut-history-go-forward',
category: 'affine:general',
preconditionStrategy: PreconditionStrategy.Never,
icon: 'none',
label: 'go forward',
keyBinding: {
binding: '$mod+]',
},
run() {
forward();
},
})
);

return () => {
unsubs.forEach(unsub => unsub());
};
}, [back, forward]);
}
5 changes: 4 additions & 1 deletion packages/component/src/components/app-sidebar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,10 @@ export function AppSidebar(props: AppSidebarProps): ReactElement {
data-enable-animation={enableAnimation && !isResizing}
>
<nav className={navStyle} ref={navRef} data-testid="app-sidebar">
<SidebarHeader router={props.router} />
<SidebarHeader
router={props.router}
generalShortcutsInfo={props.generalShortcutsInfo}
/>
<div className={navBodyStyle} data-testid="sliderBar-inner">
{props.children}
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { ArrowLeftSmallIcon, ArrowRightSmallIcon } from '@blocksuite/icons';
import { IconButton } from '@toeverything/components/button';
import { Tooltip } from '@toeverything/components/tooltip';
import { useAtomValue } from 'jotai';
import { useMemo } from 'react';

import type { History } from '..';
import {
Expand All @@ -17,10 +20,32 @@ export type SidebarHeaderProps = {
forward: () => unknown;
history: History;
};
generalShortcutsInfo?: {
shortcuts: {
[title: string]: string[];
};
};
};

export const SidebarHeader = (props: SidebarHeaderProps) => {
const open = useAtomValue(appSidebarOpenAtom);
const t = useAFFiNEI18N();

const shortcuts = props.generalShortcutsInfo?.shortcuts;
const shortcutsObject = useMemo(() => {
const goBack = t['com.affine.keyboardShortcuts.goBack']();
const goBackShortcut = shortcuts?.[goBack];

const goForward = t['com.affine.keyboardShortcuts.goForward']();
const goForwardShortcut = shortcuts?.[goForward];
return {
goBack,
goBackShortcut,
goForward,
goForwardShortcut,
};
}, [shortcuts, t]);

return (
<div
className={navHeaderStyle}
Expand All @@ -29,33 +54,43 @@ export const SidebarHeader = (props: SidebarHeaderProps) => {
>
<SidebarSwitch show={open} />
<div className={navHeaderNavigationButtons}>
<IconButton
className={navHeaderButton}
data-testid="app-sidebar-arrow-button-back"
disabled={props.router?.history.current === 0}
onClick={() => {
props.router?.back();
}}
<Tooltip
content={`${shortcutsObject.goBack} ${shortcutsObject.goBackShortcut}`}
side="bottom"
>
<ArrowLeftSmallIcon />
</IconButton>
<IconButton
className={navHeaderButton}
data-testid="app-sidebar-arrow-button-forward"
disabled={
props.router
? (props.router.history.stack.length > 0 &&
props.router.history.current ===
props.router.history.stack.length - 1) ||
props.router.history.stack.length === 0
: true
}
onClick={() => {
props.router?.forward();
}}
<IconButton
className={navHeaderButton}
data-testid="app-sidebar-arrow-button-back"
disabled={props.router?.history.current === 0}
onClick={() => {
props.router?.back();
}}
>
<ArrowLeftSmallIcon />
</IconButton>
</Tooltip>
<Tooltip
content={`${shortcutsObject.goForward} ${shortcutsObject.goForwardShortcut}`}
side="bottom"
>
<ArrowRightSmallIcon />
</IconButton>
<IconButton
className={navHeaderButton}
data-testid="app-sidebar-arrow-button-forward"
disabled={
props.router
? (props.router.history.stack.length > 0 &&
props.router.history.current ===
props.router.history.stack.length - 1) ||
props.router.history.stack.length === 0
: true
}
onClick={() => {
props.router?.forward();
}}
>
<ArrowRightSmallIcon />
</IconButton>
</Tooltip>
</div>
</div>
);
Expand Down
Loading

0 comments on commit efca651

Please sign in to comment.