revert: loadWorkspace unexpected behavior (#1172)

This commit is contained in:
Himself65
2023-02-21 20:44:18 -06:00
committed by GitHub
parent 86346b284e
commit 0b072da346
49 changed files with 1225 additions and 2198 deletions

View File

@@ -1,6 +1,6 @@
import { PageMeta } from '@affine/store';
import { useCallback } from 'react';
import { PageMeta } from '@/providers/app-state-provider';
import { useGlobalState } from '@/store/app';
export type ChangePageMeta = (

View File

@@ -1,6 +1,6 @@
import { PageMeta } from '@affine/store';
import { useCallback, useEffect, useState } from 'react';
import { PageMeta } from '@/providers/app-state-provider';
import { useGlobalState } from '@/store/app';
export const useCurrentPageMeta = (): PageMeta | null => {

View File

@@ -0,0 +1,73 @@
import { assertEquals } from '@blocksuite/global/utils';
import { useRouter } from 'next/router';
import { useCallback, useEffect, useState } from 'react';
import { useGlobalState } from '@/store/app';
// todo: refactor with suspense mode
// It is a fully effective hook
// Cause it not just ensure workspace loaded, but also have router change.
export const useEnsureWorkspace = () => {
const dataCenter = useGlobalState(useCallback(store => store.dataCenter, []));
const currentWorkspace = useGlobalState(
useCallback(store => store.currentDataCenterWorkspace, [])
);
const loadWorkspace = useGlobalState(
useCallback(store => store.loadWorkspace, [])
);
const router = useRouter();
const [currentWorkspaceId, setCurrentWorkspaceId] = useState<string | null>(
typeof router.query.workspaceId === 'string'
? router.query.workspaceId
: null
);
// const defaultOutLineWorkspaceId = '99ce7eb7';
// console.log(defaultOutLineWorkspaceId);
useEffect(() => {
const abortController = new AbortController();
const workspaceId =
(router.query.workspaceId as string) || dataCenter.workspaces[0]?.id;
// If router.query.workspaceId is not in workspace list, jump to 404 page
// If workspaceList is empty, we need to create a default workspace but not jump to 404
if (
workspaceId &&
dataCenter.workspaces.length &&
dataCenter.workspaces.findIndex(
meta => meta.id.toString() === workspaceId
) === -1
) {
router.push('/404');
return;
}
// If user is not login and input a custom workspaceId, jump to 404 page
// if (
// !user &&
// router.query.workspaceId &&
// router.query.workspaceId !== defaultOutLineWorkspaceId
// ) {
// router.push('/404');
// return;
// }
loadWorkspace(workspaceId, abortController.signal).then(unit => {
if (!abortController.signal.aborted && unit) {
setCurrentWorkspaceId(unit.id);
assertEquals(unit.id, workspaceId);
}
});
return () => {
abortController.abort();
};
}, [dataCenter, loadWorkspace, router]);
return {
workspaceLoaded: currentWorkspace?.id === currentWorkspaceId,
activeWorkspaceId: currentWorkspace?.id ?? router.query.workspaceId,
};
};
export default useEnsureWorkspace;

View File

@@ -0,0 +1,35 @@
import { getDataCenter, WorkspaceUnit } from '@affine/datacenter';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
export function useLoadPublicWorkspace(workspaceId: string) {
const router = useRouter();
const [workspace, setWorkspace] = useState<WorkspaceUnit | null>();
const [status, setStatus] = useState<'loading' | 'error' | 'success'>(
'loading'
);
useEffect(() => {
setStatus('loading');
const init = async () => {
const dataCenter = await getDataCenter();
dataCenter
.loadPublicWorkspace(workspaceId)
.then(data => {
setWorkspace(data);
setStatus('success');
})
.catch(() => {
// if (!cancel) {
// router.push('/404');
// }
setStatus('error');
});
};
init();
}, [router, workspaceId]);
return { status, workspace };
}

View File

@@ -1,9 +1,9 @@
import { Member } from '@affine/datacenter';
import { useCallback, useEffect, useState } from 'react';
import { useDataCenter, useGlobalState } from '@/store/app';
import { useGlobalState } from '@/store/app';
export const useMembers = () => {
const dataCenter = useDataCenter();
const dataCenter = useGlobalState(store => store.dataCenter);
const currentWorkspace = useGlobalState(
useCallback(store => store.currentDataCenterWorkspace, [])
);

View File

@@ -1,13 +1,13 @@
import { WorkspaceUnit } from '@affine/datacenter';
import { PageMeta } from '@affine/store';
import { EditorContainer } from '@blocksuite/editor';
import { uuidv4, Workspace } from '@blocksuite/store';
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
import type { QueryContent } from '@blocksuite/store/dist/workspace/search';
import { useRouter } from 'next/router';
import { useCallback, useMemo } from 'react';
import { useCallback } from 'react';
import { useChangePageMeta } from '@/hooks/use-change-page-meta';
import { PageMeta } from '@/providers/app-state-provider';
import { useGlobalState } from '@/store/app';
export type EditorHandlers = {
@@ -48,107 +48,104 @@ export const usePageHelper = (): EditorHandlers => {
useCallback(store => store.currentDataCenterWorkspace, [])
);
return useMemo(
() => ({
createPage: ({
pageId = uuidv4().replaceAll('-', ''),
title = '',
} = {}) => {
return new Promise(resolve => {
if (!currentWorkspace) {
return resolve(null);
}
currentWorkspace.blocksuiteWorkspace?.createPage(pageId);
currentWorkspace.blocksuiteWorkspace?.signals.pageAdded.once(
addedPageId => {
currentWorkspace.blocksuiteWorkspace?.setPageMeta(addedPageId, {
title,
});
resolve(addedPageId);
}
);
});
},
toggleFavoritePage: async pageId => {
const pageMeta = getPageMeta(currentWorkspace, pageId);
if (!pageMeta) {
return Promise.reject('No page');
}
const favorite = !pageMeta.favorite;
changePageMeta(pageMeta.id, {
favorite,
});
return favorite;
},
toggleDeletePage: async pageId => {
const pageMeta = getPageMeta(currentWorkspace, pageId);
if (!pageMeta) {
return Promise.reject('No page');
}
const trash = !pageMeta.trash;
changePageMeta(pageMeta.id, {
trash,
trashDate: +new Date(),
});
return trash;
},
search: (query: QueryContent, workspace?: Workspace) => {
if (workspace) {
return workspace.search(query);
}
if (currentWorkspace) {
if (currentWorkspace.blocksuiteWorkspace) {
return currentWorkspace.blocksuiteWorkspace.search(query);
}
}
return new Map();
},
changePageMode: async (pageId, mode) => {
const pageMeta = getPageMeta(currentWorkspace, pageId);
if (!pageMeta) {
return Promise.reject('No page');
}
editor?.setAttribute('mode', mode as string);
changePageMeta(pageMeta.id, {
mode,
});
return mode;
},
permanentlyDeletePage: pageId => {
// TODO: workspace.meta.removePage or workspace.removePage?
currentWorkspace!.blocksuiteWorkspace?.meta.removePage(pageId);
},
openPage: (pageId, query = {}, newTab = false) => {
pageId = pageId.replace('space:', '');
if (newTab) {
window.open(`/workspace/${currentWorkspace?.id}/${pageId}`, '_blank');
return Promise.resolve(true);
}
return router.push({
pathname: `/workspace/${currentWorkspace?.id}/${pageId}`,
query,
});
},
getPageMeta: pageId => {
return {
createPage: ({
pageId = uuidv4().replaceAll('-', ''),
title = '',
} = {}) => {
return new Promise(resolve => {
if (!currentWorkspace) {
return null;
return resolve(null);
}
return (
(currentWorkspace.blocksuiteWorkspace?.meta.pageMetas.find(
page => page.id === pageId
) as PageMeta) || null
currentWorkspace.blocksuiteWorkspace?.createPage(pageId);
currentWorkspace.blocksuiteWorkspace?.signals.pageAdded.once(
addedPageId => {
currentWorkspace.blocksuiteWorkspace?.setPageMeta(addedPageId, {
title,
});
resolve(addedPageId);
}
);
},
}),
[changePageMeta, currentWorkspace, editor, router]
);
});
},
toggleFavoritePage: async pageId => {
const pageMeta = getPageMeta(currentWorkspace, pageId);
if (!pageMeta) {
return Promise.reject('No page');
}
const favorite = !pageMeta.favorite;
changePageMeta(pageMeta.id, {
favorite,
});
return favorite;
},
toggleDeletePage: async pageId => {
const pageMeta = getPageMeta(currentWorkspace, pageId);
if (!pageMeta) {
return Promise.reject('No page');
}
const trash = !pageMeta.trash;
changePageMeta(pageMeta.id, {
trash,
trashDate: +new Date(),
});
return trash;
},
search: (query: QueryContent, workspace?: Workspace) => {
if (workspace) {
return workspace.search(query);
}
if (currentWorkspace) {
if (currentWorkspace.blocksuiteWorkspace) {
return currentWorkspace.blocksuiteWorkspace.search(query);
}
}
return new Map();
},
changePageMode: async (pageId, mode) => {
const pageMeta = getPageMeta(currentWorkspace, pageId);
if (!pageMeta) {
return Promise.reject('No page');
}
editor?.setAttribute('mode', mode as string);
changePageMeta(pageMeta.id, {
mode,
});
return mode;
},
permanentlyDeletePage: pageId => {
// TODO: workspace.meta.removePage or workspace.removePage?
currentWorkspace!.blocksuiteWorkspace?.meta.removePage(pageId);
},
openPage: (pageId, query = {}, newTab = false) => {
pageId = pageId.replace('space:', '');
if (newTab) {
window.open(`/workspace/${currentWorkspace?.id}/${pageId}`, '_blank');
return Promise.resolve(true);
}
return router.push({
pathname: `/workspace/${currentWorkspace?.id}/${pageId}`,
query,
});
},
getPageMeta: pageId => {
if (!currentWorkspace) {
return null;
}
return (
(currentWorkspace.blocksuiteWorkspace?.meta.pageMetas.find(
page => page.id === pageId
) as PageMeta) || null
);
},
};
};
export default usePageHelper;

View File

@@ -1,26 +0,0 @@
import { useDataCenter, useDataCenterWorkspace } from '@affine/store';
import { useRouter } from 'next/router';
import { useMemo } from 'react';
export function useRouterTargetWorkspace() {
const router = useRouter();
const dataCenter = useDataCenter();
const workspaceId =
typeof router.query.workspaceId === 'string'
? router.query.workspaceId
: dataCenter.workspaces.at(0)?.id ?? null;
const targetWorkspace = useDataCenterWorkspace(workspaceId);
const notExist = useMemo(
() =>
workspaceId &&
dataCenter.workspaces.length &&
dataCenter.workspaces.findIndex(
meta => meta.id.toString() === workspaceId
) === -1,
[dataCenter.workspaces, workspaceId]
);
return {
targetWorkspace,
exist: !notExist,
};
}

View File

@@ -1,10 +1,10 @@
import { WorkspaceUnit } from '@affine/datacenter';
import { useCallback } from 'react';
import { useDataCenter, useGlobalState } from '@/store/app';
import { useGlobalState } from '@/store/app';
export const useWorkspaceHelper = () => {
const dataCenter = useDataCenter();
const dataCenter = useGlobalState(store => store.dataCenter);
const currentWorkspace = useGlobalState(
useCallback(store => store.currentDataCenterWorkspace, [])
);