diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts index 25ef393357..075bc15e5c 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts +++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.css.ts @@ -35,7 +35,7 @@ export const mainHeader = style([ export const sidebarHeader = style([ header, { - padding: '0 14px', + padding: '0 16px', gap: '12px', }, ]); diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx index 517ded84c8..e2e432e538 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page-header.tsx @@ -11,6 +11,7 @@ import { JournalTodayButton } from '@affine/core/components/blocksuite/block-sui import { PageHeaderMenuButton } from '@affine/core/components/blocksuite/block-suite-header/menu'; import { EditorModeSwitch } from '@affine/core/components/blocksuite/block-suite-mode-switch'; import { useJournalInfoHelper } from '@affine/core/hooks/use-journal'; +import type { BlockSuiteWorkspace } from '@affine/core/shared'; import type { Workspace } from '@affine/workspace'; import { RightSidebarIcon } from '@blocksuite/icons'; import type { Page } from '@blocksuite/store'; @@ -187,7 +188,11 @@ export function DetailPageHeader(props: PageHeaderProps) { ); } -function WindowsSidebarHeader() { +interface SidebarHeaderProps { + workspace: BlockSuiteWorkspace; + page: Page; +} +function WindowsSidebarHeader(props: SidebarHeaderProps) { return ( <>
@@ -196,26 +201,22 @@ function WindowsSidebarHeader() {
- +
); } -function NonWindowsSidebarHeader() { +function NonWindowsSidebarHeader(props: SidebarHeaderProps) { return (
- +
); } -export function RightSidebarHeader() { - return isWindowsDesktop ? ( - - ) : ( - - ); -} +export const RightSidebarHeader = isWindowsDesktop + ? WindowsSidebarHeader + : NonWindowsSidebarHeader; diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx index cf305f9d76..1c49ef9df6 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx @@ -193,7 +193,7 @@ const DetailPageImpl = memo(function DetailPageImpl({ page }: { page: Page }) { sidebar={ !isInTrash ? (
- +
) : null diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts index fb179f6e4a..56c0031dc9 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts +++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/atoms.ts @@ -1,16 +1,18 @@ // main editor sidebar states -import { assertExists } from '@blocksuite/global/utils'; +import { assertExists, isEqual } from '@blocksuite/global/utils'; import { atom } from 'jotai'; import { selectAtom } from 'jotai/utils'; import { copilotExtension } from './extensions/copilot'; import { framePanelExtension } from './extensions/frame'; +import { journalExtension } from './extensions/journal'; import { outlineExtension } from './extensions/outline'; import type { EditorExtension, EditorExtensionName } from './types'; // the list of all possible extensions in affine. // order matters (determines the order of the tabs) export const extensions: EditorExtension[] = [ + journalExtension, outlineExtension, framePanelExtension, copilotExtension, @@ -42,7 +44,8 @@ const widthAtom = selectAtom(baseStateAtom, state => state.width); export const editorExtensionsAtom = selectAtom( baseStateAtom, - state => state.extensions + state => state.extensions, + isEqual ); // get/set sidebar open state diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx index 1c6ec27857..4803c34ddb 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/extensions.tsx @@ -1,6 +1,9 @@ import { IconButton } from '@affine/component'; +import { useJournalInfoHelper } from '@affine/core/hooks/use-journal'; import { useWorkspaceEnabledFeatures } from '@affine/core/hooks/use-workspace-features'; +import type { BlockSuiteWorkspace } from '@affine/core/shared'; import { FeatureType } from '@affine/graphql'; +import type { Page } from '@blocksuite/store'; import { assignInlineVars } from '@vanilla-extract/dynamic'; import { useAtom, useAtomValue } from 'jotai'; import { useEffect } from 'react'; @@ -11,18 +14,32 @@ import { } from '../atoms'; import * as styles from './extensions.css'; +export interface ExtensionTabsProps { + workspace: BlockSuiteWorkspace; + page: Page; +} + // provide a switcher for active extensions // will be used in global top header (MacOS) or sidebar (Windows) -export const ExtensionTabs = () => { +export const ExtensionTabs = ({ page }: ExtensionTabsProps) => { // todo: filter in editorExtensionsAtom instead? const copilotEnabled = useWorkspaceEnabledFeatures().includes( FeatureType.Copilot ); + + const { isJournal } = useJournalInfoHelper(page.meta); + const exts = useAtomValue(editorExtensionsAtom).filter(ext => { if (ext.name === 'copilot' && !copilotEnabled) return false; return true; }); const [selected, setSelected] = useAtom(editorSidebarActiveExtensionAtom); + + // if journal is active, set selected to journal + useEffect(() => { + isJournal && setSelected('journal'); + }, [isJournal, setSelected]); + const vars = assignInlineVars({ [styles.activeIdx]: String( exts.findIndex(ext => ext.name === selected?.name) ?? 0 diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/journal.tsx b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/journal.tsx new file mode 100644 index 0000000000..97741ca0d7 --- /dev/null +++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/extensions/journal.tsx @@ -0,0 +1,13 @@ +import { TodayIcon } from '@blocksuite/icons'; + +import type { EditorExtension } from '..'; + +const EditorJournalPanel = () => { + return
journal extension
; +}; + +export const journalExtension: EditorExtension = { + name: 'journal', + icon: , + Component: EditorJournalPanel, +}; diff --git a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts index b992ec9f9f..d153ca834e 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts +++ b/packages/frontend/core/src/pages/workspace/detail-page/editor-sidebar/types.ts @@ -1,4 +1,4 @@ -export type EditorExtensionName = 'outline' | 'frame' | 'copilot'; +export type EditorExtensionName = 'outline' | 'frame' | 'copilot' | 'journal'; export interface EditorExtension { name: EditorExtensionName;