From d57f995e8713bbba3ea13759b1678c7ed9694041 Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Tue, 5 Sep 2023 01:14:02 +0800 Subject: [PATCH] feat: add fav button (#4159) Co-authored-by: Alex Yang --- .../block-suite-page-list/utils.tsx | 7 +++-- .../favorite/add-favourite-button.tsx | 30 +++++++++++++++++++ .../src/components/root-app-sidebar/index.tsx | 5 +++- .../e2e/local-first-favorites-items.spec.ts | 15 ++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 apps/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx diff --git a/apps/core/src/components/blocksuite/block-suite-page-list/utils.tsx b/apps/core/src/components/blocksuite/block-suite-page-list/utils.tsx index 4ccec34e73..f3beaa4329 100644 --- a/apps/core/src/components/blocksuite/block-suite-page-list/utils.tsx +++ b/apps/core/src/components/blocksuite/block-suite-page-list/utils.tsx @@ -19,11 +19,14 @@ export const usePageHelper = (blockSuiteWorkspace: BlockSuiteWorkspace) => { ); const setPageMode = useSetAtom(setPageModeAtom); const createPageAndOpen = useCallback( - (id?: string, mode?: 'page' | 'edgeless') => { + (id?: string, mode?: 'page' | 'edgeless'): string => { const page = createPage(id); - initEmptyPage(page); // we don't need to wait it to be loaded right? + initEmptyPage(page).catch(error => { + toast(`Failed to initialize Page: ${error.message}`); + }); setPageMode(page.id, mode || 'page'); openPage(blockSuiteWorkspace.id, page.id); + return page.id; }, [blockSuiteWorkspace.id, createPage, openPage, setPageMode] ); diff --git a/apps/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx b/apps/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx new file mode 100644 index 0000000000..d585b80aec --- /dev/null +++ b/apps/core/src/components/pure/workspace-slider-bar/favorite/add-favourite-button.tsx @@ -0,0 +1,30 @@ +import { PlusIcon } from '@blocksuite/icons'; +import type { Workspace } from '@blocksuite/store'; +import { IconButton } from '@toeverything/components/button'; +import { usePageMetaHelper } from '@toeverything/hooks/use-block-suite-page-meta'; +import { useCallback } from 'react'; + +import { usePageHelper } from '../../../blocksuite/block-suite-page-list/utils'; + +type AddFavouriteButtonProps = { + workspace: Workspace; +}; + +export const AddFavouriteButton = ({ workspace }: AddFavouriteButtonProps) => { + const { createPage } = usePageHelper(workspace); + const { setPageMeta } = usePageMetaHelper(workspace); + const handleAddFavorite = useCallback(async () => { + const id = createPage(); + setPageMeta(id, { favorite: true }); + }, [createPage, setPageMeta]); + + return ( + + + + ); +}; diff --git a/apps/core/src/components/root-app-sidebar/index.tsx b/apps/core/src/components/root-app-sidebar/index.tsx index 40b8b08c0f..6f886951f3 100644 --- a/apps/core/src/components/root-app-sidebar/index.tsx +++ b/apps/core/src/components/root-app-sidebar/index.tsx @@ -30,6 +30,7 @@ import { useAppSetting } from '../../atoms/settings'; import type { AllWorkspace } from '../../shared'; import { CollectionsList } from '../pure/workspace-slider-bar/collections'; import { AddCollectionButton } from '../pure/workspace-slider-bar/collections/add-collection-button'; +import { AddFavouriteButton } from '../pure/workspace-slider-bar/favorite/add-favourite-button'; import FavoriteList from '../pure/workspace-slider-bar/favorite/favorite-list'; import { WorkspaceSelector } from '../pure/workspace-slider-bar/WorkspaceSelector'; import ImportPage from './import-page'; @@ -196,7 +197,9 @@ export const RootAppSidebar = ({ - + + + diff --git a/tests/affine-local/e2e/local-first-favorites-items.spec.ts b/tests/affine-local/e2e/local-first-favorites-items.spec.ts index e4e66fcce8..32a053ec69 100644 --- a/tests/affine-local/e2e/local-first-favorites-items.spec.ts +++ b/tests/affine-local/e2e/local-first-favorites-items.spec.ts @@ -127,3 +127,18 @@ test("Deleted page's reference will not be shown in sidebar", async ({ expect(currentWorkspace.flavour).toContain('local'); }); + +test('Add new favorite page via sidebar', async ({ page }) => { + await openHomePage(page); + await waitForEditorLoad(page); + await page.getByTestId('slider-bar-add-favorite-button').click(); + await waitForEditorLoad(page); + + // enter random page title + await getBlockSuiteEditorTitle(page).fill('this is a new fav page'); + // check if the page title is shown in the favorite list + const favItem = page.locator( + '[data-type=favorite-list-item] >> text=this is a new fav page' + ); + await expect(favItem).toBeVisible(); +});