* UserAreaAPI: fix patch * NicknameIconsAPI: fix patch * MemberListDecoratorsAPI: some fix * bleeh * less generic
78 lines
2.2 KiB
TypeScript
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} />];
|
|
}
|