import { VolumeMute, MicrophoneOff } from "@styled-icons/boxicons-solid"; import { observer } from "mobx-react-lite"; import { useParams } from "react-router-dom"; import { Masquerade } from "revolt-api/types/Channels"; import { Presence } from "revolt-api/types/Users"; import { User } from "revolt.js/dist/maps/Users"; import styled, { css } from "styled-components/macro"; import { useApplicationState } from "../../../mobx/State"; import { useClient } from "../../../context/revoltjs/RevoltClient"; import fallback from "../assets/user.png"; import IconBase, { IconBaseProps } from "../IconBase"; type VoiceStatus = "muted" | "deaf"; interface Props extends IconBaseProps { status?: boolean; voice?: VoiceStatus; masquerade?: Masquerade; showServerIdentity?: boolean; } export function useStatusColour(user?: User) { const theme = useApplicationState().settings.theme; return user?.online && user?.status?.presence !== Presence.Invisible ? user?.status?.presence === Presence.Idle ? theme.getVariable("status-away") : user?.status?.presence === Presence.Busy ? theme.getVariable("status-busy") : theme.getVariable("status-online") : theme.getVariable("status-invisible"); } const VoiceIndicator = styled.div<{ status: VoiceStatus }>` width: 10px; height: 10px; border-radius: var(--border-radius-half); display: flex; align-items: center; justify-content: center; ${(props) => (props.status === "muted" || props.status === "deaf") && css` background: var(--error); `} `; export default observer( ( props: Props & Omit< JSX.SVGAttributes, keyof Props | "children" | "as" >, ) => { const client = useClient(); const { target, attachment, size, status, animate, mask, hover, showServerIdentity, masquerade, innerRef, ...svgProps } = props; let { url } = props; if (masquerade?.avatar) { url = masquerade.avatar; } else if (!url) { let override; if (target && showServerIdentity) { const { server } = useParams<{ server?: string }>(); if (server) { const member = client.members.getKey({ server, user: target._id, }); if (member?.avatar) { override = member?.avatar; } } } url = client.generateFileURL( override ?? target?.avatar ?? attachment, { max_side: 256 }, animate, ) ?? (target ? target.defaultAvatarURL : fallback); } return ( ); }, );