Skip to content

Commit 58db654

Browse files
committed
fix(core): share mode page reference (#8238)
1 parent 0a585a1 commit 58db654

File tree

2 files changed

+95
-2
lines changed

2 files changed

+95
-2
lines changed

packages/frontend/core/src/components/affine/reference-link/index.tsx

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
useRef,
2626
useState,
2727
} from 'react';
28+
import { Link } from 'react-router-dom';
2829

2930
import * as styles from './styles.css';
3031

@@ -173,3 +174,79 @@ export function AffinePageReference({
173174
</WorkbenchLink>
174175
);
175176
}
177+
178+
export function AffineSharedPageReference({
179+
pageId,
180+
docCollection,
181+
wrapper: Wrapper,
182+
params,
183+
}: {
184+
pageId: string;
185+
docCollection: DocCollection;
186+
wrapper?: React.ComponentType<PropsWithChildren>;
187+
params?: URLSearchParams;
188+
}) {
189+
const t = useI18n();
190+
const pageMetaHelper = useDocMetaHelper();
191+
const journalHelper = useJournalHelper(docCollection);
192+
const docsService = useService(DocsService);
193+
const mode = useLiveData(docsService.list.primaryMode$(pageId));
194+
195+
let linkWithMode: DocMode | null = null;
196+
let linkToNode = false;
197+
if (params) {
198+
const m = params.get('mode');
199+
if (m && (m === 'page' || m === 'edgeless')) {
200+
linkWithMode = m as DocMode;
201+
}
202+
linkToNode = params.has('blockIds') || params.has('elementIds');
203+
}
204+
205+
const el = pageReferenceRenderer({
206+
docMode: linkWithMode ?? mode ?? 'page',
207+
pageId,
208+
pageMetaHelper,
209+
journalHelper,
210+
docCollection,
211+
t,
212+
linkToNode,
213+
});
214+
215+
const ref = useRef<HTMLAnchorElement>(null);
216+
217+
const [refreshKey, setRefreshKey] = useState<string>(() => nanoid());
218+
219+
const isJournal = journalHelper.isPageJournal(pageId);
220+
221+
const onClick = useCallback(() => {
222+
if (isJournal) {
223+
track.doc.editor.pageRef.navigate({
224+
to: 'journal',
225+
});
226+
}
227+
228+
// update refresh key
229+
setRefreshKey(nanoid());
230+
231+
return;
232+
}, [isJournal]);
233+
234+
const query = useMemo(() => {
235+
// A block/element reference link
236+
let str = params?.toString() ?? '';
237+
if (str.length) str += '&';
238+
str += `refreshKey=${refreshKey}`;
239+
return '?' + str;
240+
}, [params, refreshKey]);
241+
242+
return (
243+
<Link
244+
ref={ref}
245+
to={`/workspace/${docCollection.id}/${pageId}${query}`}
246+
onClick={onClick}
247+
className={styles.pageReferenceLink}
248+
>
249+
{Wrapper ? <Wrapper>{el}</Wrapper> : el}
250+
</Link>
251+
);
252+
}

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
useLiveData,
2020
useService,
2121
useServices,
22+
WorkspaceService,
2223
} from '@toeverything/infra';
2324
import React, {
2425
forwardRef,
@@ -30,7 +31,10 @@ import React, {
3031
} from 'react';
3132

3233
import { PagePropertiesTable } from '../../affine/page-properties';
33-
import { AffinePageReference } from '../../affine/reference-link';
34+
import {
35+
AffinePageReference,
36+
AffineSharedPageReference,
37+
} from '../../affine/reference-link';
3438
import { BiDirectionalLinkPanel } from './bi-directional-link-panel';
3539
import { BlocksuiteEditorJournalDocTitle } from './journal-doc-title';
3640
import {
@@ -75,11 +79,13 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
7579
docService,
7680
docsService,
7781
editorService,
82+
workspaceService,
7883
featureFlagService,
7984
} = useServices({
8085
PeekViewService,
8186
DocService,
8287
DocsService,
88+
WorkspaceService,
8389
EditorService,
8490
FeatureFlagService,
8591
});
@@ -94,6 +100,16 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
94100

95101
const params = toURLSearchParams(data.params);
96102

103+
if (workspaceService.workspace.openOptions.isSharedMode) {
104+
return (
105+
<AffineSharedPageReference
106+
docCollection={workspaceService.workspace.docCollection}
107+
pageId={pageId}
108+
params={params}
109+
/>
110+
);
111+
}
112+
97113
return (
98114
<AffinePageReference
99115
docCollection={page.collection}
@@ -102,7 +118,7 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => {
102118
/>
103119
);
104120
};
105-
}, [page.collection]);
121+
}, [page.collection, workspaceService]);
106122

107123
const specs = useMemo(() => {
108124
const enableAI = featureFlagService.flags.enable_ai.value;

0 commit comments

Comments
 (0)