From 9c5d91a1d9434137a4fbff5fc2acbd2f3ea015e6 Mon Sep 17 00:00:00 2001 From: 3720 Date: Thu, 13 Jul 2023 16:42:20 +0800 Subject: [PATCH] fix: collections should be unique for workspaces (#3213) --- .../blocksuite/block-suite-page-list/index.tsx | 2 +- .../collections/collections-list.tsx | 4 ++-- apps/web/src/components/workspace-header.tsx | 3 ++- .../src/pages/workspace/[workspaceId]/[pageId].tsx | 2 +- apps/web/src/pages/workspace/[workspaceId]/all.tsx | 2 +- .../page-list/__tests__/use-all-page-setting.spec.ts | 3 ++- .../component/src/components/page-list/all-page.tsx | 5 +++++ packages/component/src/components/page-list/type.ts | 1 + .../components/page-list/use-collection-manager.ts | 12 +++++++----- .../src/components/page-list/view/collection-bar.tsx | 4 +++- packages/env/src/filter.ts | 1 + 11 files changed, 26 insertions(+), 13 deletions(-) diff --git a/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx b/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx index 8ac34fdd45..ad9a8060a5 100644 --- a/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx +++ b/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx @@ -187,7 +187,6 @@ export const BlockSuitePageList: React.FC = ({ const pageList: ListData[] = list.map(pageMeta => { const page = blockSuiteWorkspace.getPage(pageMeta.id); const preview = page ? getPagePreviewText(page) : undefined; - return { icon: isPreferredEdgeless(pageMeta.id) ? : , pageId: pageMeta.id, @@ -230,6 +229,7 @@ export const BlockSuitePageList: React.FC = ({ }); return ( { const [collapsed, setCollapsed] = React.useState(true); - const setting = useCollectionManager(); + const setting = useCollectionManager(workspace.id); const router = useRouter(); const clickCollection = useCallback(() => { router @@ -255,7 +255,7 @@ const CollectionRenderer = ({ }; export const CollectionsList = ({ currentWorkspace }: CollectionsListProps) => { const metas = useBlockSuitePageMeta(currentWorkspace.blockSuiteWorkspace); - const { savedCollections } = useSavedCollections(); + const { savedCollections } = useSavedCollections(currentWorkspace.id); const getPageInfo = useGetPageInfoById(); return (
diff --git a/apps/web/src/components/workspace-header.tsx b/apps/web/src/components/workspace-header.tsx index cc87d68324..d45fc43389 100644 --- a/apps/web/src/components/workspace-header.tsx +++ b/apps/web/src/components/workspace-header.tsx @@ -23,7 +23,7 @@ export function WorkspaceHeader({ currentWorkspaceId, currentEntry, }: WorkspaceHeaderProps): ReactElement { - const setting = useCollectionManager(); + const setting = useCollectionManager(currentWorkspaceId); const t = useAFFiNEI18N(); const saveToCollection = useCallback( async (collection: Collection) => { @@ -73,6 +73,7 @@ export function WorkspaceHeader({ id: uuidv4(), name: '', filterList: setting.currentCollection.filterList, + workspaceId: currentWorkspaceId, }} onConfirm={saveToCollection} > diff --git a/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx b/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx index 7707a7d716..369e69b91d 100644 --- a/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx +++ b/apps/web/src/pages/workspace/[workspaceId]/[pageId].tsx @@ -27,7 +27,7 @@ const WorkspaceDetail: React.FC = () => { assertExists(currentWorkspace); assertExists(currentPageId); const blockSuiteWorkspace = currentWorkspace.blockSuiteWorkspace; - const collectionManager = useCollectionManager(); + const collectionManager = useCollectionManager(currentWorkspace.id); const onLoad = useCallback( (page: Page, editor: EditorContainer) => { const dispose = editor.slots.pageLinkClicked.on(({ pageId }) => { diff --git a/apps/web/src/pages/workspace/[workspaceId]/all.tsx b/apps/web/src/pages/workspace/[workspaceId]/all.tsx index 47272918d7..a714b50de1 100644 --- a/apps/web/src/pages/workspace/[workspaceId]/all.tsx +++ b/apps/web/src/pages/workspace/[workspaceId]/all.tsx @@ -15,9 +15,9 @@ import type { NextPageWithLayout } from '../../../shared'; const AllPage: NextPageWithLayout = () => { const router = useRouter(); - const setting = useCollectionManager(); const { jumpToPage } = useRouterHelper(router); const [currentWorkspace] = useCurrentWorkspace(); + const setting = useCollectionManager(currentWorkspace.id); const t = useAFFiNEI18N(); const onClickPage = useCallback( (pageId: string, newTab?: boolean) => { diff --git a/packages/component/src/components/page-list/__tests__/use-all-page-setting.spec.ts b/packages/component/src/components/page-list/__tests__/use-all-page-setting.spec.ts index b9ccc2154f..ec9c288883 100644 --- a/packages/component/src/components/page-list/__tests__/use-all-page-setting.spec.ts +++ b/packages/component/src/components/page-list/__tests__/use-all-page-setting.spec.ts @@ -12,12 +12,13 @@ import { useCollectionManager } from '../use-collection-manager'; const defaultMeta = { tags: { options: [] } }; test('useAllPageSetting', async () => { - const settingHook = renderHook(() => useCollectionManager()); + const settingHook = renderHook(() => useCollectionManager('test')); const prevCollection = settingHook.result.current.currentCollection; expect(settingHook.result.current.savedCollections).toEqual([]); await settingHook.result.current.updateCollection({ ...settingHook.result.current.currentCollection, filterList: [createDefaultFilter(vars[0], defaultMeta)], + workspaceId: 'test', }); settingHook.rerender(); const nextCollection = settingHook.result.current.currentCollection; diff --git a/packages/component/src/components/page-list/all-page.tsx b/packages/component/src/components/page-list/all-page.tsx index 45edeff6a1..8a12ef8d5e 100644 --- a/packages/component/src/components/page-list/all-page.tsx +++ b/packages/component/src/components/page-list/all-page.tsx @@ -36,6 +36,7 @@ const AllPagesHead = ({ importFile, getPageInfo, propertiesMeta, + workspaceId, }: { isPublicWorkspace: boolean; sorter: ReturnType>; @@ -44,6 +45,7 @@ const AllPagesHead = ({ importFile: () => void; getPageInfo: GetPageInfoById; propertiesMeta: PropertiesMeta; + workspaceId: string; }) => { const t = useAFFiNEI18N(); const titleList = useMemo( @@ -143,6 +145,7 @@ const AllPagesHead = ({ {tableItem} void; diff --git a/packages/component/src/components/page-list/use-collection-manager.ts b/packages/component/src/components/page-list/use-collection-manager.ts index 79480ce3d6..d1c8385712 100644 --- a/packages/component/src/components/page-list/use-collection-manager.ts +++ b/packages/component/src/components/page-list/use-collection-manager.ts @@ -35,6 +35,7 @@ const defaultCollection = { id: NIL, name: 'All', filterList: [], + workspaceId: 'temporary', }; const collectionAtom = atomWithReset<{ currentId: string; @@ -44,14 +45,15 @@ const collectionAtom = atomWithReset<{ defaultCollection: defaultCollection, }); -export const useSavedCollections = () => { +export const useSavedCollections = (workspaceId: string) => { const { data: savedCollections, mutate } = useSWRImmutable( - ['affine', 'page-collection'], + ['affine', 'page-collection', workspaceId], { fetcher: async () => { const db = await pageCollectionDBPromise; const t = db.transaction('view').objectStore('view'); - return await t.getAll(); + const all = await t.getAll(); + return all.filter(v => v.workspaceId === workspaceId); }, suspense: true, fallbackData: [], @@ -103,9 +105,9 @@ export const useSavedCollections = () => { }; }; -export const useCollectionManager = () => { +export const useCollectionManager = (workspaceId: string) => { const { savedCollections, saveCollection, deleteCollection, addPage } = - useSavedCollections(); + useSavedCollections(workspaceId); const [collectionData, setCollectionData] = useAtom(collectionAtom); const updateCollection = useCallback( diff --git a/packages/component/src/components/page-list/view/collection-bar.tsx b/packages/component/src/components/page-list/view/collection-bar.tsx index e3a4457948..8e9a1e0d3b 100644 --- a/packages/component/src/components/page-list/view/collection-bar.tsx +++ b/packages/component/src/components/page-list/view/collection-bar.tsx @@ -22,12 +22,14 @@ export const CollectionBar = ({ getPageInfo, propertiesMeta, columnsCount, + workspaceId, }: { getPageInfo: GetPageInfoById; propertiesMeta: PropertiesMeta; columnsCount: number; + workspaceId: string; }) => { - const setting = useCollectionManager(); + const setting = useCollectionManager(workspaceId); const collection = setting.currentCollection; const [open, setOpen] = useState(false); const actions: { diff --git a/packages/env/src/filter.ts b/packages/env/src/filter.ts index 72721c77dc..0f45e6c1c6 100644 --- a/packages/env/src/filter.ts +++ b/packages/env/src/filter.ts @@ -29,6 +29,7 @@ export type Filter = { export type Collection = { id: string; + workspaceId: string; name: string; pinned?: boolean; filterList: Filter[];