From 3da9471cadde035d314304e0e633cd4690b3d6d6 Mon Sep 17 00:00:00 2001 From: Nikolay Akhmetov Date: Mon, 21 Oct 2024 15:55:24 -0400 Subject: [PATCH] add memoization --- .../js/components/search/Facets/TermFacet.tsx | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/context/app/static/js/components/search/Facets/TermFacet.tsx b/context/app/static/js/components/search/Facets/TermFacet.tsx index a6a6351a04..4682cdfd3e 100644 --- a/context/app/static/js/components/search/Facets/TermFacet.tsx +++ b/context/app/static/js/components/search/Facets/TermFacet.tsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback } from 'react'; +import React, { useState, useCallback, useMemo } from 'react'; import { useShallow } from 'zustand/react/shallow'; import Typography from '@mui/material/Typography'; import IndeterminateCheckBoxOutlinedIcon from '@mui/icons-material/IndeterminateCheckBoxOutlined'; @@ -236,7 +236,7 @@ export function HierarchicalFacetChild({ parentValue, field, label, ...rest }: T ); } -export function HierarchicalTermFacetItem({ +export const HierarchicalTermFacetItem = React.memo(function HierarchicalTermFacetItem({ field, label, childBuckets, @@ -258,6 +258,13 @@ export function HierarchicalTermFacetItem({ const { [parentField]: filter } = filters; + const sortedBuckets = useMemo(() => { + if (!expanded || !childBuckets || !Array.isArray(childBuckets)) { + return []; + } + return sortBuckets({ buckets: childBuckets, field: parentField }); + }, [expanded, childBuckets, parentField]); + if (!childBuckets || !Array.isArray(childBuckets) || !isHierarchicalFilter(filter)) { return null; } @@ -305,22 +312,21 @@ export function HierarchicalTermFacetItem({ /> - {expanded && - sortBuckets({ buckets: childBuckets, field: parentField }).map(({ key, doc_count }) => ( - - ))} + {sortedBuckets.map(({ key, doc_count }) => ( + + ))} ); -} +}); export function HierarchicalTermFacet({ field: parentField, childField }: { field: string; childField: string }) { const { aggregations } = useSearch(); @@ -329,23 +335,25 @@ export function HierarchicalTermFacet({ field: parentField, childField }: { fiel const { [parentField]: filter } = filters; + const sortedBuckets = useMemo(() => { + const parentBuckets = aggregations?.[parentField]?.[parentField]?.buckets; + if (!parentBuckets || !Array.isArray(parentBuckets)) { + return []; + } + return sortBuckets({ buckets: parentBuckets, field: parentField }); + }, [parentField, aggregations]); + if (!aggregations || !isHierarchicalFilter(filter)) { return null; } const { values } = filter; - const parentBuckets = aggregations?.[parentField]?.[parentField]?.buckets; - - if (!parentBuckets || !Array.isArray(parentBuckets)) { - return null; - } - const title = getFieldLabel(parentField); return ( - {sortBuckets({ buckets: parentBuckets, field: parentField }).map((bucket) => { + {sortedBuckets.map((bucket) => { const key = getBucketKey(bucket); return (