import { APIFetchV1 } from "util/api"; import { FormatDate } from "util/time"; import Navbar from "components/nav/Navbar"; import NavItem from "components/nav/NavItem"; import Divider from "components/util/Divider"; import ExternalLink from "components/util/ExternalLink"; import Icon from "components/util/Icon"; import Muted from "components/util/Muted"; import { UserContext } from "context/UserContext"; import { ClientConfig } from "lib/config"; import React, { useContext, useState } from "react"; import { Button, Form, Modal } from "react-bootstrap"; import { PublicUserDocument } from "tachi-common"; import { SetState } from "types/react"; import ProfileBadges from "./ProfileBadges"; import ProfilePicture from "./ProfilePicture"; export function UserHeaderBody({ reqUser }: { reqUser: PublicUserDocument }) { function ConditionalSocialMediaRender({ mode, href, }: { mode: "discord" | "twitter" | "github" | "steam" | "youtube" | "twitch"; href?: string; }) { if (!reqUser.socialMedia[mode]) { return null; } return (
  • {" "} {reqUser.socialMedia[mode]}
  • ); } return ( <>
    ); } export function UserBottomNav({ baseUrl, reqUser, }: { baseUrl: string; reqUser: PublicUserDocument; }) { const { user } = useContext(UserContext); const isRequestedUser = !!(user && user.id === reqUser.id); const navItems = [ Overview , Games , ]; if (isRequestedUser) { navItems.push( Profile Settings ); navItems.push( Service Integrations ); navItems.push( Imports ); // If mandates login, assume that we also use invite codes. // I'm sure we could set up an elaborate way of doing this by // querying the server, but I just don't care. if (ClientConfig.MANDATE_LOGIN) { navItems.push( Invites ); } } return (
    {navItems}
    ); } function StatusComponent({ reqUser }: { reqUser: PublicUserDocument }) { const { user } = useContext(UserContext); const isRequestedUser = user?.id === reqUser.id; const [modalShow, setModalShow] = useState(false); return (
    {reqUser.status ? ( {reqUser.status} ) : ( {isRequestedUser ? "You have" : `${reqUser.username} has`} no status... )}
    {isRequestedUser && ( setModalShow(true)}> Change Status )}
    {/*
    Last Seen: {MillisToSince(reqUser.lastSeen)}
    */}
    ); } function ChangeStatusModal({ modalShow, setModalShow, reqUser, }: { modalShow: boolean; setModalShow: SetState; reqUser: PublicUserDocument; }) { const [status, setStatus] = useState(reqUser.status); const [innerStatus, setInnerStatus] = useState(reqUser.status ?? ""); return ( setModalShow(false)}> Change Status
    ) => { e.preventDefault(); APIFetchV1( "/users/me", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ status: innerStatus || null, }), }, true, true ).then((r) => { if (r.success) { setStatus(innerStatus); reqUser.status = innerStatus; setModalShow(false); } }); }} >
    setInnerStatus(e.target.value)} />
    ); }