fix: password update response parsing

This commit is contained in:
ae 2025-04-21 22:21:06 +03:00
parent 709d0892b9
commit 37fe85a7b4
Signed by: ae
GPG Key ID: 995EFD5C1B532B3E

View File

@ -103,6 +103,7 @@ export const accessToken: Writable<string | null> = writable(null)
export const csrfToken: Writable<string | null> = writable(null) export const csrfToken: Writable<string | null> = writable(null)
export const isPending: Writable<boolean> = writable(false) export const isPending: Writable<boolean> = writable(false)
export const cError: Writable<string | null> = writable(null) export const cError: Writable<string | null> = writable(null)
export const cSuccess: Writable<string | null> = writable(null)
class ApiClient { class ApiClient {
private viewCookieName: string private viewCookieName: string
@ -122,10 +123,11 @@ class ApiClient {
private async handleRequest<T>( private async handleRequest<T>(
fn: () => Promise<T>, fn: () => Promise<T>,
options: { useBearerAuth: boolean } options: { useBearerAuth: boolean; suspendGlobalErr: boolean }
): Promise<T | null> { ): Promise<T | null> {
isPending.set(true) isPending.set(true)
cError.set(null) cError.set(null)
cSuccess.set(null)
// NOTE: If `handleResponse` is used, errors thrown from it will be caught here // NOTE: If `handleResponse` is used, errors thrown from it will be caught here
@ -145,8 +147,17 @@ class ApiClient {
return await fn() return await fn()
} catch (err) { } catch (err) {
cError.set(err instanceof Error ? err.message : "Unknown error") const errMsg = err instanceof Error ? err.message : "Unknown error"
console.log(`[ERR] ${get(cError)}`)
// 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 { } finally {
isPending.set(false) isPending.set(false)
} }
@ -224,7 +235,7 @@ class ApiClient {
accessToken.set(newToken) accessToken.set(newToken)
this.lastAtUpdate = new Date() this.lastAtUpdate = new Date()
}, },
{ useBearerAuth: false } { useBearerAuth: false, suspendGlobalErr: false }
) )
} }
@ -258,7 +269,7 @@ class ApiClient {
csrfToken.set(newToken) csrfToken.set(newToken)
this.lastCsrfUpdate = new Date() this.lastCsrfUpdate = new Date()
}, },
{ useBearerAuth: false } { useBearerAuth: false, suspendGlobalErr: false }
) )
} }
@ -414,7 +425,7 @@ class ApiClient {
await goto("/login") await goto("/login")
}, },
{ useBearerAuth: false } { useBearerAuth: false, suspendGlobalErr: false }
) )
} }
@ -437,7 +448,7 @@ class ApiClient {
goto("/") goto("/")
}, },
{ useBearerAuth: false } { useBearerAuth: false, suspendGlobalErr: false }
) )
} }
@ -458,10 +469,10 @@ class ApiClient {
return return
} }
await this.handleResponse<void>(response, { useBearerAuth: false }) await this.handleResponse<void>(response, { useBearerAuth: true })
await this.handleLocalLogout() await this.handleLocalLogout()
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -473,12 +484,12 @@ class ApiClient {
...this.getAuthHeader() ...this.getAuthHeader()
} }
}) })
const data = await this.handleResponse<ApiUserResponse>(response, { useBearerAuth: false }) const data = await this.handleResponse<ApiUserResponse>(response, { useBearerAuth: true })
const user = this.deserializeUser(data) const user = this.deserializeUser(data)
currentUser.set(user) currentUser.set(user)
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -498,19 +509,20 @@ class ApiClient {
...this.getAuthHeader(), ...this.getAuthHeader(),
"Content-Type": "application/json" "Content-Type": "application/json"
}, },
credentials: "include",
body: JSON.stringify(data) body: JSON.stringify(data)
}) })
const { accessToken: token, user } = await this.handleResponse<{ const { access_token: token, user } = await this.handleResponse<{
accessToken: string access_token: string
user: User user: User
}>(response, { useBearerAuth: false }) }>(response, { useBearerAuth: true })
accessToken.set(token) accessToken.set(token)
currentUser.set(user || null) currentUser.set(user || null)
this.lastAtUpdate = new Date() this.lastAtUpdate = new Date()
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: true } // Error displayed inside the settings modal
) )
} }
@ -532,10 +544,10 @@ class ApiClient {
return return
} }
await this.handleResponse<void>(response, { useBearerAuth: false }) await this.handleResponse<void>(response, { useBearerAuth: true })
await this.handleLocalLogout() 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<User[]>(response, { useBearerAuth: false }) const users = await this.handleResponse<User[]>(response, { useBearerAuth: true })
console.log(`[ADMIN] Got ${users.length} user results`) console.log(`[ADMIN] Got ${users.length} user results`)
return users return users
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: true } // Error displayed inside the settings modal
) )
} }
@ -589,9 +601,9 @@ class ApiClient {
return return
} }
await this.handleResponse<void>(response, { useBearerAuth: false }) await this.handleResponse<void>(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 notes: NoteMetadata[] = []
let data = await this.handleResponse<ApiNoteMetadataResponse[]>(response, { let data = await this.handleResponse<ApiNoteMetadataResponse[]>(response, {
useBearerAuth: false useBearerAuth: true
}) })
if (data) { if (data) {
@ -620,7 +632,7 @@ class ApiClient {
return notes return notes
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -636,9 +648,9 @@ class ApiClient {
...this.getAuthHeader() ...this.getAuthHeader()
} }
}) })
return await this.handleResponse<NewNoteResponse>(response, { useBearerAuth: false }) return await this.handleResponse<NewNoteResponse>(response, { useBearerAuth: true })
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -665,7 +677,7 @@ class ApiClient {
}) })
const data = await this.handleResponse<ApiFullNoteResponse>(response, { const data = await this.handleResponse<ApiFullNoteResponse>(response, {
useBearerAuth: false useBearerAuth: true
}) })
const note = this.deserializeFullNote(data) const note = this.deserializeFullNote(data)
@ -675,7 +687,7 @@ class ApiClient {
return note return note
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -698,9 +710,9 @@ class ApiClient {
return return
} }
await this.handleResponse<void>(response, { useBearerAuth: false }) await this.handleResponse<void>(response, { useBearerAuth: true })
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -728,7 +740,7 @@ class ApiClient {
}) })
const data = await this.handleResponse<ApiVersionMetadataResponse[]>(response, { const data = await this.handleResponse<ApiVersionMetadataResponse[]>(response, {
useBearerAuth: false useBearerAuth: true
}) })
const versions = this.deserializeVersionMetadatas(data) const versions = this.deserializeVersionMetadatas(data)
@ -737,7 +749,7 @@ class ApiClient {
return versions return versions
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -764,9 +776,9 @@ class ApiClient {
return return
} }
await this.handleResponse<void>(response, { useBearerAuth: false }) await this.handleResponse<void>(response, { useBearerAuth: true })
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
@ -798,7 +810,7 @@ class ApiClient {
}) })
const data = await this.handleResponse<ApiFullVersionResponse>(response, { const data = await this.handleResponse<ApiFullVersionResponse>(response, {
useBearerAuth: false useBearerAuth: true
}) })
const version = this.joinDeserializedVersion(noteID, data) const version = this.joinDeserializedVersion(noteID, data)
@ -811,7 +823,7 @@ class ApiClient {
return version return version
}, },
{ useBearerAuth: true } { useBearerAuth: true, suspendGlobalErr: false }
) )
} }
} }