Equicord/src/api/UserArea.tsx
prism de2716ce52
im hungry (#675)
* UserAreaAPI: fix patch

* NicknameIconsAPI: fix patch

* MemberListDecoratorsAPI: some fix

* bleeh

* less generic
2026-01-23 16:54:39 -05:00

78 lines
2.2 KiB
TypeScript

/*
* 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", "positionKeyStemOverride") as ComponentType<UserAreaButtonProps>;
export interface UserAreaButtonProps {
icon: ReactNode;
tooltipText?: ReactNode;
onClick?: MouseEventHandler<HTMLDivElement>;
onContextMenu?: MouseEventHandler<HTMLDivElement>;
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<string, ButtonEntry>();
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 }]) => (
<ErrorBoundary noop key={id} onError={e => logger.error(`Failed to render ${id}`, e.error)}>
<Button {...props} />
</ErrorBoundary>
))}
</>
);
}
export function _renderButtons(props: UserAreaRenderProps) {
return [<UserAreaButtons key="vc-user-area-buttons" props={props} />];
}