11'use client' ;
22
3- import { useState , useCallback , useEffect } from 'react' ;
3+ import { useState , useCallback , useEffect , useRef } from 'react' ;
44import styles from './FilterBar.module.css' ;
55import { 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+
1934export 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