// TODO dark and light theme import { useEffect, useState, useRef, RefObject } from "react"; const twitterWidgetJs = "https://platform.twitter.com/widgets.js"; enum TweetState { LOADING, LOADED, FAILED, } interface TweetConfig { theme: string; } declare global { interface Window { twttr: { widgets: { createTweet: ( id: string, ref: RefObject, options: TweetConfig ) => Promise; // TODO type load: (ref: RefObject) => void; }; }; } } export default function TwitterEmbed({ url, ...props }) { const ref = useRef(null); const [tweetState, setTweetState] = useState(TweetState.LOADING); const tweetId = url.split("status/").pop(); useEffect(() => { const renderTweet = () => { window.twttr.widgets .createTweet(tweetId, ref.current as any, { theme: "dark", }) .then((el) => { if (el) { setTweetState(TweetState.LOADED); } else { setTweetState(TweetState.FAILED); } }); return window.twttr.widgets.load(ref.current as any); }; if (!window.twttr) { const script = document.createElement("script"); script.src = twitterWidgetJs; script.async = true; script.onload = () => renderTweet(); document.head.appendChild(script); } else { renderTweet(); } }, [tweetId]); return ( <> {tweetState === TweetState.LOADING && (
Twitter
{"Loading tweet..."}
)}
); }