Merge branch 'feat/filesystem_and_search' of github.com:toeverything/AFFiNE into feat/filesystem_and_search

This commit is contained in:
alt0
2022-12-20 15:31:19 +08:00
9 changed files with 91 additions and 72 deletions
@@ -16,7 +16,7 @@ export const Footer = (props: { query: string }) => {
<Command.Item <Command.Item
data-testid="quickSearch-addNewPage" data-testid="quickSearch-addNewPage"
onSelect={async () => { onSelect={async () => {
const pageId = await createPage(); const pageId = await createPage?.current?.();
if (pageId) { if (pageId) {
goToPage(pageId); goToPage(pageId);
} }
@@ -141,7 +141,7 @@ export const WorkSpaceSliderBar = () => {
</Link> </Link>
<StyledNewPageButton <StyledNewPageButton
onClick={async () => { onClick={async () => {
const pageId = await createPage(); const pageId = await createPage?.current?.();
console.log('pageID', pageId); console.log('pageID', pageId);
if (pageId) { if (pageId) {
goToPage(pageId); goToPage(pageId);
@@ -35,10 +35,10 @@ const Home: NextPage = () => {
return ret; return ret;
} }
const editor = createEditor(page); const editor = createEditor?.current?.(page);
if (editor) { if (editor) {
editorContainer.current?.appendChild(editor); editorContainer.current?.appendChild(editor);
setEditor(editor); setEditor?.current?.(editor);
if (page.isEmpty) { if (page.isEmpty) {
const title = 'Welcome to the AFFiNE Alpha'; const title = 'Welcome to the AFFiNE Alpha';
const pageId = page.addBlock({ const pageId = page.addBlock({
@@ -53,7 +53,7 @@ const Home: NextPage = () => {
} }
return ret; return ret;
}, [workspace, page]); }, [workspace, page, createEditor, setEditor]);
return ( return (
<> <>
@@ -19,13 +19,13 @@ const Page = () => {
return; return;
} }
createPage()?.then(async pageId => { createPage?.current?.()?.then(async pageId => {
if (!pageId) { if (!pageId) {
return; return;
} }
router.push(`/workspace/${currentWorkspaceId}/${pageId}`); router.push(`/workspace/${currentWorkspaceId}/${pageId}`);
}); });
}, [workspace, currentWorkspaceId]); }, [workspace, currentWorkspaceId, createPage, router]);
return <div>Hello, there is [pageId]/index</div>; return <div>Hello, there is [pageId]/index</div>;
}; };
@@ -9,6 +9,12 @@ import type {
import type { EditorContainer } from '@blocksuite/editor'; import type { EditorContainer } from '@blocksuite/editor';
import { QueryContent } from '@blocksuite/store/dist/workspace/search'; import { QueryContent } from '@blocksuite/store/dist/workspace/search';
export type LoadWorkspaceHandler = (
workspaceId: string
) => Promise<StoreWorkspace | null> | null;
export type CreateEditorHandler = (page: StorePage) => EditorContainer | null;
export interface AppStateValue { export interface AppStateValue {
user: AccessTokenMessage | null; user: AccessTokenMessage | null;
workspacesMeta: Workspace[]; workspacesMeta: Workspace[];
@@ -23,15 +29,19 @@ export interface AppStateValue {
export interface AppStateContext extends AppStateValue { export interface AppStateContext extends AppStateValue {
setState: (state: AppStateValue) => void; setState: (state: AppStateValue) => void;
createEditor: (page: StorePage) => EditorContainer | null; createEditor?: MutableRefObject<
setEditor: (editor: EditorContainer) => void; ((page: StorePage) => EditorContainer | null) | undefined
>;
setEditor?: MutableRefObject<((page: EditorContainer) => void) | undefined>;
loadWorkspace?: MutableRefObject< loadWorkspace?: MutableRefObject<
((workspaceId: string) => Promise<StoreWorkspace | null> | null) | undefined ((workspaceId: string) => Promise<StoreWorkspace | null> | null) | undefined
>; >;
loadPage?: MutableRefObject< loadPage?: MutableRefObject<
((pageId: string) => Promise<StorePage | null> | null) | undefined ((pageId: string) => Promise<StorePage | null> | null) | undefined
>; >;
createPage: (pageId?: string) => Promise<string | null> | null; createPage?: MutableRefObject<
((pageId?: string) => Promise<string | null>) | undefined
>;
getPageMeta: (pageId: string) => PageMeta | null; getPageMeta: (pageId: string) => PageMeta | null;
toggleFavoritePage: (pageId: string) => void; toggleFavoritePage: (pageId: string) => void;
toggleDeletePage: (pageId: string) => void; toggleDeletePage: (pageId: string) => void;
@@ -50,11 +60,11 @@ export const AppState = createContext<AppStateContext>({
editor: null, editor: null,
setState: () => {}, setState: () => {},
createEditor: () => null, createEditor: undefined,
setEditor: () => {}, setEditor: undefined,
loadWorkspace: undefined, loadWorkspace: undefined,
loadPage: undefined, loadPage: undefined,
createPage: () => null, createPage: undefined,
getPageMeta: () => null, getPageMeta: () => null,
toggleFavoritePage: () => {}, toggleFavoritePage: () => {},
toggleDeletePage: () => {}, toggleDeletePage: () => {},
@@ -8,7 +8,11 @@ import {
import '@blocksuite/blocks'; import '@blocksuite/blocks';
import '@blocksuite/blocks/style'; import '@blocksuite/blocks/style';
import { BlockSchema, createEditor } from '@blocksuite/editor'; import { BlockSchema, createEditor } from '@blocksuite/editor';
import type { AppStateContext } from './context'; import type {
AppStateContext,
LoadWorkspaceHandler,
CreateEditorHandler,
} from './context';
const getEditorParams = (workspaceId: string) => { const getEditorParams = (workspaceId: string) => {
const providers = []; const providers = [];
@@ -29,9 +33,6 @@ const getEditorParams = (workspaceId: string) => {
}; };
}; };
type LoadWorkspaceHandler = AppStateContext['loadWorkspace'];
type CreateEditorHandler = AppStateContext['createEditor'];
interface Props { interface Props {
setLoadWorkspaceHandler: (handler: LoadWorkspaceHandler) => void; setLoadWorkspaceHandler: (handler: LoadWorkspaceHandler) => void;
setCreateEditorHandler: (handler: CreateEditorHandler) => void; setCreateEditorHandler: (handler: CreateEditorHandler) => void;
@@ -7,13 +7,15 @@ import {
getWorkspaces, getWorkspaces,
} from '@pathfinder/data-services'; } from '@pathfinder/data-services';
import { AppState } from './context'; import { AppState } from './context';
import type { AppStateValue, AppStateContext } from './context'; import type {
AppStateValue,
AppStateContext,
CreateEditorHandler,
LoadWorkspaceHandler,
} from './context';
import { QueryContent } from '@blocksuite/store/dist/workspace/search'; import { QueryContent } from '@blocksuite/store/dist/workspace/search';
import type { Page, Workspace } from '@blocksuite/store'; import type { Page, Workspace } from '@blocksuite/store';
import { EditorContainer } from '@blocksuite/editor';
type LoadWorkspaceHandler = (
workspaceId: string
) => Promise<Workspace | null> | null;
const DynamicBlocksuite = dynamic(() => import('./dynamic-blocksuite'), { const DynamicBlocksuite = dynamic(() => import('./dynamic-blocksuite'), {
ssr: false, ssr: false,
@@ -42,9 +44,9 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
); );
const [createEditorHandler, _setCreateEditorHandler] = const [createEditorHandler, _setCreateEditorHandler] =
useState<AppStateContext['createEditor']>(); useState<CreateEditorHandler>();
const setCreateEditorHandler = useCallback( const setCreateEditorHandler = useCallback(
(handler: AppStateContext['createEditor']) => { (handler: CreateEditorHandler) => {
_setCreateEditorHandler(() => handler); _setCreateEditorHandler(() => handler);
}, },
[_setCreateEditorHandler] [_setCreateEditorHandler]
@@ -71,6 +73,53 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
setState(state => ({ ...state, currentPage: page })); setState(state => ({ ...state, currentPage: page }));
return page; return page;
}; };
const createEditor = useRef<
((page: Page) => EditorContainer | null) | undefined
>();
createEditor.current = () => {
const { currentPage, currentWorkspace } = state;
if (!currentPage || !currentWorkspace) {
return null;
}
const editor = createEditorHandler?.(currentPage) || null;
if (editor) {
const pageMeta = currentWorkspace?.meta.pageMetas.find(
p => p.id === currentPage.pageId
);
if (pageMeta?.mode) {
editor.mode = pageMeta.mode as 'page' | 'edgeless' | undefined;
}
if (pageMeta?.trash) {
editor.readonly = true;
}
}
return editor;
};
const setEditor = useRef<(editor: AppStateValue['editor']) => void>();
setEditor.current = (editor: AppStateValue['editor']) => {
setState(state => ({ ...state, editor }));
};
const createPage = useRef<(pageId?: string) => Promise<string | null>>();
createPage.current = (pageId: string = Date.now().toString()) =>
new Promise<string | null>(resolve => {
const { currentWorkspace } = state;
if (!currentWorkspace) {
resolve(null);
return;
}
currentWorkspace.createPage(pageId);
currentWorkspace.signals.pageAdded.once(addedPageId => {
resolve(addedPageId);
});
});
useEffect(() => { useEffect(() => {
const callback = async (user: AccessTokenMessage | null) => { const callback = async (user: AccessTokenMessage | null) => {
const workspacesMeta = user ? await getWorkspaces() : []; const workspacesMeta = user ? await getWorkspaces() : [];
@@ -87,44 +136,11 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
() => ({ () => ({
...state, ...state,
setState, setState,
createEditor: () => { createEditor,
const { currentPage, currentWorkspace } = state; setEditor,
if (!currentPage || !currentWorkspace) {
return null;
}
const editor = createEditorHandler?.(currentPage) || null;
if (editor) {
const pageMeta = currentWorkspace?.meta.pageMetas.find(
p => p.id === currentPage.pageId
);
if (pageMeta?.mode) {
editor.mode = pageMeta.mode as 'page' | 'edgeless' | undefined;
}
if (pageMeta?.trash) {
editor.readonly = true;
}
}
return editor;
},
setEditor: (editor: AppStateValue['editor']) => {
setState(state => ({ ...state, editor }));
},
loadWorkspace, loadWorkspace,
loadPage, loadPage,
createPage: (pageId: string = Date.now().toString()) => createPage,
new Promise<string | null>(resolve => {
const { currentWorkspace } = state;
if (!currentWorkspace) {
resolve(null);
return;
}
currentWorkspace.createPage(pageId);
currentWorkspace.signals.pageAdded.once(addedPageId => {
resolve(addedPageId);
});
}),
getPageMeta: (pageId: string) => { getPageMeta: (pageId: string) => {
const { currentWorkspace } = state; const { currentWorkspace } = state;
if (!currentWorkspace) { if (!currentWorkspace) {
@@ -166,14 +182,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
return currentWorkspace!.search(query); return currentWorkspace!.search(query);
}, },
}), }),
[ [state, setState, loadPage, loadWorkspace]
state,
setState,
loadWorkspaceHandler,
createEditorHandler,
loadPage,
loadWorkspace,
]
); );
return ( return (
@@ -45,13 +45,12 @@ export const EditorProvider = ({
const router = useRouter(); const router = useRouter();
const [workspace, setWorkspace] = useState<Workspace>(); const [workspace, setWorkspace] = useState<Workspace>();
const [page, _setPage] = useState<Page>(); const [page, _setPage] = useState<Page>();
const workspaceId = router.query.workspaceId as string;
const setPage = useCallback( const setPage = useCallback(
(page: Page) => { (page: Page) => {
_setPage(page); _setPage(page);
// router.push(`/workspace/${workspaceId}/${page.id.replace('space:', '')}`); // router.push(`/workspace/${workspaceId}/${page.id.replace('space:', '')}`);
}, },
[_setPage, workspaceId] [_setPage]
); );
const [pageList, setPageList] = useState<PageMeta[]>([]); const [pageList, setPageList] = useState<PageMeta[]>([]);
const [editor, setEditor] = useState<EditorContainer>(); const [editor, setEditor] = useState<EditorContainer>();
+2 -2
View File
@@ -3350,7 +3350,7 @@ packages:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.38.0_76twfck5d7crjqrmw4yltga7zm '@typescript-eslint/parser': 5.38.0_tg6quxtr5dyl3tikvj7rwonxxi
debug: 3.2.7 debug: 3.2.7
eslint: 8.22.0 eslint: 8.22.0
eslint-import-resolver-node: 0.3.6 eslint-import-resolver-node: 0.3.6
@@ -3369,7 +3369,7 @@ packages:
'@typescript-eslint/parser': '@typescript-eslint/parser':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.38.0_76twfck5d7crjqrmw4yltga7zm '@typescript-eslint/parser': 5.38.0_tg6quxtr5dyl3tikvj7rwonxxi
array-includes: 3.1.5 array-includes: 3.1.5
array.prototype.flat: 1.3.0 array.prototype.flat: 1.3.0
debug: 2.6.9 debug: 2.6.9