wip: plugin install item supports show limited message

pull/20014/head
NFish 12 months ago
parent dc9c64135a
commit 7fec4a928f

@ -15,6 +15,7 @@ import { renderI18nObject } from '@/i18n'
import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks' import { useMixedTranslation } from '@/app/components/plugins/marketplace/hooks'
import Partner from '../base/badges/partner' import Partner from '../base/badges/partner'
import Verified from '../base/badges/verified' import Verified from '../base/badges/verified'
import { RiAlertFill } from '@remixicon/react'
export type Props = { export type Props = {
className?: string className?: string
@ -28,7 +29,7 @@ export type Props = {
isLoading?: boolean isLoading?: boolean
loadingFileName?: string loadingFileName?: string
locale?: string locale?: string
showLimitWarning?: boolean limitedInstall?: boolean
} }
const Card = ({ const Card = ({
@ -43,7 +44,7 @@ const Card = ({
isLoading = false, isLoading = false,
loadingFileName, loadingFileName,
locale: localeFromProps, locale: localeFromProps,
showLimitWarning = false, limitedInstall = false,
}: Props) => { }: Props) => {
const defaultLocale = useGetLanguage() const defaultLocale = useGetLanguage()
const locale = localeFromProps ? getLanguage(localeFromProps) : defaultLocale const locale = localeFromProps ? getLanguage(localeFromProps) : defaultLocale
@ -56,7 +57,7 @@ const Card = ({
obj ? renderI18nObject(obj, locale) : '' obj ? renderI18nObject(obj, locale) : ''
const isPartner = badges.includes('partner') 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) const wrapClassName = cn('hover-bg-components-panel-on-panel-item-bg relative overflow-hidden rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-on-panel-item-bg shadow-xs', className)
if (isLoading) { if (isLoading) {
return ( return (
<Placeholder <Placeholder
@ -68,31 +69,39 @@ const Card = ({
return ( return (
<div className={wrapClassName}> <div className={wrapClassName}>
{!hideCornerMark && <CornerMark text={cornerMark} />} <div className={cn('p-4 pb-3', limitedInstall && 'pb-1')}>
{/* Header */} {!hideCornerMark && <CornerMark text={cornerMark} />}
<div className="flex"> {/* Header */}
<Icon src={icon} installed={installed} installFailed={installFailed} /> <div className="flex">
<div className="ml-3 w-0 grow"> <Icon src={icon} installed={installed} installFailed={installFailed} />
<div className="flex h-5 items-center"> <div className="ml-3 w-0 grow">
<Title title={getLocalizedText(label)} /> <div className="flex h-5 items-center">
{isPartner && <Partner className='ml-0.5 h-4 w-4' text={t('plugin.marketplace.partnerTip')} />} <Title title={getLocalizedText(label)} />
{verified && <Verified className='ml-0.5 h-4 w-4' text={t('plugin.marketplace.verifiedTip')} />} {isPartner && <Partner className='ml-0.5 h-4 w-4' text={t('plugin.marketplace.partnerTip')} />}
{titleLeft} {/* This can be version badge */} {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>
<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> </div>
<Description {limitedInstall
className="mt-3" && <div className='relative flex h-8 items-center gap-x-2 px-3 after:absolute after:bottom-0 after:left-0 after:right-0 after:top-0 after:bg-toast-warning-bg after:opacity-40'>
text={getLocalizedText(brief)} <RiAlertFill className='h-3 w-3 shrink-0 text-text-warning-secondary' />
descriptionLineRows={descriptionLineRows} <p className='system-xs-regular z-10 grow text-text-secondary'>
/> {t('plugin.installModal.installWarning')}
{showLimitWarning && <div>{t('plugin.installModal.installWarning')}</div>} </p>
{footer && <div>{footer}</div>} </div>}
</div> </div>
) )
} }

@ -1,9 +1,9 @@
import { useGlobalPublicStore } from '@/context/global-public-context' import { useGlobalPublicStore } from '@/context/global-public-context'
import type { SystemFeatures } from '@/types/feature'
import { InstallationScope } from '@/types/feature' import { InstallationScope } from '@/types/feature'
import type { Plugin, PluginManifestInMarket } from '../../types' import type { Plugin, PluginManifestInMarket } from '../../types'
export default function usePluginInstallLimit(plugin: Plugin | PluginManifestInMarket) { export function pluginInstallLimit(plugin: Plugin | PluginManifestInMarket, systemFeatures: SystemFeatures) {
const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
if (systemFeatures.plugin_installation_permission.restrict_to_marketplace_only) { if (systemFeatures.plugin_installation_permission.restrict_to_marketplace_only) {
return { canInstall: false } return { canInstall: false }
} }
@ -37,3 +37,8 @@ export default function usePluginInstallLimit(plugin: Plugin | PluginManifestInM
} }
} }
} }
export default function usePluginInstallLimit(plugin: Plugin | PluginManifestInMarket) {
const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
return pluginInstallLimit(plugin, systemFeatures)
}

@ -8,6 +8,7 @@ import useGetIcon from '../../base/use-get-icon'
import { MARKETPLACE_API_PREFIX } from '@/config' import { MARKETPLACE_API_PREFIX } from '@/config'
import Version from '../../base/version' import Version from '../../base/version'
import type { VersionProps } from '../../../types' import type { VersionProps } from '../../../types'
import usePluginInstallLimit from '../../hooks/use-install-plugin-limit'
type Props = { type Props = {
checked: boolean checked: boolean
@ -29,9 +30,11 @@ const LoadedItem: FC<Props> = ({
...particleVersionInfo, ...particleVersionInfo,
toInstallVersion: payload.version, toInstallVersion: payload.version,
} }
const { canInstall } = usePluginInstallLimit(payload)
return ( return (
<div className='flex items-center space-x-2'> <div className='flex items-center space-x-2'>
<Checkbox <Checkbox
disabled={!canInstall}
className='shrink-0' className='shrink-0'
checked={checked} checked={checked}
onCheck={() => onCheckedChange(payload)} onCheck={() => onCheckedChange(payload)}
@ -43,6 +46,7 @@ const LoadedItem: FC<Props> = ({
icon: isFromMarketPlace ? `${MARKETPLACE_API_PREFIX}/plugins/${payload.org}/${payload.name}/icon` : getIconUrl(payload.icon), icon: isFromMarketPlace ? `${MARKETPLACE_API_PREFIX}/plugins/${payload.org}/${payload.name}/icon` : getIconUrl(payload.icon),
}} }}
titleLeft={payload.version ? <Version {...versionInfo} /> : null} titleLeft={payload.version ? <Version {...versionInfo} /> : null}
limitedInstall={!canInstall}
/> />
</div> </div>
) )

@ -149,7 +149,7 @@ const Installed: FC<Props> = ({
installedVersion={installedVersion} installedVersion={installedVersion}
toInstallVersion={toInstallVersion} toInstallVersion={toInstallVersion}
/>} />}
showLimitWarning={!canInstall} limitedInstall={!canInstall}
/> />
</div> </div>
</div> </div>

Loading…
Cancel
Save