fix(core): share mode page reference (#8238)
This commit is contained in:
@@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user