@@ -41,6 +41,7 @@ const ArtistAlbumsPage: React.FC = () => {
4141 const storedState = artistId ? getStoredState ( artistId ) : null ;
4242 const [ sortField , setSortField ] = useState < SortField > ( storedState ?. sortField ?? 'year' ) ;
4343 const [ sortOrder , setSortOrder ] = useState < SortOrder > ( storedState ?. sortOrder ?? 'desc' ) ;
44+ const [ searchTerm , setSearchTerm ] = useState < string > ( '' ) ;
4445
4546 // Save state to sessionStorage whenever it changes
4647 useEffect ( ( ) => {
@@ -75,7 +76,14 @@ const ArtistAlbumsPage: React.FC = () => {
7576 const sortedAlbums = useMemo ( ( ) => {
7677 if ( ! pageData ) return [ ] ;
7778
78- return [ ...pageData . albums ] . sort ( ( a , b ) => {
79+ let result = pageData . albums ;
80+
81+ if ( searchTerm . trim ( ) !== '' ) {
82+ const lowerQuery = searchTerm . toLowerCase ( ) ;
83+ result = result . filter ( a => a . title . toLowerCase ( ) . includes ( lowerQuery ) ) ;
84+ }
85+
86+ return [ ...result ] . sort ( ( a , b ) => {
7987 if ( sortField === 'title' ) {
8088 const comparison = a . title . localeCompare ( b . title ) ;
8189 return sortOrder === 'asc' ? comparison : - comparison ;
@@ -84,7 +92,7 @@ const ArtistAlbumsPage: React.FC = () => {
8492 return sortOrder === 'asc' ? comparison : - comparison ;
8593 }
8694 } ) ;
87- } , [ pageData , sortField , sortOrder ] ) ;
95+ } , [ pageData , sortField , sortOrder , searchTerm ] ) ;
8896
8997 const handleAlbumClick = ( album : ArtistAlbum ) => {
9098 if ( album . type === 'master' ) {
@@ -130,31 +138,42 @@ const ArtistAlbumsPage: React.FC = () => {
130138 </ div >
131139 </ div >
132140
133- { /* Sort controls */ }
134- < div className = "flex flex-wrap items-center gap-4 mb-6 p-4 bg-base-200 rounded-lg" >
135- < span className = "text-sm font-medium" > { t ( 'artist.sortBy' ) } </ span >
136- < div className = "flex gap-2" >
137- < button
138- className = { `btn btn-sm ${ sortField === 'title' ? 'btn-primary' : 'btn-outline' } ` }
139- onClick = { ( ) => setSortField ( 'title' ) }
140- >
141- { t ( 'common.title' ) }
142- </ button >
141+ { /* Filter and Sort controls */ }
142+ < div className = "flex flex-col md:flex-row justify-between gap-4 mb-6 p-4 bg-base-200 rounded-lg" >
143+ < div className = "w-full md:max-w-sm" >
144+ < input
145+ type = "text"
146+ placeholder = { t ( 'search.placeholder' , 'Search...' ) }
147+ className = "input input-bordered input-sm w-full"
148+ value = { searchTerm }
149+ onChange = { ( e ) => setSearchTerm ( e . target . value ) }
150+ />
151+ </ div >
152+ < div className = "flex flex-wrap items-center gap-4" >
153+ < span className = "text-sm font-medium" > { t ( 'artist.sortBy' ) } </ span >
154+ < div className = "flex gap-2" >
155+ < button
156+ className = { `btn btn-sm ${ sortField === 'title' ? 'btn-primary' : 'btn-outline' } ` }
157+ onClick = { ( ) => setSortField ( 'title' ) }
158+ >
159+ { t ( 'common.title' ) }
160+ </ button >
161+ < button
162+ className = { `btn btn-sm ${ sortField === 'year' ? 'btn-primary' : 'btn-outline' } ` }
163+ onClick = { ( ) => setSortField ( 'year' ) }
164+ >
165+ { t ( 'common.year' ) }
166+ </ button >
167+ </ div >
168+ < div className = "divider divider-horizontal mx-0 hidden md:flex" > </ div >
143169 < button
144- className = { ` btn btn-sm ${ sortField === 'year' ? ' btn-primary' : 'btn-outline' } ` }
145- onClick = { ( ) => setSortField ( 'year' ) }
170+ className = " btn btn-sm btn-ghost gap-2"
171+ onClick = { toggleSortOrder }
146172 >
147- { t ( 'common.year' ) }
173+ { sortOrder === 'asc' ? < ArrowUp size = { 16 } /> : < ArrowDown size = { 16 } /> }
174+ { sortOrder === 'asc' ? t ( 'artist.ascending' ) : t ( 'artist.descending' ) }
148175 </ button >
149176 </ div >
150- < div className = "divider divider-horizontal mx-0" > </ div >
151- < button
152- className = "btn btn-sm btn-ghost gap-2"
153- onClick = { toggleSortOrder }
154- >
155- { sortOrder === 'asc' ? < ArrowUp size = { 16 } /> : < ArrowDown size = { 16 } /> }
156- { sortOrder === 'asc' ? t ( 'artist.ascending' ) : t ( 'artist.descending' ) }
157- </ button >
158177 </ div >
159178
160179 { /* Albums grid */ }
0 commit comments