@corti/dictation-web
Version:
Web component for Corti Dictation
168 lines • 5.89 kB
JavaScript
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"
=${(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"
=${(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