Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 144 lines 4.8 kB view raw
1import {useCallback, useEffect, useState} from 'react' 2import {View} from 'react-native' 3import {useSafeAreaInsets} from 'react-native-safe-area-context' 4import {msg} from '@lingui/core/macro' 5import {useLingui} from '@lingui/react' 6import {useQueryClient} from '@tanstack/react-query' 7 8import {PressableScale} from '#/lib/custom-animations/PressableScale' 9import {STALE} from '#/state/queries' 10import {profilesQueryKey} from '#/state/queries/profile' 11import {useAgent, useSession} from '#/state/session' 12import { 13 useLoggedOutView, 14 useLoggedOutViewControls, 15} from '#/state/shell/logged-out' 16import {useEnableMinimalShellMode} from '#/state/shell/minimal-mode' 17import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' 18import {Login} from '#/screens/Login' 19import {Signup} from '#/screens/Signup' 20import {LandingScreen} from '#/screens/StarterPack/StarterPackLandingScreen' 21import {atoms as a, native, tokens, useTheme} from '#/alf' 22import {Button, ButtonIcon} from '#/components/Button' 23import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times' 24import {useAnalytics} from '#/analytics' 25import {SplashScreen} from './SplashScreen' 26 27enum ScreenState { 28 S_LoginOrCreateAccount, 29 S_Login, 30 S_CreateAccount, 31 S_StarterPack, 32} 33export {ScreenState as LoggedOutScreenState} 34 35export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { 36 const {_} = useLingui() 37 const ax = useAnalytics() 38 const t = useTheme() 39 const insets = useSafeAreaInsets() 40 useEnableMinimalShellMode() 41 const {requestedAccountSwitchTo} = useLoggedOutView() 42 const [screenState, setScreenState] = useState<ScreenState>(() => { 43 if (requestedAccountSwitchTo === 'new') { 44 return ScreenState.S_CreateAccount 45 } else if (requestedAccountSwitchTo === 'starterpack') { 46 return ScreenState.S_StarterPack 47 } else if (requestedAccountSwitchTo != null) { 48 return ScreenState.S_Login 49 } else { 50 return ScreenState.S_LoginOrCreateAccount 51 } 52 }) 53 const {clearRequestedAccount} = useLoggedOutViewControls() 54 55 const queryClient = useQueryClient() 56 const {accounts} = useSession() 57 const agent = useAgent() 58 useEffect(() => { 59 const actors = accounts.map(acc => acc.did) 60 if (actors.length === 0) return 61 void queryClient.prefetchQuery({ 62 queryKey: profilesQueryKey(actors), 63 staleTime: STALE.MINUTES.FIVE, 64 queryFn: async () => { 65 const res = await agent.getProfiles({actors}) 66 return res.data 67 }, 68 }) 69 }, [accounts, agent, queryClient]) 70 71 const onPressDismiss = useCallback(() => { 72 if (onDismiss) { 73 onDismiss() 74 } 75 clearRequestedAccount() 76 }, [clearRequestedAccount, onDismiss]) 77 78 return ( 79 <View 80 testID="noSessionView" 81 style={[ 82 a.util_screen_outer, 83 t.atoms.bg, 84 {paddingTop: insets.top, paddingBottom: insets.bottom}, 85 ]}> 86 <ErrorBoundary> 87 {onDismiss && screenState === ScreenState.S_LoginOrCreateAccount ? ( 88 <Button 89 label={_(msg`Go back`)} 90 variant="solid" 91 color="secondary_inverted" 92 size="small" 93 shape="round" 94 PressableComponent={native(PressableScale)} 95 style={[ 96 a.absolute, 97 { 98 top: insets.top + tokens.space.xl, 99 right: tokens.space.xl, 100 zIndex: 100, 101 }, 102 ]} 103 onPress={onPressDismiss}> 104 <ButtonIcon icon={XIcon} /> 105 </Button> 106 ) : null} 107 108 {screenState === ScreenState.S_StarterPack ? ( 109 <LandingScreen setScreenState={setScreenState} /> 110 ) : screenState === ScreenState.S_LoginOrCreateAccount ? ( 111 <SplashScreen 112 onPressSignin={() => { 113 setScreenState(ScreenState.S_Login) 114 ax.metric('splash:signInPressed', {}) 115 }} 116 onPressCreateAccount={() => { 117 setScreenState(ScreenState.S_CreateAccount) 118 ax.metric('splash:createAccountPressed', {}) 119 }} 120 /> 121 ) : undefined} 122 {screenState === ScreenState.S_Login ? ( 123 <Login 124 onPressBack={() => { 125 setScreenState(ScreenState.S_LoginOrCreateAccount) 126 clearRequestedAccount() 127 }} 128 /> 129 ) : undefined} 130 {screenState === ScreenState.S_CreateAccount ? ( 131 <Signup 132 onPressBack={() => 133 setScreenState(ScreenState.S_LoginOrCreateAccount) 134 } 135 onPressSignIn={() => { 136 setScreenState(ScreenState.S_Login) 137 ax.metric('splash:signInPressed', {}) 138 }} 139 /> 140 ) : undefined} 141 </ErrorBoundary> 142 </View> 143 ) 144}