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 4ccec34e7..f3beaa432 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 000000000..d585b80ae
--- /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 40b8b08c0..6f886951f 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 e4e66fcce..32a053ec6 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();
+});