@@ -2,21 +2,32 @@ import Header from '@app/components/Common/Header';
22import ListView from '@app/components/Common/ListView' ;
33import PageTitle from '@app/components/Common/PageTitle' ;
44import useDiscover from '@app/hooks/useDiscover' ;
5+ import globalMessages from '@app/i18n/globalMessages' ;
56import Error from '@app/pages/_error' ;
67import defineMessages from '@app/utils/defineMessages' ;
8+ import { CircleStackIcon , FunnelIcon } from '@heroicons/react/24/solid' ;
79import type {
810 MovieResult ,
911 PersonResult ,
1012 TvResult ,
1113} from '@server/models/Search' ;
14+ import { useState } from 'react' ;
1215import { useIntl } from 'react-intl' ;
1316
1417const messages = defineMessages ( 'components.Discover' , {
1518 trending : 'Trending' ,
19+ timeWindowDay : 'Daily' ,
20+ timeWindowWeek : 'Weekly' ,
1621} ) ;
1722
23+ type MediaType = 'all' | 'movie' | 'tv' ;
24+
25+ type TimeWindow = 'day' | 'week' ;
26+
1827const Trending = ( ) => {
1928 const intl = useIntl ( ) ;
29+ const [ currentMediaType , setCurrentMediaType ] = useState < MediaType > ( 'all' ) ;
30+ const [ currentTimeWindow , setCurrentTimeWindow ] = useState < TimeWindow > ( 'day' ) ;
2031 const {
2132 isLoadingInitialData,
2233 isEmpty,
@@ -26,7 +37,8 @@ const Trending = () => {
2637 fetchMore,
2738 error,
2839 } = useDiscover < MovieResult | TvResult | PersonResult > (
29- '/api/v1/discover/trending'
40+ '/api/v1/discover/trending' ,
41+ { mediaType : currentMediaType , timeWindow : currentTimeWindow }
3042 ) ;
3143
3244 if ( error ) {
@@ -36,8 +48,53 @@ const Trending = () => {
3648 return (
3749 < >
3850 < PageTitle title = { intl . formatMessage ( messages . trending ) } />
39- < div className = "mt-1 mb-5" >
51+ < div className = "mt-1 mb-5 flex flex-col justify-between lg:flex-row lg:items-end " >
4052 < Header > { intl . formatMessage ( messages . trending ) } </ Header >
53+ < div className = "mt-2 flex flex-grow flex-col sm:flex-row lg:flex-grow-0" >
54+ < div className = "mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0" >
55+ < span className = "inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100" >
56+ < CircleStackIcon className = "h-6 w-6" />
57+ </ span >
58+ < select
59+ id = "mediaType"
60+ name = "mediaType"
61+ onChange = { ( e ) => setCurrentMediaType ( e . target . value as MediaType ) }
62+ value = { currentMediaType }
63+ className = "rounded-r-only"
64+ >
65+ < option value = "all" >
66+ { intl . formatMessage ( globalMessages . all ) }
67+ </ option >
68+ < option value = "movie" >
69+ { intl . formatMessage ( globalMessages . movies ) }
70+ </ option >
71+ < option value = "tv" >
72+ { intl . formatMessage ( globalMessages . tvshows ) }
73+ </ option >
74+ </ select >
75+ </ div >
76+ < div className = "mb-2 flex flex-grow sm:mb-0 sm:mr-2 lg:flex-grow-0" >
77+ < span className = "inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100" >
78+ < FunnelIcon className = "h-6 w-6" />
79+ </ span >
80+ < select
81+ id = "timeWindow"
82+ name = "timeWindow"
83+ onChange = { ( e ) =>
84+ setCurrentTimeWindow ( e . target . value as TimeWindow )
85+ }
86+ value = { currentTimeWindow }
87+ className = "rounded-r-only"
88+ >
89+ < option value = "day" >
90+ { intl . formatMessage ( messages . timeWindowDay ) }
91+ </ option >
92+ < option value = "week" >
93+ { intl . formatMessage ( messages . timeWindowWeek ) }
94+ </ option >
95+ </ select >
96+ </ div >
97+ </ div >
4198 </ div >
4299 < ListView
43100 items = { titles }
0 commit comments