perf: optimize marketplace card re-renders with memoization (#29263)

This commit is contained in:
yyh
2025-12-08 14:09:03 +08:00
committed by GitHub
parent 6942666d03
commit 2f96374837
4 changed files with 41 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
'use client'
import React from 'react'
import React, { useMemo } from 'react'
import type { FC } from 'react'
import { useTheme } from 'next-themes'
import { useTranslation } from 'react-i18next'
@@ -23,7 +23,7 @@ type Props = {
payload: Plugin
}
const ProviderCard: FC<Props> = ({
const ProviderCardComponent: FC<Props> = ({
className,
payload,
}) => {
@@ -37,6 +37,9 @@ const ProviderCard: FC<Props> = ({
const { org, label } = payload
const { locale } = useI18N()
// Memoize the marketplace link params to prevent unnecessary re-renders
const marketplaceLinkParams = useMemo(() => ({ language: locale, theme }), [locale, theme])
return (
<div className={cn('group relative rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg p-4 pb-3 shadow-xs hover:bg-components-panel-on-panel-item-bg', className)}>
{/* Header */}
@@ -63,7 +66,7 @@ const ProviderCard: FC<Props> = ({
))}
</div>
<div
className='absolute bottom-0 left-0 right-0 hidden items-center gap-2 rounded-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent p-4 pt-8 group-hover:flex'
className='absolute bottom-0 left-0 right-0 hidden items-center gap-2 rounded-xl bg-gradient-to-tr from-components-panel-on-panel-item-bg to-background-gradient-mask-transparent p-4 pt-4 group-hover:flex'
>
<Button
className='grow'
@@ -76,7 +79,7 @@ const ProviderCard: FC<Props> = ({
className='grow'
variant='secondary'
>
<a href={getPluginLinkInMarketplace(payload, { language: locale, theme })} target='_blank' className='flex items-center gap-0.5'>
<a href={getPluginLinkInMarketplace(payload, marketplaceLinkParams)} target='_blank' className='flex items-center gap-0.5'>
{t('plugin.detailPanel.operation.detail')}
<RiArrowRightUpLine className='h-4 w-4' />
</a>
@@ -96,4 +99,7 @@ const ProviderCard: FC<Props> = ({
)
}
// Memoize the component to prevent unnecessary re-renders when props haven't changed
const ProviderCard = React.memo(ProviderCardComponent)
export default ProviderCard