1
- import { React , useState } from '@common'
1
+ import { React , styled } from '@common'
2
2
import { ParticipantStudy } from '@api'
3
3
import { Footer , TopNavBar } from '@components'
4
4
import { useEnvironment , useIsMobileDevice } from '@lib'
@@ -11,10 +11,10 @@ import { EffectCards, FreeMode, Navigation, Pagination } from 'swiper/modules';
11
11
import { LearnerWelcomeModal } from './learner/learner-welcome-modal' ;
12
12
import { UnsupportedCountryModal } from './learner/unsupported-country-modal' ;
13
13
import { Badge , Box , Container , Flex , Group , Stack , Text , TextInput , Title } from '@mantine/core' ;
14
- import { IconSearch , IconX } from '@tabler/icons-react' ;
14
+ import { IconSearch , IconX , IconPlus , IconMinus } from '@tabler/icons-react' ;
15
15
import { groupBy , filter } from 'lodash' ;
16
16
import { colors } from '@theme'
17
- import { useMemo } from 'react' ;
17
+ import { useEffect , useMemo , useState } from 'react' ;
18
18
import { orderBy , sortBy , uniqBy } from 'lodash-es' ;
19
19
20
20
const HighlightedStudies : FC = ( ) => {
@@ -114,17 +114,69 @@ export const SearchResults: FC<{search: string, filteredStudies: ParticipantStud
114
114
)
115
115
}
116
116
117
+ const Circle = styled . div ( {
118
+ borderRadius : '50%' ,
119
+ border : `1px solid ${ colors . blue } ` ,
120
+ backgroundColor : colors . white ,
121
+ width : '.875rem' ,
122
+ height : '.875rem' ,
123
+ display : 'flex' ,
124
+ justifyContent : 'center' ,
125
+ alignItems : 'center' ,
126
+ } )
127
+
128
+ const StudyDuration : FC < { duration : Set < Number > , setDuration : Function , durationText : Number } > = ( { duration, setDuration, durationText } ) => {
129
+
130
+ const handleDurationChange = ( duration :Number ) => {
131
+ setDuration ( ( prev :Set < Number > ) => {
132
+ const newDuration = new Set < Number > ( prev )
133
+ if ( newDuration . has ( duration ) ) {
134
+ newDuration . delete ( duration )
135
+ } else {
136
+ newDuration . add ( duration )
137
+ }
138
+ return newDuration
139
+ } )
140
+ }
141
+
142
+ const [ active , setActive ] = useState < Boolean > ( ( ) => {
143
+ return duration . has ( durationText )
144
+ } )
145
+
146
+ useEffect ( ( ) => {
147
+ setActive ( ( ) => {
148
+ return duration . has ( durationText )
149
+ } )
150
+ } , [ duration , durationText ] )
151
+
152
+ return (
153
+ < Flex justify = 'center' align = 'center' gap = '.5rem'
154
+ pt = '.25rem' pb = '.25rem' pl = '.625rem' pr = '.625rem'
155
+ bg = { active ? colors . blue : colors . white }
156
+ style = { { border : `1px solid ${ colors . blue } ` , borderRadius : '50rem' , transition : 'all .1s ease-in' , cursor : 'pointer' } }
157
+ onClick = { ( ) => {
158
+ handleDurationChange ( durationText )
159
+ } } >
160
+ < Text size = 'sm' c = { active ? colors . white : colors . blue } > ~{ String ( durationText ) } min</ Text >
161
+ < Circle > { active ? < IconMinus size = { 10 } color = { colors . blue } stroke = { 3 } /> : < IconPlus size = { 10 } color = { colors . blue } stroke = { 3 } /> } </ Circle >
162
+ </ Flex >
163
+ )
164
+ }
117
165
export const StudiesContainer = ( ) => {
118
- const { search, setSearch, filteredStudies } = useSearchStudies ( )
166
+ const { search, setSearch, duration , setDuration , filteredStudies } = useSearchStudies ( )
119
167
120
168
return (
121
169
< Container my = 'lg' >
122
170
< Stack gap = 'lg' >
123
- < Flex justify = 'space-between' wrap = 'wrap' >
124
- < StudiesTitle search = { search } filteredStudies = { filteredStudies } />
125
-
171
+ < StudiesTitle search = { search } filteredStudies = { filteredStudies } />
172
+ < Group justify = 'space-between' wrap = 'wrap' >
173
+ < Flex justify = 'center' align = 'center' gap = 'md' >
174
+ < StudyDuration duration = { duration } durationText = { 5 } setDuration = { setDuration } > </ StudyDuration >
175
+ < StudyDuration duration = { duration } durationText = { 15 } setDuration = { setDuration } > </ StudyDuration >
176
+ < StudyDuration duration = { duration } durationText = { 25 } setDuration = { setDuration } > </ StudyDuration >
177
+ </ Flex >
126
178
< SearchBar search = { search } setSearch = { setSearch } />
127
- </ Flex >
179
+ </ Group >
128
180
129
181
< SearchResults search = { search } filteredStudies = { filteredStudies } />
130
182
0 commit comments