Bluesky app fork with some witchin' additions 馃挮
at main 148 lines 4.9 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 {useSetMinimalShellMode} 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 const setMinimalShellMode = useSetMinimalShellMode() 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 useEffect(() => { 72 setMinimalShellMode(true) 73 }, [setMinimalShellMode]) 74 75 const onPressDismiss = useCallback(() => { 76 if (onDismiss) { 77 onDismiss() 78 } 79 clearRequestedAccount() 80 }, [clearRequestedAccount, onDismiss]) 81 82 return ( 83 <View 84 testID="noSessionView" 85 style={[ 86 a.util_screen_outer, 87 t.atoms.bg, 88 {paddingTop: insets.top, paddingBottom: insets.bottom}, 89 ]}> 90 <ErrorBoundary> 91 {onDismiss && screenState === ScreenState.S_LoginOrCreateAccount ? ( 92 <Button 93 label={_(msg`Go back`)} 94 variant="solid" 95 color="secondary_inverted" 96 size="small" 97 shape="round" 98 PressableComponent={native(PressableScale)} 99 style={[ 100 a.absolute, 101 { 102 top: insets.top + tokens.space.xl, 103 right: tokens.space.xl, 104 zIndex: 100, 105 }, 106 ]} 107 onPress={onPressDismiss}> 108 <ButtonIcon icon={XIcon} /> 109 </Button> 110 ) : null} 111 112 {screenState === ScreenState.S_StarterPack ? ( 113 <LandingScreen setScreenState={setScreenState} /> 114 ) : screenState === ScreenState.S_LoginOrCreateAccount ? ( 115 <SplashScreen 116 onPressSignin={() => { 117 setScreenState(ScreenState.S_Login) 118 ax.metric('splash:signInPressed', {}) 119 }} 120 onPressCreateAccount={() => { 121 setScreenState(ScreenState.S_CreateAccount) 122 ax.metric('splash:createAccountPressed', {}) 123 }} 124 /> 125 ) : undefined} 126 {screenState === ScreenState.S_Login ? ( 127 <Login 128 onPressBack={() => { 129 setScreenState(ScreenState.S_LoginOrCreateAccount) 130 clearRequestedAccount() 131 }} 132 /> 133 ) : undefined} 134 {screenState === ScreenState.S_CreateAccount ? ( 135 <Signup 136 onPressBack={() => 137 setScreenState(ScreenState.S_LoginOrCreateAccount) 138 } 139 onPressSignIn={() => { 140 setScreenState(ScreenState.S_Login) 141 logEvent('splash:signInPressed', {}) 142 }} 143 /> 144 ) : undefined} 145 </ErrorBoundary> 146 </View> 147 ) 148}