import menuInstance from '@components/contextMenu/instance' import menuShare from '@components/contextMenu/share' import menuStatus from '@components/contextMenu/status' import TimelineActioned from '@components/Timeline/Shared/Actioned' import TimelineActions from '@components/Timeline/Shared/Actions' import TimelineAttachment from '@components/Timeline/Shared/Attachment' import TimelineAvatar from '@components/Timeline/Shared/Avatar' import TimelineCard from '@components/Timeline/Shared/Card' import TimelineContent from '@components/Timeline/Shared/Content' import TimelineHeaderDefault from '@components/Timeline/Shared/HeaderDefault' import TimelinePoll from '@components/Timeline/Shared/Poll' import { useNavigation } from '@react-navigation/native' import { StackNavigationProp } from '@react-navigation/stack' import { TabLocalStackParamList } from '@utils/navigation/navigators' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { getInstanceAccount } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useRef, useState } from 'react' import { Pressable, StyleProp, View, ViewStyle } from 'react-native' import { useSelector } from 'react-redux' import * as ContextMenu from 'zeego/context-menu' import StatusContext from './Shared/Context' import TimelineFeedback from './Shared/Feedback' import TimelineFiltered, { shouldFilter } from './Shared/Filtered' import TimelineFullConversation from './Shared/FullConversation' import TimelineHeaderAndroid from './Shared/HeaderAndroid' import TimelineTranslate from './Shared/Translate' export interface Props { item: Mastodon.Status & { _pinned?: boolean } // For account page, internal property queryKey?: QueryKeyTimeline rootQueryKey?: QueryKeyTimeline highlighted?: boolean disableDetails?: boolean disableOnPress?: boolean isConversation?: boolean } // When the poll is long const TimelineDefault: React.FC = ({ item, queryKey, rootQueryKey, highlighted = false, disableDetails = false, disableOnPress = false, isConversation = false }) => { const { colors } = useTheme() const navigation = useNavigation>() const instanceAccount = useSelector(getInstanceAccount, () => true) const status = item.reblog ? item.reblog : item const ownAccount = status.account?.id === instanceAccount?.id const [spoilerExpanded, setSpoilerExpanded] = useState( instanceAccount?.preferences?.['reading:expand:spoilers'] || false ) const spoilerHidden = status.spoiler_text?.length ? !instanceAccount?.preferences?.['reading:expand:spoilers'] && !spoilerExpanded : false const copiableContent = useRef<{ content: string; complete: boolean }>({ content: '', complete: false }) const detectedLanguage = useRef(status.language || '') const filtered = queryKey && shouldFilter({ copiableContent, status, queryKey }) if (queryKey && filtered && !highlighted) { return } const mainStyle: StyleProp = { flex: 1, padding: disableDetails ? StyleConstants.Spacing.Global.PagePadding / 1.5 : StyleConstants.Spacing.Global.PagePadding, backgroundColor: colors.backgroundDefault, paddingBottom: disableDetails ? StyleConstants.Spacing.Global.PagePadding / 1.5 : 0 } const main = () => ( <> {item.reblog ? ( ) : item._pinned ? ( ) : null} ) const mShare = menuShare({ visibility: status.visibility, type: 'status', url: status.url || status.uri, copiableContent }) const mStatus = menuStatus({ status, queryKey, rootQueryKey }) const mInstance = menuInstance({ status, queryKey, rootQueryKey }) return ( {disableOnPress ? ( {main()} ) : ( <> navigation.push('Tab-Shared-Toot', { toot: status, rootQueryKey: queryKey }) } onLongPress={() => {}} children={main()} /> {mShare.map((mGroup, index) => ( {mGroup.map(menu => ( ))} ))} {mStatus.map((mGroup, index) => ( {mGroup.map(menu => ( ))} ))} {mInstance.map((mGroup, index) => ( {mGroup.map(menu => ( ))} ))} )} ) } export default TimelineDefault