diff --git a/web/src/lib/client.ts b/web/src/lib/client.ts index 63889c5..e9bbdd3 100644 --- a/web/src/lib/client.ts +++ b/web/src/lib/client.ts @@ -103,6 +103,7 @@ export const accessToken: Writable = writable(null) export const csrfToken: Writable = writable(null) export const isPending: Writable = writable(false) export const cError: Writable = writable(null) +export const cSuccess: Writable = writable(null) class ApiClient { private viewCookieName: string @@ -122,10 +123,11 @@ class ApiClient { private async handleRequest( fn: () => Promise, - options: { useBearerAuth: boolean } + options: { useBearerAuth: boolean; suspendGlobalErr: boolean } ): Promise { isPending.set(true) cError.set(null) + cSuccess.set(null) // NOTE: If `handleResponse` is used, errors thrown from it will be caught here @@ -145,8 +147,17 @@ class ApiClient { return await fn() } catch (err) { - cError.set(err instanceof Error ? err.message : "Unknown error") - console.log(`[ERR] ${get(cError)}`) + const errMsg = err instanceof Error ? err.message : "Unknown error" + + // The suspension option is handy when we want to display the error inside a modal instead of in a global notification + if (options.suspendGlobalErr) { + // Throw the same error to the next handler (should be handled inside the caller component) + throw new Error(errMsg) + } else { + cError.set(errMsg) + } + + console.log(`[ERR] ${errMsg}`) } finally { isPending.set(false) } @@ -224,7 +235,7 @@ class ApiClient { accessToken.set(newToken) this.lastAtUpdate = new Date() }, - { useBearerAuth: false } + { useBearerAuth: false, suspendGlobalErr: false } ) } @@ -258,7 +269,7 @@ class ApiClient { csrfToken.set(newToken) this.lastCsrfUpdate = new Date() }, - { useBearerAuth: false } + { useBearerAuth: false, suspendGlobalErr: false } ) } @@ -414,7 +425,7 @@ class ApiClient { await goto("/login") }, - { useBearerAuth: false } + { useBearerAuth: false, suspendGlobalErr: false } ) } @@ -437,7 +448,7 @@ class ApiClient { goto("/") }, - { useBearerAuth: false } + { useBearerAuth: false, suspendGlobalErr: false } ) } @@ -458,10 +469,10 @@ class ApiClient { return } - await this.handleResponse(response, { useBearerAuth: false }) + await this.handleResponse(response, { useBearerAuth: true }) await this.handleLocalLogout() }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -473,12 +484,12 @@ class ApiClient { ...this.getAuthHeader() } }) - const data = await this.handleResponse(response, { useBearerAuth: false }) + const data = await this.handleResponse(response, { useBearerAuth: true }) const user = this.deserializeUser(data) currentUser.set(user) }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -498,19 +509,20 @@ class ApiClient { ...this.getAuthHeader(), "Content-Type": "application/json" }, + credentials: "include", body: JSON.stringify(data) }) - const { accessToken: token, user } = await this.handleResponse<{ - accessToken: string + const { access_token: token, user } = await this.handleResponse<{ + access_token: string user: User - }>(response, { useBearerAuth: false }) + }>(response, { useBearerAuth: true }) accessToken.set(token) currentUser.set(user || null) this.lastAtUpdate = new Date() }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: true } // Error displayed inside the settings modal ) } @@ -532,10 +544,10 @@ class ApiClient { return } - await this.handleResponse(response, { useBearerAuth: false }) + await this.handleResponse(response, { useBearerAuth: true }) await this.handleLocalLogout() }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: true } // Error displayed inside the settings modal ) } @@ -556,12 +568,12 @@ class ApiClient { } }) - const users = await this.handleResponse(response, { useBearerAuth: false }) + const users = await this.handleResponse(response, { useBearerAuth: true }) console.log(`[ADMIN] Got ${users.length} user results`) return users }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: true } // Error displayed inside the settings modal ) } @@ -589,9 +601,9 @@ class ApiClient { return } - await this.handleResponse(response, { useBearerAuth: false }) + await this.handleResponse(response, { useBearerAuth: true }) }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: true } // Error displayed inside the settings modal ) } @@ -609,7 +621,7 @@ class ApiClient { let notes: NoteMetadata[] = [] let data = await this.handleResponse(response, { - useBearerAuth: false + useBearerAuth: true }) if (data) { @@ -620,7 +632,7 @@ class ApiClient { return notes }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -636,9 +648,9 @@ class ApiClient { ...this.getAuthHeader() } }) - return await this.handleResponse(response, { useBearerAuth: false }) + return await this.handleResponse(response, { useBearerAuth: true }) }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -665,7 +677,7 @@ class ApiClient { }) const data = await this.handleResponse(response, { - useBearerAuth: false + useBearerAuth: true }) const note = this.deserializeFullNote(data) @@ -675,7 +687,7 @@ class ApiClient { return note }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -698,9 +710,9 @@ class ApiClient { return } - await this.handleResponse(response, { useBearerAuth: false }) + await this.handleResponse(response, { useBearerAuth: true }) }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -728,7 +740,7 @@ class ApiClient { }) const data = await this.handleResponse(response, { - useBearerAuth: false + useBearerAuth: true }) const versions = this.deserializeVersionMetadatas(data) @@ -737,7 +749,7 @@ class ApiClient { return versions }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -764,9 +776,9 @@ class ApiClient { return } - await this.handleResponse(response, { useBearerAuth: false }) + await this.handleResponse(response, { useBearerAuth: true }) }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } @@ -798,7 +810,7 @@ class ApiClient { }) const data = await this.handleResponse(response, { - useBearerAuth: false + useBearerAuth: true }) const version = this.joinDeserializedVersion(noteID, data) @@ -811,7 +823,7 @@ class ApiClient { return version }, - { useBearerAuth: true } + { useBearerAuth: true, suspendGlobalErr: false } ) } }