diff --git a/packages/frontend/core/src/mobile/components/app-tabs/create.tsx b/packages/frontend/core/src/mobile/components/app-tabs/create.tsx index 94b2af05b4..852e5215cf 100644 --- a/packages/frontend/core/src/mobile/components/app-tabs/create.tsx +++ b/packages/frontend/core/src/mobile/components/app-tabs/create.tsx @@ -1,10 +1,13 @@ import { usePageHelper } from '@affine/core/components/blocksuite/block-suite-page-list/utils'; +import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks'; +import { DocsService } from '@affine/core/modules/doc'; +import { FeatureFlagService } from '@affine/core/modules/feature-flag'; +import { TemplateDocService } from '@affine/core/modules/template-doc'; import { WorkbenchService } from '@affine/core/modules/workbench'; import { WorkspaceService } from '@affine/core/modules/workspace'; import track from '@affine/track'; import { EditIcon } from '@blocksuite/icons/rc'; -import { useService } from '@toeverything/infra'; -import { useCallback } from 'react'; +import { useLiveData, useService } from '@toeverything/infra'; import type { AppTabCustomFCProps } from './data'; import { TabItem } from './tab-item'; @@ -12,17 +15,43 @@ import { TabItem } from './tab-item'; export const AppTabCreate = ({ tab }: AppTabCustomFCProps) => { const workbench = useService(WorkbenchService).workbench; const workspaceService = useService(WorkspaceService); + const featureFlagService = useService(FeatureFlagService); + const templateDocService = useService(TemplateDocService); + const docsService = useService(DocsService); + const currentWorkspace = workspaceService.workspace; const pageHelper = usePageHelper(currentWorkspace.docCollection); + const enableTemplateDoc = useLiveData( + featureFlagService.flags.enable_template_doc.$ + ); + const enablePageTemplate = useLiveData( + templateDocService.setting.enablePageTemplate$ + ); + const pageTemplateDocId = useLiveData( + templateDocService.setting.pageTemplateDocId$ + ); - const createPage = useCallback( - (isActive: boolean) => { + const createPage = useAsyncCallback( + async (isActive: boolean) => { if (isActive) return; - const doc = pageHelper.createPage(undefined, { show: false }); - workbench.openDoc({ docId: doc.id, fromTab: 'true' }); + if (enableTemplateDoc && enablePageTemplate && pageTemplateDocId) { + const docId = + await docsService.duplicateFromTemplate(pageTemplateDocId); + workbench.openDoc({ docId, fromTab: 'true' }); + } else { + const doc = pageHelper.createPage(undefined, { show: false }); + workbench.openDoc({ docId: doc.id, fromTab: 'true' }); + } track.$.navigationPanel.$.createDoc(); }, - [pageHelper, workbench] + [ + docsService, + enablePageTemplate, + enableTemplateDoc, + pageHelper, + pageTemplateDocId, + workbench, + ] ); return ( diff --git a/packages/frontend/core/src/modules/feature-flag/constant.ts b/packages/frontend/core/src/modules/feature-flag/constant.ts index 914be87d43..013655eb4c 100644 --- a/packages/frontend/core/src/modules/feature-flag/constant.ts +++ b/packages/frontend/core/src/modules/feature-flag/constant.ts @@ -236,7 +236,7 @@ export const AFFINE_FLAGS = { displayName: 'Enable template doc', description: 'Allow users to mark a doc as a template, and create new docs from it', - configurable: !isMobile, + configurable: true, defaultState: isCanaryBuild, }, // TODO(@L-Sun): remove this flag when ready