Feat: add search params with theme in links of marketplace (#19648)

This commit is contained in:
KVOJJJin 2025-05-14 13:46:03 +08:00 committed by GitHub
parent 9dce0e40b5
commit 2c5f5b0c67
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 22 additions and 9 deletions

View File

@ -1,4 +1,5 @@
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useTheme } from 'next-themes'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Link from 'next/link' import Link from 'next/link'
import { import {
@ -29,6 +30,7 @@ const InstallFromMarketplace = ({
searchText, searchText,
}: InstallFromMarketplaceProps) => { }: InstallFromMarketplaceProps) => {
const { t } = useTranslation() const { t } = useTranslation()
const { theme } = useTheme()
const [collapse, setCollapse] = useState(false) const [collapse, setCollapse] = useState(false)
const locale = getLocaleOnClient() const locale = getLocaleOnClient()
const { const {
@ -53,7 +55,7 @@ const InstallFromMarketplace = ({
</div> </div>
<div className='mb-2 flex items-center pt-2'> <div className='mb-2 flex items-center pt-2'>
<span className='system-sm-regular pr-1 text-text-tertiary'>{t('common.modelProvider.discoverMore')}</span> <span className='system-sm-regular pr-1 text-text-tertiary'>{t('common.modelProvider.discoverMore')}</span>
<Link target="_blank" href={`${MARKETPLACE_URL_PREFIX}`} className='system-sm-medium inline-flex items-center text-text-accent'> <Link target="_blank" href={`${MARKETPLACE_URL_PREFIX}${theme ? `?theme=${theme}` : ''}`} className='system-sm-medium inline-flex items-center text-text-accent'>
{t('plugin.marketplace.difyMarketplace')} {t('plugin.marketplace.difyMarketplace')}
<RiArrowRightUpLine className='h-4 w-4' /> <RiArrowRightUpLine className='h-4 w-4' />
</Link> </Link>

View File

@ -1,4 +1,5 @@
'use client' 'use client'
import { useTheme } from 'next-themes'
import { RiArrowRightUpLine } from '@remixicon/react' import { RiArrowRightUpLine } from '@remixicon/react'
import { getPluginLinkInMarketplace } from '../utils' import { getPluginLinkInMarketplace } from '../utils'
import Card from '@/app/components/plugins/card' import Card from '@/app/components/plugins/card'
@ -22,6 +23,7 @@ const CardWrapper = ({
locale, locale,
}: CardWrapperProps) => { }: CardWrapperProps) => {
const { t } = useMixedTranslation(locale) const { t } = useMixedTranslation(locale)
const { theme } = useTheme()
const [isShowInstallFromMarketplace, { const [isShowInstallFromMarketplace, {
setTrue: showInstallFromMarketplace, setTrue: showInstallFromMarketplace,
setFalse: hideInstallFromMarketplace, setFalse: hideInstallFromMarketplace,
@ -54,7 +56,7 @@ const CardWrapper = ({
> >
{t('plugin.detailPanel.operation.install')} {t('plugin.detailPanel.operation.install')}
</Button> </Button>
<a href={`${getPluginLinkInMarketplace(plugin)}?language=${localeFromLocale}`} target='_blank' className='block w-[calc(50%-4px)] flex-1 shrink-0'> <a href={`${getPluginLinkInMarketplace(plugin)}?language=${localeFromLocale}${theme ? `&theme=${theme}` : ''}`} target='_blank' className='block w-[calc(50%-4px)] flex-1 shrink-0'>
<Button <Button
className='w-full gap-0.5' className='w-full gap-0.5'
> >

View File

@ -1,4 +1,5 @@
import React, { useCallback, useMemo, useState } from 'react' import React, { useCallback, useMemo, useState } from 'react'
import { useTheme } from 'next-themes'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import { import {
@ -49,6 +50,7 @@ const DetailHeader = ({
onUpdate, onUpdate,
}: Props) => { }: Props) => {
const { t } = useTranslation() const { t } = useTranslation()
const { theme } = useTheme()
const locale = useGetLanguage() const locale = useGetLanguage()
const { checkForUpdates, fetchReleases } = useGitHubReleases() const { checkForUpdates, fetchReleases } = useGitHubReleases()
const { setShowUpdatePluginModal } = useModalContext() const { setShowUpdatePluginModal } = useModalContext()
@ -85,9 +87,9 @@ const DetailHeader = ({
if (isFromGitHub) if (isFromGitHub)
return `https://github.com/${meta!.repo}` return `https://github.com/${meta!.repo}`
if (isFromMarketplace) if (isFromMarketplace)
return `${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}` return `${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}${theme ? `?theme=${theme}` : ''}`
return '' return ''
}, [author, isFromGitHub, isFromMarketplace, meta, name]) }, [author, isFromGitHub, isFromMarketplace, meta, name, theme])
const [isShowUpdateModal, { const [isShowUpdateModal, {
setTrue: showUpdateModal, setTrue: showUpdateModal,

View File

@ -1,6 +1,7 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React, { useMemo } from 'react' import React, { useMemo } from 'react'
import { useTheme } from 'next-themes'
import { import {
RiArrowRightUpLine, RiArrowRightUpLine,
RiBugLine, RiBugLine,
@ -38,6 +39,7 @@ const PluginItem: FC<Props> = ({
plugin, plugin,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
const { theme } = useTheme()
const { categoriesMap } = useSingleCategories() const { categoriesMap } = useSingleCategories()
const currentPluginID = usePluginPageContext(v => v.currentPluginID) const currentPluginID = usePluginPageContext(v => v.currentPluginID)
const setCurrentPluginID = usePluginPageContext(v => v.setCurrentPluginID) const setCurrentPluginID = usePluginPageContext(v => v.setCurrentPluginID)
@ -164,7 +166,7 @@ const PluginItem: FC<Props> = ({
} }
{source === PluginSource.marketplace {source === PluginSource.marketplace
&& <> && <>
<a href={`${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}`} target='_blank' className='flex items-center gap-0.5'> <a href={`${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}${theme ? `?theme=${theme}` : ''}`} target='_blank' className='flex items-center gap-0.5'>
<div className='system-2xs-medium-uppercase text-text-tertiary'>{t('plugin.from')} <span className='text-text-secondary'>marketplace</span></div> <div className='system-2xs-medium-uppercase text-text-tertiary'>{t('plugin.from')} <span className='text-text-secondary'>marketplace</span></div>
<RiArrowRightUpLine className='h-3 w-3 text-text-tertiary' /> <RiArrowRightUpLine className='h-3 w-3 text-text-tertiary' />
</a> </a>

View File

@ -1,6 +1,7 @@
'use client' 'use client'
import React from 'react' import React from 'react'
import type { FC } from 'react' import type { FC } from 'react'
import { useTheme } from 'next-themes'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiArrowRightUpLine } from '@remixicon/react' import { RiArrowRightUpLine } from '@remixicon/react'
import Badge from '../base/badge' import Badge from '../base/badge'
@ -28,6 +29,7 @@ const ProviderCard: FC<Props> = ({
}) => { }) => {
const getValueFromI18nObject = useRenderI18nObject() const getValueFromI18nObject = useRenderI18nObject()
const { t } = useTranslation() const { t } = useTranslation()
const { theme } = useTheme()
const [isShowInstallFromMarketplace, { const [isShowInstallFromMarketplace, {
setTrue: showInstallFromMarketplace, setTrue: showInstallFromMarketplace,
setFalse: hideInstallFromMarketplace, setFalse: hideInstallFromMarketplace,
@ -74,7 +76,7 @@ const ProviderCard: FC<Props> = ({
className='grow' className='grow'
variant='secondary' variant='secondary'
> >
<a href={`${getPluginLinkInMarketplace(payload)}?language=${locale}`} target='_blank' className='flex items-center gap-0.5'> <a href={`${getPluginLinkInMarketplace(payload)}?language=${locale}${theme ? `&theme=${theme}` : ''}`} target='_blank' className='flex items-center gap-0.5'>
{t('plugin.detailPanel.operation.detail')} {t('plugin.detailPanel.operation.detail')}
<RiArrowRightUpLine className='h-4 w-4' /> <RiArrowRightUpLine className='h-4 w-4' />
</a> </a>

View File

@ -2,6 +2,7 @@ import {
useEffect, useEffect,
useRef, useRef,
} from 'react' } from 'react'
import { useTheme } from 'next-themes'
import { import {
RiArrowRightUpLine, RiArrowRightUpLine,
RiArrowUpDoubleLine, RiArrowUpDoubleLine,
@ -25,7 +26,7 @@ const Marketplace = ({
}: MarketplaceProps) => { }: MarketplaceProps) => {
const locale = getLocaleOnClient() const locale = getLocaleOnClient()
const { t } = useTranslation() const { t } = useTranslation()
const { theme } = useTheme()
const { const {
isLoading, isLoading,
marketplaceCollections, marketplaceCollections,
@ -83,7 +84,7 @@ const Marketplace = ({
</span> </span>
{t('common.operation.in')} {t('common.operation.in')}
<a <a
href={`${MARKETPLACE_URL_PREFIX}?language=${locale}&q=${searchPluginText}&tags=${filterPluginTags.join(',')}`} href={`${MARKETPLACE_URL_PREFIX}?language=${locale}&q=${searchPluginText}&tags=${filterPluginTags.join(',')}${theme ? `&theme=${theme}` : ''}`}
className='system-sm-medium ml-1 flex items-center text-text-accent' className='system-sm-medium ml-1 flex items-center text-text-accent'
target='_blank' target='_blank'
> >

View File

@ -1,6 +1,7 @@
'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React, { useCallback, useEffect, useRef, useState } from 'react' import React, { useCallback, useEffect, useRef, useState } from 'react'
import { useTheme } from 'next-themes'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { RiMoreFill } from '@remixicon/react' import { RiMoreFill } from '@remixicon/react'
import ActionButton from '@/app/components/base/action-button' import ActionButton from '@/app/components/base/action-button'
@ -31,6 +32,7 @@ const OperationDropdown: FC<Props> = ({
version, version,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
const { theme } = useTheme()
const openRef = useRef(open) const openRef = useRef(open)
const setOpen = useCallback((v: boolean) => { const setOpen = useCallback((v: boolean) => {
onOpenChange(v) onOpenChange(v)
@ -78,7 +80,7 @@ const OperationDropdown: FC<Props> = ({
<PortalToFollowElemContent className='z-[9999]'> <PortalToFollowElemContent className='z-[9999]'>
<div className='w-[112px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'> <div className='w-[112px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg'>
<div onClick={handleDownload} className='system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>{t('common.operation.download')}</div> <div onClick={handleDownload} className='system-md-regular cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>{t('common.operation.download')}</div>
<a href={`${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}`} target='_blank' className='system-md-regular block cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>{t('common.operation.viewDetails')}</a> <a href={`${MARKETPLACE_URL_PREFIX}/plugins/${author}/${name}${theme ? `?theme=${theme}` : ''}`} target='_blank' className='system-md-regular block cursor-pointer rounded-lg px-3 py-1.5 text-text-secondary hover:bg-state-base-hover'>{t('common.operation.viewDetails')}</a>
</div> </div>
</PortalToFollowElemContent> </PortalToFollowElemContent>
</PortalToFollowElem> </PortalToFollowElem>