feat: follow publish mode if no params

This commit is contained in:
DarkSky
2026-04-05 20:43:09 +08:00
parent f81abe692d
commit 64149d909a
4 changed files with 173 additions and 20 deletions
@@ -37,6 +37,10 @@ import { PageNotFound } from '../../404';
import { ShareFooter } from './share-footer';
import { ShareHeader } from './share-header';
import * as styles from './share-page.css';
import {
fetchSharedPublishMode,
getResolvedPublishMode,
} from './share-page.utils';
import { useSharedModeQuerySync } from './use-shared-mode-query-sync';
const useUpdateBasename = (workspace: Workspace | null) => {
@@ -127,19 +131,58 @@ const SharePageInner = ({
const [page, setPage] = useState<Doc | null>(null);
const [editor, setEditor] = useState<Editor | null>(null);
const [noPermission, setNoPermission] = useState(false);
const [fetchedPublishMode, setFetchedPublishMode] = useState<
DocMode | null | undefined
>(() => (publishMode === undefined ? undefined : null));
const [editorContainer, setActiveBlocksuiteEditor] =
useActiveBlocksuiteEditor();
const resolvedPublishMode = publishMode ?? null;
const resolvedPublishMode =
publishMode !== undefined
? publishMode
: fetchedPublishMode === undefined
? null
: getResolvedPublishMode(null, fetchedPublishMode);
const currentPublishMode = useSharedModeQuerySync({
editor,
resolvedPublishMode,
});
useEffect(() => {
if (editor || workspace || page) {
if (publishMode !== undefined) {
setFetchedPublishMode(null);
return;
}
const abortController = new AbortController();
setFetchedPublishMode(undefined);
void fetchSharedPublishMode({
serverBaseUrl: serverService.server.baseUrl,
workspaceId,
docId,
signal: abortController.signal,
})
.then(mode => {
if (!abortController.signal.aborted) {
setFetchedPublishMode(mode);
}
})
.catch(err => {
if (!abortController.signal.aborted) {
console.error(err);
setFetchedPublishMode(null);
}
});
return () => {
abortController.abort();
};
}, [docId, publishMode, serverService.server.baseUrl, workspaceId]);
useEffect(() => {
if (resolvedPublishMode === null) return;
if (editor || workspace || page) return;
// create a workspace for share page
const { workspace: sharedWorkspace } = workspacesService.open(
{
@@ -188,7 +231,7 @@ const SharePageInner = ({
setPage(doc);
const editor = doc.scope.get(EditorsService).createEditor();
editor.setMode(resolvedPublishMode ?? doc.getPrimaryMode() ?? 'page');
editor.setMode(resolvedPublishMode);
if (selector) {
editor.setSelector(selector);
@@ -1,15 +1,67 @@
import { PublicDocMode } from '@affine/graphql';
import { type DocMode, DocModes } from '@blocksuite/affine/model';
export const getResolvedPublishMode = (
queryMode: DocMode | null,
publicMode?: PublicDocMode | null
publishMode?: DocMode | null
): DocMode => {
if (queryMode && DocModes.includes(queryMode)) {
return queryMode;
}
return publicMode === PublicDocMode.Edgeless ? 'edgeless' : 'page';
return publishMode === 'edgeless' ? 'edgeless' : 'page';
};
export const parsePublishMode = (
publishMode: string | null | undefined
): DocMode | null => {
if (!publishMode) {
return null;
}
return DocModes.includes(publishMode as DocMode)
? (publishMode as DocMode)
: null;
};
export const fetchSharedPublishMode = async ({
serverBaseUrl,
workspaceId,
docId,
signal,
}: {
serverBaseUrl: string;
workspaceId: string;
docId: string;
signal?: AbortSignal;
}): Promise<DocMode | null> => {
const url = new URL(
`/api/workspaces/${encodeURIComponent(workspaceId)}/docs/${encodeURIComponent(docId)}`,
serverBaseUrl
);
const headers = {
Accept: 'application/octet-stream',
'x-affine-version': BUILD_CONFIG.appVersion,
};
const headResponse = await globalThis.fetch(url, {
method: 'HEAD',
headers,
signal,
});
const headMode = parsePublishMode(headResponse.headers.get('publish-mode'));
if (headMode || headResponse.status === 404 || !headResponse.ok) {
return headMode;
}
const getResponse = await globalThis.fetch(url, {
headers,
signal,
});
try {
return parsePublishMode(getResponse.headers.get('publish-mode'));
} finally {
await getResponse.body?.cancel();
}
};
export const getSearchWithMode = (search: string, mode: DocMode) => {