import React from 'react' import {Pressable, View} from 'react-native' import {MeasuredDimensions, runOnJS, runOnUI} from 'react-native-reanimated' import {AppBskyGraphDefs} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' 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 {emitSoftReset} from '#/state/events' import {useLightboxControls} from '#/state/lightbox' import {TextLink} from '#/view/com/util/Link' import {LoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder' import {Text} from '#/view/com/util/text/Text' import {UserAvatar, UserAvatarType} from '#/view/com/util/UserAvatar' import {StarterPack} from '#/components/icons/StarterPack' import * as Layout from '#/components/Layout' export function ProfileSubpageHeader({ isLoading, href, title, avatar, isOwner, purpose, creator, avatarType, children, }: React.PropsWithChildren<{ isLoading?: boolean href: string title: string | undefined avatar: string | undefined isOwner: boolean | undefined purpose: AppBskyGraphDefs.ListPurpose | undefined creator: | { did: string handle: string } | undefined avatarType: UserAvatarType | 'starter-pack' }>) { const navigation = useNavigation() const {_} = useLingui() const {isMobile} = useWebMediaQueries() const {openLightbox} = useLightboxControls() const pal = usePalette('default') const canGoBack = navigation.canGoBack() const aviRef = useHandleRef() 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 ( <> {canGoBack ? ( ) : ( )} {children} {avatarType === 'starter-pack' ? ( ) : ( )} {isLoading ? ( ) : ( )} {isLoading || !creator ? ( ) : ( {purpose === 'app.bsky.graph.defs#curatelist' ? ( isOwner ? ( List by you ) : ( List by{' '} ) ) : purpose === 'app.bsky.graph.defs#modlist' ? ( isOwner ? ( Moderation list by you ) : ( Moderation list by{' '} ) ) : purpose === 'app.bsky.graph.defs#referencelist' ? ( isOwner ? ( Starter pack by you ) : ( Starter pack by{' '} ) ) : null} )} ) }