Skip to content

Commit 663a3c7

Browse files
committed
refactor: use useRef instead of stringify
1 parent 76029d8 commit 663a3c7

1 file changed

Lines changed: 24 additions & 3 deletions

File tree

mflix/client/app/components/FilterBar/FilterBar.tsx

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import { useState, useCallback, useEffect } from 'react';
3+
import { useState, useCallback, useEffect, useRef } from 'react';
44
import styles from './FilterBar.module.css';
55
import { fetchGenres, type MovieFilterParams } from '@/lib/api';
66

@@ -16,6 +16,21 @@ interface FilterBarProps {
1616
initialFilters?: MovieFilterParams;
1717
}
1818

19+
/**
20+
* Compares two MovieFilterParams objects for equality.
21+
* Returns true if all filter values match.
22+
*/
23+
function areFiltersEqual(a: MovieFilterParams, b: MovieFilterParams): boolean {
24+
return (
25+
a.genre === b.genre &&
26+
a.year === b.year &&
27+
a.minRating === b.minRating &&
28+
a.maxRating === b.maxRating &&
29+
a.sortBy === b.sortBy &&
30+
a.sortOrder === b.sortOrder
31+
);
32+
}
33+
1934
export default function FilterBar({
2035
onFilterChange,
2136
isLoading = false,
@@ -25,6 +40,9 @@ export default function FilterBar({
2540
const [genres, setGenres] = useState<string[]>([]);
2641
const [isLoadingGenres, setIsLoadingGenres] = useState(true);
2742

43+
// Track previous initialFilters to detect changes
44+
const prevInitialFiltersRef = useRef<MovieFilterParams>(initialFilters);
45+
2846
// Fetch genres from the API on mount
2947
useEffect(() => {
3048
async function loadGenres() {
@@ -38,8 +56,11 @@ export default function FilterBar({
3856

3957
// Sync internal state when initialFilters changes (e.g. from URL navigation)
4058
useEffect(() => {
41-
setFilters(initialFilters);
42-
}, [JSON.stringify(initialFilters)]); // Use JSON.stringify for deep comparison
59+
if (!areFiltersEqual(prevInitialFiltersRef.current, initialFilters)) {
60+
setFilters(initialFilters);
61+
prevInitialFiltersRef.current = initialFilters;
62+
}
63+
}, [initialFilters]);
4364

4465
const handleFilterChange = useCallback((key: keyof MovieFilterParams, value: string | number | undefined) => {
4566
setFilters(prev => {

0 commit comments

Comments
 (0)