fix(core): selectAtom crash on isEqual (#4780)

This commit is contained in:
Peng Xiao
2023-10-31 11:29:18 +08:00
committed by GitHub
parent a015dc42bb
commit 9e3c79526c
2 changed files with 21 additions and 35 deletions

View File

@@ -8,7 +8,6 @@ import * as Collapsible from '@radix-ui/react-collapsible';
import clsx from 'clsx'; import clsx from 'clsx';
import { useAtomValue } from 'jotai'; import { useAtomValue } from 'jotai';
import { selectAtom } from 'jotai/utils'; import { selectAtom } from 'jotai/utils';
import { isEqual } from 'lodash-es';
import { type MouseEventHandler, useCallback, useMemo, useState } from 'react'; import { type MouseEventHandler, useCallback, useMemo, useState } from 'react';
import { PagePreview } from './page-content-preview'; import { PagePreview } from './page-content-preview';
@@ -186,15 +185,11 @@ type RequiredProps = Pick<PageListProps, (typeof requiredPropNames)[number]> & {
selectable: boolean; selectable: boolean;
}; };
const listPropsAtom = selectAtom( const listPropsAtom = selectAtom(pageListPropsAtom, props => {
pageListPropsAtom, return Object.fromEntries(
props => { requiredPropNames.map(name => [name, props[name]])
return Object.fromEntries( ) as RequiredProps;
requiredPropNames.map(name => [name, props[name]]) });
) as RequiredProps;
},
isEqual
);
const PageMetaListItemRenderer = (pageMeta: PageMeta) => { const PageMetaListItemRenderer = (pageMeta: PageMeta) => {
const props = useAtomValue(listPropsAtom); const props = useAtomValue(listPropsAtom);

View File

@@ -2,7 +2,6 @@ import { DEFAULT_SORT_KEY } from '@affine/env/constant';
import type { PageMeta } from '@blocksuite/store'; import type { PageMeta } from '@blocksuite/store';
import { atom } from 'jotai'; import { atom } from 'jotai';
import { selectAtom } from 'jotai/utils'; import { selectAtom } from 'jotai/utils';
import { isEqual } from 'lodash-es';
import { pagesToPageGroups } from './page-group'; import { pagesToPageGroups } from './page-group';
import type { PageListProps, PageMetaRecord } from './types'; import type { PageListProps, PageMetaRecord } from './types';
@@ -17,18 +16,14 @@ const selectionActiveAtom = atom(false);
export const selectionStateAtom = atom( export const selectionStateAtom = atom(
get => { get => {
const baseAtom = selectAtom( const baseAtom = selectAtom(pageListPropsAtom, props => {
pageListPropsAtom, const { selectable, selectedPageIds, onSelectedPageIdsChange } = props;
props => { return {
const { selectable, selectedPageIds, onSelectedPageIdsChange } = props; selectable,
return { selectedPageIds,
selectable, onSelectedPageIdsChange,
selectedPageIds, };
onSelectedPageIdsChange, });
};
},
isEqual
);
const baseState = get(baseAtom); const baseState = get(baseAtom);
const selectionActive = const selectionActive =
baseState.selectable === 'toggle' baseState.selectable === 'toggle'
@@ -45,19 +40,15 @@ export const selectionStateAtom = atom(
); );
// get handlers from pageListPropsAtom // get handlers from pageListPropsAtom
export const pageListHandlersAtom = selectAtom( export const pageListHandlersAtom = selectAtom(pageListPropsAtom, props => {
pageListPropsAtom, const { onSelectedPageIdsChange, onDragStart, onDragEnd } = props;
props => {
const { onSelectedPageIdsChange, onDragStart, onDragEnd } = props;
return { return {
onSelectedPageIdsChange, onSelectedPageIdsChange,
onDragStart, onDragStart,
onDragEnd, onDragEnd,
}; };
}, });
isEqual
);
export const pagesAtom = selectAtom(pageListPropsAtom, props => props.pages); export const pagesAtom = selectAtom(pageListPropsAtom, props => props.pages);