aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/DictationButton.tsx
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2025-02-10 19:07:20 -0500
committerbobzel <zzzman@gmail.com>2025-02-10 19:07:20 -0500
commitc9686eaebffb3547b7e0f20aec64754627af76ce (patch)
tree7ebf1c38323a8d7af554ba564acf95cfe79b7709 /src/client/views/DictationButton.tsx
parentb72d018698ad1d2e713f0fcbef392d23bf1cf545 (diff)
parente93ca53af693fa1ec2186ca9417af122bb5e8e09 (diff)
updated from master
Diffstat (limited to 'src/client/views/DictationButton.tsx')
-rw-r--r--src/client/views/DictationButton.tsx57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/client/views/DictationButton.tsx b/src/client/views/DictationButton.tsx
new file mode 100644
index 000000000..0ce586df4
--- /dev/null
+++ b/src/client/views/DictationButton.tsx
@@ -0,0 +1,57 @@
+import { IconButton, Type } from '@dash/components';
+import { action, makeObservable, observable } from 'mobx';
+import { observer } from 'mobx-react';
+import * as React from 'react';
+import { BiMicrophone } from 'react-icons/bi';
+import { DictationManager } from '../util/DictationManager';
+import { SnappingManager } from '../util/SnappingManager';
+
+export interface DictationButtonProps {
+ setInput: (val: string) => void;
+ inputRef?: HTMLInputElement | null | undefined;
+}
+@observer
+export class DictationButton extends React.Component<DictationButtonProps> {
+ @observable private _isRecording = false;
+ constructor(props: DictationButtonProps) {
+ super(props);
+ makeObservable(this);
+ }
+
+ stopDictation = action(() => {
+ this._isRecording = false;
+ DictationManager.Controls.stop();
+ });
+
+ render() {
+ return (
+ <IconButton
+ type={Type.TERT}
+ color={this._isRecording ? '#2bcaff' : SnappingManager.userVariantColor}
+ tooltip="Record"
+ icon={<BiMicrophone size="16px" />}
+ 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();
+ }
+ })}
+ />
+ );
+ }
+}