use-pay.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 {
  7. fetchDataSourceNotionBinding,
  8. } from '@/service/common'
  9. import type { IConfirm } from '@/app/components/base/confirm'
  10. import Confirm from '@/app/components/base/confirm'
  11. export type ConfirmType = Pick<IConfirm, 'type' | 'title' | 'content'>
  12. export const useAnthropicCheckPay = () => {
  13. const { t } = useTranslation()
  14. const [confirm, setConfirm] = useState<ConfirmType | null>(null)
  15. const searchParams = useSearchParams()
  16. const providerName = searchParams.get('provider_name')
  17. const paymentResult = searchParams.get('payment_result')
  18. useEffect(() => {
  19. if (providerName === 'anthropic' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) {
  20. setConfirm({
  21. type: paymentResult === 'succeeded' ? 'info' : 'warning',
  22. title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'),
  23. })
  24. }
  25. }, [providerName, paymentResult, t])
  26. return confirm
  27. }
  28. export const useBillingPay = () => {
  29. const { t } = useTranslation()
  30. const [confirm, setConfirm] = useState<ConfirmType | null>(null)
  31. const searchParams = useSearchParams()
  32. const paymentType = searchParams.get('payment_type')
  33. const paymentResult = searchParams.get('payment_result')
  34. useEffect(() => {
  35. if (paymentType === 'billing' && (paymentResult === 'succeeded' || paymentResult === 'cancelled')) {
  36. setConfirm({
  37. type: paymentResult === 'succeeded' ? 'info' : 'warning',
  38. title: paymentResult === 'succeeded' ? t('common.actionMsg.paySucceeded') : t('common.actionMsg.payCancelled'),
  39. })
  40. }
  41. }, [paymentType, paymentResult, t])
  42. return confirm
  43. }
  44. export const useCheckNotion = () => {
  45. const router = useRouter()
  46. const [confirm, setConfirm] = useState<ConfirmType | null>(null)
  47. const [canBinding, setCanBinding] = useState(false)
  48. const searchParams = useSearchParams()
  49. const type = searchParams.get('type')
  50. const notionCode = searchParams.get('code')
  51. const notionError = searchParams.get('error')
  52. const { data } = useSWR(
  53. (canBinding && notionCode)
  54. ? `/oauth/data-source/binding/notion?code=${notionCode}`
  55. : null,
  56. fetchDataSourceNotionBinding,
  57. )
  58. useEffect(() => {
  59. if (data)
  60. router.replace('/')
  61. }, [data, router])
  62. useEffect(() => {
  63. if (type === 'notion') {
  64. if (notionError) {
  65. setConfirm({
  66. type: 'warning',
  67. title: notionError,
  68. })
  69. }
  70. else if (notionCode) {
  71. setCanBinding(true)
  72. }
  73. }
  74. }, [type, notionCode, notionError])
  75. return confirm
  76. }
  77. export const CheckModal = () => {
  78. const router = useRouter()
  79. const { t } = useTranslation()
  80. const [showPayStatusModal, setShowPayStatusModal] = useState(true)
  81. const anthropicConfirmInfo = useAnthropicCheckPay()
  82. const notionConfirmInfo = useCheckNotion()
  83. const billingConfirmInfo = useBillingPay()
  84. const handleCancelShowPayStatusModal = useCallback(() => {
  85. setShowPayStatusModal(false)
  86. router.replace('/')
  87. }, [router])
  88. const confirmInfo = anthropicConfirmInfo || notionConfirmInfo || billingConfirmInfo
  89. if (!confirmInfo || !showPayStatusModal)
  90. return null
  91. return (
  92. <Confirm
  93. isShow
  94. onCancel={handleCancelShowPayStatusModal}
  95. onConfirm={handleCancelShowPayStatusModal}
  96. showCancel={false}
  97. type={confirmInfo.type === 'info' ? 'info' : 'warning' }
  98. title={confirmInfo.title}
  99. content={(confirmInfo as unknown as { desc: string }).desc || ''}
  100. confirmText={(confirmInfo.type === 'info' && t('common.operation.ok')) || ''}
  101. />
  102. )
  103. }