diff --git a/.changeset/stable-filter-selector.md b/.changeset/stable-filter-selector.md new file mode 100644 index 000000000..274c288f3 --- /dev/null +++ b/.changeset/stable-filter-selector.md @@ -0,0 +1,5 @@ +--- +"@equinor/fusion-react-filter": patch +--- + +Prevent `FilterOptionHeader` from entering an infinite render loop after upgrading `@equinor/fusion-observable` by keeping its selection count selector stable across renders. diff --git a/packages/filter/src/components/filter/FilterOptionHeader.tsx b/packages/filter/src/components/filter/FilterOptionHeader.tsx index 2f7cdafcf..3e9178209 100644 --- a/packages/filter/src/components/filter/FilterOptionHeader.tsx +++ b/packages/filter/src/components/filter/FilterOptionHeader.tsx @@ -14,6 +14,8 @@ type FilterHeaderProps = { readonly title: string; }; +const getSelectedCount = (selection?: Set): number => selection?.size ?? 0; + const Styled = { Root: styled.div` display: flex; @@ -63,7 +65,7 @@ export const FilterOptionHeader = (props: FilterHeaderProps): ReactElement => { const { options$, selection$ } = useFilterOptionContext(); const optionCount = Object.keys(useObservableState(options$).value || {}).length; const { value: selectedCount } = useObservableState( - useObservableSelector(selection$, (x) => (x ?? new Set()).size), + useObservableSelector(selection$, getSelectedCount), { initial: 0 }, );