@@ -22,9 +22,11 @@ import {
2222 type ConfirmEmailResponse ,
2323 Roles ,
2424 Products ,
25+ AuthorizationError ,
2526} from "utils/atlas" ;
2627
2728import { isUndefined } from "src/utils" ;
29+ import { GraphQLError } from "graphql" ;
2830
2931interface IAtlasProvider {
3032 isVerified : boolean ;
@@ -94,16 +96,32 @@ const AtlasProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) =
9496 } , [ authToken , address ] ) ;
9597
9698 useEffect ( ( ) => {
97- // initial verfiy check
98- setIsVerified ( verifySession ( ) ) ;
99+ let timeoutId : NodeJS . Timeout ;
99100
100- // verify session every 5 sec
101- const intervalId = setInterval ( ( ) => {
102- setIsVerified ( verifySession ( ) ) ;
103- } , 5000 ) ;
101+ const verifyAndSchedule = ( ) => {
102+ console . log ( "checking" ) ;
103+
104+ // initial verfiy check
105+ const isValid = verifySession ( ) ;
106+ setIsVerified ( isValid ) ;
107+
108+ if ( isValid && authToken ) {
109+ try {
110+ const payload = decodeJwt ( authToken ) ;
111+ const expiresIn = ( payload . exp as number ) * 1000 - Date . now ( ) ;
112+
113+ timeoutId = setTimeout ( verifyAndSchedule , Math . max ( 0 , expiresIn ) ) ;
114+ } catch ( err ) {
115+ console . error ( "Error decoding JWT:" , err ) ;
116+ setIsVerified ( false ) ;
117+ }
118+ }
119+ } ;
120+
121+ verifyAndSchedule ( ) ;
104122
105123 return ( ) => {
106- clearInterval ( intervalId ) ;
124+ clearTimeout ( timeoutId ) ;
107125 } ;
108126 } , [ authToken , verifySession , address ] ) ;
109127
@@ -140,6 +158,21 @@ const AtlasProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) =
140158 return ! isUndefined ( user . email ) ;
141159 } , [ user ] ) ;
142160
161+ async function fetchWithAuthErrorHandling < T > ( request : ( ) => Promise < T > ) : Promise < T > {
162+ try {
163+ return await request ( ) ;
164+ } catch ( error ) {
165+ if (
166+ error instanceof AuthorizationError ||
167+ ( error instanceof GraphQLError && error . extensions [ "code" ] === "UNAUTHENTICATED" )
168+ ) {
169+ setIsVerified ( false ) ;
170+ throw error ;
171+ }
172+ throw error ;
173+ }
174+ }
175+
143176 /**
144177 * @description authorise user and enable authorised calls
145178 */
@@ -173,7 +206,7 @@ const AtlasProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) =
173206 if ( ! address || ! isVerified ) return false ;
174207 setIsAddingUser ( true ) ;
175208
176- const userAdded = await addUserToAtlas ( atlasGqlClient , userSettings ) ;
209+ const userAdded = await fetchWithAuthErrorHandling ( ( ) => addUserToAtlas ( atlasGqlClient , userSettings ) ) ;
177210 refetchUser ( ) ;
178211
179212 return userAdded ;
@@ -199,7 +232,8 @@ const AtlasProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) =
199232 if ( ! address || ! isVerified ) return false ;
200233 setIsUpdatingUser ( true ) ;
201234
202- const emailUpdated = await updateEmailInAtlas ( atlasGqlClient , userSettings ) ;
235+ // const emailUpdated = await updateEmailInAtlas(atlasGqlClient, userSettings);
236+ const emailUpdated = await fetchWithAuthErrorHandling ( ( ) => updateEmailInAtlas ( atlasGqlClient , userSettings ) ) ;
203237 refetchUser ( ) ;
204238
205239 return emailUpdated ;
@@ -227,9 +261,8 @@ const AtlasProvider: React.FC<{ children?: React.ReactNode }> = ({ children }) =
227261 if ( ! address || ! isVerified || ! atlasUri || ! authToken ) return null ;
228262 setIsUploadingFile ( true ) ;
229263
230- const hash = await uploadToIpfs (
231- { baseUrl : atlasUri , authToken } ,
232- { file, name : file . name , role, product : Products . CourtV2 }
264+ const hash = await fetchWithAuthErrorHandling ( ( ) =>
265+ uploadToIpfs ( { baseUrl : atlasUri , authToken } , { file, name : file . name , role, product : Products . CourtV2 } )
233266 ) ;
234267 return hash ? `/ipfs/${ hash } ` : null ;
235268 } catch ( err : any ) {
0 commit comments