// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import './base_page.js';
import './icons.html.js';
import './shimless_rma_shared.css.js';
import 'chrome://resources/ash/common/cr_elements/icons.html.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import {assert} from 'chrome://resources/js/assert.js';
import {CrDialogElement} from 'chrome://resources/ash/common/cr_elements/cr_dialog/cr_dialog.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {I18nMixin} from 'chrome://resources/ash/common/cr_elements/i18n_mixin.js';
import {getShimlessRmaService} from './mojo_interface_provider.js';
import {getTemplate} from './onboarding_landing_page.html.js';
import {HardwareVerificationStatusObserverReceiver, ShimlessRmaServiceInterface, StateResult} from './shimless_rma.mojom-webui.js';
import {executeThenTransitionState, focusPageTitle} from './shimless_rma_util.js';
import {ClickExitButtonEvent, CLICK_EXIT_BUTTON, createCustomEvent} from './events.js';
declare global {
interface HTMLElementEventMap {
[CLICK_EXIT_BUTTON]: ClickExitButtonEvent;
}
}
/**
* @fileoverview
* 'onboarding-landing-page' is the main landing page for the shimless rma
* process.
*/
const OnboardingLandingPageBase = I18nMixin(PolymerElement);
export class OnboardingLandingPage extends OnboardingLandingPageBase {
static get is() {
return 'onboarding-landing-page' as const;
}
static get template() {
return getTemplate();
}
static get properties() {
return {
/**
* Set by shimless_rma.ts.
*/
allButtonsDisabled: Boolean,
/**
* List of unqualified components from rmad service, not i18n.
*/
componentsList: {
type: String,
value: '',
},
verificationInProgress: {
type: Boolean,
value: true,
},
/**
* isCompliant is not valid until verificationInProgress is false.
*/
isCompliant: {
type: Boolean,
value: false,
},
/**
* After the Get Started button is clicked, true until the next state is
* processed. It is set back to false by shimless_rma.ts.
*/
getStartedButtonClicked: {
type: Boolean,
value: false,
},
/**
* After the exit button is clicked, true until the next state is
* processed. It is set back to false by shimless_rma.ts.
*/
confirmExitButtonClicked: {
type: Boolean,
value: false,
},
verificationFailedMessage: {
type: String,
value: '',
},
};
}
allButtonsDisabled: boolean;
getStartedButtonClicked: boolean;
confirmExitButtonClicked: boolean;
shimlessRmaService: ShimlessRmaServiceInterface = getShimlessRmaService();
hwVerificationObserverReceiver: HardwareVerificationStatusObserverReceiver;
protected componentsList: string;
protected verificationInProgress: boolean;
protected isCompliant: boolean;
protected verificationFailedMessage: TrustedHTML;
constructor() {
super();
this.hwVerificationObserverReceiver =
new HardwareVerificationStatusObserverReceiver(this);
this.shimlessRmaService.observeHardwareVerificationStatus(
this.hwVerificationObserverReceiver.$.bindNewPipeAndPassRemote());
}
override ready() {
super.ready();
focusPageTitle(this);
}
onNextButtonClick(): Promise<{stateResult: StateResult}> {
if (this.verificationInProgress) {
return Promise.reject(new Error('Hardware verification is not complete.'));
}
return this.shimlessRmaService.beginFinalization();
}
protected onGetStartedButtonClicked(e: Event): void {
e.preventDefault();
this.getStartedButtonClicked = true;
executeThenTransitionState(this, () => {
if (this.verificationInProgress) {
return Promise.reject(
new Error('Hardware verification is not complete.'));
}
return this.shimlessRmaService.beginFinalization();
});
}
protected onLandingExitButtonClicked(e: Event): void {
e.preventDefault();
this.dispatchEvent(createCustomEvent(CLICK_EXIT_BUTTON, {}));
}
protected getVerificationIcon(): string {
return this.isCompliant ? 'shimless-icon:check' : 'shimless-icon:warning';
}
/**
* Implements
* HardwareVerificationStatusObserver.onHardwareVerificationResult()
*/
onHardwareVerificationResult(isCompliant: boolean, errorMessage: string): void {
this.isCompliant = isCompliant;
this.verificationInProgress = false;
if (!this.isCompliant) {
this.componentsList = errorMessage;
this.setVerificationFailedMessage();
}
}
private setVerificationFailedMessage(): void {
this.verificationFailedMessage =
this.i18nAdvanced('validatedComponentsFailText', {attrs: ['id']});
const linkElement =
this.shadowRoot!.querySelector('#unqualifiedComponentsLink');
assert(linkElement);
linkElement.setAttribute('href', '#');
const dialog: CrDialogElement|null =
this.shadowRoot!.querySelector('#unqualifiedComponentsDialog');
assert(dialog);
linkElement.addEventListener('click', () => dialog.showModal());
}
private closeDialog(): void {
const dialog: CrDialogElement|null =
this.shadowRoot!.querySelector('#unqualifiedComponentsDialog');
assert(dialog);
dialog.close();
}
protected isGetStartedButtonDisabled(): boolean {
return this.verificationInProgress || this.allButtonsDisabled;
}
}
declare global {
interface HTMLElementTagNameMap {
[OnboardingLandingPage.is]: OnboardingLandingPage;
}
}
customElements.define(OnboardingLandingPage.is, OnboardingLandingPage);