import React, { useCallback, useMemo } from 'react'; import fetchTwetchPost, { TwetchPost } from './data/fetchTwetchPost'; import LinkPreview from './LinkPreview'; import MediaGrid from './MediaGrid'; import TwitterPreview from './TwitterPreview'; import useAsync from './useAsync'; import { genericUrlRegex } from './util'; import clsx from 'clsx'; export interface TwetchRendererProps { txid: string; isQuoted?: boolean; } export default function TwetchRenderer({ txid, isQuoted = false }: TwetchRendererProps) { const fetcher = useCallback(() => fetchTwetchPost(txid), [txid]); const post = useAsync(fetcher); return (
{ window.location.href = `https://twetch.app/t/${txid}`; }} > {post ? ( ) : (
Loading...
)}
); } interface LoadedProps { post: TwetchPost; isQuoted: boolean; } function Loaded({ post: { createdAt, user, text, numLikes, numBranches, bitcoinFilesMedia, quotedTwetch, twitterData, files, }, isQuoted, }: LoadedProps) { const richText = useMemo( () => text.split(genericUrlRegex).map((segment, index) => genericUrlRegex.test(segment) ? ( {segment} ) : ( segment ), ), [], ); const userHref = `https://twetch.app/u/${user.id}`; return ( <>
{user.name}

@{user.id}

{createdAt.toLocaleDateString()}

{richText &&

{richText}

} {bitcoinFilesMedia && } {!files.length /* <-- doesn't really make sense to me but appears to be Twetch's behavior */ && ( )} {quotedTwetch && !isQuoted && }
{!isQuoted && (
{numLikes} Likes
{numBranches} Branches
)} ); }