| 'use client' |
|
|
| 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' |
|
|
| export type ConfirmType = Pick<IConfirm, 'type' | 'title' | 'content'> |
|
|
| export const useAnthropicCheckPay = () => { |
| const { t } = useTranslation() |
| const [confirm, setConfirm] = useState<ConfirmType | null>(null) |
| const searchParams = useSearchParams() |
| const providerName = searchParams.get('provider_name') |
| const paymentResult = searchParams.get('payment_result') |
|
|
| useEffect(() => { |
| if (providerName === 'anthropic' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) { |
| setConfirm({ |
| type: paymentResult === 'succeeded' ? 'info' : 'warning', |
| title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'), |
| }) |
| } |
| }, [providerName, paymentResult, t]) |
|
|
| return confirm |
| } |
|
|
| export const useBillingPay = () => { |
| const { t } = useTranslation() |
| const [confirm, setConfirm] = useState<ConfirmType | null>(null) |
| const searchParams = useSearchParams() |
| const paymentType = searchParams.get('payment_type') |
| const paymentResult = searchParams.get('payment_result') |
|
|
| useEffect(() => { |
| if (paymentType === 'billing' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) { |
| setConfirm({ |
| type: paymentResult === 'succeeded' ? 'info' : 'warning', |
| title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'), |
| }) |
| } |
| }, [paymentType, paymentResult, t]) |
|
|
| return confirm |
| } |
|
|
| const QUOTA_RECEIVE_STATUS: Record<string, any> = { |
| 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<ConfirmType | null>(null) |
| const [canBinding, setCanBinding] = useState(false) |
| const searchParams = useSearchParams() |
| const type = searchParams.get('type') |
| const notionCode = searchParams.get('code') |
| const notionError = searchParams.get('error') |
| const { data } = useSWR( |
| (canBinding && notionCode) |
| ? `/oauth/data-source/binding/notion?code=${notionCode}` |
| : null, |
| fetchDataSourceNotionBinding, |
| ) |
|
|
| useEffect(() => { |
| if (data) |
| router.replace('/') |
| }, [data, router]) |
| useEffect(() => { |
| if (type === 'notion') { |
| if (notionError) { |
| setConfirm({ |
| type: 'warning', |
| title: notionError, |
| }) |
| } |
| else if (notionCode) { |
| setCanBinding(true) |
| } |
| } |
| }, [type, notionCode, notionError]) |
|
|
| return confirm |
| } |
|
|
| export const CheckModal = () => { |
| const router = useRouter() |
| const { t } = useTranslation() |
| const [showPayStatusModal, setShowPayStatusModal] = useState(true) |
| const anthropicConfirmInfo = useAnthropicCheckPay() |
| const freeQuotaConfirmInfo = useCheckFreeQuota() |
| const notionConfirmInfo = useCheckNotion() |
| const billingConfirmInfo = useBillingPay() |
|
|
| const handleCancelShowPayStatusModal = useCallback(() => { |
| setShowPayStatusModal(false) |
| router.replace('/') |
| }, [router]) |
|
|
| const confirmInfo = anthropicConfirmInfo || freeQuotaConfirmInfo || notionConfirmInfo || billingConfirmInfo |
|
|
| if (!confirmInfo || !showPayStatusModal) |
| return null |
|
|
| return ( |
| <Confirm |
| isShow |
| onCancel={handleCancelShowPayStatusModal} |
| onConfirm={handleCancelShowPayStatusModal} |
| showCancel={false} |
| type={confirmInfo.type === 'info' ? 'info' : 'warning' } |
| title={confirmInfo.title} |
| content={(confirmInfo as { desc: string }).desc || ''} |
| confirmText={(confirmInfo.type === 'info' && t('common.operation.ok')) || ''} |
| /> |
| ) |
| } |
|
|