mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-23 21:06:22 +08:00
Merge branch 'feat/filesystem_and_search' of github.com:toeverything/AFFiNE into feat/filesystem_and_search
This commit is contained in:
@@ -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>();
|
||||||
|
|||||||
Generated
+2
-2
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user