This commit is contained in:
Samuel Newman
2025-05-10 00:06:06 +03:00
committed by GitHub
parent 2e80fa3dac
commit a0bd804262
45 changed files with 2021 additions and 451 deletions
+3
View File
@@ -5,6 +5,7 @@ import {msg, Plural, plural, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {StackActions, useNavigation} from '@react-navigation/native'
import {useActorStatus} from '#/lib/actor-status'
import {FEEDBACK_FORM_URL, HELP_DESK_URL} from '#/lib/constants'
import {type PressableScale} from '#/lib/custom-animations/PressableScale'
import {useNavigationTabState} from '#/lib/hooks/useNavigationTabState'
@@ -67,6 +68,7 @@ let DrawerProfileCard = ({
const t = useTheme()
const {data: profile} = useProfileQuery({did: account.did})
const verification = useSimpleVerificationState({profile})
const {isActive: live} = useActorStatus(profile)
return (
<TouchableOpacity
@@ -81,6 +83,7 @@ let DrawerProfileCard = ({
// See https://github.com/bluesky-social/social-app/pull/1801:
usePlainRNImage={true}
type={profile?.associated?.labeler ? 'labeler' : 'user'}
live={live}
/>
<View style={[a.gap_2xs]}>
<View style={[a.flex_row, a.align_center, a.gap_xs, a.flex_1]}>
+20 -4
View File
@@ -7,6 +7,7 @@ import {useLingui} from '@lingui/react'
import {type BottomTabBarProps} from '@react-navigation/bottom-tabs'
import {StackActions} from '@react-navigation/native'
import {useActorStatus} from '#/lib/actor-status'
import {PressableScale} from '#/lib/custom-animations/PressableScale'
import {BOTTOM_BAR_AVI} from '#/lib/demo'
import {useHaptics} from '#/lib/haptics'
@@ -127,6 +128,7 @@ export function BottomBar({navigation}: BottomTabBarProps) {
}, [accountSwitchControl, playHaptic])
const [demoMode] = useDemoMode()
const {isActive: live} = useActorStatus(profile)
return (
<>
@@ -260,25 +262,39 @@ export function BottomBar({navigation}: BottomTabBarProps) {
pal.text,
styles.profileIcon,
styles.onProfile,
{borderColor: pal.text.color},
{
borderColor: pal.text.color,
borderWidth: live ? 0 : 1,
},
]}>
<UserAvatar
avatar={demoMode ? BOTTOM_BAR_AVI : profile?.avatar}
size={iconWidth - 3}
size={iconWidth - 2}
// See https://github.com/bluesky-social/social-app/pull/1801:
usePlainRNImage={true}
type={profile?.associated?.labeler ? 'labeler' : 'user'}
live={live}
hideLiveBadge
/>
</View>
) : (
<View
style={[styles.ctrlIcon, pal.text, styles.profileIcon]}>
style={[
styles.ctrlIcon,
pal.text,
styles.profileIcon,
{
borderWidth: live ? 0 : 1,
},
]}>
<UserAvatar
avatar={demoMode ? BOTTOM_BAR_AVI : profile?.avatar}
size={iconWidth - 3}
size={iconWidth - 2}
// See https://github.com/bluesky-social/social-app/pull/1801:
usePlainRNImage={true}
type={profile?.associated?.labeler ? 'labeler' : 'user'}
live={live}
hideLiveBadge
/>
</View>
)}
+47 -29
View File
@@ -9,6 +9,7 @@ import {
useNavigationState,
} from '@react-navigation/native'
import {useActorStatus} from '#/lib/actor-status'
import {useAccountSwitcher} from '#/lib/hooks/useAccountSwitcher'
import {useOpenComposer} from '#/lib/hooks/useOpenComposer'
import {usePalette} from '#/lib/hooks/usePalette'
@@ -100,6 +101,8 @@ function ProfileCard() {
profile: profiles?.find(p => p.did === account.did),
}))
const {isActive: live} = useActorStatus(profile)
return (
<View style={[a.my_md, !leftNavMinimal && [a.w_full, a.align_start]]}>
{!isLoading && profile ? (
@@ -142,6 +145,7 @@ function ProfileCard() {
avatar={profile.avatar}
size={size}
type={profile?.associated?.labeler ? 'labeler' : 'user'}
live={live}
/>
</View>
{!leftNavMinimal && (
@@ -226,7 +230,6 @@ function SwitchMenuItems({
signOutPromptControl: DialogControlProps
}) {
const {_} = useLingui()
const {onPressSwitchAccount, pendingDid} = useAccountSwitcher()
const {setShowLoggedOut} = useLoggedOutViewControls()
const closeEverything = useCloseAllActiveElements()
@@ -243,35 +246,11 @@ function SwitchMenuItems({
<Trans>Switch account</Trans>
</Menu.LabelText>
{accounts.map(other => (
<Menu.Item
disabled={!!pendingDid}
style={[{minWidth: 150}]}
<SwitchMenuItem
key={other.account.did}
label={_(
msg`Switch to ${sanitizeHandle(
other.profile?.handle ?? other.account.handle,
'@',
)}`,
)}
onPress={() =>
onPressSwitchAccount(other.account, 'SwitchAccount')
}>
<View style={[{marginLeft: tokens.space._2xs * -1}]}>
<UserAvatar
avatar={other.profile?.avatar}
size={20}
type={
other.profile?.associated?.labeler ? 'labeler' : 'user'
}
/>
</View>
<Menu.ItemText>
{sanitizeHandle(
other.profile?.handle ?? other.account.handle,
'@',
)}
</Menu.ItemText>
</Menu.Item>
account={other.account}
profile={other.profile}
/>
))}
</Menu.Group>
<Menu.Divider />
@@ -295,6 +274,45 @@ function SwitchMenuItems({
)
}
function SwitchMenuItem({
account,
profile,
}: {
account: SessionAccount
profile: AppBskyActorDefs.ProfileViewDetailed | undefined
}) {
const {_} = useLingui()
const {onPressSwitchAccount, pendingDid} = useAccountSwitcher()
const {isActive: live} = useActorStatus(profile)
return (
<Menu.Item
disabled={!!pendingDid}
style={[a.gap_sm, {minWidth: 150}]}
key={account.did}
label={_(
msg`Switch to ${sanitizeHandle(
profile?.handle ?? account.handle,
'@',
)}`,
)}
onPress={() => onPressSwitchAccount(account, 'SwitchAccount')}>
<View>
<UserAvatar
avatar={profile?.avatar}
size={20}
type={profile?.associated?.labeler ? 'labeler' : 'user'}
live={live}
hideLiveBadge
/>
</View>
<Menu.ItemText>
{sanitizeHandle(profile?.handle ?? account.handle, '@')}
</Menu.ItemText>
</Menu.Item>
)
}
interface NavItemProps {
count?: string
hasNew?: boolean