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