Upload patient.js
Browse files- 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 |
-
|
| 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 |
-
|
| 161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 162 |
return;
|
| 163 |
}
|
| 164 |
|
|
@@ -166,11 +217,7 @@
|
|
| 166 |
|
| 167 |
const formData = new FormData();
|
| 168 |
formData.append("language", selectedLanguage);
|
| 169 |
-
|
| 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 |
});
|