@@ -2,23 +2,30 @@ import { createContext, useContext, useState, useEffect, type ReactNode } from "
22import FastAuthRelayer , { type NetworkId } from "../services/fast-auth-relayer" ;
33import { FastAuthClient } from "@fast-auth/browser-sdk" ;
44import { JavascriptProvider } from "@fast-auth/javascript-provider" ;
5+ import { FirebaseProvider } from "@fast-auth/browser-sdk" ;
56import config from "../auth_config.json" ;
67import { Connection } from "near-api-js" ;
8+ import { getConfig } from "../config.ts" ;
9+
10+ export type ProviderType = "auth0" | "firebase-google" | "firebase-apple" ;
711
812interface FastAuthContextType {
913 relayer : FastAuthRelayer | null ;
10- client : FastAuthClient < JavascriptProvider > | null ;
14+ client : FastAuthClient < JavascriptProvider | FirebaseProvider > | null ;
1115 isRelayerInitialized : boolean ;
1216 isClientInitialized : boolean ;
1317 error : Error | null ;
1418 network : NetworkId ;
1519 setNetwork : ( network : NetworkId ) => Promise < void > ;
20+ provider : ProviderType ;
21+ setProvider : ( provider : ProviderType ) => Promise < void > ;
1622}
1723
1824const FastAuthContext = createContext < FastAuthContextType | null > ( null ) ;
1925
2026const APP_ORIGIN = import . meta. env . VITE_APP_ORIGIN || config . appOrigin ;
2127const NETWORK_STORAGE_KEY = "fast-auth-network" ;
28+ const PROVIDER_STORAGE_KEY = "fast-auth-provider" ;
2229
2330const getStoredNetwork = ( ) : NetworkId => {
2431 if ( typeof window === "undefined" ) return "testnet" ;
@@ -35,6 +42,21 @@ const saveNetwork = (network: NetworkId) => {
3542 }
3643} ;
3744
45+ const getStoredProvider = ( ) : ProviderType => {
46+ if ( typeof window === "undefined" ) return "auth0" ;
47+ const stored = localStorage . getItem ( PROVIDER_STORAGE_KEY ) ;
48+ if ( stored === "auth0" || stored === "firebase-google" || stored === "firebase-apple" ) {
49+ return stored ;
50+ }
51+ return "auth0" ;
52+ } ;
53+
54+ const saveProvider = ( provider : ProviderType ) => {
55+ if ( typeof window !== "undefined" ) {
56+ localStorage . setItem ( PROVIDER_STORAGE_KEY , provider ) ;
57+ }
58+ } ;
59+
3860const getContractsFromNetwork = ( network : NetworkId ) => {
3961 switch ( network ) {
4062 case "mainnet" :
@@ -53,38 +75,57 @@ const getContractsFromNetwork = (network: NetworkId) => {
5375export function FastAuthProvider ( { children, initialNetwork } : { children : ReactNode ; initialNetwork ?: NetworkId } ) {
5476 // Load network from localStorage or use initialNetwork/default
5577 const storedNetwork = getStoredNetwork ( ) ;
78+ const storedProvider = getStoredProvider ( ) ;
5679 const defaultNetwork = initialNetwork || storedNetwork ;
57-
80+ const firebaseConfig = getConfig ( ) . firebase ;
81+
5882 const [ relayer , setRelayer ] = useState < FastAuthRelayer | null > ( null ) ;
59- const [ client , setClient ] = useState < FastAuthClient < JavascriptProvider > | null > ( null ) ;
83+ const [ client , setClient ] = useState < FastAuthClient < JavascriptProvider | FirebaseProvider > | null > ( null ) ;
6084 const [ isRelayerInitialized , setIsRelayerInitialized ] = useState ( false ) ;
6185 const [ isClientInitialized , setIsClientInitialized ] = useState ( false ) ;
6286 const [ error , setError ] = useState < Error | null > ( null ) ;
6387 const [ network , setNetworkState ] = useState < NetworkId > ( defaultNetwork ) ;
88+ const [ provider , setProviderState ] = useState < ProviderType > ( storedProvider ) ;
89+
90+ const initializeClient = async ( connection : Connection , networkId : NetworkId , providerType : ProviderType ) => {
91+ let authProvider : JavascriptProvider | FirebaseProvider ;
92+
93+ if ( providerType === "firebase-google" || providerType === "firebase-apple" ) {
94+ authProvider = new FirebaseProvider ( {
95+ apiKey : firebaseConfig . apiKey ,
96+ authDomain : firebaseConfig . authDomain ,
97+ projectId : firebaseConfig . projectId ,
98+ storageBucket : firebaseConfig . storageBucket ,
99+ messagingSenderId : firebaseConfig . messagingSenderId ,
100+ appId : firebaseConfig . appId ,
101+ redirectUri : APP_ORIGIN ,
102+ issuerUrl : firebaseConfig . issuerUrl ,
103+ } ) ;
104+ } else {
105+ authProvider = new JavascriptProvider ( {
106+ domain : config . domain ,
107+ clientId : config . clientId ,
108+ redirectUri : APP_ORIGIN ,
109+ audience : config . audience ,
110+ } ) ;
111+ }
64112
65- const initializeClient = async ( connection : Connection , networkId : NetworkId ) => {
66- const provider = new JavascriptProvider ( {
67- domain : config . domain ,
68- clientId : config . clientId ,
69- redirectUri : APP_ORIGIN ,
70- audience : config . audience ,
71- } ) ;
72113 const contracts = getContractsFromNetwork ( networkId ) ;
73- const client = new FastAuthClient ( provider , connection , {
114+ const client = new FastAuthClient ( authProvider , connection , {
74115 mpcContractId : contracts . mpcContractId ,
75116 fastAuthContractId : contracts . fastAuthContractId ,
76117 } ) ;
77118 setClient ( client ) ;
78119 setIsClientInitialized ( true ) ;
79120 } ;
80121
81- const initializeRelayer = async ( networkId : NetworkId ) => {
122+ const initializeRelayer = async ( networkId : NetworkId , providerType : ProviderType ) => {
82123 try {
83124 const fastAuthRelayer = new FastAuthRelayer ( networkId ) ;
84125 await fastAuthRelayer . init ( ) ;
85126 setRelayer ( fastAuthRelayer ) ;
86127 setIsRelayerInitialized ( true ) ;
87- await initializeClient ( fastAuthRelayer . getConnection ( ) . connection , networkId ) ;
128+ await initializeClient ( fastAuthRelayer . getConnection ( ) . connection , networkId , providerType ) ;
88129 setError ( null ) ;
89130 } catch ( err ) {
90131 console . error ( "Failed to initialize FastAuthRelayer:" , err ) ;
@@ -93,40 +134,71 @@ export function FastAuthProvider({ children, initialNetwork }: { children: React
93134 } ;
94135
95136 useEffect ( ( ) => {
96- // Save the initial network to localStorage if not already saved
137+ // Save the initial network and provider to localStorage if not already saved
97138 saveNetwork ( network ) ;
98- initializeRelayer ( network ) ;
139+ saveProvider ( provider ) ;
140+ initializeRelayer ( network , provider ) ;
99141 // eslint-disable-next-line react-hooks/exhaustive-deps
100142 } , [ ] ) ;
101143
102144 const setNetwork = async ( newNetwork : NetworkId ) => {
103145 if ( newNetwork === network ) return ;
104-
146+
105147 // Save to localStorage
106148 saveNetwork ( newNetwork ) ;
107-
149+
108150 setNetworkState ( newNetwork ) ;
109151 setIsRelayerInitialized ( false ) ;
110152 setIsClientInitialized ( false ) ;
111153 setClient ( null ) ;
112-
154+
113155 try {
114156 if ( relayer ) {
115157 await relayer . switchNetwork ( newNetwork ) ;
116158 setRelayer ( relayer ) ;
117159 setIsRelayerInitialized ( true ) ;
118- await initializeClient ( relayer . getConnection ( ) . connection , newNetwork ) ;
160+ await initializeClient ( relayer . getConnection ( ) . connection , newNetwork , provider ) ;
119161 } else {
120- await initializeRelayer ( newNetwork ) ;
162+ await initializeRelayer ( newNetwork , provider ) ;
121163 }
122164 } catch ( err ) {
123165 console . error ( "Failed to switch network:" , err ) ;
124166 setError ( err instanceof Error ? err : new Error ( String ( err ) ) ) ;
125167 }
126168 } ;
127169
170+ const setProvider = async ( newProvider : ProviderType ) => {
171+ if ( newProvider === provider ) return ;
172+
173+ // Save to localStorage
174+ saveProvider ( newProvider ) ;
175+
176+ setProviderState ( newProvider ) ;
177+ setIsClientInitialized ( false ) ;
178+ setClient ( null ) ;
179+
180+ try {
181+ if ( relayer ) {
182+ await initializeClient ( relayer . getConnection ( ) . connection , network , newProvider ) ;
183+ }
184+ } catch ( err ) {
185+ console . error ( "Failed to switch provider:" , err ) ;
186+ setError ( err instanceof Error ? err : new Error ( String ( err ) ) ) ;
187+ }
188+ } ;
189+
128190 return (
129- < FastAuthContext . Provider value = { { relayer, client, isRelayerInitialized, isClientInitialized, error, network, setNetwork } } >
191+ < FastAuthContext . Provider value = { {
192+ relayer,
193+ client,
194+ isRelayerInitialized,
195+ isClientInitialized,
196+ error,
197+ network,
198+ setNetwork,
199+ provider,
200+ setProvider,
201+ } } >
130202 { children }
131203 </ FastAuthContext . Provider >
132204 ) ;
0 commit comments