feat(core): add new doc default mode setting (#7990)

https://github.com/user-attachments/assets/523b14f3-ee42-4061-8ca2-221e071d5cc9
This commit is contained in:
JimmFly
2024-08-28 02:35:27 +00:00
parent c53adbc7e8
commit 09ab922572
14 changed files with 191 additions and 69 deletions

View File

@@ -32,7 +32,7 @@ export function registerAffineCreationCommands({
run() { run() {
track.$.cmdk.creation.createDoc({ mode: 'page' }); track.$.cmdk.creation.createDoc({ mode: 'page' });
pageHelper.createPage(); pageHelper.createPage('page');
}, },
}) })
); );

View File

@@ -34,7 +34,6 @@ import {
useCallback, useCallback,
useEffect, useEffect,
useMemo, useMemo,
useState,
} from 'react'; } from 'react';
import { Virtuoso } from 'react-virtuoso'; import { Virtuoso } from 'react-virtuoso';
@@ -275,7 +274,8 @@ const CustomFontFamilySettings = () => {
}; };
const NewDocDefaultModeSettings = () => { const NewDocDefaultModeSettings = () => {
const t = useI18n(); const t = useI18n();
const [value, setValue] = useState<DocMode>('page'); const { editorSettingService } = useServices({ EditorSettingService });
const settings = useLiveData(editorSettingService.editorSetting.settings$);
const radioItems = useMemo<RadioItem[]>( const radioItems = useMemo<RadioItem[]>(
() => [ () => [
{ {
@@ -291,13 +291,19 @@ const NewDocDefaultModeSettings = () => {
], ],
[t] [t]
); );
const updateNewDocDefaultMode = useCallback(
(value: DocMode) => {
editorSettingService.editorSetting.set('newDocDefaultMode', value);
},
[editorSettingService.editorSetting]
);
return ( return (
<RadioGroup <RadioGroup
items={radioItems} items={radioItems}
value={value} value={settings.newDocDefaultMode}
width={250} width={250}
className={styles.settingWrapper} className={styles.settingWrapper}
onChange={setValue} onChange={updateNewDocDefaultMode}
/> />
); );
}; };

View File

@@ -1,29 +1,42 @@
import { toast } from '@affine/component'; import { toast } from '@affine/component';
import { useDocCollectionHelper } from '@affine/core/hooks/use-block-suite-workspace-helper'; import { useDocCollectionHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
import { EditorSettingService } from '@affine/core/modules/editor-settting';
import { WorkbenchService } from '@affine/core/modules/workbench'; import { WorkbenchService } from '@affine/core/modules/workbench';
import { DocsService, initEmptyPage, useService } from '@toeverything/infra'; import {
type DocMode,
DocsService,
initEmptyPage,
useLiveData,
useServices,
} from '@toeverything/infra';
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import type { DocCollection } from '../../../shared'; import type { DocCollection } from '../../../shared';
export const usePageHelper = (docCollection: DocCollection) => { export const usePageHelper = (docCollection: DocCollection) => {
const workbench = useService(WorkbenchService).workbench; const { docsService, workbenchService, editorSettingService } = useServices({
DocsService,
WorkbenchService,
EditorSettingService,
});
const workbench = workbenchService.workbench;
const { createDoc } = useDocCollectionHelper(docCollection); const { createDoc } = useDocCollectionHelper(docCollection);
const docsService = useService(DocsService);
const docRecordList = docsService.list; const docRecordList = docsService.list;
const settings = useLiveData(editorSettingService.editorSetting.settings$);
const createPageAndOpen = useCallback( const createPageAndOpen = useCallback(
(mode?: 'page' | 'edgeless', open?: boolean | 'new-tab') => { (mode?: DocMode, open?: boolean | 'new-tab') => {
const page = createDoc(); const page = createDoc();
initEmptyPage(page); initEmptyPage(page);
docRecordList.doc$(page.id).value?.setPrimaryMode(mode || 'page'); const primaryMode = mode || settings.newDocDefaultMode;
docRecordList.doc$(page.id).value?.setPrimaryMode(primaryMode);
if (open !== false) if (open !== false)
workbench.openDoc(page.id, { workbench.openDoc(page.id, {
at: open === 'new-tab' ? 'new-tab' : 'active', at: open === 'new-tab' ? 'new-tab' : 'active',
}); });
return page; return page;
}, },
[createDoc, docRecordList, workbench] [createDoc, docRecordList, settings.newDocDefaultMode, workbench]
); );
const createEdgelessAndOpen = useCallback( const createEdgelessAndOpen = useCallback(
@@ -77,8 +90,8 @@ export const usePageHelper = (docCollection: DocCollection) => {
return useMemo(() => { return useMemo(() => {
return { return {
createPage: (open?: boolean | 'new-tab') => createPage: (mode?: DocMode, open?: boolean | 'new-tab') =>
createPageAndOpen('page', open), createPageAndOpen(mode, open),
createEdgeless: createEdgelessAndOpen, createEdgeless: createEdgelessAndOpen,
importFile: importFileAndOpen, importFile: importFileAndOpen,
}; };

View File

@@ -9,6 +9,7 @@ import { useCallback, useState } from 'react';
import { menuContent } from './new-page-button.css'; import { menuContent } from './new-page-button.css';
type NewPageButtonProps = { type NewPageButtonProps = {
createNewDoc: (e?: MouseEvent) => void;
createNewPage: (e?: MouseEvent) => void; createNewPage: (e?: MouseEvent) => void;
createNewEdgeless: (e?: MouseEvent) => void; createNewEdgeless: (e?: MouseEvent) => void;
importFile?: () => void; importFile?: () => void;
@@ -61,6 +62,7 @@ export const CreateNewPagePopup = ({
}; };
export const NewPageButton = ({ export const NewPageButton = ({
createNewDoc,
createNewPage, createNewPage,
createNewEdgeless, createNewEdgeless,
importFile, importFile,
@@ -69,11 +71,20 @@ export const NewPageButton = ({
}: PropsWithChildren<NewPageButtonProps>) => { }: PropsWithChildren<NewPageButtonProps>) => {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const handleCreateNewDoc: NewPageButtonProps['createNewDoc'] = useCallback(
e => {
createNewDoc(e);
setOpen(false);
track.allDocs.header.actions.createDoc();
},
[createNewDoc]
);
const handleCreateNewPage: NewPageButtonProps['createNewPage'] = useCallback( const handleCreateNewPage: NewPageButtonProps['createNewPage'] = useCallback(
e => { e => {
createNewPage(e); createNewPage(e);
setOpen(false); setOpen(false);
track.allDocs.header.actions.createDoc(); track.allDocs.header.actions.createDoc({ mode: 'page' });
}, },
[createNewPage] [createNewPage]
); );
@@ -99,6 +110,7 @@ export const NewPageButton = ({
<Menu <Menu
items={ items={
<CreateNewPagePopup <CreateNewPagePopup
createNewDoc={handleCreateNewDoc}
createNewPage={handleCreateNewPage} createNewPage={handleCreateNewPage}
createNewEdgeless={handleCreateNewEdgeless} createNewEdgeless={handleCreateNewEdgeless}
importFile={importFile ? handleImportFile : undefined} importFile={importFile ? handleImportFile : undefined}
@@ -118,7 +130,7 @@ export const NewPageButton = ({
> >
<DropdownButton <DropdownButton
size={size} size={size}
onClick={handleCreateNewPage} onClick={handleCreateNewDoc}
onAuxClick={handleCreateNewPage} onAuxClick={handleCreateNewPage}
onClickDropDown={useCallback(() => setOpen(open => !open), [])} onClickDropDown={useCallback(() => setOpen(open => !open), [])}
> >

View File

@@ -19,7 +19,12 @@ import {
ViewLayersIcon, ViewLayersIcon,
} from '@blocksuite/icons/rc'; } from '@blocksuite/icons/rc';
import type { Doc as BlockSuiteDoc } from '@blocksuite/store'; import type { Doc as BlockSuiteDoc } from '@blocksuite/store';
import { useLiveData, useService, WorkspaceService } from '@toeverything/infra'; import {
useLiveData,
useService,
useServices,
WorkspaceService,
} from '@toeverything/infra';
import clsx from 'clsx'; import clsx from 'clsx';
import { nanoid } from 'nanoid'; import { nanoid } from 'nanoid';
import { useCallback, useMemo, useState } from 'react'; import { useCallback, useMemo, useState } from 'react';
@@ -38,7 +43,11 @@ import { PageListNewPageButton } from './page-list-new-page-button';
export const PageListHeader = () => { export const PageListHeader = () => {
const t = useI18n(); const t = useI18n();
const workspace = useService(WorkspaceService).workspace; const { workspaceService } = useServices({
WorkspaceService,
});
const workspace = workspaceService.workspace;
const { importFile, createEdgeless, createPage } = usePageHelper( const { importFile, createEdgeless, createPage } = usePageHelper(
workspace.docCollection workspace.docCollection
); );
@@ -69,7 +78,12 @@ export const PageListHeader = () => {
onCreateEdgeless={e => onCreateEdgeless={e =>
createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true) createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true)
} }
onCreatePage={e => createPage(isNewTabTrigger(e) ? 'new-tab' : true)} onCreatePage={e =>
createPage('page', isNewTabTrigger(e) ? 'new-tab' : true)
}
onCreateDoc={e =>
createPage(undefined, isNewTabTrigger(e) ? 'new-tab' : true)
}
onImportFile={onImportFile} onImportFile={onImportFile}
> >
<div className={styles.buttonText}>{t['New Page']()}</div> <div className={styles.buttonText}>{t['New Page']()}</div>
@@ -86,12 +100,15 @@ export const CollectionPageListHeader = ({
}) => { }) => {
const t = useI18n(); const t = useI18n();
const { jumpToCollections } = useNavigateHelper(); const { jumpToCollections } = useNavigateHelper();
const { collectionService, workspaceService } = useServices({
CollectionService,
WorkspaceService,
});
const handleJumpToCollections = useCallback(() => { const handleJumpToCollections = useCallback(() => {
jumpToCollections(workspaceId); jumpToCollections(workspaceId);
}, [jumpToCollections, workspaceId]); }, [jumpToCollections, workspaceId]);
const collectionService = useService(CollectionService);
const { node, open } = useEditCollection(); const { node, open } = useEditCollection();
const handleEdit = useAsyncCallback(async () => { const handleEdit = useAsyncCallback(async () => {
@@ -99,7 +116,7 @@ export const CollectionPageListHeader = ({
collectionService.updateCollection(collection.id, () => ret); collectionService.updateCollection(collection.id, () => ret);
}, [collection, collectionService, open]); }, [collection, collectionService, open]);
const workspace = useService(WorkspaceService).workspace; const workspace = workspaceService.workspace;
const { createEdgeless, createPage } = usePageHelper(workspace.docCollection); const { createEdgeless, createPage } = usePageHelper(workspace.docCollection);
const { openConfirmModal } = useConfirmModal(); const { openConfirmModal } = useConfirmModal();
@@ -127,14 +144,18 @@ export const CollectionPageListHeader = ({
[openConfirmModal, t, createAndAddDocument] [openConfirmModal, t, createAndAddDocument]
); );
const createPageModeDoc = useCallback(() => createPage('page'), [createPage]);
const onCreateEdgeless = useCallback( const onCreateEdgeless = useCallback(
() => onConfirmAddDocument(createEdgeless), () => onConfirmAddDocument(createEdgeless),
[createEdgeless, onConfirmAddDocument] [createEdgeless, onConfirmAddDocument]
); );
const onCreatePage = useCallback( const onCreatePage = useCallback(() => {
() => onConfirmAddDocument(createPage), onConfirmAddDocument(createPageModeDoc);
[createPage, onConfirmAddDocument] }, [createPageModeDoc, onConfirmAddDocument]);
); const onCreateDoc = useCallback(() => {
onConfirmAddDocument(createPage);
}, [createPage, onConfirmAddDocument]);
return ( return (
<> <>
@@ -154,6 +175,7 @@ export const CollectionPageListHeader = ({
<PageListNewPageButton <PageListNewPageButton
size="small" size="small"
testId="new-page-button-trigger" testId="new-page-button-trigger"
onCreateDoc={onCreateDoc}
onCreateEdgeless={onCreateEdgeless} onCreateEdgeless={onCreateEdgeless}
onCreatePage={onCreatePage} onCreatePage={onCreatePage}
> >

View File

@@ -8,6 +8,7 @@ export const PageListNewPageButton = ({
children, children,
size, size,
testId, testId,
onCreateDoc,
onCreatePage, onCreatePage,
onCreateEdgeless, onCreateEdgeless,
onImportFile, onImportFile,
@@ -15,6 +16,7 @@ export const PageListNewPageButton = ({
className?: string; className?: string;
size?: 'small' | 'default'; size?: 'small' | 'default';
testId?: string; testId?: string;
onCreateDoc: (e?: MouseEvent) => void;
onCreatePage: (e?: MouseEvent) => void; onCreatePage: (e?: MouseEvent) => void;
onCreateEdgeless: (e?: MouseEvent) => void; onCreateEdgeless: (e?: MouseEvent) => void;
onImportFile?: (e?: MouseEvent) => void; onImportFile?: (e?: MouseEvent) => void;
@@ -24,6 +26,7 @@ export const PageListNewPageButton = ({
<NewPageButton <NewPageButton
size={size} size={size}
importFile={onImportFile} importFile={onImportFile}
createNewDoc={onCreateDoc}
createNewEdgeless={onCreateEdgeless} createNewEdgeless={onCreateEdgeless}
createNewPage={onCreatePage} createNewPage={onCreatePage}
> >

View File

@@ -32,7 +32,6 @@ import type { DocMeta } from '@blocksuite/store';
import { import {
FeatureFlagService, FeatureFlagService,
useLiveData, useLiveData,
useService,
useServices, useServices,
WorkspaceService, WorkspaceService,
} from '@toeverything/infra'; } from '@toeverything/infra';
@@ -305,9 +304,12 @@ export const CollectionOperationCell = ({
info, info,
}: CollectionOperationCellProps) => { }: CollectionOperationCellProps) => {
const t = useI18n(); const t = useI18n();
const { compatibleFavoriteItemsAdapter: favAdapter, workspaceService } =
const favAdapter = useService(CompatibleFavoriteItemsAdapter); useServices({
const docCollection = useService(WorkspaceService).workspace.docCollection; CompatibleFavoriteItemsAdapter,
WorkspaceService,
});
const docCollection = workspaceService.workspace.docCollection;
const { createPage } = usePageHelper(docCollection); const { createPage } = usePageHelper(docCollection);
const { openConfirmModal } = useConfirmModal(); const { openConfirmModal } = useConfirmModal();
const favourite = useLiveData( const favourite = useLiveData(

View File

@@ -1,6 +1,7 @@
import { openSettingModalAtom } from '@affine/core/atoms'; import { openSettingModalAtom } from '@affine/core/atoms';
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks'; import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
import { track } from '@affine/core/mixpanel'; import { track } from '@affine/core/mixpanel';
import { EditorSettingService } from '@affine/core/modules/editor-settting';
import { import {
ExplorerCollections, ExplorerCollections,
ExplorerFavorites, ExplorerFavorites,
@@ -20,7 +21,11 @@ import {
} from '@blocksuite/icons/rc'; } from '@blocksuite/icons/rc';
import type { Doc } from '@blocksuite/store'; import type { Doc } from '@blocksuite/store';
import type { Workspace } from '@toeverything/infra'; import type { Workspace } from '@toeverything/infra';
import { useLiveData, useService, WorkspaceService } from '@toeverything/infra'; import {
useLiveData,
useServices,
WorkspaceService,
} from '@toeverything/infra';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
import type { MouseEvent, ReactElement } from 'react'; import type { MouseEvent, ReactElement } from 'react';
import { useCallback, useEffect } from 'react'; import { useCallback, useEffect } from 'react';
@@ -73,30 +78,45 @@ export type RootAppSidebarProps = {
* *
*/ */
export const RootAppSidebar = (): ReactElement => { export const RootAppSidebar = (): ReactElement => {
const currentWorkspace = useService(WorkspaceService).workspace; const {
workbenchService,
workspaceService,
cMDKQuickSearchService,
editorSettingService,
} = useServices({
WorkspaceService,
WorkbenchService,
CMDKQuickSearchService,
EditorSettingService,
});
const currentWorkspace = workspaceService.workspace;
const { appSettings } = useAppSettingHelper(); const { appSettings } = useAppSettingHelper();
const docCollection = currentWorkspace.docCollection; const docCollection = currentWorkspace.docCollection;
const t = useI18n(); const t = useI18n();
const workbench = useService(WorkbenchService).workbench; const workbench = workbenchService.workbench;
const currentPath = useLiveData( const currentPath = useLiveData(
workbench.location$.map(location => location.pathname) workbench.location$.map(location => location.pathname)
); );
const cmdkQuickSearchService = useService(CMDKQuickSearchService);
const onOpenQuickSearchModal = useCallback(() => { const onOpenQuickSearchModal = useCallback(() => {
cmdkQuickSearchService.toggle(); cMDKQuickSearchService.toggle();
}, [cmdkQuickSearchService]); }, [cMDKQuickSearchService]);
const allPageActive = currentPath === '/all'; const allPageActive = currentPath === '/all';
const pageHelper = usePageHelper(currentWorkspace.docCollection); const pageHelper = usePageHelper(currentWorkspace.docCollection);
const settings = useLiveData(editorSettingService.editorSetting.settings$);
const onClickNewPage = useAsyncCallback( const onClickNewPage = useAsyncCallback(
async (e?: MouseEvent) => { async (e?: MouseEvent) => {
const page = pageHelper.createPage(isNewTabTrigger(e) ? 'new-tab' : true); const page = pageHelper.createPage(
settings.newDocDefaultMode,
isNewTabTrigger(e) ? 'new-tab' : true
);
page.load(); page.load();
track.$.navigationPanel.$.createDoc(); track.$.navigationPanel.$.createDoc({ mode: settings.newDocDefaultMode });
}, },
[pageHelper] [pageHelper, settings.newDocDefaultMode]
); );
useEffect(() => { useEffect(() => {
if (environment.isDesktop) { if (environment.isDesktop) {

View File

@@ -4,6 +4,7 @@ import {
MenuSeparator, MenuSeparator,
useConfirmModal, useConfirmModal,
} from '@affine/component'; } from '@affine/component';
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
import { IsFavoriteIcon } from '@affine/core/components/pure/icons'; import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
import { useDeleteCollectionInfo } from '@affine/core/hooks/affine/use-delete-collection-info'; import { useDeleteCollectionInfo } from '@affine/core/hooks/affine/use-delete-collection-info';
import { track } from '@affine/core/mixpanel'; import { track } from '@affine/core/mixpanel';
@@ -19,10 +20,10 @@ import {
SplitViewIcon, SplitViewIcon,
} from '@blocksuite/icons/rc'; } from '@blocksuite/icons/rc';
import { import {
DocsService,
FeatureFlagService, FeatureFlagService,
useLiveData, useLiveData,
useServices, useServices,
WorkspaceService,
} from '@toeverything/infra'; } from '@toeverything/infra';
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
@@ -36,19 +37,23 @@ export const useExplorerCollectionNodeOperations = (
const t = useI18n(); const t = useI18n();
const { const {
workbenchService, workbenchService,
docsService, workspaceService,
collectionService, collectionService,
compatibleFavoriteItemsAdapter, compatibleFavoriteItemsAdapter,
featureFlagService, featureFlagService,
} = useServices({ } = useServices({
DocsService,
WorkbenchService, WorkbenchService,
WorkspaceService,
CollectionService, CollectionService,
CompatibleFavoriteItemsAdapter, CompatibleFavoriteItemsAdapter,
FeatureFlagService, FeatureFlagService,
}); });
const deleteInfo = useDeleteCollectionInfo(); const deleteInfo = useDeleteCollectionInfo();
const { createPage } = usePageHelper(
workspaceService.workspace.docCollection
);
const enableMultiView = useLiveData( const enableMultiView = useLiveData(
featureFlagService.flags.enable_multi_view.$ featureFlagService.flags.enable_multi_view.$
); );
@@ -62,7 +67,7 @@ export const useExplorerCollectionNodeOperations = (
const { openConfirmModal } = useConfirmModal(); const { openConfirmModal } = useConfirmModal();
const createAndAddDocument = useCallback(() => { const createAndAddDocument = useCallback(() => {
const newDoc = docsService.createDoc(); const newDoc = createPage();
collectionService.addPageToCollection(collectionId, newDoc.id); collectionService.addPageToCollection(collectionId, newDoc.id);
track.$.navigationPanel.collections.createDoc(); track.$.navigationPanel.collections.createDoc();
track.$.navigationPanel.collections.addDocToCollection({ track.$.navigationPanel.collections.addDocToCollection({
@@ -73,7 +78,7 @@ export const useExplorerCollectionNodeOperations = (
}, [ }, [
collectionId, collectionId,
collectionService, collectionService,
docsService, createPage,
onOpenCollapsed, onOpenCollapsed,
workbenchService.workbench, workbenchService.workbench,
]); ]);

View File

@@ -5,6 +5,7 @@ import {
toast, toast,
useConfirmModal, useConfirmModal,
} from '@affine/component'; } from '@affine/component';
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
import { IsFavoriteIcon } from '@affine/core/components/pure/icons'; import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks'; import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
import { track } from '@affine/core/mixpanel'; import { track } from '@affine/core/mixpanel';
@@ -24,6 +25,7 @@ import {
FeatureFlagService, FeatureFlagService,
useLiveData, useLiveData,
useServices, useServices,
WorkspaceService,
} from '@toeverything/infra'; } from '@toeverything/infra';
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
@@ -39,12 +41,14 @@ export const useExplorerDocNodeOperations = (
const t = useI18n(); const t = useI18n();
const { const {
workbenchService, workbenchService,
workspaceService,
docsService, docsService,
compatibleFavoriteItemsAdapter, compatibleFavoriteItemsAdapter,
featureFlagService, featureFlagService,
} = useServices({ } = useServices({
DocsService, DocsService,
WorkbenchService, WorkbenchService,
WorkspaceService,
CompatibleFavoriteItemsAdapter, CompatibleFavoriteItemsAdapter,
FeatureFlagService, FeatureFlagService,
}); });
@@ -55,6 +59,10 @@ export const useExplorerDocNodeOperations = (
const docRecord = useLiveData(docsService.list.doc$(docId)); const docRecord = useLiveData(docsService.list.doc$(docId));
const { createPage } = usePageHelper(
workspaceService.workspace.docCollection
);
const favorite = useLiveData( const favorite = useLiveData(
useMemo(() => { useMemo(() => {
return compatibleFavoriteItemsAdapter.isFavorite$(docId, 'doc'); return compatibleFavoriteItemsAdapter.isFavorite$(docId, 'doc');
@@ -109,14 +117,14 @@ export const useExplorerDocNodeOperations = (
}, [docId, workbenchService.workbench]); }, [docId, workbenchService.workbench]);
const handleAddLinkedPage = useAsyncCallback(async () => { const handleAddLinkedPage = useAsyncCallback(async () => {
const newDoc = docsService.createDoc(); const newDoc = createPage();
// TODO: handle timeout & error // TODO: handle timeout & error
await docsService.addLinkedDoc(docId, newDoc.id); await docsService.addLinkedDoc(docId, newDoc.id);
track.$.navigationPanel.docs.createDoc({ control: 'linkDoc' }); track.$.navigationPanel.docs.createDoc({ control: 'linkDoc' });
track.$.navigationPanel.docs.linkDoc({ control: 'createDoc' }); track.$.navigationPanel.docs.linkDoc({ control: 'createDoc' });
workbenchService.workbench.openDoc(newDoc.id); workbenchService.workbench.openDoc(newDoc.id);
options.openNodeCollapsed(); options.openNodeCollapsed();
}, [docsService, docId, workbenchService.workbench, options]); }, [createPage, docsService, docId, workbenchService.workbench, options]);
const handleToggleFavoriteDoc = useCallback(() => { const handleToggleFavoriteDoc = useCallback(() => {
compatibleFavoriteItemsAdapter.toggle(docId, 'doc'); compatibleFavoriteItemsAdapter.toggle(docId, 'doc');

View File

@@ -9,6 +9,7 @@ import {
MenuSub, MenuSub,
notify, notify,
} from '@affine/component'; } from '@affine/component';
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
import { import {
useSelectCollection, useSelectCollection,
useSelectDoc, useSelectDoc,
@@ -34,10 +35,10 @@ import {
TagsIcon, TagsIcon,
} from '@blocksuite/icons/rc'; } from '@blocksuite/icons/rc';
import { import {
DocsService,
FeatureFlagService, FeatureFlagService,
useLiveData, useLiveData,
useServices, useServices,
WorkspaceService,
} from '@toeverything/infra'; } from '@toeverything/infra';
import { difference } from 'lodash-es'; import { difference } from 'lodash-es';
import { useCallback, useMemo, useState } from 'react'; import { useCallback, useMemo, useState } from 'react';
@@ -186,12 +187,13 @@ export const ExplorerFolderNodeFolder = ({
node: FolderNode; node: FolderNode;
} & GenericExplorerNode) => { } & GenericExplorerNode) => {
const t = useI18n(); const t = useI18n();
const { docsService, workbenchService, featureFlagService } = useServices({ const { workbenchService, workspaceService, featureFlagService } =
DocsService, useServices({
WorkbenchService, WorkbenchService,
CompatibleFavoriteItemsAdapter, WorkspaceService,
FeatureFlagService, CompatibleFavoriteItemsAdapter,
}); FeatureFlagService,
});
const openDocsSelector = useSelectDoc(); const openDocsSelector = useSelectDoc();
const openTagsSelector = useSelectTag(); const openTagsSelector = useSelectTag();
const openCollectionsSelector = useSelectCollection(); const openCollectionsSelector = useSelectCollection();
@@ -202,6 +204,9 @@ export const ExplorerFolderNodeFolder = ({
const [collapsed, setCollapsed] = useState(true); const [collapsed, setCollapsed] = useState(true);
const [newFolderId, setNewFolderId] = useState<string | null>(null); const [newFolderId, setNewFolderId] = useState<string | null>(null);
const { createPage } = usePageHelper(
workspaceService.workspace.docCollection
);
const handleDelete = useCallback(() => { const handleDelete = useCallback(() => {
node.delete(); node.delete();
track.$.navigationPanel.organize.deleteOrganizeItem({ track.$.navigationPanel.organize.deleteOrganizeItem({
@@ -545,7 +550,7 @@ export const ExplorerFolderNodeFolder = ({
); );
const handleNewDoc = useCallback(() => { const handleNewDoc = useCallback(() => {
const newDoc = docsService.createDoc(); const newDoc = createPage();
node.createLink('doc', newDoc.id, node.indexAt('before')); node.createLink('doc', newDoc.id, node.indexAt('before'));
workbenchService.workbench.openDoc(newDoc.id); workbenchService.workbench.openDoc(newDoc.id);
track.$.navigationPanel.folders.createDoc(); track.$.navigationPanel.folders.createDoc();
@@ -554,7 +559,7 @@ export const ExplorerFolderNodeFolder = ({
target: 'doc', target: 'doc',
}); });
setCollapsed(false); setCollapsed(false);
}, [docsService, node, workbenchService.workbench]); }, [createPage, node, workbenchService.workbench]);
const handleCreateSubfolder = useCallback(() => { const handleCreateSubfolder = useCallback(() => {
const newFolderId = node.createFolder( const newFolderId = node.createFolder(

View File

@@ -1,4 +1,5 @@
import { IconButton, MenuItem, MenuSeparator, toast } from '@affine/component'; import { IconButton, MenuItem, MenuSeparator, toast } from '@affine/component';
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
import { IsFavoriteIcon } from '@affine/core/components/pure/icons'; import { IsFavoriteIcon } from '@affine/core/components/pure/icons';
import { track } from '@affine/core/mixpanel'; import { track } from '@affine/core/mixpanel';
import { FavoriteService } from '@affine/core/modules/favorite'; import { FavoriteService } from '@affine/core/modules/favorite';
@@ -16,6 +17,7 @@ import {
FeatureFlagService, FeatureFlagService,
useLiveData, useLiveData,
useServices, useServices,
WorkspaceService,
} from '@toeverything/infra'; } from '@toeverything/infra';
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
@@ -31,13 +33,14 @@ export const useExplorerTagNodeOperations = (
): NodeOperation[] => { ): NodeOperation[] => {
const t = useI18n(); const t = useI18n();
const { const {
docsService,
workbenchService, workbenchService,
workspaceService,
tagService, tagService,
favoriteService, favoriteService,
featureFlagService, featureFlagService,
} = useServices({ } = useServices({
WorkbenchService, WorkbenchService,
WorkspaceService,
TagService, TagService,
DocsService, DocsService,
FavoriteService, FavoriteService,
@@ -52,15 +55,19 @@ export const useExplorerTagNodeOperations = (
featureFlagService.flags.enable_multi_view.$ featureFlagService.flags.enable_multi_view.$
); );
const { createPage } = usePageHelper(
workspaceService.workspace.docCollection
);
const handleNewDoc = useCallback(() => { const handleNewDoc = useCallback(() => {
if (tagRecord) { if (tagRecord) {
const newDoc = docsService.createDoc(); const newDoc = createPage();
tagRecord?.tag(newDoc.id); tagRecord?.tag(newDoc.id);
track.$.navigationPanel.tags.createDoc(); track.$.navigationPanel.tags.createDoc();
workbenchService.workbench.openDoc(newDoc.id); workbenchService.workbench.openDoc(newDoc.id);
openNodeCollapsed(); openNodeCollapsed();
} }
}, [docsService, openNodeCollapsed, tagRecord, workbenchService.workbench]); }, [createPage, openNodeCollapsed, tagRecord, workbenchService.workbench]);
const handleMoveToTrash = useCallback(() => { const handleMoveToTrash = useCallback(() => {
tagService.tagList.deleteTag(tagId); tagService.tagList.deleteTag(tagId);

View File

@@ -3,6 +3,7 @@ import {
IconButton, IconButton,
useDropTarget, useDropTarget,
} from '@affine/component'; } from '@affine/component';
import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils';
import { track } from '@affine/core/mixpanel'; import { track } from '@affine/core/mixpanel';
import { import {
DropEffect, DropEffect,
@@ -18,7 +19,11 @@ import type { AffineDNDData } from '@affine/core/types/dnd';
import { isNewTabTrigger } from '@affine/core/utils'; import { isNewTabTrigger } from '@affine/core/utils';
import { useI18n } from '@affine/i18n'; import { useI18n } from '@affine/i18n';
import { PlusIcon } from '@blocksuite/icons/rc'; import { PlusIcon } from '@blocksuite/icons/rc';
import { DocsService, useLiveData, useServices } from '@toeverything/infra'; import {
useLiveData,
useServices,
WorkspaceService,
} from '@toeverything/infra';
import { type MouseEventHandler, useCallback } from 'react'; import { type MouseEventHandler, useCallback } from 'react';
import { ExplorerService } from '../../../services/explorer'; import { ExplorerService } from '../../../services/explorer';
@@ -36,13 +41,17 @@ import {
import { RootEmpty } from './empty'; import { RootEmpty } from './empty';
export const ExplorerFavorites = () => { export const ExplorerFavorites = () => {
const { favoriteService, docsService, workbenchService, explorerService } = const {
useServices({ favoriteService,
FavoriteService, workspaceService,
DocsService, workbenchService,
WorkbenchService, explorerService,
ExplorerService, } = useServices({
}); FavoriteService,
WorkbenchService,
WorkspaceService,
ExplorerService,
});
const explorerSection = explorerService.sections.favorites; const explorerSection = explorerService.sections.favorites;
@@ -52,6 +61,10 @@ export const ExplorerFavorites = () => {
const t = useI18n(); const t = useI18n();
const { createPage } = usePageHelper(
workspaceService.workspace.docCollection
);
const handleDrop = useCallback( const handleDrop = useCallback(
(data: DropTargetDropEvent<AffineDNDData>) => { (data: DropTargetDropEvent<AffineDNDData>) => {
if ( if (
@@ -75,7 +88,7 @@ export const ExplorerFavorites = () => {
const handleCreateNewFavoriteDoc: MouseEventHandler = useCallback( const handleCreateNewFavoriteDoc: MouseEventHandler = useCallback(
e => { e => {
const newDoc = docsService.createDoc(); const newDoc = createPage();
favoriteService.favoriteList.add( favoriteService.favoriteList.add(
'doc', 'doc',
newDoc.id, newDoc.id,
@@ -87,7 +100,7 @@ export const ExplorerFavorites = () => {
explorerSection.setCollapsed(false); explorerSection.setCollapsed(false);
}, },
[ [
docsService, createPage,
explorerSection, explorerSection,
favoriteService.favoriteList, favoriteService.favoriteList,
workbenchService.workbench, workbenchService.workbench,

View File

@@ -11,7 +11,7 @@ import { track } from '@affine/core/mixpanel';
import { isNewTabTrigger } from '@affine/core/utils'; import { isNewTabTrigger } from '@affine/core/utils';
import type { Filter } from '@affine/env/filter'; import type { Filter } from '@affine/env/filter';
import { PlusIcon } from '@blocksuite/icons/rc'; import { PlusIcon } from '@blocksuite/icons/rc';
import { useService, WorkspaceService } from '@toeverything/infra'; import { useServices, WorkspaceService } from '@toeverything/infra';
import clsx from 'clsx'; import clsx from 'clsx';
import * as styles from './all-page.css'; import * as styles from './all-page.css';
@@ -25,7 +25,10 @@ export const AllPageHeader = ({
filters: Filter[]; filters: Filter[];
onChangeFilters: (filters: Filter[]) => void; onChangeFilters: (filters: Filter[]) => void;
}) => { }) => {
const workspace = useService(WorkspaceService).workspace; const { workspaceService } = useServices({
WorkspaceService,
});
const workspace = workspaceService.workspace;
const { importFile, createEdgeless, createPage } = usePageHelper( const { importFile, createEdgeless, createPage } = usePageHelper(
workspace.docCollection workspace.docCollection
); );
@@ -64,7 +67,10 @@ export const AllPageHeader = ({
createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true) createEdgeless(isNewTabTrigger(e) ? 'new-tab' : true)
} }
onCreatePage={e => onCreatePage={e =>
createPage(isNewTabTrigger(e) ? 'new-tab' : true) createPage('page', isNewTabTrigger(e) ? 'new-tab' : true)
}
onCreateDoc={e =>
createPage(undefined, isNewTabTrigger(e) ? 'new-tab' : true)
} }
onImportFile={onImportFile} onImportFile={onImportFile}
> >