1
1
export const publishableKey = import . meta. env . FRONTEND_STRIPE_PUBLIC_KEY
2
2
import { loadStripe } from '@stripe/stripe-js'
3
3
4
+ const stripe = ref ( null as any )
5
+ const elements = ref ( null as any )
6
+
4
7
export function useBillable ( ) {
5
8
async function fetchSetupIntent ( ) : Promise < string > {
6
9
const url = 'http://localhost:3008/stripe/create-setup-intent'
@@ -19,20 +22,41 @@ export function useBillable() {
19
22
return clientSecret
20
23
}
21
24
22
- async function loadStripeElement ( clientSecret : string ) : Promise < any | undefined > {
23
- const stripe = await loadStripe ( publishableKey )
25
+ async function loadStripeElement ( clientSecret : string ) : Promise < boolean > {
26
+ stripe . value = await loadStripe ( publishableKey )
24
27
25
28
if ( stripe ) {
26
- const elements = stripe . elements ( { clientSecret } )
27
- const paymentElement = elements . create ( 'payment' , {
29
+ elements . value = stripe . value . elements ( { clientSecret } )
30
+
31
+ const paymentElement = elements . value . create ( 'payment' , {
28
32
fields : { billingDetails : 'auto' } ,
29
33
} )
30
34
31
- return paymentElement
35
+ paymentElement . mount ( '#payment-element' )
36
+
37
+ return true
32
38
}
33
39
34
- return undefined
40
+ return false
41
+ }
42
+
43
+ async function handleAddPaymentMethod ( ) {
44
+ if ( ! stripe . value || ! elements . value ) return
45
+
46
+ const { setupIntent, error } = await stripe . value . confirmSetup ( {
47
+ elements : elements . value ,
48
+ confirmParams : {
49
+ return_url : 'http://localhost:5173/settings/billing'
50
+ } ,
51
+ } )
52
+
53
+ if ( error ) {
54
+ console . error ( error . message ) // Display or handle error for the user
55
+ } else {
56
+ console . log ( 'Setup Intent successful:' , setupIntent )
57
+ // You might save setupIntent.id to your database here
58
+ }
35
59
}
36
60
37
- return { fetchSetupIntent, loadStripeElement }
61
+ return { fetchSetupIntent, loadStripeElement, handleAddPaymentMethod }
38
62
}
0 commit comments