PM-7392 - Per PR feedback, move error handling toast responsibility to client specific app component logic reached via messaging.

This commit is contained in:
Jared Snider 2024-05-07 13:57:51 -04:00
parent c5b807114f
commit 28d2a8797c
No known key found for this signature in database
GPG Key ID: A149DDD612516286
7 changed files with 34 additions and 13 deletions

View File

@ -572,7 +572,7 @@ export default class MainBackground {
this.environmentService,
this.appIdService,
this.stateService,
this.i18nService,
this.messagingService,
this.logService,
(expired: boolean) => this.logout(expired),
);

View File

@ -16,8 +16,8 @@ import {
environmentServiceFactory,
EnvironmentServiceInitOptions,
} from "./environment-service.factory";
import { i18nServiceFactory, I18nServiceInitOptions } from "./i18n-service.factory";
import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory";
import { messageSenderFactory, MessageSenderInitOptions } from "./message-sender.factory";
import {
PlatformUtilsServiceInitOptions,
platformUtilsServiceFactory,
@ -37,7 +37,7 @@ export type ApiServiceInitOptions = ApiServiceFactoryOptions &
EnvironmentServiceInitOptions &
AppIdServiceInitOptions &
StateServiceInitOptions &
I18nServiceInitOptions &
MessageSenderInitOptions &
LogServiceInitOptions;
export function apiServiceFactory(
@ -55,7 +55,7 @@ export function apiServiceFactory(
await environmentServiceFactory(cache, opts),
await appIdServiceFactory(cache, opts),
await stateServiceFactory(cache, opts),
await i18nServiceFactory(cache, opts),
await messageSenderFactory(cache, opts),
await logServiceFactory(cache, opts),
opts.apiServiceOptions.logoutCallback,
opts.apiServiceOptions.customUserAgent,

View File

@ -144,6 +144,12 @@ export class AppComponent implements OnInit, OnDestroy {
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.router.navigate(["/update-temp-password"]);
} else if (msg.command === "refreshAccessTokenError") {
this.toastService.showToast({
variant: "error",
title: this.i18nService.t("errorRefreshingAccessToken"),
message: this.i18nService.t("errorRefreshingAccessTokenDesc"),
});
}
}),
takeUntil(this.destroy$),

View File

@ -454,6 +454,13 @@ export class AppComponent implements OnInit, OnDestroy {
case "deepLink":
this.processDeepLink(message.urlString);
break;
case "refreshAccessTokenError":
this.toastService.showToast({
variant: "error",
title: this.i18nService.t("errorRefreshingAccessToken"),
message: this.i18nService.t("errorRefreshingAccessTokenDesc"),
});
break;
}
});
});

View File

@ -209,6 +209,13 @@ export class AppComponent implements OnDestroy, OnInit {
case "showToast":
this.toastService._showToast(message);
break;
case "refreshAccessTokenError":
this.toastService.showToast({
variant: "error",
title: this.i18nService.t("errorRefreshingAccessToken"),
message: this.i18nService.t("errorRefreshingAccessTokenDesc"),
});
break;
case "convertAccountToKeyConnector":
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
// eslint-disable-next-line @typescript-eslint/no-floating-promises

View File

@ -574,7 +574,7 @@ const safeProviders: SafeProvider[] = [
EnvironmentService,
AppIdServiceAbstraction,
StateServiceAbstraction,
I18nServiceAbstraction,
MessageSender,
LogService,
LOGOUT_CALLBACK,
],

View File

@ -115,10 +115,10 @@ import { ProfileResponse } from "../models/response/profile.response";
import { UserKeyResponse } from "../models/response/user-key.response";
import { AppIdService } from "../platform/abstractions/app-id.service";
import { EnvironmentService } from "../platform/abstractions/environment.service";
import { I18nService } from "../platform/abstractions/i18n.service";
import { LogService } from "../platform/abstractions/log.service";
import { PlatformUtilsService } from "../platform/abstractions/platform-utils.service";
import { StateService } from "../platform/abstractions/state.service";
import { CommandDefinition, MessageSender } from "../platform/messaging";
import { Utils } from "../platform/misc/utils";
import { UserId } from "../types/guid";
import { AttachmentRequest } from "../vault/models/request/attachment.request";
@ -142,6 +142,11 @@ import {
} from "../vault/models/response/collection.response";
import { SyncResponse } from "../vault/models/response/sync.response";
// TODO: platform to investigate why we can't do CommandDefinition<void>
export const REFRESH_ACCESS_TOKEN_ERROR_MSG_CMD = new CommandDefinition<object>(
"refreshAccessTokenError",
);
/**
* @deprecated The `ApiService` class is deprecated and calls should be extracted into individual
* api services. The `send` method is still allowed to be used within api services. For background
@ -159,7 +164,7 @@ export class ApiService implements ApiServiceAbstraction {
private environmentService: EnvironmentService,
private appIdService: AppIdService,
private stateService: StateService,
private i18nService: I18nService,
private messageSender: MessageSender,
private logService: LogService,
private logoutCallback: (expired: boolean) => Promise<void>,
private customUserAgent: string = null,
@ -1718,12 +1723,8 @@ export class ApiService implements ApiServiceAbstraction {
return this.doApiTokenRefresh();
}
// Surface an error to the user.
this.platformUtilsService.showToast(
"error",
this.i18nService.t("errorRefreshingAccessToken"),
this.i18nService.t("errorRefreshingAccessTokenDesc"),
);
// Send message which each client can handle to surface an error message to the user.
this.messageSender.send(REFRESH_ACCESS_TOKEN_ERROR_MSG_CMD, null);
throw new Error("Cannot refresh access token, no refresh token or api keys are stored.");
}