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