|
'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')) || ''} |
|
/> |
|
) |
|
} |
|
|