fix: collections should be unique for workspaces (#3213)

This commit is contained in:
3720
2023-07-13 16:42:20 +08:00
committed by Alex Yang
parent 944f4ee895
commit 559d9bb9a8
11 changed files with 26 additions and 13 deletions

View File

@@ -187,7 +187,6 @@ export const BlockSuitePageList: React.FC<BlockSuitePageListProps> = ({
const pageList: ListData[] = list.map(pageMeta => {
const page = blockSuiteWorkspace.getPage(pageMeta.id);
const preview = page ? getPagePreviewText(page) : undefined;
return {
icon: isPreferredEdgeless(pageMeta.id) ? <EdgelessIcon /> : <PageIcon />,
pageId: pageMeta.id,
@@ -230,6 +229,7 @@ export const BlockSuitePageList: React.FC<BlockSuitePageListProps> = ({
});
return (
<PageList
workspaceId={blockSuiteWorkspace.id}
propertiesMeta={blockSuiteWorkspace.meta.properties}
getPageInfo={getPageInfo}
onCreateNewPage={createPage}

View File

@@ -130,7 +130,7 @@ const CollectionRenderer = ({
getPageInfo: GetPageInfoById;
}) => {
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 (
<div data-testid="collections" className={styles.wrapper}>

View File

@@ -23,7 +23,7 @@ export function WorkspaceHeader({
currentWorkspaceId,
currentEntry,
}: WorkspaceHeaderProps<WorkspaceFlavour>): 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}
></SaveCollectionButton>

View File

@@ -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 }) => {

View File

@@ -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) => {

View File

@@ -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;

View File

@@ -36,6 +36,7 @@ const AllPagesHead = ({
importFile,
getPageInfo,
propertiesMeta,
workspaceId,
}: {
isPublicWorkspace: boolean;
sorter: ReturnType<typeof useSorter<ListData>>;
@@ -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 = ({
<TableHead>
<TableHeadRow>{tableItem}</TableHeadRow>
<CollectionBar
workspaceId={workspaceId}
columnsCount={titleList.length}
getPageInfo={getPageInfo}
propertiesMeta={propertiesMeta}
@@ -153,6 +156,7 @@ const AllPagesHead = ({
export const PageList = ({
isPublicWorkspace = false,
workspaceId,
list,
onCreateNewPage,
onCreateNewEdgeless,
@@ -197,6 +201,7 @@ export const PageList = ({
<StyledTableContainer ref={ref}>
<Table showBorder={hasScrollTop} style={{ maxHeight: '100%' }}>
<AllPagesHead
workspaceId={workspaceId}
propertiesMeta={propertiesMeta}
isPublicWorkspace={isPublicWorkspace}
sorter={sorter}

View File

@@ -45,6 +45,7 @@ export type TrashListData = {
export type PageListProps = {
isPublicWorkspace?: boolean;
workspaceId: string;
list: ListData[];
fallback?: React.ReactNode;
onCreateNewPage: () => void;

View File

@@ -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<Collection[]>(
['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(

View File

@@ -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: {

View File

@@ -29,6 +29,7 @@ export type Filter = {
export type Collection = {
id: string;
workspaceId: string;
name: string;
pinned?: boolean;
filterList: Filter[];