// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'chrome://resources/ash/common/cr_elements/cr_button/cr_button.js';
import './strings.m.js';
import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
import {UserAction} from './cloud_upload.mojom-webui.js';
import {CloudUploadBrowserProxy} from './cloud_upload_browser_proxy.js';
import {getTemplate} from './connect_onedrive.html.js';
/**
* The ConnectOneDriveElement represents the dialog shown when the user selects
* OneDrive from the Files app Services menu, without going through the normal
* setup flow.
*/
export class ConnectOneDriveElement extends HTMLElement {
private proxy: CloudUploadBrowserProxy =
CloudUploadBrowserProxy.getInstance();
// Save reference to listener so it can be removed from the document in
// disconnectedCallback().
private boundKeyDownListener_: (e: KeyboardEvent) => void;
constructor() {
super();
const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = getTemplate();
const connectButton = this.$('.action-button')!;
const closeButton = this.$('.cancel-button')!;
connectButton.addEventListener('click', () => this.onConnectButtonClick());
closeButton.addEventListener('click', () => this.onCloseButtonClick());
this.boundKeyDownListener_ = this.onKeyDown.bind(this);
}
connectedCallback(): void {
document.addEventListener('keydown', this.boundKeyDownListener_);
}
disconnectedCallback(): void {
document.removeEventListener('keydown', this.boundKeyDownListener_);
}
$<T extends HTMLElement>(query: string): T {
return this.shadowRoot!.querySelector(query)!;
}
private async onConnectButtonClick(): Promise<void> {
const {success: signInSuccess} =
await this.proxy.handler.signInToOneDrive();
if (signInSuccess) {
// Change to success page.
this.shadowRoot!.querySelector<SVGUseElement>('#install')!.setAttribute(
'visibility', 'hidden');
this.shadowRoot!.querySelector<SVGUseElement>('#success')!.setAttribute(
'visibility', 'visible');
this.$('#title').innerText =
loadTimeData.getString('oneDriveConnectedTitle');
this.$('#body-text').innerText =
loadTimeData.getString('oneDriveConnectedBodyText');
this.$('.action-button')!.remove();
} else {
this.$('#error-message').toggleAttribute('hidden', false);
}
}
private onCloseButtonClick(): void {
this.proxy.handler.respondWithUserActionAndClose(UserAction.kCancel);
}
private onKeyDown(e: KeyboardEvent) {
if (e.key === 'Escape') {
// Handle Escape as a "cancel".
e.stopImmediatePropagation();
e.preventDefault();
this.onCloseButtonClick();
return;
}
}
}
declare global {
interface HTMLElementTagNameMap {
'connect-onedrive': ConnectOneDriveElement;
}
}
customElements.define('connect-onedrive', ConnectOneDriveElement);