import contextMenuAccount from '@components/ContextMenu/account' import contextMenuInstance from '@components/ContextMenu/instance' import contextMenuShare from '@components/ContextMenu/share' import contextMenuStatus from '@components/ContextMenu/status' import Icon from '@components/Icon' import { RelationshipIncoming, RelationshipOutgoing } from '@components/Relationship' import { useActionSheet } from '@expo/react-native-action-sheet' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useMemo } from 'react' import { Pressable, View } from 'react-native' import { ContextMenuAction } from 'react-native-context-menu-view' import HeaderSharedAccount from './HeaderShared/Account' import HeaderSharedApplication from './HeaderShared/Application' import HeaderSharedCreated from './HeaderShared/Created' import HeaderSharedMuted from './HeaderShared/Muted' import HeaderSharedVisibility from './HeaderShared/Visibility' export interface Props { queryKey: QueryKeyTimeline notification: Mastodon.Notification } const TimelineHeaderNotification = ({ queryKey, notification }: Props) => { const { colors } = useTheme() const contextMenuActions: ContextMenuAction[] = [] const status = notification.status const shareOnPress = status && status?.visibility !== 'direct' ? contextMenuShare({ actions: contextMenuActions, type: 'status', url: status.url || status.uri }) : null const statusOnPress = status && contextMenuStatus({ actions: contextMenuActions, status: status, queryKey }) const accountOnPress = status && contextMenuAccount({ actions: contextMenuActions, type: 'status', queryKey, id: status.account.id }) const instanceOnPress = status && contextMenuInstance({ actions: contextMenuActions, status: status, queryKey }) const { showActionSheetWithOptions } = useActionSheet() const actions = useMemo(() => { switch (notification.type) { case 'follow': return case 'follow_request': return default: if (notification.status) { return ( showActionSheetWithOptions( { options: contextMenuActions.map(action => action.title), cancelButtonIndex: 999, destructiveButtonIndex: contextMenuActions .map((action, index) => (action.destructive ? index : 999)) .filter(num => num !== 999) }, index => { if (index !== undefined) { for (const on of [ shareOnPress, statusOnPress, accountOnPress, instanceOnPress ]) { on && on(index) } } } ) } children={ } /> ) } } }, [notification.type]) return ( {notification.status?.visibility ? ( ) : null} {actions} ) } export default TimelineHeaderNotification