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 { featureCheck } from '@utils/helpers/featureCheck' import { checkIsMyAccount } from '@utils/helpers/isMyAccount' import { TabLocalStackParamList } from '@utils/navigation/navigators' import { usePreferencesQuery } from '@utils/queryHooks/preferences' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { Fragment, useState } from 'react' import { Pressable, View } from 'react-native' 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 { data: preferences } = usePreferencesQuery() 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 isMyAccount = checkIsMyAccount(notification.account?.id) const [spoilerExpanded, setSpoilerExpanded] = useState( preferences?.['reading:expand:spoilers'] || false ) const spoilerHidden = notification.status?.spoiler_text?.length ? !preferences?.['reading:expand:spoilers'] && !spoilerExpanded : false const { colors } = useTheme() const navigation = useNavigation>() 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 (!isMyAccount) { let filterResults: FilteredProps['filterResults'] = [] const [filterRevealed, setFilterRevealed] = useState(false) const hasFilterServerSide = featureCheck('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 ( notification.status && navigation.push('Tab-Shared-Toot', { toot: notification.status }) } onLongPress={() => {}} children={main()} /> {[mShare, mStatus, mInstance].map((menu, i) => ( {menu.map((group, index) => ( {group.map(item => { switch (item.type) { case 'item': return ( {item.icon ? : null} ) case 'sub': return ( // @ts-ignore {item.trigger.icon ? ( ) : null} {item.items.map(sub => ( {sub.icon ? ( ) : null} ))} ) } })} ))} ))} ) } export default React.memo(TimelineNotifications)