mirror of
https://github.com/supabase/supabase.git
synced 2026-07-04 13:34:28 +08:00
75 lines
1.9 KiB
TypeScript
75 lines
1.9 KiB
TypeScript
import { FC, useEffect, useState } from 'react'
|
|
import { IconLoader, Modal } from '@supabase/ui'
|
|
import { loadStripe } from '@stripe/stripe-js'
|
|
import { Elements } from '@stripe/react-stripe-js'
|
|
|
|
import { useStore } from 'hooks'
|
|
import { post } from 'lib/common/fetch'
|
|
import { API_URL, STRIPE_PUBLIC_KEY } from 'lib/constants'
|
|
import AddPaymentMethodForm from './AddPaymentMethodForm'
|
|
|
|
interface Props {
|
|
visible: boolean
|
|
returnUrl: string
|
|
onCancel: () => void
|
|
}
|
|
|
|
const stripePromise = loadStripe(STRIPE_PUBLIC_KEY)
|
|
|
|
const AddNewPaymentMethodModal: FC<Props> = ({ visible, returnUrl, onCancel }) => {
|
|
const { ui } = useStore()
|
|
const [intent, setIntent] = useState<any>()
|
|
|
|
useEffect(() => {
|
|
if (visible) {
|
|
setupIntent()
|
|
}
|
|
}, [visible])
|
|
|
|
const setupIntent = async () => {
|
|
setIntent(undefined)
|
|
const orgSlug = ui.selectedOrganization?.slug ?? ''
|
|
const intent = await post(`${API_URL}/organizations/${orgSlug}/payments/setup-intent`, {})
|
|
|
|
if (intent.error) {
|
|
return ui.setNotification({
|
|
category: 'error',
|
|
message: intent.error.message,
|
|
error: intent.error,
|
|
})
|
|
}
|
|
|
|
setIntent(intent)
|
|
}
|
|
|
|
const options = {
|
|
clientSecret: intent ? intent.client_secret : '',
|
|
appearance: { theme: 'night', labels: 'floating' },
|
|
} as any
|
|
|
|
return (
|
|
<Modal
|
|
hideFooter
|
|
size="medium"
|
|
visible={visible}
|
|
header="Add new payment method"
|
|
onCancel={onCancel}
|
|
className="PAYMENT"
|
|
>
|
|
<div className="space-y-4 py-4">
|
|
{intent !== undefined ? (
|
|
<Elements stripe={stripePromise} options={options}>
|
|
<AddPaymentMethodForm returnUrl={returnUrl} onCancel={onCancel} />
|
|
</Elements>
|
|
) : (
|
|
<div className="flex w-full items-center justify-center py-20">
|
|
<IconLoader size={16} className="animate-spin" />
|
|
</div>
|
|
)}
|
|
</div>
|
|
</Modal>
|
|
)
|
|
}
|
|
|
|
export default AddNewPaymentMethodModal
|