diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/api/UserApi.ts | 4 | ||||
-rw-r--r-- | src/api/server/ServerApi.ts | 16 | ||||
-rw-r--r-- | src/stores/UserStore.ts | 36 |
3 files changed, 56 insertions, 0 deletions
diff --git a/src/api/UserApi.ts b/src/api/UserApi.ts index 2b319207a..9364b3383 100644 --- a/src/api/UserApi.ts +++ b/src/api/UserApi.ts | |||
@@ -38,6 +38,10 @@ export default class UserApi { | |||
38 | return this.server.userInfo(); | 38 | return this.server.userInfo(); |
39 | } | 39 | } |
40 | 40 | ||
41 | requestNewToken() { | ||
42 | return this.server.requestNewToken(); | ||
43 | } | ||
44 | |||
41 | updateInfo(data: { oldPassword: string; newPassword: string }) { | 45 | updateInfo(data: { oldPassword: string; newPassword: string }) { |
42 | const userData = data; | 46 | const userData = data; |
43 | if (userData.oldPassword && userData.newPassword) { | 47 | if (userData.oldPassword && userData.newPassword) { |
diff --git a/src/api/server/ServerApi.ts b/src/api/server/ServerApi.ts index 8e1d45588..c6cbbd2e2 100644 --- a/src/api/server/ServerApi.ts +++ b/src/api/server/ServerApi.ts | |||
@@ -151,6 +151,22 @@ export default class ServerApi { | |||
151 | return user; | 151 | return user; |
152 | } | 152 | } |
153 | 153 | ||
154 | async requestNewToken() { | ||
155 | if (apiBase() === SERVER_NOT_LOADED) { | ||
156 | throw new Error('Server not loaded'); | ||
157 | } | ||
158 | |||
159 | const request = await sendAuthRequest(`${apiBase()}/me/newtoken`); | ||
160 | if (!request.ok) { | ||
161 | throw new Error(request.statusText); | ||
162 | } | ||
163 | const data = await request.json(); | ||
164 | |||
165 | debug('ServerApi::requestNewToken new authToken received'); | ||
166 | |||
167 | return data; | ||
168 | } | ||
169 | |||
154 | async updateUserInfo(data: any) { | 170 | async updateUserInfo(data: any) { |
155 | const request = await sendAuthRequest(`${apiBase()}/me`, { | 171 | const request = await sendAuthRequest(`${apiBase()}/me`, { |
156 | method: 'PUT', | 172 | method: 'PUT', |
diff --git a/src/stores/UserStore.ts b/src/stores/UserStore.ts index 0616acdad..f98f7d340 100644 --- a/src/stores/UserStore.ts +++ b/src/stores/UserStore.ts | |||
@@ -50,6 +50,11 @@ export default class UserStore extends TypedStore { | |||
50 | 'getInfo', | 50 | 'getInfo', |
51 | ); | 51 | ); |
52 | 52 | ||
53 | @observable requestNewTokenRequest: CachedRequest = new CachedRequest( | ||
54 | this.api.user, | ||
55 | 'requestNewToken', | ||
56 | ); | ||
57 | |||
53 | @observable updateUserInfoRequest: Request = new Request( | 58 | @observable updateUserInfoRequest: Request = new Request( |
54 | this.api.user, | 59 | this.api.user, |
55 | 'updateInfo', | 60 | 'updateInfo', |
@@ -174,6 +179,11 @@ export default class UserStore extends TypedStore { | |||
174 | @computed get data() { | 179 | @computed get data() { |
175 | if (!this.isLoggedIn) return {}; | 180 | if (!this.isLoggedIn) return {}; |
176 | 181 | ||
182 | const newTokenNeeded = this._shouldRequestNewToken(this.authToken); | ||
183 | if (newTokenNeeded) { | ||
184 | this._requestNewToken(); | ||
185 | } | ||
186 | |||
177 | return this.getUserInfoRequest.execute().result || {}; | 187 | return this.getUserInfoRequest.execute().result || {}; |
178 | } | 188 | } |
179 | 189 | ||
@@ -367,6 +377,32 @@ export default class UserStore extends TypedStore { | |||
367 | } | 377 | } |
368 | 378 | ||
369 | // Helpers | 379 | // Helpers |
380 | _shouldRequestNewToken(authToken): boolean { | ||
381 | try { | ||
382 | const decoded = jwt.decode(authToken); | ||
383 | if (!decoded) { | ||
384 | throw new Error('Invalid token'); | ||
385 | } | ||
386 | |||
387 | if (decoded.uid) { | ||
388 | return true; | ||
389 | } | ||
390 | |||
391 | return false; | ||
392 | } catch { | ||
393 | return true; | ||
394 | } | ||
395 | } | ||
396 | |||
397 | _requestNewToken(): void { | ||
398 | // Logic to request new token (use an endpoint for that) | ||
399 | const data = this.requestNewTokenRequest.execute().result; | ||
400 | if (data) { | ||
401 | this.authToken = data.token; | ||
402 | localStorage.setItem('authToken', data.token); | ||
403 | } | ||
404 | } | ||
405 | |||
370 | _parseToken(authToken) { | 406 | _parseToken(authToken) { |
371 | try { | 407 | try { |
372 | const decoded = jwt.decode(authToken); | 408 | const decoded = jwt.decode(authToken); |