aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam Wilkins <samwilkins333@gmail.com>2019-08-04 05:09:56 -0400
committerSam Wilkins <samwilkins333@gmail.com>2019-08-04 05:09:56 -0400
commit6d718c8a243e68d23199d35592bfded285385c91 (patch)
treefc5083fa538469f3e9eff67ca20d97f3771a601f /src
parent5a17fc9ff91e5a039a0ada4be498d8353ee94205 (diff)
now all listen() calls display recording UI
Diffstat (limited to 'src')
-rw-r--r--src/client/util/DictationManager.ts24
-rw-r--r--src/client/views/GlobalKeyHandler.ts21
-rw-r--r--src/client/views/Main.scss1
-rw-r--r--src/client/views/MainView.tsx11
-rw-r--r--src/client/views/nodes/DocumentView.tsx16
5 files changed, 45 insertions, 28 deletions
diff --git a/src/client/util/DictationManager.ts b/src/client/util/DictationManager.ts
index b6f871713..a882994c1 100644
--- a/src/client/util/DictationManager.ts
+++ b/src/client/util/DictationManager.ts
@@ -10,6 +10,7 @@ import { Cast, CastCtor } from "../../new_fields/Types";
import { listSpec } from "../../new_fields/Schema";
import { AudioField, ImageField } from "../../new_fields/URLField";
import { HistogramField } from "../northstar/dash-fields/HistogramField";
+import { MainView } from "../views/MainView";
/**
* This namespace provides a singleton instance of a manager that
@@ -37,9 +38,11 @@ export namespace DictationManager {
}
}
const { webkitSpeechRecognition }: CORE.IWindow = window as CORE.IWindow;
+ export const placeholder = "Listening...";
export namespace Controls {
+ const infringe = "unable to process: dictation manager still involved in previous session";
const intraSession = ". ";
const interSession = " ... ";
@@ -52,7 +55,7 @@ export namespace DictationManager {
const recognizer: SpeechRecognition = new webkitSpeechRecognition() || new SpeechRecognition();
recognizer.onstart = () => console.log("initiating speech recognition session...");
- export type InterimResultHandler = (results: any) => any;
+ export type InterimResultHandler = (results: string) => any;
export type ContinuityArgs = { indefinite: boolean } | false;
export type DelimiterArgs = { inter: string, intra: string };
@@ -61,21 +64,33 @@ export namespace DictationManager {
continuous: ContinuityArgs;
delimiters: DelimiterArgs;
interimHandler: InterimResultHandler;
+ tryExecute: boolean;
}
export const listen = async (options?: Partial<ListeningOptions>) => {
- let results: any;
+ let results: string | undefined;
+ MainView.Instance.dictationOverlayVisible = true;
+ MainView.Instance.isListening = true;
try {
results = await listenImpl(options);
+ if (results) {
+ MainView.Instance.isListening = false;
+ MainView.Instance.dictatedPhrase = results = results.toLowerCase();
+ MainView.Instance.dictationSuccess = options && options.tryExecute ? await DictationManager.Commands.execute(results) : true;
+ }
} catch (e) {
- results = `Dictation Error: ${"error" in e ? e.error : "unknown error"}`;
+ MainView.Instance.isListening = false;
+ MainView.Instance.dictatedPhrase = results = `dictation error: ${"error" in e ? e.error : "unknown error"}`;
+ MainView.Instance.dictationSuccess = false;
+ } finally {
+ MainView.Instance.initiateDictationFade();
}
return results;
};
const listenImpl = (options?: Partial<ListeningOptions>) => {
if (isListening) {
- return undefined;
+ return infringe;
}
isListening = true;
@@ -126,6 +141,7 @@ export namespace DictationManager {
} else {
resolve(current);
}
+ current = undefined;
reset();
};
diff --git a/src/client/views/GlobalKeyHandler.ts b/src/client/views/GlobalKeyHandler.ts
index c3e6ae6c8..0989e8db1 100644
--- a/src/client/views/GlobalKeyHandler.ts
+++ b/src/client/views/GlobalKeyHandler.ts
@@ -73,9 +73,11 @@ export default class KeyManager {
SelectionManager.DeselectAll();
DictationManager.Controls.stop();
if (main.dictationOverlayVisible) {
+ main.cancelDictationFade();
main.dictationOverlayVisible = false;
+ main.isListening = true;
+ main.dictatedPhrase = "";
main.dictationSuccess = undefined;
- main.cancelDictationFade();
}
break;
case "delete":
@@ -110,22 +112,7 @@ export default class KeyManager {
switch (keyname) {
case " ":
- let main = MainView.Instance;
- main.dictationOverlayVisible = true;
-
- main.isListening = true;
- // let printer = (results: any) => console.log(results);
- let command = await DictationManager.Controls.listen();
- main.isListening = false;
-
- if (!command) {
- break;
- }
-
- main.dictatedPhrase = command = command.toLowerCase();
- main.dictationSuccess = await DictationManager.Commands.execute(command);
- main.initiateDictationFade();
-
+ DictationManager.Controls.listen({ tryExecute: true });
stopPropagation = true;
preventDefault = true;
}
diff --git a/src/client/views/Main.scss b/src/client/views/Main.scss
index 8e57b88c3..f76abaff3 100644
--- a/src/client/views/Main.scss
+++ b/src/client/views/Main.scss
@@ -292,7 +292,6 @@ ul#add-options-list {
width: 100%;
height: 100%;
position: absolute;
- background: darkslategray;
z-index: 999;
transition: 0.5s all ease;
pointer-events: none;
diff --git a/src/client/views/MainView.tsx b/src/client/views/MainView.tsx
index 4443eea6d..383efa1e3 100644
--- a/src/client/views/MainView.tsx
+++ b/src/client/views/MainView.tsx
@@ -1,7 +1,7 @@
import { IconName, library } from '@fortawesome/fontawesome-svg-core';
import { faArrowDown, faCloudUploadAlt, faArrowUp, faClone, faCheck, faPlay, faPause, faCaretUp, faLongArrowAltRight, faCommentAlt, faCut, faExclamation, faFilePdf, faFilm, faFont, faGlobeAsia, faPortrait, faMusic, faObjectGroup, faPenNib, faRedoAlt, faTable, faThumbtack, faTree, faUndoAlt, faCat, faBolt } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { action, computed, configure, observable, runInAction, reaction, trace } from 'mobx';
+import { action, computed, configure, observable, runInAction, reaction, trace, autorun } from 'mobx';
import { observer } from 'mobx-react';
import "normalize.css";
import * as React from 'react';
@@ -167,6 +167,8 @@ export class MainView extends React.Component {
}
}
+ autorun(() => console.log(`this.isListening = ${this.isListening}`));
+
library.add(faFont);
library.add(faExclamation);
library.add(faPortrait);
@@ -523,7 +525,7 @@ export class MainView extends React.Component {
render() {
let display = this.dictationOverlayVisible;
let success = this.dictationSuccess;
- let result = this.isListening ? "Listening..." : `"${this.dictatedPhrase}"`;
+ let result = this.isListening ? DictationManager.placeholder : `"${this.dictatedPhrase}"`;
return (
<div id="main-div">
<div
@@ -536,7 +538,10 @@ export class MainView extends React.Component {
>{result}</div>
<div
className={"dictation-prompt-overlay"}
- style={{ opacity: display ? 0.4 : 0 }}
+ style={{
+ opacity: display ? 0.4 : 0,
+ backgroundColor: this.isListening ? "red" : "darkslategrey"
+ }}
/>
<DocumentDecorations />
{this.mainContent}
diff --git a/src/client/views/nodes/DocumentView.tsx b/src/client/views/nodes/DocumentView.tsx
index 1d9cb3c80..a415aefda 100644
--- a/src/client/views/nodes/DocumentView.tsx
+++ b/src/client/views/nodes/DocumentView.tsx
@@ -38,6 +38,7 @@ import "./DocumentView.scss";
import { FormattedTextBox } from './FormattedTextBox';
import React = require("react");
import { DictationManager } from '../../util/DictationManager';
+import { MainView } from '../MainView';
const JsxParser = require('react-jsx-parser').default; //TODO Why does this need to be imported like this?
library.add(fa.faTrash);
@@ -536,9 +537,18 @@ export class DocumentView extends DocComponent<DocumentViewProps, Document>(Docu
}
listen = async () => {
- let options = { continuous: { indefinite: true }, delimiter: " " };
- let transcript = await DictationManager.Controls.listen(options);
- transcript && (Doc.GetProto(this.props.Document).transcript = transcript);
+ let dataDoc = Doc.GetProto(this.props.Document);
+ let options = {
+ continuous: { indefinite: true },
+ delimiter: " ",
+ interimHandler: (results: string) => {
+ MainView.Instance.isListening = false;
+ MainView.Instance.dictationSuccess = true;
+ MainView.Instance.dictatedPhrase = results;
+ }
+ };
+ let final = await DictationManager.Controls.listen(options);
+ final && (dataDoc.transcript = final);
}
@action