mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	- static skeleton animation - start download / inference only after opt-in - update model-optin to allow placing icon on either right or left depending on iconAtEnd - update background-color of optin-wrapper - add new prefs browser.ml.linkPreview.optin and browser.ml.linkPreview.collapse - use css order attribute for placement of icon - update to final text for opt-in modal - don't generate key points if collapsed is true - add optin test suite in browser_link_preview_optin.js - add telemetry to link review optin - remove learn more link - refactor updateCardProperty Differential Revision: https://phabricator.services.mozilla.com/D249104
		
			
				
	
	
		
			184 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
import { html } from "chrome://global/content/vendor/lit.all.mjs";
 | 
						|
import { MozLitElement } from "chrome://global/content/lit-utils.mjs";
 | 
						|
 | 
						|
/**
 | 
						|
 * Model Optin Component
 | 
						|
 *
 | 
						|
 * Displays a prompt allowing the user to opt in or out of a model download.
 | 
						|
 * Can also show a progress bar while downloading.
 | 
						|
 */
 | 
						|
class ModelOptin extends MozLitElement {
 | 
						|
  static properties = {
 | 
						|
    headingL10nId: { type: String, fluent: true },
 | 
						|
    headingIcon: { type: String },
 | 
						|
    iconAtEnd: { type: Boolean },
 | 
						|
    messageL10nId: { type: String, fluent: true },
 | 
						|
    optinButtonL10nId: { type: String, fluent: true },
 | 
						|
    optoutButtonL10nId: { type: String, fluent: true },
 | 
						|
    footerMessageL10nId: { type: String, fluent: true },
 | 
						|
    cancelDownloadButtonL10nId: { type: String, fluent: true },
 | 
						|
    isLoading: { type: Boolean, reflect: true },
 | 
						|
    progressStatus: { type: Number }, // Expected to be a number between 0 and 100
 | 
						|
    isHidden: { type: Boolean },
 | 
						|
  };
 | 
						|
 | 
						|
  static events = {
 | 
						|
    confirm: "MlModelOptinConfirm",
 | 
						|
    deny: "MlModelOptinDeny",
 | 
						|
    cancelDownload: "MlModelOptinCancelDownload",
 | 
						|
    messageLinkClick: "MlModelOptinMessageLinkClick",
 | 
						|
    footerLinkClick: "MlModelOptinFooterLinkClick",
 | 
						|
  };
 | 
						|
 | 
						|
  static eventBehaviors = {
 | 
						|
    bubbles: true,
 | 
						|
    composed: true,
 | 
						|
  };
 | 
						|
 | 
						|
  constructor() {
 | 
						|
    super();
 | 
						|
    this.isLoading = false;
 | 
						|
    this.isHidden = false;
 | 
						|
    this.iconAtEnd = false;
 | 
						|
    this.optinButtonL10nId = "genai-model-optin-continue";
 | 
						|
    this.optoutButtonL10nId = "genai-model-optin-optout";
 | 
						|
    this.cancelDownloadButtonL10nId = "genai-model-optin-cancel";
 | 
						|
    this.footerMessageL10nId = "";
 | 
						|
  }
 | 
						|
 | 
						|
  dispatch(event) {
 | 
						|
    this.dispatchEvent(
 | 
						|
      new CustomEvent(event, { bubbles: true, composed: true })
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  handleConfirmClick() {
 | 
						|
    this.dispatch(ModelOptin.events.confirm);
 | 
						|
  }
 | 
						|
 | 
						|
  handleDenyClick() {
 | 
						|
    this.dispatch(ModelOptin.events.deny);
 | 
						|
    this.isHidden = true;
 | 
						|
  }
 | 
						|
 | 
						|
  handleCancelDownloadClick() {
 | 
						|
    this.dispatch(ModelOptin.events.cancelDownload);
 | 
						|
    this.isLoading = false;
 | 
						|
    this.progressStatus = undefined;
 | 
						|
  }
 | 
						|
 | 
						|
  handleMessageLinkClick(e) {
 | 
						|
    // ftl overrides the html, need to manually watch for event in parent.
 | 
						|
    if (e.target.id !== "optin-message-link") {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    this.dispatch(ModelOptin.events.messageLinkClick);
 | 
						|
  }
 | 
						|
 | 
						|
  handleFooterLinkClick(e) {
 | 
						|
    // ftl overrides the html, need to manually watch for event in parent.
 | 
						|
    if (e.target.id !== "optin-footer-link") {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    this.dispatch(ModelOptin.events.footerLinkClick);
 | 
						|
  }
 | 
						|
 | 
						|
  render() {
 | 
						|
    return html`
 | 
						|
      <link
 | 
						|
        rel="stylesheet"
 | 
						|
        href="chrome://browser/content/genai/content/model-optin.css"
 | 
						|
      />
 | 
						|
      <section ?hidden=${this.isHidden} class="optin-wrapper">
 | 
						|
        ${this.isLoading
 | 
						|
          ? html`
 | 
						|
              <div class="optin-progress-bar-wrapper">
 | 
						|
                <progress
 | 
						|
                  class="optin-progress-bar"
 | 
						|
                  value=${this.progressStatus}
 | 
						|
                  max="100"
 | 
						|
                ></progress>
 | 
						|
              </div>
 | 
						|
            `
 | 
						|
          : ""}
 | 
						|
 | 
						|
        <div class="optin-header-wrapper">
 | 
						|
          <div class="optin-header">
 | 
						|
            ${this.headingIcon
 | 
						|
              ? html`<img
 | 
						|
                  src=${this.headingIcon}
 | 
						|
                  alt=${this.headingL10nId}
 | 
						|
                  class="optin-heading-icon ${this.iconAtEnd
 | 
						|
                    ? "icon-at-end"
 | 
						|
                    : ""}"
 | 
						|
                />`
 | 
						|
              : ""}
 | 
						|
            <h3 class="optin-heading" data-l10n-id=${this.headingL10nId}></h3>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
 | 
						|
        <p
 | 
						|
          class="optin-message"
 | 
						|
          data-l10n-id=${this.messageL10nId}
 | 
						|
          @click=${this.handleMessageLinkClick}
 | 
						|
        >
 | 
						|
          <a id="optin-message-link" data-l10n-name="support" href="#"></a>
 | 
						|
        </p>
 | 
						|
        <slot></slot>
 | 
						|
 | 
						|
        ${this.isLoading
 | 
						|
          ? html`
 | 
						|
              <div class="optin-actions">
 | 
						|
                <moz-button
 | 
						|
                  size="small"
 | 
						|
                  data-l10n-id=${this.cancelDownloadButtonL10nId}
 | 
						|
                  @click=${this.handleCancelDownloadClick}
 | 
						|
                >
 | 
						|
                </moz-button>
 | 
						|
              </div>
 | 
						|
            `
 | 
						|
          : html`
 | 
						|
              <div class="optin-actions">
 | 
						|
                <moz-button-group>
 | 
						|
                  <moz-button
 | 
						|
                    size="small"
 | 
						|
                    id="optin-confirm-button"
 | 
						|
                    type="primary"
 | 
						|
                    data-l10n-id=${this.optinButtonL10nId}
 | 
						|
                    @click=${this.handleConfirmClick}
 | 
						|
                  >
 | 
						|
                  </moz-button>
 | 
						|
                  <moz-button
 | 
						|
                    size="small"
 | 
						|
                    id="optin-deny-button"
 | 
						|
                    data-l10n-id=${this.optoutButtonL10nId}
 | 
						|
                    @click=${this.handleDenyClick}
 | 
						|
                  >
 | 
						|
                  </moz-button>
 | 
						|
                </moz-button-group>
 | 
						|
              </div>
 | 
						|
            `}
 | 
						|
        ${!this.isLoading && this.footerMessageL10nId !== ""
 | 
						|
          ? html`
 | 
						|
              <p
 | 
						|
                class="optin-footer-message"
 | 
						|
                data-l10n-id=${this.footerMessageL10nId}
 | 
						|
                @click=${this.handleFooterLinkClick}
 | 
						|
              >
 | 
						|
                <a
 | 
						|
                  id="optin-footer-link"
 | 
						|
                  data-l10n-name="settings"
 | 
						|
                  href="#"
 | 
						|
                ></a>
 | 
						|
              </p>
 | 
						|
            `
 | 
						|
          : ""}
 | 
						|
      </section>
 | 
						|
    `;
 | 
						|
  }
 | 
						|
}
 | 
						|
customElements.define("model-optin", ModelOptin);
 |