chore(fix): fixes sync response not correctly identifying all errors (#2346)
This commit is contained in:
@@ -315,12 +315,14 @@ export class HttpService implements HttpServiceInterface {
|
|||||||
console.error(error)
|
console.error(error)
|
||||||
}
|
}
|
||||||
if (httpStatus >= HttpStatusCode.Success && httpStatus < HttpStatusCode.InternalServerError) {
|
if (httpStatus >= HttpStatusCode.Success && httpStatus < HttpStatusCode.InternalServerError) {
|
||||||
if (
|
if (httpStatus === HttpStatusCode.Forbidden && isErrorResponse(response)) {
|
||||||
httpStatus === HttpStatusCode.Forbidden &&
|
if (!response.data.error) {
|
||||||
response.data &&
|
response.data.error = {
|
||||||
(response as HttpErrorResponse).data.error !== undefined
|
message: ErrorMessage.RateLimited,
|
||||||
) {
|
}
|
||||||
;(response as HttpErrorResponse).data.error.message = ErrorMessage.RateLimited
|
} else {
|
||||||
|
response.data.error.message = ErrorMessage.RateLimited
|
||||||
|
}
|
||||||
}
|
}
|
||||||
resolve(response)
|
resolve(response)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { HttpErrorResponse } from '../Http'
|
import { HttpErrorResponse, getErrorFromErrorResponse } from '../Http'
|
||||||
|
|
||||||
export class ClientDisplayableError {
|
export class ClientDisplayableError {
|
||||||
constructor(public text: string, public title?: string, public tag?: string) {
|
constructor(public text: string, public title?: string, public tag?: string) {
|
||||||
@@ -14,7 +14,7 @@ export class ClientDisplayableError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static FromNetworkError(error: HttpErrorResponse) {
|
static FromNetworkError(error: HttpErrorResponse) {
|
||||||
return new ClientDisplayableError(error.data.error.message)
|
return new ClientDisplayableError(getErrorFromErrorResponse(error).message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { HttpError } from './HttpError'
|
import { HttpError } from './HttpError'
|
||||||
|
|
||||||
export type HttpErrorResponseBody = {
|
export type HttpErrorResponseBody = {
|
||||||
error: HttpError
|
error?: HttpError
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { HttpErrorResponseBody } from './HttpErrorResponseBody'
|
|||||||
import { HttpResponseMeta } from './HttpResponseMeta'
|
import { HttpResponseMeta } from './HttpResponseMeta'
|
||||||
import { HttpHeaders } from './HttpHeaders'
|
import { HttpHeaders } from './HttpHeaders'
|
||||||
import { HttpStatusCode } from './HttpStatusCode'
|
import { HttpStatusCode } from './HttpStatusCode'
|
||||||
|
import { HttpError } from './HttpError'
|
||||||
|
|
||||||
type AnySuccessRecord = Record<string, unknown> & { error?: never }
|
type AnySuccessRecord = Record<string, unknown> & { error?: never }
|
||||||
|
|
||||||
@@ -24,3 +25,14 @@ export type HttpResponse<T = AnySuccessRecord> = HttpErrorResponse | HttpSuccess
|
|||||||
export function isErrorResponse<T>(response: HttpResponse<T>): response is HttpErrorResponse {
|
export function isErrorResponse<T>(response: HttpResponse<T>): response is HttpErrorResponse {
|
||||||
return (response.data as HttpErrorResponseBody)?.error != undefined || response.status >= 400
|
return (response.data as HttpErrorResponseBody)?.error != undefined || response.status >= 400
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getErrorFromErrorResponse(response: HttpErrorResponse): HttpError {
|
||||||
|
const embeddedError = response.data.error
|
||||||
|
if (embeddedError) {
|
||||||
|
return embeddedError
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
message: 'Unknown error',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export class GetInboundAsymmetricMessages {
|
|||||||
const response = await this.messageServer.getMessages()
|
const response = await this.messageServer.getMessages()
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return ClientDisplayableError.FromError(response.data.error)
|
return ClientDisplayableError.FromNetworkError(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.data.messages
|
return response.data.messages
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export class GetOutboundAsymmetricMessages {
|
|||||||
const response = await this.messageServer.getOutboundUserMessages()
|
const response = await this.messageServer.getOutboundUserMessages()
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return ClientDisplayableError.FromError(response.data.error)
|
return ClientDisplayableError.FromNetworkError(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.data.messages
|
return response.data.messages
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export class SendAsymmetricMessageUseCase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return ClientDisplayableError.FromError(response.data.error)
|
return ClientDisplayableError.FromNetworkError(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.data.message
|
return response.data.message
|
||||||
|
|||||||
@@ -386,7 +386,7 @@ export class FileService extends AbstractService implements FilesClientInterface
|
|||||||
|
|
||||||
const result = await this.api.deleteFile(tokenResult, file.shared_vault_uuid ? 'shared-vault' : 'user')
|
const result = await this.api.deleteFile(tokenResult, file.shared_vault_uuid ? 'shared-vault' : 'user')
|
||||||
|
|
||||||
if (result.data?.error) {
|
if (isErrorResponse(result)) {
|
||||||
const deleteAnyway = await this.alertService.confirm(
|
const deleteAnyway = await this.alertService.confirm(
|
||||||
spaceSeparatedStrings(
|
spaceSeparatedStrings(
|
||||||
'This file could not be deleted from the server, possibly because you are attempting to delete a file item',
|
'This file could not be deleted from the server, possibly because you are attempting to delete a file item',
|
||||||
@@ -400,7 +400,7 @@ export class FileService extends AbstractService implements FilesClientInterface
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (!deleteAnyway) {
|
if (!deleteAnyway) {
|
||||||
return ClientDisplayableError.FromError(result.data?.error)
|
return ClientDisplayableError.FromNetworkError(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { RevisionApiServiceInterface } from '@standardnotes/api'
|
import { RevisionApiServiceInterface } from '@standardnotes/api'
|
||||||
import { Uuid } from '@standardnotes/domain-core'
|
import { Uuid } from '@standardnotes/domain-core'
|
||||||
import { isErrorResponse } from '@standardnotes/responses'
|
import { getErrorFromErrorResponse, isErrorResponse } from '@standardnotes/responses'
|
||||||
|
|
||||||
import { InternalEventBusInterface } from '../Internal/InternalEventBusInterface'
|
import { InternalEventBusInterface } from '../Internal/InternalEventBusInterface'
|
||||||
import { AbstractService } from '../Service/AbstractService'
|
import { AbstractService } from '../Service/AbstractService'
|
||||||
@@ -21,7 +21,7 @@ export class RevisionManager extends AbstractService implements RevisionClientIn
|
|||||||
const result = await this.revisionApiService.listRevisions(itemUuid.value)
|
const result = await this.revisionApiService.listRevisions(itemUuid.value)
|
||||||
|
|
||||||
if (isErrorResponse(result)) {
|
if (isErrorResponse(result)) {
|
||||||
throw new Error(result.data.error.message)
|
throw new Error(getErrorFromErrorResponse(result).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.data.revisions
|
return result.data.revisions
|
||||||
@@ -31,7 +31,7 @@ export class RevisionManager extends AbstractService implements RevisionClientIn
|
|||||||
const result = await this.revisionApiService.deleteRevision(itemUuid.value, revisionUuid.value)
|
const result = await this.revisionApiService.deleteRevision(itemUuid.value, revisionUuid.value)
|
||||||
|
|
||||||
if (isErrorResponse(result)) {
|
if (isErrorResponse(result)) {
|
||||||
throw new Error(result.data.error.message)
|
throw new Error(getErrorFromErrorResponse(result).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.data.message
|
return result.data.message
|
||||||
@@ -41,7 +41,7 @@ export class RevisionManager extends AbstractService implements RevisionClientIn
|
|||||||
const result = await this.revisionApiService.getRevision(itemUuid.value, revisionUuid.value)
|
const result = await this.revisionApiService.getRevision(itemUuid.value, revisionUuid.value)
|
||||||
|
|
||||||
if (isErrorResponse(result)) {
|
if (isErrorResponse(result)) {
|
||||||
throw new Error(result.data.error.message)
|
throw new Error(getErrorFromErrorResponse(result).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.data.revision
|
return result.data.revision
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export class SendSharedVaultInviteUseCase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return ClientDisplayableError.FromError(response.data.error)
|
return ClientDisplayableError.FromNetworkError(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.data.invite
|
return response.data.invite
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export class UpdateSharedVaultInviteUseCase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return ClientDisplayableError.FromError(response.data.error)
|
return ClientDisplayableError.FromNetworkError(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.data.invite
|
return response.data.invite
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { InternalEventBusInterface } from '../Internal/InternalEventBusInterface
|
|||||||
import { AbstractService } from '../Service/AbstractService'
|
import { AbstractService } from '../Service/AbstractService'
|
||||||
import { SubscriptionClientInterface } from './SubscriptionClientInterface'
|
import { SubscriptionClientInterface } from './SubscriptionClientInterface'
|
||||||
import { AppleIAPReceipt } from './AppleIAPReceipt'
|
import { AppleIAPReceipt } from './AppleIAPReceipt'
|
||||||
import { isErrorResponse } from '@standardnotes/responses'
|
import { getErrorFromErrorResponse, isErrorResponse } from '@standardnotes/responses'
|
||||||
|
|
||||||
export class SubscriptionManager extends AbstractService implements SubscriptionClientInterface {
|
export class SubscriptionManager extends AbstractService implements SubscriptionClientInterface {
|
||||||
constructor(
|
constructor(
|
||||||
@@ -19,7 +19,7 @@ export class SubscriptionManager extends AbstractService implements Subscription
|
|||||||
const result = await this.subscriptionApiService.acceptInvite(inviteUuid)
|
const result = await this.subscriptionApiService.acceptInvite(inviteUuid)
|
||||||
|
|
||||||
if (isErrorResponse(result)) {
|
if (isErrorResponse(result)) {
|
||||||
return { success: false, message: result.data.error.message }
|
return { success: false, message: getErrorFromErrorResponse(result).message }
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.data
|
return result.data
|
||||||
@@ -81,7 +81,7 @@ export class SubscriptionManager extends AbstractService implements Subscription
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (isErrorResponse(result)) {
|
if (isErrorResponse(result)) {
|
||||||
return { success: false, message: result.data.error.message }
|
return { success: false, message: getErrorFromErrorResponse(result).message }
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.data
|
return result.data
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
import { Base64String } from '@standardnotes/sncrypto-common'
|
import { Base64String } from '@standardnotes/sncrypto-common'
|
||||||
import { EncryptionProviderInterface, SNRootKey, SNRootKeyParams } from '@standardnotes/encryption'
|
import { EncryptionProviderInterface, SNRootKey, SNRootKeyParams } from '@standardnotes/encryption'
|
||||||
import { HttpResponse, SignInResponse, User, isErrorResponse } from '@standardnotes/responses'
|
import {
|
||||||
|
HttpResponse,
|
||||||
|
SignInResponse,
|
||||||
|
User,
|
||||||
|
getErrorFromErrorResponse,
|
||||||
|
isErrorResponse,
|
||||||
|
} from '@standardnotes/responses'
|
||||||
import { KeyParamsOrigination, UserRequestType } from '@standardnotes/common'
|
import { KeyParamsOrigination, UserRequestType } from '@standardnotes/common'
|
||||||
import { UuidGenerator } from '@standardnotes/utils'
|
import { UuidGenerator } from '@standardnotes/utils'
|
||||||
import { UserApiServiceInterface, UserRegistrationResponseBody } from '@standardnotes/api'
|
import { UserApiServiceInterface, UserRegistrationResponseBody } from '@standardnotes/api'
|
||||||
@@ -227,7 +233,7 @@ export class UserService
|
|||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return {
|
return {
|
||||||
error: true,
|
error: true,
|
||||||
message: response.data.error.message,
|
message: getErrorFromErrorResponse(response).message,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -664,7 +664,7 @@ export class SNApiService
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return ClientDisplayableError.FromError(response.data.error)
|
return ClientDisplayableError.FromNetworkError(response)
|
||||||
}
|
}
|
||||||
const data = response.data
|
const data = response.data
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ import {
|
|||||||
ChangeCredentialsResponse,
|
ChangeCredentialsResponse,
|
||||||
SessionListResponse,
|
SessionListResponse,
|
||||||
HttpSuccessResponse,
|
HttpSuccessResponse,
|
||||||
|
getErrorFromErrorResponse,
|
||||||
} from '@standardnotes/responses'
|
} from '@standardnotes/responses'
|
||||||
import { CopyPayloadWithContentOverride, RootKeyWithKeyPairsInterface } from '@standardnotes/models'
|
import { CopyPayloadWithContentOverride, RootKeyWithKeyPairsInterface } from '@standardnotes/models'
|
||||||
import { LegacySession, MapperInterface, Result, Session, SessionToken } from '@standardnotes/domain-core'
|
import { LegacySession, MapperInterface, Result, Session, SessionToken } from '@standardnotes/domain-core'
|
||||||
@@ -316,7 +317,7 @@ export class SNSessionManager
|
|||||||
const result = await this.apiService.getSubscription(this.getSureUser().uuid)
|
const result = await this.apiService.getSubscription(this.getSureUser().uuid)
|
||||||
|
|
||||||
if (isErrorResponse(result)) {
|
if (isErrorResponse(result)) {
|
||||||
return ClientDisplayableError.FromError(result.data?.error)
|
return ClientDisplayableError.FromNetworkError(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
const subscription = result.data.subscription
|
const subscription = result.data.subscription
|
||||||
@@ -328,7 +329,7 @@ export class SNSessionManager
|
|||||||
const response = await this.apiService.getAvailableSubscriptions()
|
const response = await this.apiService.getAvailableSubscriptions()
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
return ClientDisplayableError.FromError(response.data.error)
|
return ClientDisplayableError.FromNetworkError(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.data
|
return response.data
|
||||||
@@ -418,8 +419,8 @@ export class SNSessionManager
|
|||||||
ephemeral,
|
ephemeral,
|
||||||
})
|
})
|
||||||
|
|
||||||
if ('error' in registerResponse.data) {
|
if (isErrorResponse(registerResponse)) {
|
||||||
throw new ApiCallError(registerResponse.data.error.message)
|
throw new ApiCallError(getErrorFromErrorResponse(registerResponse).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.handleAuthentication({
|
await this.handleAuthentication({
|
||||||
@@ -492,8 +493,8 @@ export class SNSessionManager
|
|||||||
const result = await this.performSignIn(email, password, strict, ephemeral, minAllowedVersion)
|
const result = await this.performSignIn(email, password, strict, ephemeral, minAllowedVersion)
|
||||||
if (
|
if (
|
||||||
isErrorResponse(result.response) &&
|
isErrorResponse(result.response) &&
|
||||||
result.response.data.error.tag !== ErrorTag.ClientValidationError &&
|
getErrorFromErrorResponse(result.response).tag !== ErrorTag.ClientValidationError &&
|
||||||
result.response.data.error.tag !== ErrorTag.ClientCanceledMfa
|
getErrorFromErrorResponse(result.response).tag !== ErrorTag.ClientCanceledMfa
|
||||||
) {
|
) {
|
||||||
const cleanedEmail = cleanedEmailString(email)
|
const cleanedEmail = cleanedEmailString(email)
|
||||||
if (cleanedEmail !== email) {
|
if (cleanedEmail !== email) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { SettingsList } from './SettingsList'
|
import { SettingsList } from './SettingsList'
|
||||||
import { SettingName } from '@standardnotes/settings'
|
import { SettingName } from '@standardnotes/settings'
|
||||||
import { API_MESSAGE_INVALID_SESSION } from '@standardnotes/services'
|
import { API_MESSAGE_INVALID_SESSION } from '@standardnotes/services'
|
||||||
import { HttpStatusCode, isErrorResponse, User } from '@standardnotes/responses'
|
import { getErrorFromErrorResponse, HttpStatusCode, isErrorResponse, User } from '@standardnotes/responses'
|
||||||
import { SettingsServerInterface } from './SettingsServerInterface'
|
import { SettingsServerInterface } from './SettingsServerInterface'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,7 +34,7 @@ export class SettingsGateway {
|
|||||||
const response = await this.settingsApi.listSettings(this.userUuid)
|
const response = await this.settingsApi.listSettings(this.userUuid)
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
throw new Error(response.data?.error.message)
|
throw new Error(getErrorFromErrorResponse(response).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.data == undefined || response.data.settings == undefined) {
|
if (response.data == undefined || response.data.settings == undefined) {
|
||||||
@@ -53,7 +53,7 @@ export class SettingsGateway {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
throw new Error(response.data?.error.message)
|
throw new Error(getErrorFromErrorResponse(response).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response?.data?.setting?.value ?? undefined
|
return response?.data?.setting?.value ?? undefined
|
||||||
@@ -71,7 +71,7 @@ export class SettingsGateway {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
throw new Error(response.data?.error.message)
|
throw new Error(getErrorFromErrorResponse(response).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response?.data?.setting?.value ?? undefined
|
return response?.data?.setting?.value ?? undefined
|
||||||
@@ -89,7 +89,7 @@ export class SettingsGateway {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
throw new Error(response.data?.error.message)
|
throw new Error(getErrorFromErrorResponse(response).message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return response.data?.success ?? false
|
return response.data?.success ?? false
|
||||||
@@ -98,14 +98,14 @@ export class SettingsGateway {
|
|||||||
async updateSetting(name: SettingName, payload: string, sensitive: boolean): Promise<void> {
|
async updateSetting(name: SettingName, payload: string, sensitive: boolean): Promise<void> {
|
||||||
const response = await this.settingsApi.updateSetting(this.userUuid, name.value, payload, sensitive)
|
const response = await this.settingsApi.updateSetting(this.userUuid, name.value, payload, sensitive)
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
throw new Error(response.data?.error.message)
|
throw new Error(getErrorFromErrorResponse(response).message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async deleteSetting(name: SettingName): Promise<void> {
|
async deleteSetting(name: SettingName): Promise<void> {
|
||||||
const response = await this.settingsApi.deleteSetting(this.userUuid, name.value)
|
const response = await this.settingsApi.deleteSetting(this.userUuid, name.value)
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
throw new Error(response.data?.error.message)
|
throw new Error(getErrorFromErrorResponse(response).message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
RawSyncResponse,
|
RawSyncResponse,
|
||||||
UserEventServerHash,
|
UserEventServerHash,
|
||||||
AsymmetricMessageServerHash,
|
AsymmetricMessageServerHash,
|
||||||
|
getErrorFromErrorResponse,
|
||||||
} from '@standardnotes/responses'
|
} from '@standardnotes/responses'
|
||||||
import {
|
import {
|
||||||
FilterDisallowedRemotePayloadsAndMap,
|
FilterDisallowedRemotePayloadsAndMap,
|
||||||
@@ -35,8 +36,6 @@ export class ServerSyncResponse {
|
|||||||
private successResponseData: RawSyncResponse | undefined
|
private successResponseData: RawSyncResponse | undefined
|
||||||
|
|
||||||
constructor(public rawResponse: HttpResponse<RawSyncResponse>) {
|
constructor(public rawResponse: HttpResponse<RawSyncResponse>) {
|
||||||
this.rawResponse = rawResponse
|
|
||||||
|
|
||||||
if (!isErrorResponse(rawResponse)) {
|
if (!isErrorResponse(rawResponse)) {
|
||||||
this.successResponseData = rawResponse.data
|
this.successResponseData = rawResponse.data
|
||||||
}
|
}
|
||||||
@@ -101,7 +100,11 @@ export class ServerSyncResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public get error(): HttpError | undefined {
|
public get error(): HttpError | undefined {
|
||||||
return isErrorResponse(this.rawResponse) ? this.rawResponse.data?.error : undefined
|
if (isErrorResponse(this.rawResponse)) {
|
||||||
|
return getErrorFromErrorResponse(this.rawResponse)
|
||||||
|
} else {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public get status(): number {
|
public get status(): number {
|
||||||
@@ -123,6 +126,6 @@ export class ServerSyncResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public get hasError(): boolean {
|
public get hasError(): boolean {
|
||||||
return this.error != undefined
|
return isErrorResponse(this.rawResponse)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import Icon from '@/Components/Icon/Icon'
|
|||||||
import IconButton from '@/Components/Button/IconButton'
|
import IconButton from '@/Components/Button/IconButton'
|
||||||
import AdvancedOptions from './AdvancedOptions'
|
import AdvancedOptions from './AdvancedOptions'
|
||||||
import HorizontalSeparator from '../Shared/HorizontalSeparator'
|
import HorizontalSeparator from '../Shared/HorizontalSeparator'
|
||||||
import { isErrorResponse } from '@standardnotes/snjs'
|
import { getErrorFromErrorResponse, isErrorResponse } from '@standardnotes/snjs'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
viewControllerManager: ViewControllerManager
|
viewControllerManager: ViewControllerManager
|
||||||
@@ -99,7 +99,7 @@ const SignInPane: FunctionComponent<Props> = ({ application, viewControllerManag
|
|||||||
.signIn(email, password, isStrictSignin, isEphemeral, shouldMergeLocal)
|
.signIn(email, password, isStrictSignin, isEphemeral, shouldMergeLocal)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (isErrorResponse(response)) {
|
if (isErrorResponse(response)) {
|
||||||
throw new Error(response.data?.error.message)
|
throw new Error(getErrorFromErrorResponse(response).message)
|
||||||
}
|
}
|
||||||
viewControllerManager.accountMenuController.closeAccountMenu()
|
viewControllerManager.accountMenuController.closeAccountMenu()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
import { ViewControllerManager } from '@/Controllers/ViewControllerManager'
|
import { ViewControllerManager } from '@/Controllers/ViewControllerManager'
|
||||||
import { SNApplication, SessionStrings, UuidString, SessionListEntry, isErrorResponse } from '@standardnotes/snjs'
|
import {
|
||||||
|
SNApplication,
|
||||||
|
SessionStrings,
|
||||||
|
UuidString,
|
||||||
|
SessionListEntry,
|
||||||
|
isErrorResponse,
|
||||||
|
getErrorFromErrorResponse,
|
||||||
|
} from '@standardnotes/snjs'
|
||||||
import { FunctionComponent, useState, useEffect, useRef, useMemo } from 'react'
|
import { FunctionComponent, useState, useEffect, useRef, useMemo } from 'react'
|
||||||
import { WebApplication } from '@/Application/WebApplication'
|
import { WebApplication } from '@/Application/WebApplication'
|
||||||
import { observer } from 'mobx-react-lite'
|
import { observer } from 'mobx-react-lite'
|
||||||
@@ -64,9 +71,10 @@ function useSessions(
|
|||||||
if (!response) {
|
if (!response) {
|
||||||
setSessions(sessionsBeforeRevoke)
|
setSessions(sessionsBeforeRevoke)
|
||||||
} else if (isErrorResponse(response)) {
|
} else if (isErrorResponse(response)) {
|
||||||
if (response.data?.error.message) {
|
setErrorMessage(
|
||||||
setErrorMessage(response.data?.error.message || 'An unknown error occured while revoking the session.')
|
getErrorFromErrorResponse(response).message || 'An unknown error occured while revoking the session.',
|
||||||
}
|
)
|
||||||
|
|
||||||
setSessions(sessionsBeforeRevoke)
|
setSessions(sessionsBeforeRevoke)
|
||||||
} else {
|
} else {
|
||||||
setSessions(sessions.filter((session) => session.uuid !== uuid))
|
setSessions(sessions.filter((session) => session.uuid !== uuid))
|
||||||
|
|||||||
Reference in New Issue
Block a user