Add profile link to switcher menu (#8867)

* feat(leftnav): add profile link to switcher menu

* fix: close menu on navigate
This commit is contained in:
Inbestigator
2025-08-26 08:18:40 -07:00
committed by GitHub
parent df20ae237e
commit 5a074fa37a
+52
View File
@@ -236,6 +236,7 @@ function SwitchMenuItems({
setShowLoggedOut(true)
closeEverything()
}
return (
<Menu.Outer>
{accounts && accounts.length > 0 && (
@@ -255,6 +256,7 @@ function SwitchMenuItems({
<Menu.Divider />
</>
)}
<SwitcherMenuProfileLink />
<Menu.Item
label={_(msg`Add another account`)}
onPress={onAddAnotherAccount}>
@@ -273,6 +275,56 @@ function SwitchMenuItems({
)
}
function SwitcherMenuProfileLink() {
const {_} = useLingui()
const {currentAccount} = useSession()
const navigation = useNavigation()
const context = Menu.useMenuContext()
const profileLink = currentAccount ? makeProfileLink(currentAccount) : '/'
const [pathName] = useMemo(() => router.matchPath(profileLink), [profileLink])
const currentRouteInfo = useNavigationState(state => {
if (!state) {
return {name: 'Home'}
}
return getCurrentRoute(state)
})
let isCurrent =
currentRouteInfo.name === 'Profile'
? isTab(currentRouteInfo.name, pathName) &&
(currentRouteInfo.params as CommonNavigatorParams['Profile']).name ===
currentAccount?.handle
: isTab(currentRouteInfo.name, pathName)
const onProfilePress = useCallback(
(e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
if (e.ctrlKey || e.metaKey || e.altKey) {
return
}
e.preventDefault()
context.control.close()
if (isCurrent) {
emitSoftReset()
} else {
const [screen, params] = router.matchPath(profileLink)
// @ts-expect-error TODO: type matchPath well enough that it can be plugged into navigation.navigate directly
navigation.navigate(screen, params, {pop: true})
}
},
[navigation, profileLink, isCurrent, context],
)
return (
<Menu.Item
label={_(msg`Go to profile`)}
// @ts-expect-error The function signature differs on web -inb
onPress={onProfilePress}
href={profileLink}>
<Menu.ItemIcon icon={UserCircle} />
<Menu.ItemText>
<Trans>Go to profile</Trans>
</Menu.ItemText>
</Menu.Item>
)
}
function SwitchMenuItem({
account,
profile,