/* * Vencord, a modification for Discord's desktop app * Copyright (c) 2023 Vendicated and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import "./AddonCard.css"; import { classNameFactory } from "@api/Styles"; import { BaseText } from "@components/BaseText"; import { AddonBadge } from "@components/settings/PluginBadge"; import { Switch } from "@components/Switch"; import { t } from "@utils/translation"; import { Tooltip, useRef } from "@webpack/common"; import type { MouseEventHandler, ReactNode } from "react"; import { useTruncatedText } from "./tabs/plugins/components/truncateText"; const cl = classNameFactory("vc-addon-"); interface Props { name: ReactNode; description: ReactNode; enabled: boolean; setEnabled: (enabled: boolean) => void; disabled?: boolean; isNew?: boolean; sourceBadge?: ReactNode; tooltip?: string; onMouseEnter?: MouseEventHandler; onMouseLeave?: MouseEventHandler; infoButton?: ReactNode; footer?: ReactNode; author?: ReactNode; } export function AddonCard({ disabled, isNew, sourceBadge, tooltip, name, infoButton, footer, author, enabled, setEnabled, description, onMouseEnter, onMouseLeave }: Props) { const titleRef = useRef(null); const titleContainerRef = useRef(null); const { truncated, containerRef } = useTruncatedText(description ? description.toString() : ""); return (
{ const title = titleRef.current!; const titleContainer = titleContainerRef.current!; title.style.setProperty("--offset", `${titleContainer.clientWidth - title.scrollWidth}px`); title.style.setProperty("--duration", `${Math.max(0.5, (title.scrollWidth - titleContainer.clientWidth) / 7)}s`); }} > {name}
{isNew && }
{!!author && ( {author} )}
{({ onMouseEnter, onMouseLeave }) => (
{sourceBadge}
)}
{infoButton}
{truncated}
{footer}
); }