clean up mastodon

This commit is contained in:
Wes Bos 2024-05-28 12:21:20 -04:00
parent 4626abc17a
commit 69ba8b1118
3 changed files with 38226 additions and 35 deletions

38201
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -13,46 +13,30 @@ export default function Person({ person }) {
const unavatar = person.twitter const unavatar = person.twitter
? `${twitter}?fallback=${website}&ttl=28d` ? `${twitter}?fallback=${website}&ttl=28d`
: website; : website;
// const img = `https://images.weserv.nl/?url=${unavatar}&w=100&l=9&af&il&n=-1`; const [_, mastodonHandle, mastodonServer] = person.mastodon?.split('@') || [];
const mastodonArr = person.mastodon
? person.mastodon.replace('@', '').split('@')
: null;
const webfinger =
person.mastodon
? JSON.parse(`https://${mastodonArr[0]}/.well-known/webfinger?resource=https://${mastodonArr[0]}/@${mastodonArr[1]}`)
: null;
const wfIndex =
person.mastodon && webfinger
? webfinger.links.findIndex((link) => link.rel === 'http://webfinger.net/rel/avatar')
: null;
const wfAvatar =
person.mastodon && wfIndex
? webfinger.links[wfIndex].href
: website;
const img = person.twitter ? unavatar : (person.mastodon ? wfAvatar : website);
const { tag: currentTag } = useParams(); const { tag: currentTag } = useParams();
return ( return (
<div <div
className="PersonWrapper" className="PersonWrapper"
style={{ contentVisibility: 'auto', containIntrinsicHeight: '560px' }} style={{ contentVisibility: "auto", containIntrinsicHeight: "560px" }}
> >
<div className="PersonInner"> <div className="PersonInner">
<header> <header>
<img <img
width="50" width="50"
height="50" height="50"
src={img} src={unavatar}
alt={person.name} alt={person.name}
onError={({ currentTarget }) => { onError={({ currentTarget }) => {
currentTarget.onerror = null; // prevents looping currentTarget.onerror = null; // prevents looping
currentTarget.src = '/default.png'; currentTarget.src = "/default.png";
}} }}
loading="lazy" loading="lazy"
/> />
<h3> <h3>
<a href={person.url} target="_blank" rel="noopener noreferrer"> <a href={person.url} target="_blank" rel="noopener noreferrer">
{person.name} {person.name}
</a>{' '} </a>{" "}
{person.emoji} {person.emoji}
</h3> </h3>
<a <a
@ -62,14 +46,14 @@ export default function Person({ person }) {
href={person.url} href={person.url}
> >
{url.host} {url.host}
{url.pathname.replace(/\/$/, '')} {url.pathname.replace(/\/$/, "")}
</a> </a>
</header> </header>
<p>{person.description}</p> <p>{person.description}</p>
<ul className="Tags"> <ul className="Tags">
{person.tags.map((tag) => ( {person.tags.map((tag) => (
<li <li
className={`Tag small ${tag === currentTag ? 'currentTag' : ''}`} className={`Tag small ${tag === currentTag ? "currentTag" : ""}`}
key={tag} key={tag}
> >
{tag} {tag}
@ -96,23 +80,29 @@ export default function Person({ person }) {
</span> </span>
)} )}
{(person.twitter || person.mastodon) && ( {person.twitter && (
<div className="SocialHandle"> <div className="SocialHandle">
<a <a
href={ href={`https://twitter.com/${person.twitter.replace("@", "")}`}
person.twitter
? `https://twitter.com/${person.twitter.replace('@', '')}`
: `https://${mastodonArr[1]}/@${mastodonArr[0]}`
}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<span className="at">@</span> <span className="at">@</span>
{ {person.twitter.replace("@", "")}
person.twitter </a>
? person.twitter.replace('@', '') </div>
: `${mastodonArr[1]}/@${mastodonArr[0]}` )}
}
{/* If they have a mastodon, and no twitter, show that */}
{person.mastodon && !person.twitter && (
<div className="SocialHandle">
<a
href={`https://${mastodonServer}/@${mastodonHandle}`}
target="_blank"
rel="noopener noreferrer"
>
<span className="at">@</span>
{mastodonHandle}
</a> </a>
</div> </div>
)} )}

View file

@ -12,7 +12,7 @@ export async function loader({ params }: LoaderArgs) {
} }
export default function Index() { export default function Index() {
const { people } = useLoaderData(); const { people } = useLoaderData<ReturnType<typeof loader>>();
return ( return (
<> <>
<Topics /> <Topics />