import React, { useState, useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import { name } from 'country-emoji';
import { useParams } from '@remix-run/react';
import * as icons from '../util/icons';
export default function Person({ person }) {
const url = new URL(person.url);
const twitter = person.twitter
? `https://unavatar.io/${person.twitter.replace('@', '')}`
: null;
const website = `https://unavatar.io/${url.host}`;
const unavatar = person.twitter
? `${twitter}?fallback=${website}&ttl=28d`
: website;
const [_, mastodonHandle, mastodonServer] = person.mastodon?.split('@') || [];
const { tag: currentTag } = useParams();
return (
{person.description}
{person.tags.map((tag) => (
-
{tag}
))}
{person.country}
{person.computer && (
)}
{person.phone && (
)}
{person.twitter && (
)}
{/* If they have a mastodon, and no twitter, show that */}
{person.mastodon && !person.twitter && (
)}
);
}
Person.propTypes = {
person: PropTypes.shape({
github: PropTypes.string,
name: PropTypes.string,
url: PropTypes.string,
emoji: PropTypes.string,
description: PropTypes.string,
tags: PropTypes.arrayOf(PropTypes.string),
country: PropTypes.string,
computer: PropTypes.oneOf(['apple', 'windows', 'linux']),
phone: PropTypes.oneOf(['iphone', 'android', 'windowsphone', 'flipphone']),
twitter(props, propName, componentName) {
if (!/^@?(\w){1,15}$/.test(props[propName])) {
return new Error(
`Invalid prop \`${propName}\` supplied to` +
` \`${componentName}\`. This isn't a legit Twitter handle.`
);
}
},
mastodon(props, propName, componentName) {
if (!/^@(\w){1,30}@(\w)+\.(\w)+$/.test(props[propName])) {
return new Error(
`Invalid prop \`${propName}\` supplied to` +
` \`${componentName}\`. This isn't a legit Mastodon handle.`
);
}
},
}),
};