1- import { Lover } from 'common/love/lover'
2- import { removeNullOrUndefinedProps } from 'common/util/object'
3- import { Search } from 'web/components/filters/search'
4- import { LovePage } from 'web/components/love-page'
5- import { SignUpAsMatchmaker } from 'web/components/nav/love-sidebar'
6- import { useLover } from 'web/hooks/use-lover'
7- import { useCompatibleLovers } from 'web/hooks/use-lovers'
8- import { getStars } from 'web/lib/supabase/stars'
9- import { signupThenMaybeRedirectToSignup } from 'web/lib/util/signup'
1+ import { Lover } from 'common/love/lover'
2+ import { removeNullOrUndefinedProps } from 'common/util/object'
3+ import { Search } from 'web/components/filters/search'
4+ import { LovePage } from 'web/components/love-page'
5+ import { SignUpAsMatchmaker } from 'web/components/nav/love-sidebar'
6+ import { useLover } from 'web/hooks/use-lover'
7+ import { useCompatibleLovers } from 'web/hooks/use-lovers'
8+ import { getStars } from 'web/lib/supabase/stars'
9+ import { signupThenMaybeRedirectToSignup } from 'web/lib/util/signup'
1010import Router from 'next/router'
11- import { useCallback , useEffect , useRef , useState } from 'react'
12- import { Button } from 'web/components/buttons/button'
13- import { orderLovers , useFilters } from 'web/components/filters/use-filters'
14- import { Col } from 'web/components/layout/col'
15- import { ProfileGrid } from 'web/components/profile-grid'
16- import { LoadingIndicator } from 'web/components/widgets/loading-indicator'
17- import { Title } from 'web/components/widgets/title'
18- import { useGetter } from 'web/hooks/use-getter'
19- import { usePersistentInMemoryState } from 'web/hooks/use-persistent-in-memory-state'
20- import { useSaveReferral } from 'web/hooks/use-save-referral'
21- import { useTracking } from 'web/hooks/use-tracking'
22- import { useUser } from 'web/hooks/use-user'
23- import { api } from 'web/lib/api'
24- import { debounce , omit } from 'lodash'
25- import {
26- PREF_AGE_MAX ,
27- PREF_AGE_MIN ,
28- } from 'web/components/filters/location-filter'
11+ import { useCallback , useEffect , useRef , useState } from 'react'
12+ import { Button } from 'web/components/buttons/button'
13+ import { orderLovers , useFilters } from 'web/components/filters/use-filters'
14+ import { Col } from 'web/components/layout/col'
15+ import { ProfileGrid } from 'web/components/profile-grid'
16+ import { LoadingIndicator } from 'web/components/widgets/loading-indicator'
17+ import { Title } from 'web/components/widgets/title'
18+ import { useGetter } from 'web/hooks/use-getter'
19+ import { usePersistentInMemoryState } from 'web/hooks/use-persistent-in-memory-state'
20+ import { useSaveReferral } from 'web/hooks/use-save-referral'
21+ import { useTracking } from 'web/hooks/use-tracking'
22+ import { useUser } from 'web/hooks/use-user'
23+ import { api } from 'web/lib/api'
24+ import { debounce , omit } from 'lodash'
25+ import { PREF_AGE_MAX , PREF_AGE_MIN , } from 'web/components/filters/location-filter'
2926
3027export default function ProfilesPage ( ) {
3128 const you = useLover ( )
@@ -64,7 +61,10 @@ export default function ProfilesPage() {
6461 [ ]
6562 )
6663
64+ const user = useUser ( )
65+
6766 useEffect ( ( ) => {
67+ if ( ! user ) return
6868 debouncedSetAge ( {
6969 min : filters . pref_age_min ?? PREF_AGE_MIN ,
7070 max : filters . pref_age_max ?? PREF_AGE_MAX ,
@@ -73,6 +73,7 @@ export default function ProfilesPage() {
7373
7474 const id = useRef ( 0 )
7575 useEffect ( ( ) => {
76+ if ( ! user ) return
7677 setIsReloading ( true )
7778 const current = ++ id . current
7879 api (
@@ -83,7 +84,7 @@ export default function ProfilesPage() {
8384 ...filters ,
8485 } ) as any
8586 )
86- . then ( ( { lovers } ) => {
87+ . then ( ( { lovers} ) => {
8788 if ( current === id . current ) {
8889 setLovers ( lovers )
8990 }
@@ -99,11 +100,10 @@ export default function ProfilesPage() {
99100 debouncedAgeRange . max ,
100101 ] )
101102
102- const user = useUser ( )
103103 useTracking ( 'view love profiles' )
104104 useSaveReferral ( user )
105105 const lover = useLover ( )
106- const { data : starredUserIds , refresh : refreshStars } = useGetter (
106+ const { data : starredUserIds , refresh : refreshStars } = useGetter (
107107 'star' ,
108108 user ?. id ,
109109 getStars
@@ -154,7 +154,31 @@ export default function ProfilesPage() {
154154
155155 const displayLovers = lovers && orderLovers ( lovers , starredUserIds )
156156
157- if ( user === undefined ) return < div />
157+ useEffect ( ( ) => {
158+ const text = "Search." ;
159+ const typewriter = document . getElementById ( "typewriter" ) ;
160+ let i = 0 ;
161+ let timeoutId : any ;
162+ let intervalId ;
163+ if ( typewriter ) typewriter . textContent = ""
164+
165+ function typeWriter ( ) {
166+ if ( i < text . length && typewriter ) {
167+ typewriter . textContent = text . substring ( 0 , i + 1 ) ;
168+ i ++ ;
169+ timeoutId = setTimeout ( typeWriter , 150 ) ;
170+ }
171+ }
172+
173+ intervalId = setTimeout ( ( ) => typeWriter ( ) , 500 ) ;
174+ return ( ) => {
175+ clearTimeout ( timeoutId ) ;
176+ clearTimeout ( intervalId ) ;
177+ if ( typewriter ) typewriter . textContent = "Search."
178+ } ;
179+ } , [ ] ) ;
180+
181+ if ( user === undefined ) return < div />
158182
159183 return (
160184 < LovePage trackPageView = { 'user profiles' } >
@@ -178,34 +202,70 @@ export default function ProfilesPage() {
178202 >
179203 Sign up
180204 </ Button >
181- < SignUpAsMatchmaker className = "flex-1" />
205+ < SignUpAsMatchmaker className = "flex-1" />
182206 </ Col >
183207 ) }
184- < Title className = "!mb-2 text-3xl" > Profiles</ Title >
185- < Search
186- youLover = { you }
187- starredUserIds = { starredUserIds ?? [ ] }
188- filters = { filters }
189- updateFilter = { updateFilter }
190- clearFilters = { clearFilters }
191- setYourFilters = { setYourFilters }
192- isYourFilters = { isYourFilters }
193- locationFilterProps = { locationFilterProps }
194- />
195-
196- { displayLovers === undefined || compatibleLovers === undefined ? (
197- < LoadingIndicator />
198- ) : (
199- < ProfileGrid
200- lovers = { displayLovers }
201- loadMore = { loadMore }
202- isLoadingMore = { isLoadingMore }
203- isReloading = { isReloading }
204- compatibilityScores = { compatibleLovers ?. loverCompatibilityScores }
205- starredUserIds = { starredUserIds }
206- refreshStars = { refreshStars }
207- />
208- ) }
208+ { ! user && < >
209+ < h1
210+ className = "pt-12 pb-2 text-7xl md:text-8xl xs:text-6xl font-extrabold max-w-4xl leading-tight xl:whitespace-nowrap md:whitespace-nowrap " >
211+ Don't Swipe.< br /> < span id = "typewriter" > </ span > < span id = "cursor" className = "animate-pulse" > |</ span >
212+ </ h1 >
213+ < div className = "w-full bg-gray-50 dark:bg-gray-900 py-8 mt-20" >
214+ < div className = "max-w-6xl mx-auto px-4" >
215+ < div className = "grid md:grid-cols-3 gap-8 text-center" >
216+ < div className = "space-y-2" >
217+ < h3 className = "text-lg font-bold" > Radically Transparent</ h3 >
218+ < p className = "text-gray-600 dark:text-gray-400" >
219+ No algorithms. Every profile searchable.
220+ </ p >
221+ </ div >
222+
223+ < div className = "space-y-2" >
224+ < h3 className = "text-lg font-bold" > Built for Depth</ h3 >
225+ < p className = "text-gray-600 dark:text-gray-400" >
226+ Filter by any keyword and what matters most.
227+ </ p >
228+ </ div >
229+
230+ < div className = "space-y-2" >
231+ < h3 className = "text-lg font-bold" > Community Owned</ h3 >
232+ < p className = "text-gray-600 dark:text-gray-400" >
233+ Free forever. Built by users, for users.
234+ </ p >
235+ </ div >
236+ </ div >
237+ </ div >
238+ </ div >
239+ </ > }
240+ { user &&
241+ < >
242+ < Title className = "!mb-2 text-3xl" > Profiles</ Title >
243+ < Search
244+ youLover = { you }
245+ starredUserIds = { starredUserIds ?? [ ] }
246+ filters = { filters }
247+ updateFilter = { updateFilter }
248+ clearFilters = { clearFilters }
249+ setYourFilters = { setYourFilters }
250+ isYourFilters = { isYourFilters }
251+ locationFilterProps = { locationFilterProps }
252+ />
253+
254+ { displayLovers === undefined || compatibleLovers === undefined ? (
255+ < LoadingIndicator />
256+ ) : (
257+ < ProfileGrid
258+ lovers = { displayLovers }
259+ loadMore = { loadMore }
260+ isLoadingMore = { isLoadingMore }
261+ isReloading = { isReloading }
262+ compatibilityScores = { compatibleLovers ?. loverCompatibilityScores }
263+ starredUserIds = { starredUserIds }
264+ refreshStars = { refreshStars }
265+ /> )
266+ }
267+ </ >
268+ }
209269 </ Col >
210270 </ Col >
211271 </ LovePage >
0 commit comments