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 TimelineHeaderNotification from '@components/Timeline/Shared/HeaderNotification' 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, { useCallback, useRef, useState } from 'react' import { Pressable, View } from 'react-native' import { useSelector } from 'react-redux' import * as ContextMenu from 'zeego/context-menu' import StatusContext from './Shared/Context' import TimelineFiltered, { shouldFilter } from './Shared/Filtered' import TimelineFullConversation from './Shared/FullConversation' import TimelineHeaderAndroid from './Shared/HeaderAndroid' export interface Props { notification: Mastodon.Notification queryKey: QueryKeyTimeline highlighted?: boolean } const TimelineNotifications: React.FC = ({ notification, queryKey, highlighted = false }) => { const instanceAccount = useSelector(getInstanceAccount, () => true) const status = notification.status?.reblog ? notification.status.reblog : notification.status const account = notification.status ? notification.status.account : notification.account const ownAccount = notification.account?.id === instanceAccount?.id const [spoilerExpanded, setSpoilerExpanded] = useState( instanceAccount.preferences['reading:expand:spoilers'] || false ) const spoilerHidden = notification.status?.spoiler_text?.length ? !instanceAccount.preferences['reading:expand:spoilers'] && !spoilerExpanded : false const copiableContent = useRef<{ content: string; complete: boolean }>({ content: '', complete: false }) const filtered = notification.status && shouldFilter({ copiableContent, status: notification.status, queryKey }) if (notification.status && filtered) { return } const { colors } = useTheme() const navigation = useNavigation>() const onPress = useCallback(() => { notification.status && navigation.push('Tab-Shared-Toot', { toot: notification.status, rootQueryKey: queryKey }) }, []) const main = () => { return ( <> {notification.type !== 'mention' ? ( ) : null} {notification.status ? ( ) : null} ) } const mShare = menuShare({ visibility: notification.status?.visibility, type: 'status', url: notification.status?.url || notification.status?.uri, copiableContent }) const mStatus = menuStatus({ status: notification.status, queryKey }) const mInstance = menuInstance({ status: notification.status, queryKey }) return ( {}} 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 TimelineNotifications