diff --git a/web/app/components/header/account-setting/model-provider-page/hooks.ts b/web/app/components/header/account-setting/model-provider-page/hooks.ts index e34c09d651..36aba3bc39 100644 --- a/web/app/components/header/account-setting/model-provider-page/hooks.ts +++ b/web/app/components/header/account-setting/model-provider-page/hooks.ts @@ -199,7 +199,6 @@ export const useUpdateModelList = () => { return updateModelList } -// deprecated ??? export const useAnthropicBuyQuota = () => { const [loading, setLoading] = useState(false) diff --git a/web/app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx b/web/app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx index 9d0c979de2..ac82dce3bf 100644 --- a/web/app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx +++ b/web/app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx @@ -41,7 +41,7 @@ const CredentialPanel: FC = ({ const handleChangePriority = async (key: PreferredProviderTypeEnum) => { const res = await changeModelProviderPriority({ - url: `/workspaces/current/model-providers/${provider.plugin_id}/${provider.provider}/preferred-provider-type`, + url: `/workspaces/current/model-providers/${provider.provider}/preferred-provider-type`, body: { preferred_provider_type: key, }, diff --git a/web/hooks/use-pay.tsx b/web/hooks/use-pay.tsx index 3ba23b6763..344f03955c 100644 --- a/web/hooks/use-pay.tsx +++ b/web/hooks/use-pay.tsx @@ -4,8 +4,11 @@ import { useCallback, useEffect, useState } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import { useTranslation } from 'react-i18next' import useSWR from 'swr' +import { useContext } from 'use-context-selector' +import I18n from '@/context/i18n' import { fetchDataSourceNotionBinding, + fetchFreeQuotaVerify, } from '@/service/common' import type { IConfirm } from '@/app/components/base/confirm' import Confirm from '@/app/components/base/confirm' @@ -50,6 +53,66 @@ export const useBillingPay = () => { return confirm } +const QUOTA_RECEIVE_STATUS: Record = { + spark: { + success: { + 'en': 'Successful collection, the quota will be automatically increased after 5 minutes.', + 'zh-Hans': '领取成功,将在 5 分钟后自动增加配额', + }, + fail: { + 'en': 'Failure to collect', + 'zh-Hans': '领取失败', + }, + }, + zhipuai: { + success: { + 'en': 'Successful collection', + 'zh-Hans': '领取成功', + }, + fail: { + 'en': 'Failure to collect', + 'zh-Hans': '领取失败', + }, + }, +} + +const FREE_CHECK_PROVIDER = ['spark', 'zhipuai'] +export const useCheckFreeQuota = () => { + const { locale } = useContext(I18n) + const router = useRouter() + const [shouldVerify, setShouldVerify] = useState(false) + const searchParams = useSearchParams() + const type = searchParams.get('type') + const provider = searchParams.get('provider') + const result = searchParams.get('result') + const token = searchParams.get('token') + + const { data, error } = useSWR( + shouldVerify + ? `/workspaces/current/model-providers/${provider}/free-quota-qualification-verify?token=${token}` + : null, + fetchFreeQuotaVerify, + ) + + useEffect(() => { + if (error) + router.replace('/') + }, [error, router]) + + useEffect(() => { + if (type === 'provider_apply_callback' && FREE_CHECK_PROVIDER.includes(provider as string) && result === 'success') + setShouldVerify(true) + }, [type, provider, result]) + + return (data && provider) + ? { + type: data.flag ? 'info' : 'warning', + title: data.flag ? QUOTA_RECEIVE_STATUS[provider as string].success[locale] : QUOTA_RECEIVE_STATUS[provider].fail[locale], + desc: !data.flag ? data.reason : undefined, + } + : null +} + export const useCheckNotion = () => { const router = useRouter() const [confirm, setConfirm] = useState(null) @@ -91,6 +154,7 @@ export const CheckModal = () => { const { t } = useTranslation() const [showPayStatusModal, setShowPayStatusModal] = useState(true) const anthropicConfirmInfo = useAnthropicCheckPay() + const freeQuotaConfirmInfo = useCheckFreeQuota() const notionConfirmInfo = useCheckNotion() const billingConfirmInfo = useBillingPay() @@ -99,7 +163,7 @@ export const CheckModal = () => { router.replace('/') }, [router]) - const confirmInfo = anthropicConfirmInfo || notionConfirmInfo || billingConfirmInfo + const confirmInfo = anthropicConfirmInfo || freeQuotaConfirmInfo || notionConfirmInfo || billingConfirmInfo if (!confirmInfo || !showPayStatusModal) return null @@ -112,7 +176,7 @@ export const CheckModal = () => { showCancel={false} type={confirmInfo.type === 'info' ? 'info' : 'warning' } title={confirmInfo.title} - content={(confirmInfo as unknown as { desc: string }).desc || ''} + content={(confirmInfo as { desc: string }).desc || ''} confirmText={(confirmInfo.type === 'info' && t('common.operation.ok')) || ''} /> ) diff --git a/web/service/common.ts b/web/service/common.ts index 70586b6ff6..1fc9b60f45 100644 --- a/web/service/common.ts +++ b/web/service/common.ts @@ -257,6 +257,10 @@ export const fetchFileUploadConfig: Fetcher(url) } +export const fetchFreeQuotaVerify: Fetcher<{ result: string; flag: boolean; reason: string }, string> = (url) => { + return get(url) as Promise<{ result: string; flag: boolean; reason: string }> +} + export const fetchNotionConnection: Fetcher<{ data: string }, string> = (url) => { return get(url) as Promise<{ data: string }> }