diff --git a/packages/common/infra/src/framework/react/index.tsx b/packages/common/infra/src/framework/react/index.tsx index 4805e37ac..296510d91 100644 --- a/packages/common/infra/src/framework/react/index.tsx +++ b/packages/common/infra/src/framework/react/index.tsx @@ -12,9 +12,7 @@ export function useFramework(): FrameworkProvider { return useContext(FrameworkProviderContext); // never null, because the default value } -export function useService( - identifier: GeneralIdentifier -): T { +export function useService(identifier: GeneralIdentifier): T { return useContext(FrameworkProviderContext).get(identifier); } diff --git a/packages/frontend/core/src/components/explorer/context.ts b/packages/frontend/core/src/components/explorer/context.ts index 8ab7a2a05..8d58e8ba2 100644 --- a/packages/frontend/core/src/components/explorer/context.ts +++ b/packages/frontend/core/src/components/explorer/context.ts @@ -1,19 +1,18 @@ import { LiveData } from '@toeverything/infra'; import { createContext } from 'react'; -import type { DocListItemView } from './docs-view/doc-list-item'; -import type { ExplorerPreference } from './types'; +import type { ExplorerDisplayPreference } from './types'; export type DocExplorerContextType = { - view$: LiveData; groups$: LiveData>; collapsedGroups$: LiveData; selectMode$?: LiveData; selectedDocIds$: LiveData; prevCheckAnchorId$?: LiveData; + displayPreference$: LiveData; } & { - [K in keyof Omit as `${K}$`]: LiveData< - ExplorerPreference[K] + [K in keyof ExplorerDisplayPreference as `${K}$`]: LiveData< + ExplorerDisplayPreference[K] >; }; @@ -21,24 +20,51 @@ export const DocExplorerContext = createContext( {} as any ); -export const createDocExplorerContext = () => - ({ - view$: new LiveData('list'), +export const createDocExplorerContext = ( + initialState?: ExplorerDisplayPreference +) => { + const displayPreference$ = new LiveData( + initialState ?? {} + ); + return { groups$: new LiveData>([]), collapsedGroups$: new LiveData([]), selectMode$: new LiveData(false), selectedDocIds$: new LiveData([]), prevCheckAnchorId$: new LiveData(null), - groupBy$: new LiveData(undefined), - orderBy$: new LiveData(undefined), - displayProperties$: new LiveData( - [] + displayPreference$: displayPreference$, + view$: displayPreference$.selector( + displayPreference => displayPreference.view ), - showDocIcon$: new LiveData(true), - showDocPreview$: new LiveData(true), - quickFavorite$: new LiveData(false), - quickSelect$: new LiveData(false), - quickSplit$: new LiveData(false), - quickTrash$: new LiveData(false), - quickTab$: new LiveData(false), - }) satisfies DocExplorerContextType; + groupBy$: displayPreference$.selector( + displayPreference => displayPreference.groupBy + ), + orderBy$: displayPreference$.selector( + displayPreference => displayPreference.orderBy + ), + displayProperties$: displayPreference$.selector( + displayPreference => displayPreference.displayProperties + ), + showDocIcon$: displayPreference$.selector( + displayPreference => displayPreference.showDocIcon + ), + showDocPreview$: displayPreference$.selector( + displayPreference => displayPreference.showDocPreview + ), + quickFavorite$: displayPreference$.selector( + displayPreference => displayPreference.quickFavorite + ), + quickSelect$: displayPreference$.selector( + displayPreference => displayPreference.quickSelect + ), + quickSplit$: displayPreference$.selector( + displayPreference => displayPreference.quickSplit + ), + quickTrash$: displayPreference$.selector( + displayPreference => displayPreference.quickTrash + ), + quickTab$: displayPreference$.selector( + displayPreference => displayPreference.quickTab + ), + } satisfies DocExplorerContextType; +}; diff --git a/packages/frontend/core/src/components/explorer/display-menu/index.tsx b/packages/frontend/core/src/components/explorer/display-menu/index.tsx index fc2b0f1d4..86df96800 100644 --- a/packages/frontend/core/src/components/explorer/display-menu/index.tsx +++ b/packages/frontend/core/src/components/explorer/display-menu/index.tsx @@ -11,63 +11,87 @@ import type { } from '@affine/core/modules/collection-rules/types'; import { useI18n } from '@affine/i18n'; import { ArrowDownSmallIcon } from '@blocksuite/icons/rc'; -import { useLiveData } from '@toeverything/infra'; import type React from 'react'; -import { useCallback, useContext } from 'react'; +import { useCallback } from 'react'; -import { DocExplorerContext } from '../context'; +import type { ExplorerDisplayPreference } from '../types'; import { GroupByList, GroupByName } from './group'; import { OrderByList, OrderByName } from './order'; import { DisplayProperties } from './properties'; import { QuickActionsConfig } from './quick-actions'; import * as styles from './styles.css'; -const ExplorerDisplayMenu = () => { +const ExplorerDisplayMenu = ({ + displayPreference, + onDisplayPreferenceChange, +}: { + displayPreference: ExplorerDisplayPreference; + onDisplayPreferenceChange: ( + displayPreference: ExplorerDisplayPreference + ) => void; +}) => { const t = useI18n(); - const explorerContextValue = useContext(DocExplorerContext); - const groupBy = useLiveData(explorerContextValue.groupBy$); - const orderBy = useLiveData(explorerContextValue.orderBy$); const handleGroupByChange = useCallback( (groupBy: GroupByParams) => { - explorerContextValue.groupBy$?.next(groupBy); + onDisplayPreferenceChange({ ...displayPreference, groupBy }); }, - [explorerContextValue.groupBy$] + [displayPreference, onDisplayPreferenceChange] ); const handleOrderByChange = useCallback( (orderBy: OrderByParams) => { - explorerContextValue.orderBy$?.next(orderBy); + onDisplayPreferenceChange({ ...displayPreference, orderBy }); }, - [explorerContextValue.orderBy$] + [displayPreference, onDisplayPreferenceChange] ); return (
} + items={ + + } >
{t['com.affine.explorer.display-menu.grouping']()} - {groupBy ? : null} + {displayPreference.groupBy ? ( + + ) : null}
} + items={ + + } >
{t['com.affine.explorer.display-menu.ordering']()} - {orderBy ? : null} + {displayPreference.orderBy ? ( + + ) : null}
- + - +
); }; @@ -76,14 +100,28 @@ export const ExplorerDisplayMenuButton = ({ style, className, menuProps, + displayPreference, + onDisplayPreferenceChange, }: { style?: React.CSSProperties; className?: string; menuProps?: Omit; + displayPreference: ExplorerDisplayPreference; + onDisplayPreferenceChange: ( + displayPreference: ExplorerDisplayPreference + ) => void; }) => { const t = useI18n(); return ( - } {...menuProps}> + + } + {...menuProps} + >