2
2
3
3
import { useEffect , useState , createContext , useContext } from "react" ;
4
4
import { auth , onAuthStateChanged } from "../firebase/auth" ;
5
+ import { getDatabase } from "../firebase/database" ;
5
6
6
7
export const AuthContext = createContext ( ) ;
8
+ const db = getDatabase ( ) ;
7
9
8
10
export const useAuth = ( ) => {
9
11
const context = useContext ( AuthContext ) ;
@@ -18,6 +20,32 @@ export const AuthProvider = ({ children }) => {
18
20
const [ loading , setLoading ] = useState ( true ) ;
19
21
const [ error , setError ] = useState ( null ) ;
20
22
23
+ const createStripeCustomer = async ( userData ) => {
24
+ try {
25
+ const response = await fetch ( '/api/payments/create-customer' , {
26
+ method : 'POST' ,
27
+ headers : {
28
+ 'Content-Type' : 'application/json' ,
29
+ } ,
30
+ body : JSON . stringify ( {
31
+ userId : userData . uid ,
32
+ email : userData . email ,
33
+ name : userData . displayName ,
34
+ } ) ,
35
+ } ) ;
36
+
37
+ if ( ! response . ok ) {
38
+ throw new Error ( 'Failed to create Stripe customer' ) ;
39
+ }
40
+
41
+ const { customerId } = await response . json ( ) ;
42
+ return customerId ;
43
+ } catch ( error ) {
44
+ console . error ( 'Error creating Stripe customer:' , error ) ;
45
+ return null ;
46
+ }
47
+ } ;
48
+
21
49
useEffect ( ( ) => {
22
50
if ( typeof window === 'undefined' ) {
23
51
setLoading ( false ) ;
@@ -26,15 +54,24 @@ export const AuthProvider = ({ children }) => {
26
54
27
55
let unsubscribe ;
28
56
try {
29
- unsubscribe = onAuthStateChanged ( auth , ( user ) => {
57
+ unsubscribe = onAuthStateChanged ( auth , async ( authUser ) => {
30
58
try {
31
- if ( user ) {
59
+ if ( authUser ) {
60
+ const userSnapshot = await db . ref ( `users/${ authUser . uid } ` ) . get ( ) ;
61
+ const userData = userSnapshot . val ( ) || { } ;
62
+
63
+ let stripeCustomerId = userData . stripeCustomerId ;
64
+ if ( ! stripeCustomerId ) {
65
+ stripeCustomerId = await createStripeCustomer ( authUser ) ;
66
+ }
67
+
32
68
setUser ( {
33
- uid : user . uid ,
34
- email : user . email ,
35
- displayName : user . displayName ,
36
- username : user . username || user . displayName ,
37
- groups : user . groups || [ 'default-group' ]
69
+ uid : authUser . uid ,
70
+ email : authUser . email ,
71
+ displayName : authUser . displayName ,
72
+ username : userData . username || authUser . displayName ,
73
+ groups : userData . groups || [ 'default-group' ] ,
74
+ stripeCustomerId,
38
75
} ) ;
39
76
} else {
40
77
setUser ( null ) ;
0 commit comments