Skip to content

Commit a0d6a28

Browse files
committed
fix: default style of new document does not follow AFFiNE settings (#8291)
Close issue [BS-1377](https://linear.app/affine-design/issue/BS-1377). ### What changed? - Add `initDocFromProps` function to initialize the document with specific props. - Extract `docProps` from editor settings and pass it to `docsService.createDoc` function. <div class='graphite__hidden'> <div>🎥 Video uploaded on Graphite:</div> <a href="https://app.graphite.dev/media/video/sJGviKxfE3Ap685cl5bj/8082a8bd-ab3d-432c-9d3e-2f1d1a8398eb.mov"> <img src="https://app.graphite.dev/api/v1/graphite/video/thumbnail/sJGviKxfE3Ap685cl5bj/8082a8bd-ab3d-432c-9d3e-2f1d1a8398eb.mov"> </a> </div> <video src="https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/sJGviKxfE3Ap685cl5bj/8082a8bd-ab3d-432c-9d3e-2f1d1a8398eb.mov">录屏2024-09-18 16.13.43.mov</video>
1 parent 544cdd3 commit a0d6a28

File tree

6 files changed

+91
-40
lines changed

6 files changed

+91
-40
lines changed
Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,45 @@
1-
import type { Doc } from '@blocksuite/store';
1+
import type { SurfaceBlockProps } from '@blocksuite/block-std/gfx';
2+
import {
3+
NoteDisplayMode,
4+
type NoteProps,
5+
type ParagraphProps,
6+
type RootBlockProps,
7+
} from '@blocksuite/blocks';
8+
import { type Doc, Text } from '@blocksuite/store';
29

3-
export function initEmptyPage(page: Doc, title?: string) {
4-
page.load(() => {
5-
const pageBlockId = page.addBlock(
6-
'affine:page' as keyof BlockSuite.BlockModels,
7-
{
8-
title: new page.Text(title ?? ''),
9-
}
10-
);
11-
page.addBlock(
12-
'affine:surface' as keyof BlockSuite.BlockModels,
13-
{},
14-
pageBlockId
10+
export interface DocProps {
11+
page?: Partial<RootBlockProps>;
12+
surface?: Partial<SurfaceBlockProps>;
13+
note?: Partial<NoteProps>;
14+
paragraph?: Partial<ParagraphProps>;
15+
}
16+
17+
export function initEmptyDoc(doc: Doc, title?: string) {
18+
doc.load(() => {
19+
initDocFromProps(doc, {
20+
page: {
21+
title: new Text(title),
22+
},
23+
});
24+
});
25+
}
26+
27+
export function initDocFromProps(doc: Doc, props?: DocProps) {
28+
doc.load(() => {
29+
const pageBlockId = doc.addBlock(
30+
'affine:page',
31+
props?.page || { title: new Text('') }
1532
);
16-
const noteBlockId = page.addBlock(
17-
'affine:note' as keyof BlockSuite.BlockModels,
18-
{},
33+
doc.addBlock('affine:surface', props?.surface || {}, pageBlockId);
34+
const noteBlockId = doc.addBlock(
35+
'affine:note',
36+
{
37+
...props?.note,
38+
displayMode: NoteDisplayMode.DocAndEdgeless,
39+
},
1940
pageBlockId
2041
);
21-
page.addBlock(
22-
'affine:paragraph' as keyof BlockSuite.BlockModels,
23-
{},
24-
noteBlockId
25-
);
26-
page.history.clear();
42+
doc.addBlock('affine:paragraph', props?.paragraph || {}, noteBlockId);
43+
doc.history.clear();
2744
});
2845
}

packages/common/infra/src/modules/doc/services/docs.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Unreachable } from '@affine/env/constant';
2-
import type { DocMode } from '@blocksuite/blocks';
2+
import { type DocMode } from '@blocksuite/blocks';
33

44
import { Service } from '../../../framework';
5-
import { initEmptyPage } from '../../../initialization';
5+
import { type DocProps, initDocFromProps } from '../../../initialization';
66
import { ObjectPool } from '../../../utils';
77
import type { Doc } from '../entities/doc';
88
import { DocRecordList } from '../entities/record-list';
@@ -54,11 +54,11 @@ export class DocsService extends Service {
5454
createDoc(
5555
options: {
5656
primaryMode?: DocMode;
57-
title?: string;
57+
docProps?: DocProps;
5858
} = {}
5959
) {
6060
const doc = this.store.createBlockSuiteDoc();
61-
initEmptyPage(doc, options.title);
61+
initDocFromProps(doc, options.docProps);
6262
this.store.markDocSyncStateAsReady(doc.id);
6363
const docRecord = this.list.doc$(doc.id).value;
6464
if (!docRecord) {

packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
type useConfirmModal,
99
} from '@affine/component';
1010
import type { EditorService } from '@affine/core/modules/editor';
11+
import { EditorSettingService } from '@affine/core/modules/editor-settting';
1112
import { resolveLinkToDoc } from '@affine/core/modules/navigation';
1213
import type { PeekViewService } from '@affine/core/modules/peek-view';
1314
import type { ActivePeekView } from '@affine/core/modules/peek-view/entities/peek-view';
@@ -50,8 +51,9 @@ import {
5051
ReferenceNodeConfigExtension,
5152
} from '@blocksuite/blocks';
5253
import { AIChatBlockSchema } from '@blocksuite/presets';
53-
import type { BlockSnapshot } from '@blocksuite/store';
54+
import { type BlockSnapshot, Text } from '@blocksuite/store';
5455
import {
56+
type DocProps,
5557
type DocService,
5658
DocsService,
5759
type FrameworkProvider,
@@ -336,11 +338,16 @@ export function patchQuickSearchService(framework: FrameworkProvider) {
336338

337339
if (result.source === 'creation') {
338340
const docsService = framework.get(DocsService);
341+
const editorSettingService = framework.get(EditorSettingService);
339342
const mode =
340343
result.id === 'creation:create-edgeless' ? 'edgeless' : 'page';
344+
const docProps: DocProps = {
345+
page: { title: new Text(result.payload.title) },
346+
note: editorSettingService.editorSetting.get('affine:note'),
347+
};
341348
const newDoc = docsService.createDoc({
342349
primaryMode: mode,
343-
title: result.payload.title,
350+
docProps,
344351
});
345352
track.doc.editor.quickSearch.createDoc({
346353
mode,

packages/frontend/core/src/components/blocksuite/block-suite-page-list/utils.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
import { toast } from '@affine/component';
2+
import { EditorSettingService } from '@affine/core/modules/editor-settting';
23
import { WorkbenchService } from '@affine/core/modules/workbench';
34
import type { DocMode } from '@blocksuite/blocks';
45
import type { DocCollection } from '@blocksuite/store';
5-
import { DocsService, useServices } from '@toeverything/infra';
6+
import { type DocProps, DocsService, useServices } from '@toeverything/infra';
67
import { useCallback, useMemo } from 'react';
78

89
export const usePageHelper = (docCollection: DocCollection) => {
9-
const { docsService, workbenchService } = useServices({
10+
const { docsService, workbenchService, editorSettingService } = useServices({
1011
DocsService,
1112
WorkbenchService,
13+
EditorSettingService,
1214
});
1315
const workbench = workbenchService.workbench;
1416
const docRecordList = docsService.list;
1517

1618
const createPageAndOpen = useCallback(
1719
(mode?: DocMode, open?: boolean | 'new-tab') => {
18-
const page = docsService.createDoc();
20+
const docProps: DocProps = {
21+
note: editorSettingService.editorSetting.get('affine:note'),
22+
};
23+
const page = docsService.createDoc({ docProps });
1924
if (mode) {
2025
docRecordList.doc$(page.id).value?.setPrimaryMode(mode);
2126
}
@@ -26,7 +31,7 @@ export const usePageHelper = (docCollection: DocCollection) => {
2631
});
2732
return page;
2833
},
29-
[docRecordList, docsService, workbench]
34+
[docRecordList, docsService, editorSettingService, workbench]
3035
);
3136

3237
const createEdgelessAndOpen = useCallback(

packages/frontend/core/src/components/hooks/use-journal.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1+
import { EditorSettingService } from '@affine/core/modules/editor-settting';
12
import { i18nTime } from '@affine/i18n';
23
import { track } from '@affine/track';
3-
import type { DocCollection } from '@blocksuite/store';
4-
import { DocsService, initEmptyPage, useService } from '@toeverything/infra';
4+
import { type DocCollection, Text } from '@blocksuite/store';
5+
import {
6+
type DocProps,
7+
DocsService,
8+
initDocFromProps,
9+
useService,
10+
useServices,
11+
} from '@toeverything/infra';
512
import dayjs from 'dayjs';
613
import { useCallback, useMemo } from 'react';
714

@@ -25,7 +32,10 @@ function toDayjs(j?: string | false) {
2532

2633
export const useJournalHelper = (docCollection: DocCollection) => {
2734
const bsWorkspaceHelper = useDocCollectionHelper(docCollection);
28-
const docsService = useService(DocsService);
35+
const { docsService, editorSettingService } = useServices({
36+
DocsService,
37+
EditorSettingService,
38+
});
2939
const adapter = useCurrentWorkspacePropertiesAdapter();
3040

3141
/**
@@ -46,11 +56,15 @@ export const useJournalHelper = (docCollection: DocCollection) => {
4656
.toDate()
4757
.getTime(),
4858
});
49-
initEmptyPage(page, title);
59+
const docProps: DocProps = {
60+
page: { title: new Text(title) },
61+
note: editorSettingService.editorSetting.get('affine:note'),
62+
};
63+
initDocFromProps(page, docProps);
5064
adapter.setJournalPageDateString(page.id, title);
5165
return page;
5266
},
53-
[adapter, bsWorkspaceHelper, docsService.list]
67+
[adapter, bsWorkspaceHelper, docsService.list, editorSettingService]
5468
);
5569

5670
const isPageJournal = useCallback(

packages/frontend/core/src/modules/quicksearch/services/cmdk.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { track } from '@affine/track';
2-
import type { DocsService } from '@toeverything/infra';
2+
import { Text } from '@blocksuite/store';
3+
import type { DocProps, DocsService } from '@toeverything/infra';
34
import { Service } from '@toeverything/infra';
45

6+
import { EditorSettingService } from '../../editor-settting';
57
import type { WorkbenchService } from '../../workbench';
68
import { CollectionsQuickSearchSession } from '../impls/collections';
79
import { CommandsQuickSearchSession } from '../impls/commands';
@@ -92,16 +94,22 @@ export class CMDKQuickSearchService extends Service {
9294
}
9395

9496
if (result.source === 'creation') {
97+
const editorSettingService =
98+
this.framework.get(EditorSettingService);
99+
const docProps: DocProps = {
100+
page: { title: new Text(result.payload.title) },
101+
note: editorSettingService.editorSetting.get('affine:note'),
102+
};
95103
if (result.id === 'creation:create-page') {
96104
const newDoc = this.docsService.createDoc({
97105
primaryMode: 'page',
98-
title: result.payload.title,
106+
docProps,
99107
});
100108
this.workbenchService.workbench.openDoc(newDoc.id);
101109
} else if (result.id === 'creation:create-edgeless') {
102110
const newDoc = this.docsService.createDoc({
103111
primaryMode: 'edgeless',
104-
title: result.payload.title,
112+
docProps,
105113
});
106114
this.workbenchService.workbench.openDoc(newDoc.id);
107115
}

0 commit comments

Comments
 (0)