UNPKG

@corti/dictation-web

Version:
168 lines 5.89 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; // mic-selector.ts import { LitElement, html, css } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import ButtonStyles from '../styles/buttons.js'; import SelectStyles from '../styles/select.js'; import { LANGUAGES_SUPPORTED } from '../constants.js'; import { getAudioDevices, getLanguageName } from '../utils.js'; import CalloutStyles from '../styles/callout.js'; let SettingsMenu = class SettingsMenu extends LitElement { constructor() { super(); this.selectedLanguage = ''; this.settingsDisabled = false; this._devices = []; navigator.mediaDevices.addEventListener('devicechange', this.handleDevicesChange.bind(this)); } // on load, get the available devices async connectedCallback() { super.connectedCallback(); const deviceResponse = await getAudioDevices(); this._devices = deviceResponse.devices; } async handleDevicesChange() { const deviceResponse = await getAudioDevices(); this._devices = deviceResponse.devices; } _selectDevice(deviceId) { // Find the device object const device = this._devices.find(d => d.deviceId === deviceId); if (!device) { return; } this.selectedDevice = device; this.dispatchEvent(new CustomEvent('recording-devices-changed', { detail: { devices: this._devices, selectedDevice: device, }, bubbles: true, composed: true, })); } render() { return html ` <div class="mic-selector"> <button id="settings-popover-button" popovertarget="settings-popover"> <icon-settings></icon-settings> </button> <div id="settings-popover" popover> <div class="settings-wrapper"> ${this.settingsDisabled ? html ` <div class="callout warn"> Recording is in progress. Stop recording to change settings. </div> ` : ''} <div class="form-group"> <label id="device-select-label" for="device-select"> Recording Device </label> <select id="device-select" aria-labelledby="device-select-label" @change=${(e) => { this._selectDevice(e.target.value); }} ?disabled=${this.settingsDisabled} > ${this._devices.map(device => html ` <option value=${device.deviceId} ?selected=${this.selectedDevice === device} > ${device.label || 'Unknown Device'} </option> `)} </select> </div> <div class="form-group"> <label id="language-select-label" for="language-select"> Dictation Language </label> <select id="language-select" aria-labelledby="language-select-label" @change=${(e) => { this._selectDevice(e.target.value); }} ?disabled=${this.settingsDisabled} > ${LANGUAGES_SUPPORTED.map(language => html ` <option value=${language} ?selected=${this.selectedLanguage === language} > ${getLanguageName(language)} </option> `)} </select> </div> </div> </div> </div> `; } }; SettingsMenu.styles = [ css ` :host { display: block; font-family: var(--component-font-family); } /* Retain the anchor-name styling for this component */ #settings-popover-button { anchor-name: --settings_popover_btn; } [popover] { margin: 0; padding: 16px; border: 0; background: var(--card-background); border: 1px solid var(--card-border-color); border-radius: var(--card-border-radius); box-shadow: var(--card-box-shadow); z-index: 1000; max-width: 260px; width: 100%; min-width: 200px; position-anchor: --settings_popover_btn; position-area: bottom span-right; position-visibility: always; position-try-fallbacks: flip-inline; overflow-x: hidden; } .settings-wrapper { display: flex; flex-direction: column; gap: 20px; } `, ButtonStyles, SelectStyles, CalloutStyles, ]; __decorate([ property({ type: String }) ], SettingsMenu.prototype, "selectedDevice", void 0); __decorate([ property({ type: String }) ], SettingsMenu.prototype, "selectedLanguage", void 0); __decorate([ property({ type: Boolean }) ], SettingsMenu.prototype, "settingsDisabled", void 0); __decorate([ state() ], SettingsMenu.prototype, "_devices", void 0); SettingsMenu = __decorate([ customElement('settings-menu') ], SettingsMenu); export { SettingsMenu }; //# sourceMappingURL=settings-menu.js.map