import ComponentAccount from '@components/Account' import GracefullyImage from '@components/GracefullyImage' import openLink from '@components/openLink' import CustomText from '@components/Text' import { matchAccount, matchStatus } from '@helpers/urlMatcher' import { useNavigation } from '@react-navigation/native' import { useAccountQuery } from '@utils/queryHooks/account' import { useSearchQuery } from '@utils/queryHooks/search' import { useStatusQuery } from '@utils/queryHooks/status' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useContext, useEffect, useState } from 'react' import { Pressable, StyleSheet, Text, View } from 'react-native' import { Circle } from 'react-native-animated-spinkit' import TimelineDefault from '../Default' import StatusContext from './Context' const TimelineCard: React.FC = () => { const { status, spoilerHidden, disableDetails } = useContext(StatusContext) if (!status || !status.card) return null const { colors } = useTheme() const navigation = useNavigation() const [loading, setLoading] = useState(false) const isStatus = matchStatus(status.card.url) const [foundStatus, setFoundStatus] = useState() const isAccount = matchAccount(status.card.url) const [foundAccount, setFoundAccount] = useState() const searchQuery = useSearchQuery({ type: (() => { if (isStatus) return 'statuses' if (isAccount) return 'accounts' })(), term: (() => { if (isStatus) { if (isStatus.sameInstance) { return } else { return status.card.url } } if (isAccount) { if (isAccount.sameInstance) { if (isAccount.style === 'default') { return } else { return isAccount.username } } else { return status.card.url } } })(), limit: 1, options: { enabled: false } }) const statusQuery = useStatusQuery({ id: isStatus?.id || '', options: { enabled: false } }) useEffect(() => { if (isStatus) { setLoading(true) if (isStatus.sameInstance) { statusQuery .refetch() .then(res => { res.data && setFoundStatus(res.data) setLoading(false) }) .catch(() => setLoading(false)) } else { searchQuery .refetch() .then(res => { const status = (res.data as any)?.statuses?.[0] status && setFoundStatus(status) setLoading(false) }) .catch(() => setLoading(false)) } } }, []) const accountQuery = useAccountQuery({ id: isAccount?.style === 'default' ? isAccount.id : '', options: { enabled: false } }) useEffect(() => { if (isAccount) { setLoading(true) if (isAccount.sameInstance && isAccount.style === 'default') { accountQuery .refetch() .then(res => { res.data && setFoundAccount(res.data) setLoading(false) }) .catch(() => setLoading(false)) } else { searchQuery .refetch() .then(res => { const account = (res.data as any)?.accounts?.[0] account && setFoundAccount(account) setLoading(false) }) .catch(() => setLoading(false)) } } }, []) const cardContent = () => { if (loading) { return ( ) } if (isStatus && foundStatus) { return } if (isAccount && foundAccount) { return } return ( <> {status.card?.image ? ( ) : null} {status.card?.title} {status.card?.description ? ( {status.card.description} ) : null} {status.card?.url} ) } if (spoilerHidden || disableDetails) return null return ( status.card && (await openLink(status.card.url, navigation))} children={cardContent()} /> ) } export default TimelineCard