feat(core): add track events for cmdk (#7668)

This commit is contained in:
JimmFly
2024-08-07 05:52:42 +00:00
parent 67dce9c97a
commit eb01e76426
13 changed files with 175 additions and 12 deletions

View File

@@ -4,6 +4,7 @@ import type { createStore } from 'jotai';
import { openCreateWorkspaceModalAtom } from '../atoms'; import { openCreateWorkspaceModalAtom } from '../atoms';
import type { usePageHelper } from '../components/blocksuite/block-suite-page-list/utils'; import type { usePageHelper } from '../components/blocksuite/block-suite-page-list/utils';
import { track } from '../mixpanel';
import { registerAffineCommand } from './registry'; import { registerAffineCommand } from './registry';
export function registerAffineCreationCommands({ export function registerAffineCreationCommands({
@@ -29,6 +30,8 @@ export function registerAffineCreationCommands({
} }
: undefined, : undefined,
run() { run() {
track.$.cmdk.creation.createDoc({ mode: 'page' });
pageHelper.createPage(); pageHelper.createPage();
}, },
}) })
@@ -41,6 +44,10 @@ export function registerAffineCreationCommands({
icon: <PlusIcon />, icon: <PlusIcon />,
label: t['com.affine.cmdk.affine.new-edgeless-page'](), label: t['com.affine.cmdk.affine.new-edgeless-page'](),
run() { run() {
track.$.cmdk.creation.createDoc({
mode: 'edgeless',
});
pageHelper.createEdgeless(); pageHelper.createEdgeless();
}, },
}) })
@@ -53,6 +60,8 @@ export function registerAffineCreationCommands({
icon: <PlusIcon />, icon: <PlusIcon />,
label: t['com.affine.cmdk.affine.new-workspace'](), label: t['com.affine.cmdk.affine.new-workspace'](),
run() { run() {
track.$.cmdk.workspace.createWorkspace();
store.set(openCreateWorkspaceModalAtom, 'new'); store.set(openCreateWorkspaceModalAtom, 'new');
}, },
}) })
@@ -67,6 +76,10 @@ export function registerAffineCreationCommands({
return environment.isDesktop; return environment.isDesktop;
}, },
run() { run() {
track.$.cmdk.workspace.createWorkspace({
control: 'import',
});
store.set(openCreateWorkspaceModalAtom, 'add'); store.set(openCreateWorkspaceModalAtom, 'add');
}, },
}) })

View File

