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, { useEffect, useState } from 'react' import { Pressable, StyleSheet, View } from 'react-native' import { Circle } from 'react-native-animated-spinkit' import TimelineDefault from '../Default' export interface Props { card: Pick } const TimelineCard = React.memo(({ card }: Props) => { const { colors } = useTheme() const navigation = useNavigation() const [loading, setLoading] = useState(false) const isStatus = matchStatus(card.url) const [foundStatus, setFoundStatus] = useState() const isAccount = matchAccount(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 card.url } } if (isAccount) { if (isAccount.sameInstance) { if (isAccount.style === 'default') { return } else { return isAccount.username } } else { return 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 ( <> {card.image ? ( ) : null} {card.title} {card.description ? ( {card.description} ) : null} {card.url} ) } return ( await openLink(card.url, navigation)} children={cardContent} /> ) }) export default TimelineCard