| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * @fileoverview The 'nearby-device' component shows details of a remote device. |
| */ |
| |
| import 'chrome://resources/ash/common/cr_elements/cr_auto_img/cr_auto_img.js'; |
| import 'chrome://resources/ash/common/cr_elements/cr_shared_style.css.js'; |
| import 'chrome://resources/ash/common/cr_elements/cr_icons.css.js'; |
| import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; |
| import './nearby_shared_icons.html.js'; |
| import './nearby_device_icon.js'; |
| |
| import {assert} from 'chrome://resources/js/assert.js'; |
| import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; |
| |
| import {getTemplate} from './nearby_device.html.js'; |
| import type {NearbyDeviceIconElement} from './nearby_device_icon.js'; |
| import type {ShareTarget} from './nearby_share.mojom-webui.js'; |
| |
| export class NearbyDeviceElement extends PolymerElement { |
| static get is() { |
| return 'nearby-device' as const; |
| } |
| |
| static get template() { |
| return getTemplate(); |
| } |
| |
| static get properties() { |
| return { |
| /** |
| * Expected to start as null, then change to a valid object before this |
| * component is shown. |
| */ |
| shareTarget: { |
| type: Object, |
| value: null, |
| }, |
| |
| /** |
| * Whether this share target is selected. |
| */ |
| isSelected: { |
| type: Boolean, |
| reflectToAttribute: true, |
| }, |
| |
| /** Size of the target image/icon in pixels. */ |
| targetImageSize: { |
| type: Number, |
| readOnly: true, |
| value: 26, |
| }, |
| }; |
| } |
| |
| isSelected: boolean; |
| shareTarget: ShareTarget|null; |
| targetImageSize: number; |
| |
| override ready(): void { |
| super.ready(); |
| |
| this.updateStyles({'--target-image-size': this.targetImageSize + 'px'}); |
| this.listenToTargetImageLoad_(); |
| } |
| |
| private getTargetImageUrl_(): string { |
| if (!(this.shareTarget && this.shareTarget.imageUrl && |
| this.shareTarget.imageUrl.url && |
| this.shareTarget.imageUrl.url.length)) { |
| return ''; |
| } |
| |
| // Adds the parameter to resize to the desired size. |
| return this.shareTarget.imageUrl.url + '=s' + this.targetImageSize; |
| } |
| |
| private listenToTargetImageLoad_(): void { |
| const autoImg = |
| this.shadowRoot!.querySelector<HTMLImageElement>('#share-target-image'); |
| assert(autoImg); |
| if (autoImg.complete && autoImg.naturalHeight !== 0) { |
| this.onTargetImageLoad_(); |
| } else { |
| autoImg.onload = () => { |
| this.onTargetImageLoad_(); |
| }; |
| } |
| } |
| |
| private onTargetImageLoad_(): void { |
| this.shadowRoot!.querySelector<HTMLImageElement>( |
| '#share-target-image')!.style.display = 'inline'; |
| this.shadowRoot!.querySelector<NearbyDeviceIconElement>( |
| '#icon')!.style.display = 'none'; |
| } |
| } |
| |
| declare global { |
| interface HTMLElementTagNameMap { |
| [NearbyDeviceElement.is]: NearbyDeviceElement; |
| } |
| } |
| |
| customElements.define(NearbyDeviceElement.is, NearbyDeviceElement); |