@@ -3,6 +3,7 @@ import { ContactWithUsIcon, NewIcon } from '@blocksuite/icons/rc';
import type { createStore } from 'jotai'; import type { createStore } from 'jotai';
import { openSettingModalAtom } from '../atoms'; import { openSettingModalAtom } from '../atoms';
import { track } from '../mixpanel';
import { popupWindow } from '../utils'; import { popupWindow } from '../utils';
import { registerAffineCommand } from './registry'; import { registerAffineCommand } from './registry';
@@ -21,6 +22,7 @@ export function registerAffineHelpCommands({
icon: <NewIcon />, icon: <NewIcon />,
label: t['com.affine.cmdk.affine.whats-new'](), label: t['com.affine.cmdk.affine.whats-new'](),
run() { run() {
track.$.cmdk.help.openChangelog();
popupWindow(runtimeConfig.changelogUrl); popupWindow(runtimeConfig.changelogUrl);
}, },
}) })
@@ -32,6 +34,7 @@ export function registerAffineHelpCommands({
icon: <ContactWithUsIcon />, icon: <ContactWithUsIcon />,
label: t['com.affine.cmdk.affine.contact-us'](), label: t['com.affine.cmdk.affine.contact-us'](),
run() { run() {
track.$.cmdk.help.contactUs();
store.set(openSettingModalAtom, { store.set(openSettingModalAtom, {
open: true, open: true,
activeTab: 'about', activeTab: 'about',

View File

@@ -3,6 +3,7 @@ import { SidebarIcon } from '@blocksuite/icons/rc';
import type { createStore } from 'jotai'; import type { createStore } from 'jotai';
import { appSidebarOpenAtom } from '../components/app-sidebar'; import { appSidebarOpenAtom } from '../components/app-sidebar';
import { track } from '../mixpanel';
import { registerAffineCommand } from './registry'; import { registerAffineCommand } from './registry';
export function registerAffineLayoutCommands({ export function registerAffineLayoutCommands({
@@ -27,6 +28,8 @@ export function registerAffineLayoutCommands({
binding: '$mod+/', binding: '$mod+/',
}, },
run() { run() {
track.$.navigationPanel.$.toggle();
store.set(appSidebarOpenAtom, v => !v); store.set(appSidebarOpenAtom, v => !v);
}, },
}) })

View File

@@ -28,6 +28,10 @@ export function registerAffineNavigationCommands({
icon: <ArrowRightBigIcon />, icon: <ArrowRightBigIcon />,
label: t['com.affine.cmdk.affine.navigation.goto-all-pages'](), label: t['com.affine.cmdk.affine.navigation.goto-all-pages'](),
run() { run() {
track.$.cmdk.navigation.navigate({
to: 'allDocs',
});
navigationHelper.jumpToSubPath(docCollection.id, WorkspaceSubPath.ALL); navigationHelper.jumpToSubPath(docCollection.id, WorkspaceSubPath.ALL);
}, },
}) })
@@ -40,6 +44,10 @@ export function registerAffineNavigationCommands({
icon: <ArrowRightBigIcon />, icon: <ArrowRightBigIcon />,
label: 'Go to Collection List', label: 'Go to Collection List',
run() { run() {
track.$.cmdk.navigation.navigate({
to: 'collectionList',
});
navigationHelper.jumpToCollections(docCollection.id); navigationHelper.jumpToCollections(docCollection.id);
}, },
}) })
@@ -52,6 +60,10 @@ export function registerAffineNavigationCommands({
icon: <ArrowRightBigIcon />, icon: <ArrowRightBigIcon />,
label: 'Go to Tag List', label: 'Go to Tag List',
run() { run() {
track.$.cmdk.navigation.navigate({
to: 'tagList',
});
navigationHelper.jumpToTags(docCollection.id); navigationHelper.jumpToTags(docCollection.id);
}, },
}) })
@@ -64,6 +76,10 @@ export function registerAffineNavigationCommands({
icon: <ArrowRightBigIcon />, icon: <ArrowRightBigIcon />,
label: t['com.affine.cmdk.affine.navigation.goto-workspace'](), label: t['com.affine.cmdk.affine.navigation.goto-workspace'](),
run() { run() {
track.$.cmdk.navigation.navigate({
to: 'workspace',
});
store.set(openWorkspaceListModalAtom, true); store.set(openWorkspaceListModalAtom, true);
}, },
}) })
@@ -109,6 +125,10 @@ export function registerAffineNavigationCommands({
icon: <ArrowRightBigIcon />, icon: <ArrowRightBigIcon />,
label: t['com.affine.cmdk.affine.navigation.goto-trash'](), label: t['com.affine.cmdk.affine.navigation.goto-trash'](),
run() { run() {
track.$.cmdk.navigation.navigate({
to: 'trash',
});
navigationHelper.jumpToSubPath( navigationHelper.jumpToSubPath(
docCollection.id, docCollection.id,
WorkspaceSubPath.TRASH WorkspaceSubPath.TRASH

View File

@@ -6,6 +6,7 @@ import type { createStore } from 'jotai';
import type { useTheme } from 'next-themes'; import type { useTheme } from 'next-themes';
import type { useLanguageHelper } from '../hooks/affine/use-language-helper'; import type { useLanguageHelper } from '../hooks/affine/use-language-helper';
import { track } from '../mixpanel';
import { registerAffineCommand } from './registry'; import { registerAffineCommand } from './registry';
export function registerAffineSettingsCommands({ export function registerAffineSettingsCommands({
@@ -34,6 +35,10 @@ export function registerAffineSettingsCommands({
icon: <SettingsIcon />, icon: <SettingsIcon />,
preconditionStrategy: () => theme.theme !== 'system', preconditionStrategy: () => theme.theme !== 'system',
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'theme',
value: 'system',
});
theme.setTheme('system'); theme.setTheme('system');
}, },
}) })
@@ -48,6 +53,10 @@ export function registerAffineSettingsCommands({
icon: <SettingsIcon />, icon: <SettingsIcon />,
preconditionStrategy: () => theme.theme !== 'dark', preconditionStrategy: () => theme.theme !== 'dark',
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'theme',
value: 'dark',
});
theme.setTheme('dark'); theme.setTheme('dark');
}, },
}) })
@@ -63,6 +72,11 @@ export function registerAffineSettingsCommands({
icon: <SettingsIcon />, icon: <SettingsIcon />,
preconditionStrategy: () => theme.theme !== 'light', preconditionStrategy: () => theme.theme !== 'light',
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'theme',
value: 'light',
});
theme.setTheme('light'); theme.setTheme('light');
}, },
}) })
@@ -80,6 +94,11 @@ export function registerAffineSettingsCommands({
preconditionStrategy: () => preconditionStrategy: () =>
store.get(appSettingAtom).fontStyle !== 'Sans', store.get(appSettingAtom).fontStyle !== 'Sans',
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'fontStyle',
value: 'Sans',
});
store.set(appSettingAtom, prev => ({ store.set(appSettingAtom, prev => ({
...prev, ...prev,
fontStyle: 'Sans', fontStyle: 'Sans',
@@ -99,6 +118,11 @@ export function registerAffineSettingsCommands({
preconditionStrategy: () => preconditionStrategy: () =>
store.get(appSettingAtom).fontStyle !== 'Serif', store.get(appSettingAtom).fontStyle !== 'Serif',
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'fontStyle',
value: 'Serif',
});
store.set(appSettingAtom, prev => ({ store.set(appSettingAtom, prev => ({
...prev, ...prev,
fontStyle: 'Serif', fontStyle: 'Serif',
@@ -118,6 +142,11 @@ export function registerAffineSettingsCommands({
preconditionStrategy: () => preconditionStrategy: () =>
store.get(appSettingAtom).fontStyle !== 'Mono', store.get(appSettingAtom).fontStyle !== 'Mono',
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'fontStyle',
value: 'Mono',
});
store.set(appSettingAtom, prev => ({ store.set(appSettingAtom, prev => ({
...prev, ...prev,
fontStyle: 'Mono', fontStyle: 'Mono',
@@ -138,6 +167,11 @@ export function registerAffineSettingsCommands({
icon: <SettingsIcon />, icon: <SettingsIcon />,
preconditionStrategy: () => currentLanguage?.tag !== language.tag, preconditionStrategy: () => currentLanguage?.tag !== language.tag,
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'language',
value: language.name,
});
onLanguageChange(language.tag); onLanguageChange(language.tag);
}, },
}) })
@@ -158,6 +192,10 @@ export function registerAffineSettingsCommands({
icon: <SettingsIcon />, icon: <SettingsIcon />,
preconditionStrategy: () => environment.isDesktop, preconditionStrategy: () => environment.isDesktop,
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'clientBorder',
value: store.get(appSettingAtom).clientBorder ? 'off' : 'on',
});
store.set(appSettingAtom, prev => ({ store.set(appSettingAtom, prev => ({
...prev, ...prev,
clientBorder: !prev.clientBorder, clientBorder: !prev.clientBorder,
@@ -178,6 +216,11 @@ export function registerAffineSettingsCommands({
category: 'affine:settings', category: 'affine:settings',
icon: <SettingsIcon />, icon: <SettingsIcon />,
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'fullWidthLayout',
value: store.get(appSettingAtom).fullWidthLayout ? 'off' : 'on',
});
store.set(appSettingAtom, prev => ({ store.set(appSettingAtom, prev => ({
...prev, ...prev,
fullWidthLayout: !prev.fullWidthLayout, fullWidthLayout: !prev.fullWidthLayout,
@@ -201,6 +244,11 @@ export function registerAffineSettingsCommands({
icon: <SettingsIcon />, icon: <SettingsIcon />,
preconditionStrategy: () => environment.isDesktop, preconditionStrategy: () => environment.isDesktop,
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'enableNoisyBackground',
value: store.get(appSettingAtom).enableNoisyBackground ? 'off' : 'on',
});
store.set(appSettingAtom, prev => ({ store.set(appSettingAtom, prev => ({
...prev, ...prev,
enableNoisyBackground: !prev.enableNoisyBackground, enableNoisyBackground: !prev.enableNoisyBackground,
@@ -222,6 +270,10 @@ export function registerAffineSettingsCommands({
icon: <SettingsIcon />, icon: <SettingsIcon />,
preconditionStrategy: () => environment.isDesktop && environment.isMacOs, preconditionStrategy: () => environment.isDesktop && environment.isMacOs,
run() { run() {
track.$.cmdk.settings.changeAppSetting({
key: 'enableBlurBackground',
value: store.get(appSettingAtom).enableBlurBackground ? 'off' : 'on',
});
store.set(appSettingAtom, prev => ({ store.set(appSettingAtom, prev => ({
...prev, ...prev,
enableBlurBackground: !prev.enableBlurBackground, enableBlurBackground: !prev.enableBlurBackground,

View File

@@ -5,6 +5,7 @@ import type { useI18n } from '@affine/i18n';
import { ResetIcon } from '@blocksuite/icons/rc'; import { ResetIcon } from '@blocksuite/icons/rc';
import type { createStore } from 'jotai'; import type { createStore } from 'jotai';
import { track } from '../mixpanel';
import { registerAffineCommand } from './registry'; import { registerAffineCommand } from './registry';
export function registerAffineUpdatesCommands({ export function registerAffineUpdatesCommands({
@@ -24,6 +25,8 @@ export function registerAffineUpdatesCommands({
label: t['com.affine.cmdk.affine.restart-to-upgrade'](), label: t['com.affine.cmdk.affine.restart-to-upgrade'](),
preconditionStrategy: () => !!store.get(updateReadyAtom), preconditionStrategy: () => !!store.get(updateReadyAtom),
run() { run() {
track.$.cmdk.updates.quitAndInstall();
apis?.updater.quitAndInstall().catch(err => { apis?.updater.quitAndInstall().catch(err => {
notify.error({ notify.error({
title: 'Failed to restart to upgrade', title: 'Failed to restart to upgrade',

View File

@@ -150,7 +150,9 @@ export const PageHeaderMenuButton = ({
const handleSwitchMode = useCallback(() => { const handleSwitchMode = useCallback(() => {
doc.toggleMode(); doc.toggleMode();
track.$.header.docOptions.switchPageMode(); track.$.header.docOptions.switchPageMode({
mode: currentMode === 'page' ? 'edgeless' : 'page',
});
toast( toast(
currentMode === 'page' currentMode === 'page'
? t['com.affine.toastMessage.edgelessMode']() ? t['com.affine.toastMessage.edgelessMode']()

View File

@@ -102,6 +102,8 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />, icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['com.affine.page-properties.page-info.view'](), label: t['com.affine.page-properties.page-info.view'](),
run() { run() {
track.$.cmdk.docInfo.open();
openInfoModal(); openInfoModal();
}, },
}) })
@@ -118,6 +120,8 @@ export function useRegisterBlocksuiteEditorCommands() {
: t['com.affine.favoritePageOperation.add'](), : t['com.affine.favoritePageOperation.add'](),
run() { run() {
favAdapter.toggle(docId, 'doc'); favAdapter.toggle(docId, 'doc');
track.$.cmdk.editor.toggleFavorite();
toast( toast(
favorite favorite
? t['com.affine.cmdk.affine.editor.remove-from-favourites']() ? t['com.affine.cmdk.affine.editor.remove-from-favourites']()
@@ -141,6 +145,10 @@ export function useRegisterBlocksuiteEditorCommands() {
: t['com.affine.pageMode.page']() : t['com.affine.pageMode.page']()
}`, }`,
run() { run() {
track.$.cmdk.editor.switchPageMode({
mode: mode === 'page' ? 'edgeless' : 'page',
});
doc.toggleMode(); doc.toggleMode();
toast( toast(
mode === 'page' mode === 'page'
@@ -161,7 +169,7 @@ export function useRegisterBlocksuiteEditorCommands() {
label: t['com.affine.header.option.duplicate'](), label: t['com.affine.header.option.duplicate'](),
run() { run() {
duplicate(docId); duplicate(docId);
track.$.cmdk.$.createDoc({ track.$.cmdk.editor.createDoc({
control: 'duplicate', control: 'duplicate',
}); });
}, },
@@ -176,6 +184,10 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />, icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['Export to PDF'](), label: t['Export to PDF'](),
async run() { async run() {
track.$.cmdk.editor.export({
type: 'pdf',
});
await exportHandler('pdf'); await exportHandler('pdf');
}, },
}) })
@@ -189,6 +201,10 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />, icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['Export to HTML'](), label: t['Export to HTML'](),
async run() { async run() {
track.$.cmdk.editor.export({
type: 'html',
});
await exportHandler('html'); await exportHandler('html');
}, },
}) })
@@ -202,6 +218,10 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />, icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['Export to PNG'](), label: t['Export to PNG'](),
async run() { async run() {
track.$.cmdk.editor.export({
type: 'png',
});
await exportHandler('png'); await exportHandler('png');
}, },
}) })
@@ -215,6 +235,10 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />, icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['Export to Markdown'](), label: t['Export to Markdown'](),
async run() { async run() {
track.$.cmdk.editor.export({
type: 'markdown',
});
await exportHandler('markdown'); await exportHandler('markdown');
}, },
}) })
@@ -228,6 +252,8 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />, icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['com.affine.moveToTrash.title'](), label: t['com.affine.moveToTrash.title'](),
run() { run() {
track.$.cmdk.editor.deleteDoc();
onClickDelete(doc.title$.value); onClickDelete(doc.title$.value);
}, },
}) })
@@ -242,6 +268,8 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />, icon: mode === 'page' ? <PageIcon /> : <EdgelessIcon />,
label: t['com.affine.cmdk.affine.editor.restore-from-trash'](), label: t['com.affine.cmdk.affine.editor.restore-from-trash'](),
run() { run() {
track.$.cmdk.editor.restoreDoc();
doc.restoreFromTrash(); doc.restoreFromTrash();
}, },
}) })
@@ -255,6 +283,8 @@ export function useRegisterBlocksuiteEditorCommands() {
icon: <HistoryIcon />, icon: <HistoryIcon />,
label: t['com.affine.cmdk.affine.editor.reveal-page-history-modal'](), label: t['com.affine.cmdk.affine.editor.reveal-page-history-modal'](),
run() { run() {
track.$.cmdk.docHistory.open();
openHistoryModal(); openHistoryModal();
}, },
}) })

View File

@@ -3,9 +3,10 @@ import {
registerAffineCommand, registerAffineCommand,
} from '@affine/core/commands'; } from '@affine/core/commands';
import { useSharingUrl } from '@affine/core/hooks/affine/use-share-url'; import { useSharingUrl } from '@affine/core/hooks/affine/use-share-url';
import { track } from '@affine/core/mixpanel';
import { useIsActiveView } from '@affine/core/modules/workbench'; import { useIsActiveView } from '@affine/core/modules/workbench';
import { WorkspaceFlavour } from '@affine/env/workspace'; import { WorkspaceFlavour } from '@affine/env/workspace';
import type { WorkspaceMetadata } from '@toeverything/infra'; import { type WorkspaceMetadata } from '@toeverything/infra';
import { useEffect } from 'react'; import { useEffect } from 'react';
export function useRegisterCopyLinkCommands({ export function useRegisterCopyLinkCommands({
@@ -38,6 +39,8 @@ export function useRegisterCopyLinkCommands({
label: '', label: '',
icon: null, icon: null,
run() { run() {
track.$.cmdk.general.copyShareLink({ type: 'private' });
isActiveView && isCloud && onClickCopyLink(); isActiveView && isCloud && onClickCopyLink();
}, },
}) })

View File

@@ -2,6 +2,7 @@ import {
PreconditionStrategy, PreconditionStrategy,
registerAffineCommand, registerAffineCommand,
} from '@affine/core/commands'; } from '@affine/core/commands';
import { track } from '@affine/core/mixpanel';
import { FindInPageService } from '@affine/core/modules/find-in-page/services/find-in-page'; import { FindInPageService } from '@affine/core/modules/find-in-page/services/find-in-page';
import { useService } from '@toeverything/infra'; import { useService } from '@toeverything/infra';
import { useCallback, useEffect } from 'react'; import { useCallback, useEffect } from 'react';
@@ -24,13 +25,15 @@ export function useRegisterFindInPageCommands() {
unsubs.push( unsubs.push(
registerAffineCommand({ registerAffineCommand({
preconditionStrategy: PreconditionStrategy.Never, preconditionStrategy: PreconditionStrategy.Never,
id: `editor:find-in-page`, id: `affine:find-in-page`,
keyBinding: { keyBinding: {
binding: '$mod+f', binding: '$mod+f',
}, },
icon: null, icon: null,
label: '', label: '',
run() { run() {
track.$.cmdk.general.findInPage();
toggleVisible(); toggleVisible();
}, },
}) })

View File

@@ -2,21 +2,26 @@
/* eslint-disable rxjs/finnish */ /* eslint-disable rxjs/finnish */
// SECTION: app events // SECTION: app events
type GeneralEvents = 'openMigrationDataHelp' | 'export'; type GeneralEvents = 'openMigrationDataHelp';
type CmdkEvents = 'quickSearch'; type CmdkEvents = 'quickSearch' | 'recentDocs' | 'searchResultsDocs';
type AppEvents = type AppEvents =
| 'checkUpdates' | 'checkUpdates'
| 'downloadUpdate' | 'downloadUpdate'
| 'downloadApp' | 'downloadApp'
| 'quitAndInstall' | 'quitAndInstall'
| 'openChangelog' | 'openChangelog'
| 'dismissChangelog'; | 'dismissChangelog'
| 'contactUs'
| 'findInPage';
type NavigationEvents = type NavigationEvents =
| 'openInNewTab' | 'openInNewTab'
| 'openInSplitView' | 'openInSplitView'
| 'switchTab' | 'switchTab'
| 'switchSplitView' | 'switchSplitView'
| 'navigate' | 'navigate'
| 'goBack'
| 'goForward'
| 'toggle' // toggle navigation panel
| 'open' | 'open'
| 'close'; // openclose modal/diaglog | 'close'; // openclose modal/diaglog
@@ -35,6 +40,7 @@ type DocEvents =
| 'renameDoc' | 'renameDoc'
| 'linkDoc' | 'linkDoc'
| 'deleteDoc' | 'deleteDoc'
| 'restoreDoc'
| 'switchPageMode' | 'switchPageMode'
| 'openDocOptionsMenu' | 'openDocOptionsMenu'
| 'openDocInfo'; | 'openDocInfo';
@@ -61,7 +67,6 @@ type FolderEvents =
| 'deleteFolder'; | 'deleteFolder';
type TagEvents = 'createTag' | 'deleteTag' | 'renameTag' | 'tagDoc'; type TagEvents = 'createTag' | 'deleteTag' | 'renameTag' | 'tagDoc';
type FavoriteEvents = 'toggleFavorite'; type FavoriteEvents = 'toggleFavorite';
type DocInfoEvents = 'toggle' | 'open';
type OrganizeItemEvents = // doc, link, folder, collection, tag type OrganizeItemEvents = // doc, link, folder, collection, tag
| 'createOrganizeItem' | 'createOrganizeItem'
@@ -111,8 +116,7 @@ type UserEvents =
| ShareEvents | ShareEvents
| AuthEvents | AuthEvents
| AccountEvents | AccountEvents
| PaymentEvents | PaymentEvents;
| DocInfoEvents;
interface PageDivision { interface PageDivision {
[page: string]: { [page: string]: {
@@ -161,11 +165,28 @@ const PageEvents = {
about: ['checkUpdates', 'downloadUpdate', 'changeAppSetting'], about: ['checkUpdates', 'downloadUpdate', 'changeAppSetting'],
}, },
cmdk: { cmdk: {
$: ['createDoc'], recent: ['recentDocs'],
results: ['searchResultsDocs'],
general: ['copyShareLink', 'goBack', 'goForward', 'findInPage'],
creation: ['createDoc'],
workspace: ['createWorkspace'],
settings: ['openSettings', 'changeAppSetting'], settings: ['openSettings', 'changeAppSetting'],
navigation: ['navigate'],
editor: [
'toggleFavorite',
'switchPageMode',
'createDoc',
'export',
'deleteDoc',
'restoreDoc',
],
docInfo: ['open'],
docHistory: ['open'],
updates: ['quitAndInstall'],
help: ['contactUs', 'openChangelog'],
}, },
navigationPanel: { navigationPanel: {
$: ['quickSearch', 'createDoc', 'navigate', 'openSettings'], $: ['quickSearch', 'createDoc', 'navigate', 'openSettings', 'toggle'],
organize: [ organize: [
'createOrganizeItem', 'createOrganizeItem',
'renameOrganizeItem', 'renameOrganizeItem',

View File

@@ -2,6 +2,7 @@ import {
PreconditionStrategy, PreconditionStrategy,
registerAffineCommand, registerAffineCommand,
} from '@affine/core/commands'; } from '@affine/core/commands';
import { track } from '@affine/core/mixpanel';
import { useService } from '@toeverything/infra'; import { useService } from '@toeverything/infra';
import { useEffect } from 'react'; import { useEffect } from 'react';
@@ -23,6 +24,8 @@ export function useRegisterNavigationCommands() {
binding: '$mod+[', binding: '$mod+[',
}, },
run() { run() {
track.$.cmdk.general.goBack();
navigator.back(); navigator.back();
}, },
}) })
@@ -38,6 +41,8 @@ export function useRegisterNavigationCommands() {
binding: '$mod+]', binding: '$mod+]',
}, },
run() { run() {
track.$.cmdk.general.goForward();
navigator.forward(); navigator.forward();
}, },
}) })

View File

@@ -1,3 +1,4 @@
import { track } from '@affine/core/mixpanel';
import type { DocsService } from '@toeverything/infra'; import type { DocsService } from '@toeverything/infra';
import { Service } from '@toeverything/infra'; import { Service } from '@toeverything/infra';
@@ -47,6 +48,10 @@ export class CMDKQuickSearchService extends Service {
blockId?: string; blockId?: string;
} = result.payload; } = result.payload;
result.source === 'recent-doc' && track.$.cmdk.recent.recentDocs();
result.source === 'docs' &&
track.$.cmdk.results.searchResultsDocs();
this.workbenchService.workbench.openDoc({ this.workbenchService.workbench.openDoc({
docId: doc.docId, docId: doc.docId,
blockId: doc.blockId, blockId: doc.blockId,