import React, { useCallback, useEffect, useMemo, useState } from 'react' import { Pressable, StyleSheet, Text, View } from 'react-native' import { useNavigation } from '@react-navigation/native' import { Feather } from '@expo/vector-icons' import Emojis from './Emojis' import relativeTime from 'src/utils/relativeTime' import { getLocalAccountId, getLocalUrl } from 'src/utils/slices/instancesSlice' import { useTheme } from 'src/utils/styles/ThemeManager' import BottomSheet from 'src/components/BottomSheet' import { useSelector } from 'react-redux' import { StyleConstants } from 'src/utils/styles/constants' import HeaderDefaultActionsAccount from './HeaderDefault/ActionsAccount' import HeaderDefaultActionsStatus from './HeaderDefault/ActionsStatus' import HeaderDefaultActionsDomain from './HeaderDefault/ActionsDomain' export interface Props { queryKey?: App.QueryKey status: Mastodon.Status } const TimelineHeaderDefault: React.FC = ({ queryKey, status }) => { const domain = status.uri ? status.uri.split(new RegExp(/\/\/(.*?)\//))[1] : '' const name = status.account.display_name || status.account.username const emojis = status.account.emojis const account = status.account.acct const { theme } = useTheme() const navigation = useNavigation() const localAccountId = useSelector(getLocalAccountId) const localDomain = useSelector(getLocalUrl) const [since, setSince] = useState(relativeTime(status.created_at)) const [modalVisible, setBottomSheetVisible] = useState(false) // causing full re-render useEffect(() => { setTimeout(() => { setSince(relativeTime(status.created_at)) }, 1000) }, [since]) const onPressAction = useCallback(() => setBottomSheetVisible(true), []) const onPressApplication = useCallback(() => { navigation.navigate('Screen-Shared-Webview', { uri: status.application!.website }) }, []) const pressableAction = useMemo( () => ( ), [] ) return ( {emojis?.length ? ( ) : ( {name} )} @{account} {queryKey && ( )} {since} {status.visibility === 'private' && ( )} {status.application && status.application.name !== 'Web' && ( 发自于 - {status.application.name} )} {queryKey && ( setBottomSheetVisible(false)} > {status.account.id !== localAccountId && ( )} {status.account.id === localAccountId && ( )} {domain !== localDomain && ( )} )} ) } const styles = StyleSheet.create({ base: { flex: 1 }, nameAndAction: { flex: 1, flexBasis: '100%', flexDirection: 'row', alignItems: 'flex-start' }, name: { flexBasis: '85%', flexDirection: 'row' }, nameWithoutEmoji: { fontSize: StyleConstants.Font.Size.M, fontWeight: StyleConstants.Font.Weight.Bold }, action: { flex: 1, flexDirection: 'row', justifyContent: 'center' }, account: { flexShrink: 1, marginLeft: StyleConstants.Spacing.XS }, meta: { flexDirection: 'row', alignItems: 'center', marginTop: StyleConstants.Spacing.XS, marginBottom: StyleConstants.Spacing.S }, created_at: { fontSize: StyleConstants.Font.Size.S }, visibility: { marginLeft: StyleConstants.Spacing.S }, application: { fontSize: StyleConstants.Font.Size.S, marginLeft: StyleConstants.Spacing.S } }) export default React.memo(TimelineHeaderDefault, () => true)