| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | 
							- 'use client'
 
- import React from 'react'
 
- import type { Plugin } from '../types'
 
- import Icon from '../card/base/card-icon'
 
- import CornerMark from './base/corner-mark'
 
- import Title from './base/title'
 
- import OrgInfo from './base/org-info'
 
- import Description from './base/description'
 
- import Placeholder from './base/placeholder'
 
- import cn from '@/utils/classnames'
 
- import { useGetLanguage } from '@/context/i18n'
 
- import { getLanguage } from '@/i18n/language'
 
- import { useSingleCategories } from '../hooks'
 
- import { renderI18nObject } from '@/hooks/use-i18n'
 
- import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
 
- import Partner from '../base/badges/partner'
 
- import Verified from '../base/badges/verified'
 
- export type Props = {
 
-   className?: string
 
-   payload: Plugin
 
-   titleLeft?: React.ReactNode
 
-   installed?: boolean
 
-   installFailed?: boolean
 
-   hideCornerMark?: boolean
 
-   descriptionLineRows?: number
 
-   footer?: React.ReactNode
 
-   isLoading?: boolean
 
-   loadingFileName?: string
 
-   locale?: string
 
- }
 
- const Card = ({
 
-   className,
 
-   payload,
 
-   titleLeft,
 
-   installed,
 
-   installFailed,
 
-   hideCornerMark,
 
-   descriptionLineRows = 2,
 
-   footer,
 
-   isLoading = false,
 
-   loadingFileName,
 
-   locale: localeFromProps,
 
- }: Props) => {
 
-   const defaultLocale = useGetLanguage()
 
-   const locale = localeFromProps ? getLanguage(localeFromProps) : defaultLocale
 
-   const { t } = useMixedTranslation(localeFromProps)
 
-   const { categoriesMap } = useSingleCategories(t)
 
-   const { category, type, name, org, label, brief, icon, verified, badges = [] } = payload
 
-   const isBundle = !['plugin', 'model', 'tool', 'extension', 'agent-strategy'].includes(type)
 
-   const cornerMark = isBundle ? categoriesMap.bundle?.label : categoriesMap[category]?.label
 
-   const getLocalizedText = (obj: Record<string, string> | undefined) =>
 
-     obj ? renderI18nObject(obj, locale) : ''
 
-   const isPartner = badges.includes('partner')
 
-   const wrapClassName = cn('hover-bg-components-panel-on-panel-item-bg relative rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs', className)
 
-   if (isLoading) {
 
-     return (
 
-       <Placeholder
 
-         wrapClassName={wrapClassName}
 
-         loadingFileName={loadingFileName!}
 
-       />
 
-     )
 
-   }
 
-   return (
 
-     <div className={wrapClassName}>
 
-       {!hideCornerMark && <CornerMark text={cornerMark} />}
 
-       {/* Header */}
 
-       <div className="flex">
 
-         <Icon src={icon} installed={installed} installFailed={installFailed} />
 
-         <div className="ml-3 w-0 grow">
 
-           <div className="flex h-5 items-center">
 
-             <Title title={getLocalizedText(label)} />
 
-             {isPartner && <Partner className='ml-0.5 h-4 w-4' text={t('plugin.marketplace.partnerTip')} />}
 
-             {verified && <Verified className='ml-0.5 h-4 w-4' text={t('plugin.marketplace.verifiedTip')} />}
 
-             {titleLeft} {/* This can be version badge */}
 
-           </div>
 
-           <OrgInfo
 
-             className="mt-0.5"
 
-             orgName={org}
 
-             packageName={name}
 
-           />
 
-         </div>
 
-       </div>
 
-       <Description
 
-         className="mt-3"
 
-         text={getLocalizedText(brief)}
 
-         descriptionLineRows={descriptionLineRows}
 
-       />
 
-       {footer && <div>{footer}</div>}
 
-     </div>
 
-   )
 
- }
 
- export default React.memo(Card)
 
 
  |