diff --git a/ui/v2.5/src/components/List/Filters/DuplicateFilter.tsx b/ui/v2.5/src/components/List/Filters/DuplicateFilter.tsx index fa4c4cc66..da779f227 100644 --- a/ui/v2.5/src/components/List/Filters/DuplicateFilter.tsx +++ b/ui/v2.5/src/components/List/Filters/DuplicateFilter.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState } from "react"; +import React, { useCallback, useMemo, useState } from "react"; import { useIntl } from "react-intl"; import { BooleanCriterion } from "src/models/list-filter/criteria/criterion"; import { ListFilterModel } from "src/models/list-filter/filter"; @@ -43,19 +43,25 @@ export const SidebarDuplicateFilter: React.FC = ({ const titleLabel = intl.formatMessage({ id: "title" }); // Labels for each duplicate type - const labels: Record = { - phash: phashLabel, - stash_id: stashIdLabel, - title: titleLabel, - }; + const labels: Record = useMemo( + () => ({ + phash: phashLabel, + stash_id: stashIdLabel, + title: titleLabel, + }), + [phashLabel, stashIdLabel, titleLabel] + ); // Get criterion for a given type - function getCriterion(typeId: DuplicateTypeId): BooleanCriterion | null { - const criteria = filter.criteriaFor( - DUPLICATE_TYPES[typeId].type - ) as BooleanCriterion[]; - return criteria.length > 0 ? criteria[0] : null; - } + const getCriterion = useCallback( + (typeId: DuplicateTypeId): BooleanCriterion | null => { + const criteria = filter.criteriaFor( + DUPLICATE_TYPES[typeId].type + ) as BooleanCriterion[]; + return criteria.length > 0 ? criteria[0] : null; + }, + [filter] + ); // Build selected items list const selected: Option[] = useMemo(() => { @@ -73,7 +79,7 @@ export const SidebarDuplicateFilter: React.FC = ({ } return result; - }, [filter, trueLabel, falseLabel, labels]); + }, [getCriterion, trueLabel, falseLabel, labels]); // Available options - show options that aren't already selected const options = useMemo(() => { @@ -86,7 +92,7 @@ export const SidebarDuplicateFilter: React.FC = ({ } return result; - }, [filter, labels]); + }, [getCriterion, labels]); function onToggleExpand(id: string) { setExpandedType(expandedType === id ? null : id); @@ -120,10 +126,7 @@ export const SidebarDuplicateFilter: React.FC = ({ text={title} sectionID={sectionID} outsideCollapse={ - onUnselect(i)} - /> + onUnselect(i)} /> } >
@@ -137,7 +140,10 @@ export const SidebarDuplicateFilter: React.FC = ({ tabIndex={0} >
- + {opt.label}
@@ -164,4 +170,4 @@ export const SidebarDuplicateFilter: React.FC = ({
); -}; \ No newline at end of file +}; diff --git a/ui/v2.5/src/models/list-filter/criteria/title.ts b/ui/v2.5/src/models/list-filter/criteria/title.ts index f51ed3911..46345741e 100644 --- a/ui/v2.5/src/models/list-filter/criteria/title.ts +++ b/ui/v2.5/src/models/list-filter/criteria/title.ts @@ -17,4 +17,4 @@ export class DuplicatedTitleCriterion extends StringCriterion { duplicated: this.value === "true", }; } -} \ No newline at end of file +} diff --git a/ui/v2.5/src/models/list-filter/types.ts b/ui/v2.5/src/models/list-filter/types.ts index 83ebaa010..9e0101468 100644 --- a/ui/v2.5/src/models/list-filter/types.ts +++ b/ui/v2.5/src/models/list-filter/types.ts @@ -197,6 +197,8 @@ export type CriterionType = | "favorite" | "performer_age" | "duplicated" + | "duplicated_stash_id" + | "duplicated_title" | "ignore_auto_tag" | "file_count" | "stash_id_endpoint"