use-pay.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. 'use client'
  2. import { useCallback, useEffect, useState } from 'react'
  3. import { useRouter, useSearchParams } from 'next/navigation'
  4. import { useTranslation } from 'react-i18next'
  5. import useSWR from 'swr'
  6. import { useContext } from 'use-context-selector'
  7. import I18n from '@/context/i18n'
  8. import { ProviderEnum } from '@/app/components/header/account-setting/model-page/declarations'
  9. import { fetchFreeQuotaVerify } from '@/service/common'
  10. import type { ConfirmCommonProps } from '@/app/components/base/confirm/common'
  11. import Confirm from '@/app/components/base/confirm/common'
  12. export type ConfirmType = Pick<ConfirmCommonProps, 'type' | 'title' | 'desc'>
  13. export const useAnthropicCheckPay = () => {
  14. const { t } = useTranslation()
  15. const [confirm, setConfirm] = useState<ConfirmType | null>(null)
  16. const searchParams = useSearchParams()
  17. const providerName = searchParams.get('provider_name')
  18. const paymentResult = searchParams.get('payment_result')
  19. useEffect(() => {
  20. if (providerName === ProviderEnum.anthropic && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) {
  21. setConfirm({
  22. type: paymentResult === 'succeeded' ? 'success' : 'danger',
  23. title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'),
  24. })
  25. }
  26. }, [providerName, paymentResult, t])
  27. return confirm
  28. }
  29. const QUOTA_RECEIVE_STATUS = {
  30. [ProviderEnum.spark]: {
  31. success: {
  32. 'en': 'Successful collection, the quota will be automatically increased after 5 minutes.',
  33. 'zh-Hans': '领取成功,将在 5 分钟后自动增加配额',
  34. },
  35. fail: {
  36. 'en': 'Failure to collect',
  37. 'zh-Hans': '领取失败',
  38. },
  39. },
  40. [ProviderEnum.zhipuai]: {
  41. success: {
  42. 'en': 'Successful collection',
  43. 'zh-Hans': '领取成功',
  44. },
  45. fail: {
  46. 'en': 'Failure to collect',
  47. 'zh-Hans': '领取失败',
  48. },
  49. },
  50. }
  51. const FREE_CHECK_PROVIDER = [ProviderEnum.spark, ProviderEnum.zhipuai]
  52. export const useCheckFreeQuota = () => {
  53. const { locale } = useContext(I18n)
  54. const router = useRouter()
  55. const [shouldVerify, setShouldVerify] = useState(false)
  56. const searchParams = useSearchParams()
  57. const type = searchParams.get('type')
  58. const provider = searchParams.get('provider') as (ProviderEnum.spark | ProviderEnum.zhipuai)
  59. const result = searchParams.get('result')
  60. const token = searchParams.get('token')
  61. const { data, error } = useSWR(
  62. shouldVerify
  63. ? `/workspaces/current/model-providers/${provider}/free-quota-qualification-verify?token=${token}`
  64. : null,
  65. fetchFreeQuotaVerify,
  66. )
  67. useEffect(() => {
  68. if (error)
  69. router.replace('/', { forceOptimisticNavigation: false })
  70. }, [error, router])
  71. useEffect(() => {
  72. if (type === 'provider_apply_callback' && FREE_CHECK_PROVIDER.includes(provider) && result === 'success')
  73. setShouldVerify(true)
  74. }, [type, provider, result])
  75. return (data && provider)
  76. ? {
  77. type: data.flag ? 'success' : 'danger',
  78. title: data.flag ? QUOTA_RECEIVE_STATUS[provider].success[locale] : QUOTA_RECEIVE_STATUS[provider].fail[locale],
  79. desc: !data.flag ? data.reason : undefined,
  80. }
  81. : null
  82. }
  83. export const CheckModal = () => {
  84. const router = useRouter()
  85. const { t } = useTranslation()
  86. const [showPayStatusModal, setShowPayStatusModal] = useState(true)
  87. const anthropicConfirmInfo = useAnthropicCheckPay()
  88. const freeQuotaConfirmInfo = useCheckFreeQuota()
  89. const handleCancelShowPayStatusModal = useCallback(() => {
  90. setShowPayStatusModal(false)
  91. router.replace('/', { forceOptimisticNavigation: false })
  92. }, [router])
  93. const confirmInfo = anthropicConfirmInfo || freeQuotaConfirmInfo
  94. if (!confirmInfo || !showPayStatusModal)
  95. return null
  96. return (
  97. <Confirm
  98. isShow
  99. onCancel={handleCancelShowPayStatusModal}
  100. onConfirm={handleCancelShowPayStatusModal}
  101. type={confirmInfo.type}
  102. title={confirmInfo.title}
  103. desc={confirmInfo.desc}
  104. showOperateCancel={false}
  105. confirmText={(confirmInfo.type === 'danger' && t('common.operation.ok')) || ''}
  106. />
  107. )
  108. }