import { Toggle, ToggleType } from '@dash/components'; import { action, makeObservable, observable } from 'mobx'; import { observer } from 'mobx-react'; import * as React from 'react'; import { DictationManager } from '../util/DictationManager'; import { SnappingManager } from '../util/SnappingManager'; import './DictationButton.scss'; export interface DictationButtonProps { setInput: (val: string) => void; inputRef?: HTMLInputElement | null | undefined; } @observer export class DictationButton extends React.Component { @observable private _isRecording = false; constructor(props: DictationButtonProps) { super(props); makeObservable(this); } stopDictation = action(() => { this._isRecording = false; DictationManager.Controls.stop(); }); render() { return ( } color={SnappingManager.userVariantColor} toggleType={ToggleType.BUTTON} toggleStatus={this._isRecording} onClick={action(() => { if (!this._isRecording) { this._isRecording = true; DictationManager.Controls.listen({ interimHandler: (value: string) => { this.props.setInput(value); if (this.props.inputRef) { this.props.inputRef.focus(); this.props.inputRef.scrollLeft = 1000000; } }, continuous: { indefinite: false }, }).then(results => { if (results && [DictationManager.Controls.Infringed].includes(results)) { DictationManager.Controls.stop(); } }); } else { this.stopDictation(); } })} /> ); } }