import { Money } from "@styled-icons/boxicons-regular"; import { Envelope, Edit, UserPlus, Shield } from "@styled-icons/boxicons-solid"; import { Link, useHistory } from "react-router-dom"; import { Users } from "revolt.js/dist/api/objects"; import { UserPermission } from "revolt.js/dist/api/permissions"; import { Route } from "revolt.js/dist/api/routes"; import { decodeTime } from "ulid"; import styles from "./UserProfile.module.scss"; import { Localizer, Text } from "preact-i18n"; import { useContext, useEffect, useLayoutEffect, useState } from "preact/hooks"; import { useData } from "../../../mobx/State"; import ChannelIcon from "../../../components/common/ChannelIcon"; import Tooltip from "../../../components/common/Tooltip"; import UserIcon from "../../../components/common/user/UserIcon"; import UserStatus from "../../../components/common/user/UserStatus"; import IconButton from "../../../components/ui/IconButton"; import Modal from "../../../components/ui/Modal"; import Preloader from "../../../components/ui/Preloader"; import Markdown from "../../../components/markdown/Markdown"; import { AppContext, ClientStatus, StatusContext, useClient, } from "../../revoltjs/RevoltClient"; import { useChannels, useForceUpdate, useUserPermission, } from "../../revoltjs/hooks"; import { useIntermediate } from "../Intermediate"; interface Props { user_id: string; dummy?: boolean; onClose: () => void; dummyProfile?: Users.Profile; } enum Badges { Developer = 1, Translator = 2, Supporter = 4, ResponsibleDisclosure = 8, EarlyAdopter = 256, } export function UserProfile({ user_id, onClose, dummy, dummyProfile }: Props) { const { openScreen, writeClipboard } = useIntermediate(); const [profile, setProfile] = useState( undefined, ); const [mutual, setMutual] = useState< undefined | null | Route<"GET", "/users/id/mutual">["response"] >(undefined); const history = useHistory(); const client = useClient(); const status = useContext(StatusContext); const [tab, setTab] = useState("profile"); const ctx = useForceUpdate(); const channels = useChannels(undefined, ctx); const permissions = useUserPermission(client.user!._id, ctx); const store = useData(); if (!store.users.has(user_id)) { useEffect(onClose, []); return null; } const user = store.users.get(user_id)!; const users = mutual?.users.map((id) => store.users.get(id)); useLayoutEffect(() => { if (!user_id) return; if (typeof profile !== "undefined") setProfile(undefined); if (typeof mutual !== "undefined") setMutual(undefined); }, [user_id]); if (dummy) { useLayoutEffect(() => { setProfile(dummyProfile); }, [dummyProfile]); } useEffect(() => { if (dummy) return; if (status === ClientStatus.ONLINE && typeof mutual === "undefined") { setMutual(null); client.users.fetchMutual(user_id).then((data) => setMutual(data)); } }, [mutual, status]); useEffect(() => { if (dummy) return; if (status === ClientStatus.ONLINE && typeof profile === "undefined") { setProfile(null); if (permissions & UserPermission.ViewProfile) { client.users .fetchProfile(user_id) .then((data) => setProfile(data)) .catch(() => {}); } } }, [profile, status]); const mutualGroups = channels.filter( (channel) => channel?.channel_type === "Group" && channel.recipients.includes(user_id), ); const backgroundURL = profile && client.users.getBackgroundURL(profile, { width: 1000 }, true); const badges = (user.badges ?? 0) | (decodeTime(user._id) < 1623751765790 ? Badges.EarlyAdopter : 0); return (
writeClipboard(user.username)}> @{user.username} {user.status?.text && ( )}
{user.relationship === Users.Relationship.Friend && ( }> { onClose(); history.push(`/open/${user_id}`); }}> )} {user.relationship === Users.Relationship.User && ( { onClose(); if (dummy) return; history.push(`/settings/profile`); }}> )} {(user.relationship === Users.Relationship.Incoming || user.relationship === Users.Relationship.None) && ( client.users.addFriend(user.username) }> )}
setTab("profile")}>
{user.relationship !== Users.Relationship.User && ( <>
setTab("friends")}>
setTab("groups")}>
)}
{tab === "profile" && (
{!(profile?.content || badges > 0) && (
)} {badges > 0 && (
)} {badges > 0 && (
{badges & Badges.Developer ? ( }> ) : ( <> )} {badges & Badges.Translator ? ( }> ) : ( <> )} {badges & Badges.EarlyAdopter ? ( }> ) : ( <> )} {badges & Badges.Supporter ? ( }> ) : ( <> )} {badges & Badges.ResponsibleDisclosure ? ( }> ) : ( <> )}
)} {profile?.content && (
)} {/*
*/}
)} {tab === "friends" && (users ? (
{users.length === 0 ? (
) : ( users.map( (x) => x && (
openScreen({ id: "profile", user_id: x._id, }) } className={styles.entry} key={x._id}> {x.username}
), ) )}
) : ( ))} {tab === "groups" && (
{mutualGroups.length === 0 ? (
) : ( mutualGroups.map( (x) => x?.channel_type === "Group" && (
{x.name}
), ) )}
)}
); }