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 {
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}