From 901ab10afa8636f310ed68ff0a7eac6da21ae2c3 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 3 Jul 2020 20:31:45 -0400 Subject: [PATCH] Add history mode, downloads (rough draft) --- vocodes/src/App.tsx | 14 +++++++ vocodes/src/AppMode.ts | 2 +- vocodes/src/model/utterance.ts | 17 +++++++++ .../src/modes/history/HistoryComponent.tsx | 32 ++++++++++++++++ vocodes/src/modes/history/PastUtterance.tsx | 37 +++++++++++++++++++ vocodes/src/modes/speak/Form.tsx | 14 ++++--- vocodes/src/modes/speak/SpeakComponent.tsx | 3 ++ vocodes/src/navigation/TopNav.tsx | 1 + 8 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 vocodes/src/model/utterance.ts create mode 100644 vocodes/src/modes/history/HistoryComponent.tsx create mode 100644 vocodes/src/modes/history/PastUtterance.tsx diff --git a/vocodes/src/App.tsx b/vocodes/src/App.tsx index f9424bc522..8d82e6ed25 100644 --- a/vocodes/src/App.tsx +++ b/vocodes/src/App.tsx @@ -11,6 +11,8 @@ import { UsageComponent } from './modes/usage/UsageComponent'; import { Speaker, SPEAKERS } from './Speakers'; import { ExtrasMode } from './modes/speak/extras/ExtrasComponent'; import { Spectrogram } from './modes/speak/extras/Spectrogram'; +import { Utterance } from './model/utterance'; +import { HistoryComponent } from './modes/history/HistoryComponent'; interface Props {} @@ -39,6 +41,7 @@ interface State { speaker: Speaker, currentSpectrogram?: Spectrogram, spectrogramMode: SpectrogramMode, + utterances: Utterance[], } class App extends React.Component { @@ -50,6 +53,7 @@ class App extends React.Component { extrasMode: ExtrasMode.SPEAKER_INFO, speaker: SPEAKERS[0], spectrogramMode: SpectrogramMode.VIRIDIS, + utterances: [], }; } @@ -97,6 +101,12 @@ class App extends React.Component { this.setState({ spectrogramMode: spectrogramMode }); } + appendUtterance = (utterance: Utterance) => { + let utterances = this.state.utterances.slice(); + utterances.push(utterance); + this.setState({ utterances: utterances }); + } + public render() { let component; switch (this.state.mode) { @@ -110,8 +120,12 @@ class App extends React.Component { changeExtrasModeCallback={this.switchExtrasMode} spectrogramMode={this.state.spectrogramMode} changeSpectrogramMode={this.setSpectrogramMode} + appendUtteranceCallback={this.appendUtterance} />; break; + case Mode.HISTORY_MODE: + component = + break; case Mode.USAGE_MODE: component = ; break; diff --git a/vocodes/src/AppMode.ts b/vocodes/src/AppMode.ts index 9a86b6954f..543b9534ab 100644 --- a/vocodes/src/AppMode.ts +++ b/vocodes/src/AppMode.ts @@ -1,8 +1,8 @@ enum Mode { SPEAK_MODE, + HISTORY_MODE, USAGE_MODE, NEWS_MODE, - HISTORY_MODE, HELP_WANTED_MODE, TERMS_MODE, } diff --git a/vocodes/src/model/utterance.ts b/vocodes/src/model/utterance.ts new file mode 100644 index 0000000000..c782ce75e3 --- /dev/null +++ b/vocodes/src/model/utterance.ts @@ -0,0 +1,17 @@ +import { Speaker } from "../Speakers"; + +class Utterance { + originalText: string; + speaker: Speaker; + howl: Howl; + base64data: string; + + constructor(originalText: string, speaker: Speaker, howl: Howl, base64data: string) { + this.originalText = originalText; + this.speaker = speaker; + this.howl = howl; + this.base64data = base64data; + } +} + +export { Utterance } diff --git a/vocodes/src/modes/history/HistoryComponent.tsx b/vocodes/src/modes/history/HistoryComponent.tsx new file mode 100644 index 0000000000..74470561d0 --- /dev/null +++ b/vocodes/src/modes/history/HistoryComponent.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { Utterance } from '../../model/utterance'; +import { PastUtterance } from './PastUtterance'; + +interface Props { + utterances: Utterance[], +} + +interface State { +} + +class HistoryComponent extends React.Component { + + constructor(props: Props) { + super(props); + this.state = { + }; + } + + public render() { + const utterances = this.props.utterances.map((utterance) => { + return + }); + return ( +
+ {utterances} +
+ ) + } +} + +export { HistoryComponent } \ No newline at end of file diff --git a/vocodes/src/modes/history/PastUtterance.tsx b/vocodes/src/modes/history/PastUtterance.tsx new file mode 100644 index 0000000000..6db06260b1 --- /dev/null +++ b/vocodes/src/modes/history/PastUtterance.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { Utterance } from "../../model/utterance"; + +interface Props { + utterance: Utterance, +} + +interface State { +} + +class PastUtterance extends React.Component { + + constructor(props: Props) { + super(props); + this.state = { + }; + } + + play = () => { + this.props.utterance.howl.play(); + } + + public render() { + let url = `data:audio/wav;base64,${this.props.utterance.base64data}`; + return ( +
+

{this.props.utterance.speaker.getName()}

+ {this.props.utterance.originalText} +
+ + Download +
+ ) + } +} + +export { PastUtterance } \ No newline at end of file diff --git a/vocodes/src/modes/speak/Form.tsx b/vocodes/src/modes/speak/Form.tsx index ee293f45ea..e6de17a24b 100644 --- a/vocodes/src/modes/speak/Form.tsx +++ b/vocodes/src/modes/speak/Form.tsx @@ -3,10 +3,10 @@ import React from 'react'; import { SpeakRequest } from './SpeakRequest'; import { Speaker } from '../../Speakers'; import { createColorMap, linearScale } from "@colormap/core"; -//import { VIRIDIS, CIVIDIS, PLASMA, INFERNO, MAGMA, BLACK_WHITE, } from "@colormap/presets"; import { MAGMA } from "@colormap/presets"; import { Spectrogram } from './extras/Spectrogram'; import { SpectrogramMode } from '../../App'; +import { Utterance } from '../../model/utterance'; interface Props { currentSpeaker: Speaker, @@ -19,6 +19,7 @@ interface Props { onPlayCallback: () => void, onStopCallback: () => void, updateSpectrogramCallback: (spectrogram: Spectrogram) => void, + appendUtteranceCallback: (utterance: Utterance) => void, } interface State { @@ -37,8 +38,8 @@ class Form extends React.Component { }; } - public speak(sentence: string, speaker: string) { - let request = new SpeakRequest(sentence, speaker); + public speak(sentence: string, speaker: Speaker) { + let request = new SpeakRequest(sentence, speaker.getSlug()); console.log("Making SpeakRequest:", request); @@ -107,6 +108,7 @@ class Form extends React.Component { .then(res => res.json()) .then(res => { const data = `data:audio/wav;base64,${res.audio_base64}`; + (window as any).audio_base64 = res.audio_base64; // var image = new Image(); // image.src = `data:image/bmp;base64,${res.spectrogram.bytes_base64}`; @@ -160,6 +162,9 @@ class Form extends React.Component { sound.play(); + const utterance = new Utterance(sentence, speaker, sound, res.audio_base64); + this.props.appendUtteranceCallback(utterance); + (window as any).sound = sound; }) .catch(e => { @@ -195,8 +200,7 @@ class Form extends React.Component { handleFormSubmit = (ev: React.FormEvent) : boolean => { ev.preventDefault(); - let speaker = this.props.currentSpeaker.getSlug(); - this.speak(this.state.text, speaker); + this.speak(this.state.text, this.props.currentSpeaker); return false; } diff --git a/vocodes/src/modes/speak/SpeakComponent.tsx b/vocodes/src/modes/speak/SpeakComponent.tsx index 71b8d6075e..4f65b1170a 100644 --- a/vocodes/src/modes/speak/SpeakComponent.tsx +++ b/vocodes/src/modes/speak/SpeakComponent.tsx @@ -7,6 +7,7 @@ import { Speaker } from '../../Speakers'; import { ExtrasComponent, ExtrasMode } from './extras/ExtrasComponent'; import { Spectrogram } from './extras/Spectrogram'; import { SpectrogramMode } from '../../App'; +import { Utterance } from '../../model/utterance'; enum StatusState { NONE, @@ -24,6 +25,7 @@ interface Props { changeSpectrogramCallback: (spectrogram: Spectrogram) => void, changeExtrasModeCallback: (extrasMode: ExtrasMode) => void, changeSpectrogramMode: (spectrogramMode: SpectrogramMode) => void, + appendUtteranceCallback: (utterance: Utterance) => void, } interface State { @@ -147,6 +149,7 @@ class SpeakComponent extends React.Component { onPlayCallback={this.onPlay} onStopCallback={this.onStop} updateSpectrogramCallback={this.props.changeSpectrogramCallback} + appendUtteranceCallback={this.props.appendUtteranceCallback} /> ); diff --git a/vocodes/src/navigation/TopNav.tsx b/vocodes/src/navigation/TopNav.tsx index d1997f5df6..4b5500f94a 100644 --- a/vocodes/src/navigation/TopNav.tsx +++ b/vocodes/src/navigation/TopNav.tsx @@ -10,6 +10,7 @@ function TopNav(props: Props) { return (