import React from 'react' import { RiVerifiedBadgeLine } from '@remixicon/react' import type { Plugin } from '../types' import Icon from '../card/base/card-icon' import { Group } from '../../base/icons/src/vender/other' import CornerMark from './base/corner-mark' import Title from './base/title' import OrgInfo from './base/org-info' import Description from './base/description' import cn from '@/utils/classnames' import type { Locale } from '@/i18n' type Props = { className?: string payload: Plugin locale: Locale // The component is used in both client and server side, so we can't get the locale from both side(getLocaleOnServer and useContext) titleLeft?: React.ReactNode installed?: boolean descriptionLineRows?: number footer?: React.ReactNode serverLocale?: Locale isLoading?: boolean loadingFileName?: string } const Card = ({ className, payload, titleLeft, installed, descriptionLineRows = 2, footer, locale, isLoading = false, loadingFileName, }: Props) => { const { type, name, org, label, brief, icon } = payload const getLocalizedText = (obj: Record | undefined) => obj?.[locale] || obj?.['en-US'] || '' const LoadingPlaceholder = ({ className }: { className?: string }) => (
) return (
{!isLoading && } {/* Header */}
{isLoading ? (
) : }
{!isLoading && <RiVerifiedBadgeLine className="shrink-0 ml-0.5 w-4 h-4 text-text-accent" />} {titleLeft} {/* This can be version badge */} </div> <OrgInfo className="mt-0.5" orgName={org} packageName={name} isLoading={isLoading} /> </div> </div> {isLoading ? <LoadingPlaceholder className="mt-3 w-[420px]" /> : <Description className="mt-3" text={getLocalizedText(brief)} descriptionLineRows={descriptionLineRows} />} {footer && <div>{footer}</div>} </div> ) } export default Card