@@ -3,6 +3,7 @@ import jwtDecode from 'jwt-decode';
33import { useHistory , useLocation } from 'react-router-dom' ;
44import { useModal } from '@faceless-ui/modal' ;
55import { useTranslation } from 'react-i18next' ;
6+ import { toast } from 'react-toastify' ;
67import { Permissions , User } from '../../../../auth/types' ;
78import { useConfig } from '../Config' ;
89import { requests } from '../../../api' ;
@@ -44,29 +45,56 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
4445
4546 const id = user ?. id ;
4647
47- const refreshCookie = useCallback ( ( ) => {
48+ const refreshCookie = useCallback ( ( forceRefresh ?: boolean ) => {
4849 const now = Math . round ( ( new Date ( ) ) . getTime ( ) / 1000 ) ;
4950 const remainingTime = ( exp as number || 0 ) - now ;
5051
51- if ( exp && remainingTime < 120 ) {
52+ if ( forceRefresh || ( exp && remainingTime < 120 ) ) {
5253 setTimeout ( async ( ) => {
53- const request = await requests . post ( `${ serverURL } ${ api } /${ userSlug } /refresh-token` , {
54- headers : {
55- 'Accept-Language' : i18n . language ,
56- } ,
57- } ) ;
58-
59- if ( request . status === 200 ) {
60- const json = await request . json ( ) ;
61- setUser ( json . user ) ;
62- } else {
63- setUser ( null ) ;
64- push ( `${ admin } ${ logoutInactivityRoute } ?redirect=${ encodeURIComponent ( window . location . pathname ) } ` ) ;
54+ try {
55+ const request = await requests . post ( `${ serverURL } ${ api } /${ userSlug } /refresh-token` , {
56+ headers : {
57+ 'Accept-Language' : i18n . language ,
58+ } ,
59+ } ) ;
60+
61+ if ( request . status === 200 ) {
62+ const json = await request . json ( ) ;
63+ setUser ( json . user ) ;
64+ } else {
65+ setUser ( null ) ;
66+ push ( `${ admin } ${ logoutInactivityRoute } ?redirect=${ encodeURIComponent ( window . location . pathname ) } ` ) ;
67+ }
68+ } catch ( e ) {
69+ toast . error ( e . message ) ;
6570 }
6671 } , 1000 ) ;
6772 }
6873 } , [ exp , serverURL , api , userSlug , push , admin , logoutInactivityRoute , i18n ] ) ;
6974
75+ const refreshCookieAsync = useCallback ( async ( skipSetUser ?: boolean ) : Promise < User > => {
76+ try {
77+ const request = await requests . post ( `${ serverURL } ${ api } /${ userSlug } /refresh-token` , {
78+ headers : {
79+ 'Accept-Language' : i18n . language ,
80+ } ,
81+ } ) ;
82+
83+ if ( request . status === 200 ) {
84+ const json = await request . json ( ) ;
85+ if ( ! skipSetUser ) setUser ( json . user ) ;
86+ return json . user ;
87+ }
88+
89+ setUser ( null ) ;
90+ push ( `${ admin } ${ logoutInactivityRoute } ` ) ;
91+ return null ;
92+ } catch ( e ) {
93+ toast . error ( `Refreshing token failed: ${ e . message } ` ) ;
94+ return null ;
95+ }
96+ } , [ serverURL , api , userSlug , push , admin , logoutInactivityRoute , i18n ] ) ;
97+
7098 const setToken = useCallback ( ( token : string ) => {
7199 const decoded = jwtDecode < User > ( token ) ;
72100 setUser ( decoded ) ;
@@ -80,37 +108,47 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
80108 } , [ serverURL , api , userSlug ] ) ;
81109
82110 const refreshPermissions = useCallback ( async ( ) => {
83- const request = await requests . get ( `${ serverURL } ${ api } /access` , {
84- headers : {
85- 'Accept-Language' : i18n . language ,
86- } ,
87- } ) ;
88-
89- if ( request . status === 200 ) {
90- const json : Permissions = await request . json ( ) ;
91- setPermissions ( json ) ;
92- } else {
93- throw new Error ( `Fetching permissions failed with status code ${ request . status } ` ) ;
94- }
95- } , [ serverURL , api , i18n ] ) ;
96-
97- // On mount, get user and set
98- useEffect ( ( ) => {
99- const fetchMe = async ( ) => {
100- const request = await requests . get ( `${ serverURL } ${ api } /${ userSlug } /me` , {
111+ try {
112+ const request = await requests . get ( `${ serverURL } ${ api } /access` , {
101113 headers : {
102114 'Accept-Language' : i18n . language ,
103115 } ,
104116 } ) ;
105117
106118 if ( request . status === 200 ) {
107- const json = await request . json ( ) ;
119+ const json : Permissions = await request . json ( ) ;
120+ setPermissions ( json ) ;
121+ } else {
122+ throw new Error ( `Fetching permissions failed with status code ${ request . status } ` ) ;
123+ }
124+ } catch ( e ) {
125+ toast . error ( `Refreshing permissions failed: ${ e . message } ` ) ;
126+ }
127+ } , [ serverURL , api , i18n ] ) ;
108128
109- setUser ( json ?. user || null ) ;
129+ // On mount, get user and set
130+ useEffect ( ( ) => {
131+ const fetchMe = async ( ) => {
132+ try {
133+ const request = await requests . get ( `${ serverURL } ${ api } /${ userSlug } /me` , {
134+ headers : {
135+ 'Accept-Language' : i18n . language ,
136+ } ,
137+ } ) ;
138+
139+ if ( request . status === 200 ) {
140+ const json = await request . json ( ) ;
110141
111- if ( json ?. token ) {
112- setToken ( json . token ) ;
142+ if ( json ?. user ) {
143+ setUser ( json . user ) ;
144+ } else if ( json ?. token ) {
145+ setToken ( json . token ) ;
146+ } else {
147+ setUser ( null ) ;
148+ }
113149 }
150+ } catch ( e ) {
151+ toast . error ( `Fetching user failed: ${ e . message } ` ) ;
114152 }
115153 } ;
116154
@@ -172,8 +210,10 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
172210 return (
173211 < Context . Provider value = { {
174212 user,
213+ setUser,
175214 logOut,
176215 refreshCookie,
216+ refreshCookieAsync,
177217 refreshPermissions,
178218 permissions,
179219 setToken,
0 commit comments