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 { checkInstanceFeature, 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, { FilteredProps, shouldFilter } from './Shared/Filtered' import TimelineFullConversation from './Shared/FullConversation' import TimelineHeaderAndroid from './Shared/HeaderAndroid' export interface Props { notification: Mastodon.Notification queryKey: QueryKeyTimeline } const TimelineNotifications: React.FC = ({ notification, queryKey }) => { const instanceAccount = useSelector(getInstanceAccount, () => true) const status = notification.status?.reblog ? notification.status.reblog : notification.status const account = notification.type === 'admin.report' ? notification.report.target_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 { 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 }) const mStatus = menuStatus({ status: notification.status, queryKey }) const mInstance = menuInstance({ status: notification.status, queryKey }) if (!ownAccount) { let filterResults: FilteredProps['filterResults'] = [] const [filterRevealed, setFilterRevealed] = useState(false) const hasFilterServerSide = useSelector(checkInstanceFeature('filter_server_side')) if (notification.status) { if (hasFilterServerSide) { if (notification.status.filtered?.length) { filterResults = notification.status.filtered.map(filter => filter.filter) } } else { const checkFilter = shouldFilter({ queryKey, status: notification.status }) if (checkFilter?.length) { filterResults = checkFilter } } if (filterResults?.length && !filterRevealed) { return !filterResults.filter(result => result.filter_action === 'hide').length ? ( setFilterRevealed(!filterRevealed)}> ) : null } } } 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