Skip to content

Commit f688c05

Browse files
committed
1 parent eb16c27 commit f688c05

File tree

18 files changed

+180
-59
lines changed

18 files changed

+180
-59
lines changed

packages/frontend/core/src/blocksuite/presets/ai/ai-spec.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ import { assertInstanceOf } from '@blocksuite/global/utils';
2626
import { literal, unsafeStatic } from 'lit/static-html.js';
2727

2828
import { buildAIPanelConfig } from './ai-panel';
29-
import { setupCodeToolbarEntry } from './entries/code-toolbar/setup-code-toolbar';
29+
import { setupCodeToolbarAIEntry } from './entries/code-toolbar/setup-code-toolbar';
3030
import {
3131
setupEdgelessCopilot,
32-
setupEdgelessElementToolbarEntry,
32+
setupEdgelessElementToolbarAIEntry,
3333
} from './entries/edgeless/index';
34-
import { setupFormatBarEntry } from './entries/format-bar/setup-format-bar';
35-
import { setupImageToolbarEntry } from './entries/image-toolbar/setup-image-toolbar';
36-
import { setupSlashMenuEntry } from './entries/slash-menu/setup-slash-menu';
37-
import { setupSpaceEntry } from './entries/space/setup-space';
34+
import { setupFormatBarAIEntry } from './entries/format-bar/setup-format-bar';
35+
import { setupImageToolbarAIEntry } from './entries/image-toolbar/setup-image-toolbar';
36+
import { setupSlashMenuAIEntry } from './entries/slash-menu/setup-slash-menu';
37+
import { setupSpaceAIEntry } from './entries/space/setup-space';
3838

3939
class AIPageRootWatcher extends BlockServiceWatcher {
4040
static override readonly flavour = 'affine:page';
@@ -45,15 +45,15 @@ class AIPageRootWatcher extends BlockServiceWatcher {
4545
if (view.component instanceof AffineAIPanelWidget) {
4646
view.component.style.width = '630px';
4747
view.component.config = buildAIPanelConfig(view.component);
48-
setupSpaceEntry(view.component);
48+
setupSpaceAIEntry(view.component);
4949
}
5050

5151
if (view.component instanceof AffineFormatBarWidget) {
52-
setupFormatBarEntry(view.component);
52+
setupFormatBarAIEntry(view.component);
5353
}
5454

5555
if (view.component instanceof AffineSlashMenuWidget) {
56-
setupSlashMenuEntry(view.component);
56+
setupSlashMenuAIEntry(view.component);
5757
}
5858
});
5959
}
@@ -85,23 +85,23 @@ class AIEdgelessRootWatcher extends BlockServiceWatcher {
8585
if (view.component instanceof AffineAIPanelWidget) {
8686
view.component.style.width = '430px';
8787
view.component.config = buildAIPanelConfig(view.component);
88-
setupSpaceEntry(view.component);
88+
setupSpaceAIEntry(view.component);
8989
}
9090

9191
if (view.component instanceof EdgelessCopilotWidget) {
9292
setupEdgelessCopilot(view.component);
9393
}
9494

9595
if (view.component instanceof EdgelessElementToolbarWidget) {
96-
setupEdgelessElementToolbarEntry(view.component);
96+
setupEdgelessElementToolbarAIEntry(view.component);
9797
}
9898

9999
if (view.component instanceof AffineFormatBarWidget) {
100-
setupFormatBarEntry(view.component);
100+
setupFormatBarAIEntry(view.component);
101101
}
102102

103103
if (view.component instanceof AffineSlashMenuWidget) {
104-
setupSlashMenuEntry(view.component);
104+
setupSlashMenuAIEntry(view.component);
105105
}
106106
});
107107
}
@@ -166,7 +166,7 @@ class AICodeBlockWatcher extends BlockServiceWatcher {
166166
const service = this.blockService;
167167
service.specSlots.widgetConnected.on(view => {
168168
if (view.component instanceof AffineCodeToolbarWidget) {
169-
setupCodeToolbarEntry(view.component);
169+
setupCodeToolbarAIEntry(view.component);
170170
}
171171
});
172172
}
@@ -184,7 +184,7 @@ class AIImageBlockWatcher extends BlockServiceWatcher {
184184
super.mounted();
185185
this.blockService.specSlots.widgetConnected.on(view => {
186186
if (view.component instanceof AffineImageToolbarWidget) {
187-
setupImageToolbarEntry(view.component);
187+
setupImageToolbarAIEntry(view.component);
188188
}
189189
});
190190
}

