/* * Vencord, a Discord client mod * Copyright (c) 2025 Vendicated and contributors * SPDX-License-Identifier: GPL-3.0-or-later */ import ErrorBoundary from "@components/ErrorBoundary"; import { Logger } from "@utils/Logger"; import { findComponentByCodeLazy } from "@webpack"; import type { ComponentType, MouseEventHandler, ReactNode } from "react"; const PanelButton = findComponentByCodeLazy("tooltipPositionKey", ".greenTooltip") as ComponentType; export interface UserAreaButtonProps { icon: ReactNode; tooltipText?: ReactNode; onClick?: MouseEventHandler; onContextMenu?: MouseEventHandler; className?: string; role?: string; "aria-label"?: string; "aria-checked"?: boolean; disabled?: boolean; plated?: boolean; redGlow?: boolean; orangeGlow?: boolean; } export interface UserAreaRenderProps { nameplate?: any; iconForeground?: string; hideTooltips?: boolean; } export type UserAreaButtonFactory = (props: UserAreaRenderProps) => ReactNode; export interface UserAreaButtonData { render: UserAreaButtonFactory; icon: ComponentType<{ className?: string; }>; priority?: number; } interface ButtonEntry { render: UserAreaButtonFactory; priority: number; } export const UserAreaButton = PanelButton; const logger = new Logger("UserArea"); export const buttons = new Map(); export function addUserAreaButton(id: string, render: UserAreaButtonFactory, priority = 0) { buttons.set(id, { render, priority }); } export function removeUserAreaButton(id: string) { buttons.delete(id); } function UserAreaButtons({ props }: { props: UserAreaRenderProps; }) { return ( <> {Array.from(buttons) .sort(([, a], [, b]) => a.priority - b.priority) .map(([id, { render: Button }]) => ( logger.error(`Failed to render ${id}`, e.error)}>