import React from 'react' import {Pressable, StyleSheet, View} from 'react-native' import {MeasuredDimensions, runOnJS, runOnUI} from 'react-native-reanimated' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' import {BACK_HITSLOP} from '#/lib/constants' import {measureHandle, useHandleRef} from '#/lib/hooks/useHandleRef' import {usePalette} from '#/lib/hooks/usePalette' import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' import {makeProfileLink} from '#/lib/routes/links' import {NavigationProp} from '#/lib/routes/types' import {sanitizeHandle} from '#/lib/strings/handles' import {isNative} from '#/platform/detection' import {emitSoftReset} from '#/state/events' import {useLightboxControls} from '#/state/lightbox' import {useSetDrawerOpen} from '#/state/shell' import {Menu_Stroke2_Corner0_Rounded as Menu} from '#/components/icons/Menu' import {StarterPack} from '#/components/icons/StarterPack' import {TextLink} from '../util/Link' import {LoadingPlaceholder} from '../util/LoadingPlaceholder' import {Text} from '../util/text/Text' import {UserAvatar, UserAvatarType} from '../util/UserAvatar' import {CenteredView} from '../util/Views' export function ProfileSubpageHeader({ isLoading, href, title, avatar, isOwner, creator, avatarType, children, }: React.PropsWithChildren<{ isLoading?: boolean href: string title: string | undefined avatar: string | undefined isOwner: boolean | undefined creator: | { did: string handle: string } | undefined avatarType: UserAvatarType | 'starter-pack' }>) { const setDrawerOpen = useSetDrawerOpen() const navigation = useNavigation() const {_} = useLingui() const {isMobile} = useWebMediaQueries() const {openLightbox} = useLightboxControls() const pal = usePalette('default') const canGoBack = navigation.canGoBack() const aviRef = useHandleRef() const onPressBack = React.useCallback(() => { if (navigation.canGoBack()) { navigation.goBack() } else { navigation.navigate('Home') } }, [navigation]) const onPressMenu = React.useCallback(() => { setDrawerOpen(true) }, [setDrawerOpen]) const _openLightbox = React.useCallback( (uri: string, thumbRect: MeasuredDimensions | null) => { openLightbox({ images: [ { uri, thumbUri: uri, thumbRect, dimensions: { // It's fine if it's actually smaller but we know it's 1:1. height: 1000, width: 1000, }, thumbDimensions: null, type: 'rect-avi', }, ], index: 0, }) }, [openLightbox], ) const onPressAvi = React.useCallback(() => { if ( avatar // TODO && !(view.moderation.avatar.blur && view.moderation.avatar.noOverride) ) { const aviHandle = aviRef.current runOnUI(() => { 'worklet' const rect = measureHandle(aviHandle) runOnJS(_openLightbox)(avatar, rect) })() } }, [_openLightbox, avatar, aviRef]) return ( {isMobile && ( {canGoBack ? ( ) : ( )} {children} )} {avatarType === 'starter-pack' ? ( ) : ( )} {isLoading ? ( ) : ( )} {isLoading ? ( ) : ( {!creator ? ( by — ) : isOwner ? ( by you ) : ( by{' '} )} )} {!isMobile && ( {children} )} ) } const styles = StyleSheet.create({ backBtn: { width: 20, height: 30, }, backBtnWide: { width: 20, height: 30, marginRight: 4, }, backIcon: { marginTop: 6, }, })