[🙅] Add new deactivated screen (#4270)
* Add new deactivated screen * Update copy, handle logout * Remove icons, adjust padding
This commit is contained in:
@@ -13,7 +13,7 @@ export type LogEvents = {
|
|||||||
withPassword: boolean
|
withPassword: boolean
|
||||||
}
|
}
|
||||||
'account:loggedOut': {
|
'account:loggedOut': {
|
||||||
logContext: 'SwitchAccount' | 'Settings' | 'SignupQueued'
|
logContext: 'SwitchAccount' | 'Settings' | 'SignupQueued' | 'Deactivated'
|
||||||
}
|
}
|
||||||
'notifications:openApp': {}
|
'notifications:openApp': {}
|
||||||
'notifications:request': {
|
'notifications:request': {
|
||||||
|
|||||||
@@ -0,0 +1,174 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import {View} from 'react-native'
|
||||||
|
import {useSafeAreaInsets} from 'react-native-safe-area-context'
|
||||||
|
import {msg, Trans} from '@lingui/macro'
|
||||||
|
import {useLingui} from '@lingui/react'
|
||||||
|
import {useFocusEffect} from '@react-navigation/native'
|
||||||
|
|
||||||
|
import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher'
|
||||||
|
import {isWeb} from '#/platform/detection'
|
||||||
|
import {type SessionAccount, useSession, useSessionApi} from '#/state/session'
|
||||||
|
import {useSetMinimalShellMode} from '#/state/shell'
|
||||||
|
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
|
||||||
|
import {ScrollView} from '#/view/com/util/Views'
|
||||||
|
import {Logo} from '#/view/icons/Logo'
|
||||||
|
import {atoms as a, useTheme} from '#/alf'
|
||||||
|
import {AccountList} from '#/components/AccountList'
|
||||||
|
import {Button, ButtonText} from '#/components/Button'
|
||||||
|
import {Divider} from '#/components/Divider'
|
||||||
|
import {Text} from '#/components/Typography'
|
||||||
|
|
||||||
|
const COL_WIDTH = 400
|
||||||
|
|
||||||
|
export function Deactivated() {
|
||||||
|
const {_} = useLingui()
|
||||||
|
const t = useTheme()
|
||||||
|
const insets = useSafeAreaInsets()
|
||||||
|
const {currentAccount, accounts} = useSession()
|
||||||
|
const {onPressSwitchAccount, pendingDid} = useAccountSwitcher()
|
||||||
|
const {setShowLoggedOut} = useLoggedOutViewControls()
|
||||||
|
const hasOtherAccounts = accounts.length > 1
|
||||||
|
const setMinimalShellMode = useSetMinimalShellMode()
|
||||||
|
const {logout} = useSessionApi()
|
||||||
|
|
||||||
|
useFocusEffect(
|
||||||
|
React.useCallback(() => {
|
||||||
|
setMinimalShellMode(true)
|
||||||
|
}, [setMinimalShellMode]),
|
||||||
|
)
|
||||||
|
|
||||||
|
const onSelectAccount = React.useCallback(
|
||||||
|
(account: SessionAccount) => {
|
||||||
|
if (account.did !== currentAccount?.did) {
|
||||||
|
onPressSwitchAccount(account, 'SwitchAccount')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[currentAccount, onPressSwitchAccount],
|
||||||
|
)
|
||||||
|
|
||||||
|
const onPressAddAccount = React.useCallback(() => {
|
||||||
|
setShowLoggedOut(true)
|
||||||
|
}, [setShowLoggedOut])
|
||||||
|
|
||||||
|
const onPressLogout = React.useCallback(() => {
|
||||||
|
if (isWeb) {
|
||||||
|
// We're switching accounts, which remounts the entire app.
|
||||||
|
// On mobile, this gets us Home, but on the web we also need reset the URL.
|
||||||
|
// We can't change the URL via a navigate() call because the navigator
|
||||||
|
// itself is about to unmount, and it calls pushState() too late.
|
||||||
|
// So we change the URL ourselves. The navigator will pick it up on remount.
|
||||||
|
history.pushState(null, '', '/')
|
||||||
|
}
|
||||||
|
logout('Deactivated')
|
||||||
|
}, [logout])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={[a.h_full_vh, a.flex_1, t.atoms.bg]}>
|
||||||
|
<ScrollView
|
||||||
|
style={[a.h_full, a.w_full]}
|
||||||
|
contentContainerStyle={{borderWidth: 0}}>
|
||||||
|
<View
|
||||||
|
style={[
|
||||||
|
a.px_2xl,
|
||||||
|
{
|
||||||
|
paddingTop: isWeb ? 64 : insets.top,
|
||||||
|
paddingBottom: isWeb ? 64 : insets.bottom,
|
||||||
|
},
|
||||||
|
]}>
|
||||||
|
<View style={[a.flex_row, a.justify_center]}>
|
||||||
|
<View style={[a.w_full, {maxWidth: COL_WIDTH}]}>
|
||||||
|
<View
|
||||||
|
style={[a.w_full, a.justify_center, a.align_center, a.pb_5xl]}>
|
||||||
|
<Logo width={40} />
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={[a.gap_xs, a.pb_3xl]}>
|
||||||
|
<Text style={[a.text_xl, a.font_bold, a.leading_snug]}>
|
||||||
|
<Trans>Welcome back!</Trans>
|
||||||
|
</Text>
|
||||||
|
<Text style={[a.text_sm, a.leading_snug]}>
|
||||||
|
<Trans>
|
||||||
|
You previously deactivated @{currentAccount?.handle}.
|
||||||
|
</Trans>
|
||||||
|
</Text>
|
||||||
|
<Text style={[a.text_sm, a.leading_snug, a.pb_md]}>
|
||||||
|
<Trans>
|
||||||
|
You can reactivate your account to continue logging in. Your
|
||||||
|
profile and posts will be visible to other users.
|
||||||
|
</Trans>
|
||||||
|
</Text>
|
||||||
|
|
||||||
|
<View style={[a.gap_sm]}>
|
||||||
|
<Button
|
||||||
|
label={_(msg`Reactivate your account`)}
|
||||||
|
size="medium"
|
||||||
|
variant="solid"
|
||||||
|
color="primary"
|
||||||
|
onPress={() => setShowLoggedOut(true)}>
|
||||||
|
<ButtonText>
|
||||||
|
<Trans>Yes, reactivate my account</Trans>
|
||||||
|
</ButtonText>
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
label={_(msg`Cancel reactivation and log out`)}
|
||||||
|
size="medium"
|
||||||
|
variant="solid"
|
||||||
|
color="secondary"
|
||||||
|
onPress={onPressLogout}>
|
||||||
|
<ButtonText>
|
||||||
|
<Trans>Cancel</Trans>
|
||||||
|
</ButtonText>
|
||||||
|
</Button>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View style={[a.pb_3xl]}>
|
||||||
|
<Divider />
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{hasOtherAccounts ? (
|
||||||
|
<>
|
||||||
|
<Text
|
||||||
|
style={[
|
||||||
|
t.atoms.text_contrast_medium,
|
||||||
|
a.pb_md,
|
||||||
|
a.leading_snug,
|
||||||
|
]}>
|
||||||
|
<Trans>Or, log into one of your other accounts.</Trans>
|
||||||
|
</Text>
|
||||||
|
<AccountList
|
||||||
|
onSelectAccount={onSelectAccount}
|
||||||
|
onSelectOther={onPressAddAccount}
|
||||||
|
otherLabel={_(msg`Add account`)}
|
||||||
|
pendingDid={pendingDid}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Text
|
||||||
|
style={[
|
||||||
|
t.atoms.text_contrast_medium,
|
||||||
|
a.pb_md,
|
||||||
|
a.leading_snug,
|
||||||
|
]}>
|
||||||
|
<Trans>Or, continue with another account.</Trans>
|
||||||
|
</Text>
|
||||||
|
<Button
|
||||||
|
label={_(msg`Log in or sign up`)}
|
||||||
|
size="medium"
|
||||||
|
variant="solid"
|
||||||
|
color="secondary"
|
||||||
|
onPress={() => setShowLoggedOut(true)}>
|
||||||
|
<ButtonText>
|
||||||
|
<Trans>Log in or sign up</Trans>
|
||||||
|
</ButtonText>
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</ScrollView>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ import {
|
|||||||
useLoggedOutViewControls,
|
useLoggedOutViewControls,
|
||||||
} from '#/state/shell/logged-out'
|
} from '#/state/shell/logged-out'
|
||||||
import {isWeb} from 'platform/detection'
|
import {isWeb} from 'platform/detection'
|
||||||
|
import {Deactivated} from '#/screens/Deactivated'
|
||||||
import {Onboarding} from '#/screens/Onboarding'
|
import {Onboarding} from '#/screens/Onboarding'
|
||||||
import {SignupQueued} from '#/screens/SignupQueued'
|
import {SignupQueued} from '#/screens/SignupQueued'
|
||||||
import {LoggedOut} from '../com/auth/LoggedOut'
|
import {LoggedOut} from '../com/auth/LoggedOut'
|
||||||
@@ -108,6 +109,9 @@ function NativeStackNavigator({
|
|||||||
if (showLoggedOut) {
|
if (showLoggedOut) {
|
||||||
return <LoggedOut onDismiss={() => setShowLoggedOut(false)} />
|
return <LoggedOut onDismiss={() => setShowLoggedOut(false)} />
|
||||||
}
|
}
|
||||||
|
if (currentAccount?.status === 'deactivated') {
|
||||||
|
return <Deactivated />
|
||||||
|
}
|
||||||
if (onboardingState.isActive) {
|
if (onboardingState.isActive) {
|
||||||
return <Onboarding />
|
return <Onboarding />
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user