diff --git a/src/context/intermediate/popovers/UserProfile.tsx b/src/context/intermediate/popovers/UserProfile.tsx index ef4a64db..7897316b 100644 --- a/src/context/intermediate/popovers/UserProfile.tsx +++ b/src/context/intermediate/popovers/UserProfile.tsx @@ -9,6 +9,8 @@ import styles from "./UserProfile.module.scss"; import { Localizer, Text } from "preact-i18n"; import { useContext, useEffect, useLayoutEffect, useState } from "preact/hooks"; +import { noop } from "../../../lib/js"; + import ChannelIcon from "../../../components/common/ChannelIcon"; import ServerIcon from "../../../components/common/ServerIcon"; import Tooltip from "../../../components/common/Tooltip"; @@ -16,6 +18,7 @@ import UserBadges from "../../../components/common/user/UserBadges"; import UserIcon from "../../../components/common/user/UserIcon"; import { Username } from "../../../components/common/user/UserShort"; import UserStatus from "../../../components/common/user/UserStatus"; +import Button from "../../../components/ui/Button"; import IconButton from "../../../components/ui/IconButton"; import Modal from "../../../components/ui/Modal"; import Overline from "../../../components/ui/Overline"; @@ -36,14 +39,6 @@ interface Props { dummyProfile?: Profile; } -enum Badges { - Developer = 1, - Translator = 2, - Supporter = 4, - ResponsibleDisclosure = 8, - EarlyAdopter = 256, -} - export const UserProfile = observer( ({ user_id, onClose, dummy, dummyProfile }: Props) => { const { openScreen, writeClipboard } = useIntermediate(); @@ -54,6 +49,9 @@ export const UserProfile = observer( const [mutual, setMutual] = useState< undefined | null | Route<"GET", "/users/id/mutual">["response"] >(undefined); + const [isPublicBot, setIsPublicBot] = useState< + undefined | null | boolean + >(); const history = useHistory(); const client = useClient(); @@ -82,6 +80,7 @@ export const UserProfile = observer( if (!user_id) return; if (typeof profile !== "undefined") setProfile(undefined); if (typeof mutual !== "undefined") setMutual(undefined); + if (typeof isPublicBot !== "undefined") setIsPublicBot(undefined); // eslint-disable-next-line }, [user_id]); @@ -111,11 +110,25 @@ export const UserProfile = observer( setProfile(null); if (user.permission & UserPermission.ViewProfile) { - user.fetchProfile().then(setProfile); + user.fetchProfile().then(setProfile).catch(noop); } } }, [profile, status, dummy, user]); + useEffect(() => { + if ( + status === ClientStatus.ONLINE && + user.bot && + typeof isPublicBot === "undefined" + ) { + setIsPublicBot(null); + client.bots + .fetchPublic(user._id) + .then(() => setIsPublicBot(true)) + .catch(noop); + } + }, [isPublicBot, status, user, client.bots]); + const backgroundURL = profile && client.generateFileURL(profile.background, { width: 1000 }, true); @@ -169,6 +182,13 @@ export const UserProfile = observer( )} + {isPublicBot && ( + + + + )} {user.relationship === RelationshipStatus.Friend && (