From 007742af236a5e21b18fac5e5535cb2961a368bf Mon Sep 17 00:00:00 2001 From: khalilcodes Date: Mon, 13 Jun 2022 00:44:35 +0300 Subject: [PATCH] [site/components][md]: refactor twitter embed component and modify styles for mobile --- site/components/TwitterEmbed.js | 83 +++++++++++++++++---------------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/site/components/TwitterEmbed.js b/site/components/TwitterEmbed.js index d5b0f59..6f35ffd 100644 --- a/site/components/TwitterEmbed.js +++ b/site/components/TwitterEmbed.js @@ -1,65 +1,64 @@ import { useEffect, useState, useRef } from "react"; const twitterWidgetJs = "https://platform.twitter.com/widgets.js"; -const message = "Loading tweet..." +const message = "Loading tweet..."; -export default function TwitterEmbed({ url }) { - let ref = useRef(null) +export default function TwitterEmbed({ url, ...props }) { + let ref = useRef(null); const [state, setState] = useState({ isLoading: true, - message: message - }) - - const tweetId = url.split("status/").pop() + message: message, + }); - var callbacks = []; + const tweetId = url.split("status/").pop(); - const loadScript = (src, cb) => { - if (callbacks.length === 0) { - callbacks.push(cb); - var s = document.createElement("script"); - s.setAttribute("src", src); - s.setAttribute("async", "true"); - s.onload = () => callbacks.forEach((cb) => cb()); - document.head.appendChild(s); - } else { - callbacks.push(cb); - } - } + const renderTweet = () => { + window.twttr.widgets + .createTweet(tweetId, ref.current, { + theme: "dark", + }) + .then((el) => { + if (el) return setState((prev) => ({ ...prev, isLoading: false })); + return setState((prev) => ({ + ...prev, + message: null + })); + }); + return window.twttr.widgets.load(ref.current); + }; useEffect(() => { - if (!ref.current) return; + let componentMounted = true; - const renderTweet = () => { - window.twttr.widgets.createTweet(tweetId, ref.current, { - theme: "dark" - }).then((el) => { - if (el) return setState(prev => ({ ...prev, isLoading: false })) - return setState(prev => ({ ...prev, message: "Sorry, this tweet could not be found." })) - }) - } + const script = document.createElement("script"); + script.src = twitterWidgetJs; + script.async = true; + script.onload = () => renderTweet(); - if (!window.twttr) { - loadScript(twitterWidgetJs, renderTweet) - } else { - renderTweet() + if (componentMounted) { + if (!window.twttr) { + document.head.appendChild(script); + } else { + renderTweet(); + } } return () => { - setState(prev => ({ ...prev, isLoading: true })); + setState({ isLoading: true, message: message }); + componentMounted = false; }; - },[]); + }, []); return ( <> - {state.isLoading && ( -
-
+ {state.isLoading && state.message && ( +
+
Twitter -

{state.message}

+
+ {state.message} +
-
@@ -92,6 +92,7 @@ export default function TwitterEmbed({ url }) {
)}
+ {!state.message &&

} ); }