mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-21 20:11:43 +08:00
feat: follow publish mode if no params
This commit is contained in:
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user