Skip to content

Commit

Permalink
feat(core): impl ai onboarding templates (#7341)
Browse files Browse the repository at this point in the history
  • Loading branch information
EYHN committed Jun 26, 2024
1 parent aeb666f commit dcf766f
Show file tree
Hide file tree
Showing 10 changed files with 69 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ export class ChatPanelMessages extends WithDisposable(ShadowlessElement) {
width: '85%',
alignItems: 'center',
justifyContent: 'start',
cursor: 'pointer',
})}
>
${config.icon}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,62 @@ import {
PreloadImageIcon,
PreloadPenIcon,
} from '../_common/icons.js';
import { AIProvider } from '../provider.js';
import completeWritingWithAI from './templates/completeWritingWithAI.zip';
import freelyCommunicateWithAI from './templates/freelyCommunicateWithAI.zip';
import readAforeign from './templates/readAforeign.zip';
import redHat from './templates/redHat.zip';
import TidyMindMapV3 from './templates/TidyMindMapV3.zip';

export const AIPreloadConfig = [
{
icon: ArticleIcon,
text: 'Read a foreign language article with AI',
handler: () => {}, //waiting for implementation
handler: () => {
AIProvider.slots.requestInsertTemplate.emit({
template: readAforeign,
mode: 'edgeless',
});
},
},
{
icon: MindmapIcon,
text: 'Tidy a article with AI MindMap Action',
handler: () => {},
handler: () => {
AIProvider.slots.requestInsertTemplate.emit({
template: TidyMindMapV3,
mode: 'edgeless',
});
},
},
{
icon: PreloadImageIcon,
text: 'Add illustrations to the article',
handler: () => {},
handler: () => {
AIProvider.slots.requestInsertTemplate.emit({
template: redHat,
mode: 'edgeless',
});
},
},
{
icon: PreloadPenIcon,
text: 'Complete writing with AI',
handler: () => {},
handler: () => {
AIProvider.slots.requestInsertTemplate.emit({
template: completeWritingWithAI,
mode: 'edgeless',
});
},
},
{
icon: CommunicateIcon,
text: 'Freely communicate with AI',
handler: () => {},
handler: () => {
AIProvider.slots.requestInsertTemplate.emit({
template: freelyCommunicateWithAI,
mode: 'edgeless',
});
},
},
];
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
4 changes: 4 additions & 0 deletions packages/frontend/core/src/blocksuite/presets/ai/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ export class AIProvider {
// use case: when user selects "continue in chat" in an ask ai result panel
// do we need to pass the context to the chat panel?
requestOpenWithChat: new Slot<AIChatParams>(),
requestInsertTemplate: new Slot<{
template: string;
mode: 'page' | 'edgeless';
}>(),
requestLogin: new Slot<{ host: EditorHost }>(),
requestUpgradePlan: new Slot<{ host: EditorHost }>(),
// when an action is requested to run in edgeless mode (show a toast in affine)
Expand Down
25 changes: 25 additions & 0 deletions packages/frontend/core/src/layouts/workspace-layout.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { ZipTransformer } from '@blocksuite/blocks';
import { assertExists } from '@blocksuite/global/utils';
import {
DndContext,
Expand All @@ -21,6 +22,7 @@ import { createPortal } from 'react-dom';
import { Map as YMap } from 'yjs';

import { openSettingModalAtom } from '../atoms';
import { AIProvider } from '../blocksuite/presets/ai';
import { WorkspaceAIOnboarding } from '../components/affine/ai-onboarding';
import { AppContainer } from '../components/affine/app-container';
import { SyncAwareness } from '../components/affine/awareness';
Expand Down Expand Up @@ -107,6 +109,7 @@ export const WorkspaceLayout = function WorkspaceLayout({

export const WorkspaceLayoutInner = ({ children }: PropsWithChildren) => {
const currentWorkspace = useService(WorkspaceService).workspace;
const docsList = useService(DocsService).list;
const { openPage } = useNavigateHelper();
const pageHelper = usePageHelper(currentWorkspace.docCollection);

Expand All @@ -121,6 +124,28 @@ export const WorkspaceLayoutInner = ({ children }: PropsWithChildren) => {
workbench.location$.map(location => basename + location.pathname)
);

useEffect(() => {
const disposable = AIProvider.slots.requestInsertTemplate.on(
({ template, mode }) => {
(async () => {
const templateZip = await fetch(template);
const templateBlob = await templateZip.blob();
const [doc] = await ZipTransformer.importDocs(
currentWorkspace.docCollection,
templateBlob
);
doc.resetHistory();

docsList.setMode(doc.id, mode);
workbench.openPage(doc.id);
})().catch(err => {
console.error(err);
});
}
);
return () => disposable.dispose();
}, [currentWorkspace.docCollection, docsList, workbench]);

useRegisterWorkspaceCommands();
useRegisterNavigationCommands();
useRegisterFindInPageCommands();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,13 @@ const DetailPageImpl = memo(function DetailPageImpl() {
}, [editor, isActiveView, setActiveBlockSuiteEditor]);

useEffect(() => {
AIProvider.slots.requestOpenWithChat.on(params => {
const disposable = AIProvider.slots.requestOpenWithChat.on(params => {
const opened = rightSidebar.isOpen$.value;
const actived = activeTabName === 'chat';

if (!opened) {
rightSidebar.open();
}

if (!actived) {
setActiveTabName('chat');
}
Expand All @@ -122,7 +121,8 @@ const DetailPageImpl = memo(function DetailPageImpl() {
setTabOnLoad(null);
}
});
}, [activeTabName, rightSidebar, setActiveTabName, setTabOnLoad]);
return disposable.dispose();
}, [activeTabName, rightSidebar, setActiveTabName]);

useEffect(() => {
if (isActiveView) {
Expand Down

0 comments on commit dcf766f

Please sign in to comment.