packages/frontend/core/src/blocksuite/presets/ai/entries/code-toolbar/setup-code-toolbar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const buttonOptions: AskAIButtonOptions = {
1212
import type { AskAIButtonOptions } from '../../_common/components/ask-ai-button';
1313
import { buildAICodeItemGroups } from '../../_common/config';
1414

15-
export function setupCodeToolbarEntry(codeToolbar: AffineCodeToolbarWidget) {
15+
export function setupCodeToolbarAIEntry(codeToolbar: AffineCodeToolbarWidget) {
1616
codeToolbar.addPrimaryItems([
1717
{
1818
type: 'ask-ai',

packages/frontend/core/src/blocksuite/presets/ai/entries/edgeless/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function setupEdgelessCopilot(widget: EdgelessCopilotWidget) {
1717
widget.groups = edgelessActionGroups;
1818
}
1919

20-
export function setupEdgelessElementToolbarEntry(
20+
export function setupEdgelessElementToolbarAIEntry(
2121
widget: EdgelessElementToolbarWidget
2222
) {
2323
widget.registerEntry({

packages/frontend/core/src/blocksuite/presets/ai/entries/format-bar/setup-format-bar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { html, type TemplateResult } from 'lit';
88

99
import { AIItemGroups } from '../../_common/config';
1010

11-
export function setupFormatBarEntry(formatBar: AffineFormatBarWidget) {
11+
export function setupFormatBarAIEntry(formatBar: AffineFormatBarWidget) {
1212
toolbarDefaultConfig(formatBar);
1313
formatBar.addRawConfigItems(
1414
[

packages/frontend/core/src/blocksuite/presets/ai/entries/image-toolbar/setup-image-toolbar.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ const buttonOptions: AskAIButtonOptions = {
1313
panelWidth: 300,
1414
};
1515

16-
export function setupImageToolbarEntry(imageToolbar: AffineImageToolbarWidget) {
16+
export function setupImageToolbarAIEntry(
17+
imageToolbar: AffineImageToolbarWidget
18+
) {
1719
imageToolbar.addPrimaryItems(
1820
[
1921
{

packages/frontend/core/src/blocksuite/presets/ai/entries/slash-menu/setup-slash-menu.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { AIItemGroups } from '../../_common/config';
2020
import { handleInlineAskAIAction } from '../../actions/doc-handler';
2121
import { AIProvider } from '../../provider';
2222

23-
export function setupSlashMenuEntry(slashMenu: AffineSlashMenuWidget) {
23+
export function setupSlashMenuAIEntry(slashMenu: AffineSlashMenuWidget) {
2424
const AIItems = AIItemGroups.map(group => group.items).flat();
2525

2626
const iconWrapper = (icon: AIItemConfig['icon']) => {

packages/frontend/core/src/blocksuite/presets/ai/entries/space/setup-space.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { AffineAIPanelWidget } from '@blocksuite/blocks';
33
import { handleInlineAskAIAction } from '../../actions/doc-handler';
44
import { AIProvider } from '../../provider';
55

6-
export function setupSpaceEntry(panel: AffineAIPanelWidget) {
6+
export function setupSpaceAIEntry(panel: AffineAIPanelWidget) {
77
panel.handleEvent('keyDown', ctx => {
88
const host = panel.host;
99
const keyboardState = ctx.get('keyboardState');

packages/frontend/core/src/components/affine/ai-onboarding/index.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { EditorSettingService } from '@affine/core/modules/editor-settting';
2+
import { useLiveData, useService } from '@toeverything/infra';
13
import { Suspense, useCallback, useEffect, useState } from 'react';
24

35
import { AIOnboardingEdgeless } from './edgeless.dialog';
@@ -28,19 +30,29 @@ const useDismiss = (key: AIOnboardingType) => {
2830
export const WorkspaceAIOnboarding = () => {
2931
const [dismissGeneral] = useDismiss(AIOnboardingType.GENERAL);
3032
const [dismissLocal] = useDismiss(AIOnboardingType.LOCAL);
33+
const editorSettingService = useService(EditorSettingService);
34+
const enableAI = useLiveData(
35+
editorSettingService.editorSetting.settings$.map(s => s.enableAI)
36+
);
3137

3238
return (
3339
<Suspense>
34-
{dismissGeneral ? null : <AIOnboardingGeneral />}
35-
{dismissLocal ? null : <AIOnboardingLocal />}
40+
{!enableAI || dismissGeneral ? null : <AIOnboardingGeneral />}
41+
{!enableAI || dismissLocal ? null : <AIOnboardingLocal />}
3642
</Suspense>
3743
);
3844
};
3945

4046
export const PageAIOnboarding = () => {
4147
const [dismissEdgeless] = useDismiss(AIOnboardingType.EDGELESS);
48+
const editorSettingService = useService(EditorSettingService);
49+
const enableAI = useLiveData(
50+
editorSettingService.editorSetting.settings$.map(s => s.enableAI)
51+
);
4252

4353
return (
44-
<Suspense>{dismissEdgeless ? null : <AIOnboardingEdgeless />}</Suspense>
54+
<Suspense>
55+
{!enableAI || dismissEdgeless ? null : <AIOnboardingEdgeless />}
56+
</Suspense>
4557
);
4658
};

packages/frontend/core/src/components/affine/setting-modal/general-setting/editor/general.tsx

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
type RadioItem,
99
Scrollable,
1010
Switch,
11+
useConfirmModal,
1112
} from '@affine/component';
1213
import {
1314
SettingRow,
@@ -393,16 +394,51 @@ export const SpellCheckSettings = () => {
393394
);
394395
};
395396

397+
const AISettings = () => {
398+
const t = useI18n();
399+
const { openConfirmModal } = useConfirmModal();
400+
const { editorSettingService } = useServices({ EditorSettingService });
401+
402+
const settings = useLiveData(editorSettingService.editorSetting.settings$);
403+
404+
const onAIChange = useCallback(
405+
(checked: boolean) => {
406+
editorSettingService.editorSetting.set('enableAI', checked);
407+
},
408+
[editorSettingService]
409+
);
410+
const onToggleAI = useCallback(
411+
(checked: boolean) => {
412+
openConfirmModal({
413+
title: checked ? 'Enable AI?' : 'Disable AI?',
414+
description: `Are you sure you want to ${checked ? 'enable' : 'disable'} AI?`,
415+
confirmText: checked ? 'Enable' : 'Disable',
416+
cancelText: 'Cancel',
417+
onConfirm: () => onAIChange(checked),
418+
confirmButtonOptions: {
419+
variant: checked ? 'primary' : 'error',
420+
},
421+
});
422+
},
423+
[openConfirmModal, onAIChange]
424+
);
425+
426+
return (
427+
<SettingRow
428+
name={t['com.affine.settings.editorSettings.general.ai.title']()}
429+
desc={t['com.affine.settings.editorSettings.general.ai.description']()}
430+
>
431+
<Switch checked={settings.enableAI} onChange={onToggleAI} />
432+
</SettingRow>
433+
);
434+
};
435+
396436
export const General = () => {
397437
const t = useI18n();
438+
398439
return (
399440
<SettingWrapper title={t['com.affine.settings.editorSettings.general']()}>
400-
<SettingRow
401-
name={t['com.affine.settings.editorSettings.general.ai.title']()}
402-
desc={t['com.affine.settings.editorSettings.general.ai.description']()}
403-
>
404-
<Switch />
405-
</SettingRow>
441+
<AISettings />
406442
<FontFamilySettings />
407443
<CustomFontFamilySettings />
408444
<NewDocDefaultModeSettings />

packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
useFramework,
1616
useLiveData,
1717
useService,
18+
useServices,
1819
} from '@toeverything/infra';
1920
import React, {
2021
forwardRef,
@@ -65,9 +66,13 @@ interface BlocksuiteEditorProps {
6566

6667
const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
6768
const [reactToLit, portals] = useLitPortalFactory();
68-
const peekViewService = useService(PeekViewService);
69-
const docService = useService(DocService);
70-
const docsService = useService(DocsService);
69+
const { peekViewService, docService, docsService, editorSettingService } =
70+
useServices({
71+
PeekViewService,
72+
DocService,
73+
DocsService,
74+
EditorSettingService,
75+
});
7176
const framework = useFramework();
7277
const referenceRenderer: ReferenceReactRenderer = useMemo(() => {
7378
return function customReference(reference) {
@@ -89,10 +94,12 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
8994
}, [mode, page.collection]);
9095

9196
const specs = useMemo(() => {
97+
const enableAI =
98+
editorSettingService.editorSetting.settings$.value.enableAI;
9299
return mode === 'edgeless'
93-
? createEdgelessModeSpecs(framework)
94-
: createPageModeSpecs(framework);
95-
}, [mode, framework]);
100+
? createEdgelessModeSpecs(framework, enableAI)
101+
: createPageModeSpecs(framework, enableAI);
102+
}, [editorSettingService, mode, framework]);
96103

97104
const confirmModal = useConfirmModal();
98105
const patchedSpecs = useMemo(() => {

0 commit comments

Comments
 (0)