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 (
<>
{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
)}
>
);
}