goctests0 commited on
Commit
ff08641
·
verified ·
1 Parent(s): fc1b1e2

Upload patient.js

Browse files
Files changed (1) hide show
  1. static/js/patient.js +61 -10
static/js/patient.js CHANGED
@@ -20,6 +20,10 @@
20
  const stopRecordingBtn = document.getElementById("stop-recording-btn");
21
  const inputPanel = document.getElementById("input-panel");
22
  const listeningPanel = document.getElementById("listening-panel");
 
 
 
 
23
  const recordTimer = document.getElementById("record-timer");
24
  const recordStatus = document.getElementById("record-status");
25
  const symptomChips = document.getElementById("symptom-chips");
@@ -91,6 +95,11 @@
91
  });
92
 
93
  backToStep1Btn.addEventListener("click", function () {
 
 
 
 
 
94
  showStep(1);
95
  });
96
 
@@ -125,9 +134,8 @@
125
  recordedBlob = new Blob(recordedChunks, { type: "audio/webm" });
126
  stream.getTracks().forEach(function (track) { track.stop(); });
127
  clearInterval(recordingTimerInterval);
128
- inputPanel.style.display = "block";
129
  listeningPanel.style.display = "none";
130
- recordStatus.textContent = "Recording captured, ready to send.";
131
  });
132
 
133
  mediaRecorder.start();
@@ -152,13 +160,56 @@
152
  }
153
  });
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  // Step 2 submit
156
  submitInputBtn.addEventListener("click", async function () {
157
  clearBanner();
158
- const text = document.getElementById("patient-text").value.trim();
159
 
160
- if (!text && !recordedBlob) {
161
- showError("Type a message, tap a quick option, or record your voice first.");
 
 
 
 
 
162
  return;
163
  }
164
 
@@ -166,11 +217,7 @@
166
 
167
  const formData = new FormData();
168
  formData.append("language", selectedLanguage);
169
- if (recordedBlob) {
170
- formData.append("audio", recordedBlob, "recording.webm");
171
- } else {
172
- formData.append("text", text);
173
- }
174
 
175
  try {
176
  const response = await fetch("/patient-input", { method: "POST", body: formData });
@@ -286,6 +333,10 @@
286
  currentInteractionId = null;
287
  document.getElementById("patient-text").value = "";
288
  document.getElementById("response-card").style.display = "none";
 
 
 
 
289
  languageGrid.querySelectorAll(".language-option").forEach(function (el) {
290
  el.setAttribute("aria-pressed", "false");
291
  });
 
20
  const stopRecordingBtn = document.getElementById("stop-recording-btn");
21
  const inputPanel = document.getElementById("input-panel");
22
  const listeningPanel = document.getElementById("listening-panel");
23
+ const transcribingPanel = document.getElementById("transcribing-panel");
24
+ const reviewPanel = document.getElementById("review-panel");
25
+ const reviewText = document.getElementById("review-text");
26
+ const recordAgainBtn = document.getElementById("record-again-btn");
27
  const recordTimer = document.getElementById("record-timer");
28
  const recordStatus = document.getElementById("record-status");
29
  const symptomChips = document.getElementById("symptom-chips");
 
95
  });
96
 
97
  backToStep1Btn.addEventListener("click", function () {
98
+ reviewPanel.style.display = "none";
99
+ transcribingPanel.style.display = "none";
100
+ listeningPanel.style.display = "none";
101
+ inputPanel.style.display = "block";
102
+ recordedBlob = null;
103
  showStep(1);
104
  });
105
 
 
134
  recordedBlob = new Blob(recordedChunks, { type: "audio/webm" });
135
  stream.getTracks().forEach(function (track) { track.stop(); });
136
  clearInterval(recordingTimerInterval);
 
137
  listeningPanel.style.display = "none";
138
+ transcribeRecording();
139
  });
140
 
141
  mediaRecorder.start();
 
160
  }
161
  });
162
 
163
+ async function transcribeRecording() {
164
+ clearBanner();
165
+ transcribingPanel.style.display = "block";
166
+
167
+ const formData = new FormData();
168
+ formData.append("language", selectedLanguage);
169
+ formData.append("audio", recordedBlob, "recording.webm");
170
+
171
+ try {
172
+ const response = await fetch("/transcribe", { method: "POST", body: formData });
173
+ const data = await response.json();
174
+
175
+ transcribingPanel.style.display = "none";
176
+
177
+ if (!response.ok) {
178
+ showError(data.error || "Couldn't hear that clearly, try again or type your message instead.");
179
+ recordedBlob = null;
180
+ inputPanel.style.display = "block";
181
+ return;
182
+ }
183
+
184
+ reviewText.value = data.patient_text;
185
+ reviewPanel.style.display = "block";
186
+ reviewText.focus();
187
+ } catch (error) {
188
+ transcribingPanel.style.display = "none";
189
+ recordedBlob = null;
190
+ inputPanel.style.display = "block";
191
+ showError("Couldn't reach the server. Check your connection and try again.");
192
+ }
193
+ }
194
+
195
+ recordAgainBtn.addEventListener("click", function () {
196
+ reviewPanel.style.display = "none";
197
+ recordedBlob = null;
198
+ inputPanel.style.display = "block";
199
+ recordStatus.textContent = "";
200
+ });
201
+
202
  // Step 2 submit
203
  submitInputBtn.addEventListener("click", async function () {
204
  clearBanner();
 
205
 
206
+ const isReviewing = reviewPanel.style.display === "block";
207
+ const text = isReviewing
208
+ ? reviewText.value.trim()
209
+ : document.getElementById("patient-text").value.trim();
210
+
211
+ if (!text) {
212
+ showError(isReviewing ? "Your message can't be empty." : "Type a message, tap a quick option, or record your voice first.");
213
  return;
214
  }
215
 
 
217
 
218
  const formData = new FormData();
219
  formData.append("language", selectedLanguage);
220
+ formData.append("text", text);
 
 
 
 
221
 
222
  try {
223
  const response = await fetch("/patient-input", { method: "POST", body: formData });
 
333
  currentInteractionId = null;
334
  document.getElementById("patient-text").value = "";
335
  document.getElementById("response-card").style.display = "none";
336
+ reviewPanel.style.display = "none";
337
+ transcribingPanel.style.display = "none";
338
+ listeningPanel.style.display = "none";
339
+ inputPanel.style.display = "block";
340
  languageGrid.querySelectorAll(".language-option").forEach(function (el) {
341
  el.setAttribute("aria-pressed", "false");
342
  });