fix(core): share mode page reference (#8238)

This commit is contained in:
EYHN
2024-09-13 11:06:19 +00:00
parent 0a585a14a6
commit 58db654b07
2 changed files with 95 additions and 2 deletions

View File

@@ -25,6 +25,7 @@ import {
useRef, useRef,
useState, useState,
} from 'react'; } from 'react';
import { Link } from 'react-router-dom';
import * as styles from './styles.css'; import * as styles from './styles.css';
@@ -173,3 +174,79 @@ export function AffinePageReference({
</WorkbenchLink> </WorkbenchLink>
); );
} }
export function AffineSharedPageReference({
pageId,
docCollection,
wrapper: Wrapper,
params,
}: {
pageId: string;
docCollection: DocCollection;
wrapper?: React.ComponentType<PropsWithChildren>;
params?: URLSearchParams;
}) {
const t = useI18n();
const pageMetaHelper = useDocMetaHelper();
const journalHelper = useJournalHelper(docCollection);
const docsService = useService(DocsService);
const mode = useLiveData(docsService.list.primaryMode$(pageId));
let linkWithMode: DocMode | null = null;
let linkToNode = false;
if (params) {
const m = params.get('mode');
if (m && (m === 'page' || m === 'edgeless')) {
linkWithMode = m as DocMode;
}
linkToNode = params.has('blockIds') || params.has('elementIds');
}
const el = pageReferenceRenderer({
docMode: linkWithMode ?? mode ?? 'page',
pageId,
pageMetaHelper,
journalHelper,
docCollection,
t,
linkToNode,
});
const ref = useRef<HTMLAnchorElement>(null);
const [refreshKey, setRefreshKey] = useState<string>(() => nanoid());
const isJournal = journalHelper.isPageJournal(pageId);
const onClick = useCallback(() => {
if (isJournal) {
track.doc.editor.pageRef.navigate({
to: 'journal',
});
}
// update refresh key
setRefreshKey(nanoid());
return;
}, [isJournal]);
const query = useMemo(() => {
// A block/element reference link
let str = params?.toString() ?? '';
if (str.length) str += '&';
str += `refreshKey=${refreshKey}`;
return '?' + str;
}, [params, refreshKey]);
return (
<Link
ref={ref}
to={`/workspace/${docCollection.id}/${pageId}${query}`}
onClick={onClick}
className={styles.pageReferenceLink}
>
{Wrapper ? <Wrapper>{el}</Wrapper> : el}
</Link>
);
}

View File

@@ -19,6 +19,7 @@ import {
useLiveData, useLiveData,
useService, useService,
useServices, useServices,
WorkspaceService,
} from '@toeverything/infra'; } from '@toeverything/infra';
import React, { import React, {
forwardRef, forwardRef,
@@ -30,7 +31,10 @@ import React, {
} from 'react'; } from 'react';
import { PagePropertiesTable } from '../../affine/page-properties'; import { PagePropertiesTable } from '../../affine/page-properties';
import { AffinePageReference } from '../../affine/reference-link'; import {
AffinePageReference,
AffineSharedPageReference,
} from '../../affine/reference-link';
import { BiDirectionalLinkPanel } from './bi-directional-link-panel'; import { BiDirectionalLinkPanel } from './bi-directional-link-panel';
import { BlocksuiteEditorJournalDocTitle } from './journal-doc-title'; import { BlocksuiteEditorJournalDocTitle } from './journal-doc-title';
import { import {
@@ -75,11 +79,13 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
docService, docService,
docsService, docsService,
editorService, editorService,
workspaceService,
featureFlagService, featureFlagService,
} = useServices({ } = useServices({
PeekViewService, PeekViewService,
DocService, DocService,
DocsService, DocsService,
WorkspaceService,
EditorService, EditorService,
FeatureFlagService, FeatureFlagService,
}); });
@@ -94,6 +100,16 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
const params = toURLSearchParams(data.params); const params = toURLSearchParams(data.params);
if (workspaceService.workspace.openOptions.isSharedMode) {
return (
<AffineSharedPageReference
docCollection={workspaceService.workspace.docCollection}
pageId={pageId}
params={params}
/>
);
}
return ( return (
<AffinePageReference <AffinePageReference
docCollection={page.collection} docCollection={page.collection}
@@ -102,7 +118,7 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
/> />
); );
}; };
}, [page.collection]); }, [page.collection, workspaceService]);
const specs = useMemo(() => { const specs = useMemo(() => {
const enableAI = featureFlagService.flags.enable_ai.value; const enableAI = featureFlagService.flags.enable_ai.value;