forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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 {logEvent} from '#/lib/statsig/statsig'
9import {
10 useLoggedOutView,
11 useLoggedOutViewControls,
12} from '#/state/shell/logged-out'
13import {useSetMinimalShellMode} from '#/state/shell/minimal-mode'
14import {ErrorBoundary} from '#/view/com/util/ErrorBoundary'
15import {Login} from '#/screens/Login'
16import {Signup} from '#/screens/Signup'
17import {LandingScreen} from '#/screens/StarterPack/StarterPackLandingScreen'
18import {atoms as a, native, tokens, useTheme} from '#/alf'
19import {Button, ButtonIcon} from '#/components/Button'
20import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times'
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 t = useTheme()
34 const insets = useSafeAreaInsets()
35 const setMinimalShellMode = useSetMinimalShellMode()
36 const {requestedAccountSwitchTo} = useLoggedOutView()
37 const [screenState, setScreenState] = React.useState<ScreenState>(() => {
38 if (requestedAccountSwitchTo === 'new') {
39 return ScreenState.S_CreateAccount
40 } else if (requestedAccountSwitchTo === 'starterpack') {
41 return ScreenState.S_StarterPack
42 } else if (requestedAccountSwitchTo != null) {
43 return ScreenState.S_Login
44 } else {
45 return ScreenState.S_LoginOrCreateAccount
46 }
47 })
48 const {clearRequestedAccount} = useLoggedOutViewControls()
49
50 React.useEffect(() => {
51 setMinimalShellMode(true)
52 }, [setMinimalShellMode])
53
54 const onPressDismiss = React.useCallback(() => {
55 if (onDismiss) {
56 onDismiss()
57 }
58 clearRequestedAccount()
59 }, [clearRequestedAccount, onDismiss])
60
61 return (
62 <View
63 testID="noSessionView"
64 style={[
65 a.util_screen_outer,
66 t.atoms.bg,
67 {paddingTop: insets.top, paddingBottom: insets.bottom},
68 ]}>
69 <ErrorBoundary>
70 {onDismiss && screenState === ScreenState.S_LoginOrCreateAccount ? (
71 <Button
72 label={_(msg`Go back`)}
73 variant="solid"
74 color="secondary_inverted"
75 size="small"
76 shape="round"
77 PressableComponent={native(PressableScale)}
78 style={[
79 a.absolute,
80 {
81 top: insets.top + tokens.space.xl,
82 right: tokens.space.xl,
83 zIndex: 100,
84 },
85 ]}
86 onPress={onPressDismiss}>
87 <ButtonIcon icon={XIcon} />
88 </Button>
89 ) : null}
90
91 {screenState === ScreenState.S_StarterPack ? (
92 <LandingScreen setScreenState={setScreenState} />
93 ) : screenState === ScreenState.S_LoginOrCreateAccount ? (
94 <SplashScreen
95 onPressSignin={() => {
96 setScreenState(ScreenState.S_Login)
97 logEvent('splash:signInPressed', {})
98 }}
99 onPressCreateAccount={() => {
100 setScreenState(ScreenState.S_CreateAccount)
101 logEvent('splash:createAccountPressed', {})
102 }}
103 />
104 ) : undefined}
105 {screenState === ScreenState.S_Login ? (
106 <Login
107 onPressBack={() => {
108 setScreenState(ScreenState.S_LoginOrCreateAccount)
109 clearRequestedAccount()
110 }}
111 />
112 ) : undefined}
113 {screenState === ScreenState.S_CreateAccount ? (
114 <Signup
115 onPressBack={() =>
116 setScreenState(ScreenState.S_LoginOrCreateAccount)
117 }
118 />
119 ) : undefined}
120 </ErrorBoundary>
121 </View>
122 )
123}