@adminide-stack/yantra-mobile 12.0.136-alpha.0 → 12.0.136-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/compute.js +51 -1
- package/lib/compute.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +9 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/apps/nativeSurfaceTwin.js +1 -0
- package/lib/features/apps/nativeSurfaceTwin.js.map +1 -1
- package/lib/features/dictate/DictateExperience.js +387 -0
- package/lib/features/dictate/DictateExperience.js.map +1 -0
- package/lib/features/dictate/components/DictationList.js +110 -0
- package/lib/features/dictate/components/DictationList.js.map +1 -0
- package/lib/features/dictate/components/NoteView.js +330 -0
- package/lib/features/dictate/components/NoteView.js.map +1 -0
- package/lib/features/dictate/components/RecordPanel.js +218 -0
- package/lib/features/dictate/components/RecordPanel.js.map +1 -0
- package/lib/features/dictate/dictateClient.js +98 -0
- package/lib/features/dictate/dictateClient.js.map +1 -0
- package/lib/features/dictate/dictateTheme.js +46 -0
- package/lib/features/dictate/dictateTheme.js.map +1 -0
- package/lib/features/dictate/dictationStore.js +107 -0
- package/lib/features/dictate/dictationStore.js.map +1 -0
- package/lib/features/dictate/noteText.js +35 -0
- package/lib/features/dictate/noteText.js.map +1 -0
- package/lib/features/dictate/useDictationRecorder.js +121 -0
- package/lib/features/dictate/useDictationRecorder.js.map +1 -0
- package/lib/routes.json +50 -0
- package/lib/screens/DictateNative/index.js +36 -0
- package/lib/screens/DictateNative/index.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {useState,useEffect}from'react';import {View,StyleSheet,Text,ScrollView,ActivityIndicator}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {formatDuration,NOTE_DISCLAIMER}from'../noteText.js';const STAGE_TEXT = {
|
|
2
|
+
uploading: "Uploading the recording\u2026",
|
|
3
|
+
writing: "Transcribing and writing the note\u2026"
|
|
4
|
+
};
|
|
5
|
+
function dictationDate(iso) {
|
|
6
|
+
const d = new Date(iso);
|
|
7
|
+
return Number.isNaN(d.getTime()) ? "" : d.toLocaleString(void 0, {
|
|
8
|
+
month: "short",
|
|
9
|
+
day: "numeric",
|
|
10
|
+
hour: "numeric",
|
|
11
|
+
minute: "2-digit"
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function Section({
|
|
15
|
+
title,
|
|
16
|
+
items,
|
|
17
|
+
theme
|
|
18
|
+
}) {
|
|
19
|
+
if (!items.length) return null;
|
|
20
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.card, {
|
|
21
|
+
backgroundColor: theme.card,
|
|
22
|
+
borderColor: theme.border
|
|
23
|
+
}], children: [
|
|
24
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.heading, {
|
|
25
|
+
color: theme.muted
|
|
26
|
+
}], children: title }),
|
|
27
|
+
items.map((item, i) => /* @__PURE__ */ jsxs(View, { style: styles.item, children: [
|
|
28
|
+
/* @__PURE__ */ jsx(View, { style: [styles.bullet, {
|
|
29
|
+
backgroundColor: theme.faint
|
|
30
|
+
}] }),
|
|
31
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.itemText, {
|
|
32
|
+
color: theme.ink
|
|
33
|
+
}], children: item })
|
|
34
|
+
] }, i))
|
|
35
|
+
] });
|
|
36
|
+
}
|
|
37
|
+
function actionTone(action, theme) {
|
|
38
|
+
if (action === "start") return {
|
|
39
|
+
bg: theme.goodSoft,
|
|
40
|
+
ink: theme.good
|
|
41
|
+
};
|
|
42
|
+
if (action === "change") return {
|
|
43
|
+
bg: theme.accentSoft,
|
|
44
|
+
ink: theme.accent
|
|
45
|
+
};
|
|
46
|
+
if (action === "stop") return {
|
|
47
|
+
bg: theme.recSoft,
|
|
48
|
+
ink: theme.crit
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
bg: theme.chip,
|
|
52
|
+
ink: theme.muted
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function Medications({
|
|
56
|
+
meds,
|
|
57
|
+
theme
|
|
58
|
+
}) {
|
|
59
|
+
if (!meds.length) return null;
|
|
60
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.card, {
|
|
61
|
+
backgroundColor: theme.card,
|
|
62
|
+
borderColor: theme.border
|
|
63
|
+
}], children: [
|
|
64
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.heading, {
|
|
65
|
+
color: theme.muted
|
|
66
|
+
}], children: "MEDICATIONS" }),
|
|
67
|
+
meds.map((med, i) => {
|
|
68
|
+
const tone = actionTone(med.action, theme);
|
|
69
|
+
const detail = [med.dose, med.route, med.frequency].filter(Boolean).join(" \xB7 ");
|
|
70
|
+
return /* @__PURE__ */ jsxs(View, { style: [styles.med, i > 0 && {
|
|
71
|
+
borderTopColor: theme.border,
|
|
72
|
+
borderTopWidth: StyleSheet.hairlineWidth
|
|
73
|
+
}], children: [
|
|
74
|
+
/* @__PURE__ */ jsxs(View, { style: styles.medText, children: [
|
|
75
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.medName, {
|
|
76
|
+
color: theme.ink
|
|
77
|
+
}], children: med.name }),
|
|
78
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.medDetail, {
|
|
79
|
+
color: detail ? theme.muted : theme.warnInk
|
|
80
|
+
}], children: detail || "No dose or frequency dictated" })
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ jsx(View, { style: [styles.pill, {
|
|
83
|
+
backgroundColor: tone.bg
|
|
84
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.pillText, {
|
|
85
|
+
color: tone.ink
|
|
86
|
+
}], children: med.action }) })
|
|
87
|
+
] }, `${med.name}-${i}`);
|
|
88
|
+
})
|
|
89
|
+
] });
|
|
90
|
+
}
|
|
91
|
+
function Writing({
|
|
92
|
+
stage,
|
|
93
|
+
theme
|
|
94
|
+
}) {
|
|
95
|
+
const [seconds, setSeconds] = useState(0);
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
const id = setInterval(() => setSeconds((s) => s + 1), 1e3);
|
|
98
|
+
return () => clearInterval(id);
|
|
99
|
+
}, []);
|
|
100
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.center, children: [
|
|
101
|
+
/* @__PURE__ */ jsx(ActivityIndicator, { color: theme.accent }),
|
|
102
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.centerTitle, {
|
|
103
|
+
color: theme.ink
|
|
104
|
+
}], children: STAGE_TEXT[stage] }),
|
|
105
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.centerDetail, {
|
|
106
|
+
color: theme.faint
|
|
107
|
+
}], children: [
|
|
108
|
+
seconds,
|
|
109
|
+
"s \xB7 usually under a minute"
|
|
110
|
+
] })
|
|
111
|
+
] });
|
|
112
|
+
}
|
|
113
|
+
function NoteView({
|
|
114
|
+
record,
|
|
115
|
+
stage,
|
|
116
|
+
theme,
|
|
117
|
+
bottomInset,
|
|
118
|
+
onRetry
|
|
119
|
+
}) {
|
|
120
|
+
var _a;
|
|
121
|
+
const [showTranscript, setShowTranscript] = useState(false);
|
|
122
|
+
const meta = [dictationDate(record.createdAt), formatDuration(record.durationMs)].filter(Boolean).join(" \xB7 ");
|
|
123
|
+
if (record.status === "writing" || record.status === "saved" && stage) {
|
|
124
|
+
return /* @__PURE__ */ jsx(Writing, { stage: stage != null ? stage : "writing", theme });
|
|
125
|
+
}
|
|
126
|
+
if (!record.note) {
|
|
127
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.center, children: [
|
|
128
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "alert-circle-outline", size: 28, color: theme.crit }),
|
|
129
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.centerTitle, {
|
|
130
|
+
color: theme.ink
|
|
131
|
+
}], children: "No note yet" }),
|
|
132
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.centerDetail, {
|
|
133
|
+
color: theme.muted
|
|
134
|
+
}], children: (_a = record.error) != null ? _a : "The recording is saved on this phone." }),
|
|
135
|
+
record.audioUri ? /* @__PURE__ */ jsx(Tap, { onPress: onRetry, accessibilityRole: "button", style: [styles.retry, {
|
|
136
|
+
backgroundColor: theme.accent
|
|
137
|
+
}], pressedStyle: DIM, children: /* @__PURE__ */ jsx(Text, { style: [styles.retryText, {
|
|
138
|
+
color: theme.accentInk
|
|
139
|
+
}], children: "Write the note" }) }) : null
|
|
140
|
+
] });
|
|
141
|
+
}
|
|
142
|
+
const note = record.note;
|
|
143
|
+
return /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: [styles.scroll, {
|
|
144
|
+
paddingBottom: 24 + bottomInset
|
|
145
|
+
}], children: [
|
|
146
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
147
|
+
color: theme.ink
|
|
148
|
+
}], children: note.title }),
|
|
149
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.meta, {
|
|
150
|
+
color: theme.faint
|
|
151
|
+
}], children: meta }),
|
|
152
|
+
note.to_verify.length ? /* @__PURE__ */ jsxs(View, { style: [styles.verify, {
|
|
153
|
+
backgroundColor: theme.warnSoft,
|
|
154
|
+
borderColor: theme.warnBorder
|
|
155
|
+
}], children: [
|
|
156
|
+
/* @__PURE__ */ jsxs(View, { style: styles.verifyHead, children: [
|
|
157
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "alert-outline", size: 18, color: theme.warnInk }),
|
|
158
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.verifyTitle, {
|
|
159
|
+
color: theme.warnInk
|
|
160
|
+
}], children: "Check before you use" })
|
|
161
|
+
] }),
|
|
162
|
+
note.to_verify.map((item, i) => /* @__PURE__ */ jsx(Text, { style: [styles.verifyItem, {
|
|
163
|
+
color: theme.warnInk
|
|
164
|
+
}], children: `\u2022 ${item}` }, i))
|
|
165
|
+
] }) : null,
|
|
166
|
+
/* @__PURE__ */ jsx(Section, { title: "SUBJECTIVE", items: note.subjective, theme }),
|
|
167
|
+
/* @__PURE__ */ jsx(Section, { title: "OBJECTIVE", items: note.objective, theme }),
|
|
168
|
+
/* @__PURE__ */ jsx(Section, { title: "ASSESSMENT", items: note.assessment, theme }),
|
|
169
|
+
/* @__PURE__ */ jsx(Section, { title: "PLAN", items: note.plan, theme }),
|
|
170
|
+
/* @__PURE__ */ jsx(Medications, { meds: note.medications, theme }),
|
|
171
|
+
note.follow_up ? /* @__PURE__ */ jsx(Section, { title: "FOLLOW-UP", items: [note.follow_up], theme }) : null,
|
|
172
|
+
record.transcript ? /* @__PURE__ */ jsxs(View, { style: [styles.card, {
|
|
173
|
+
backgroundColor: theme.card,
|
|
174
|
+
borderColor: theme.border
|
|
175
|
+
}], children: [
|
|
176
|
+
/* @__PURE__ */ jsxs(Tap, { onPress: () => setShowTranscript((v) => !v), accessibilityRole: "button", style: styles.transcriptToggle, pressedStyle: DIM, children: [
|
|
177
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.heading, styles.headingFlat, {
|
|
178
|
+
color: theme.muted
|
|
179
|
+
}], children: "TRANSCRIPT" }),
|
|
180
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: showTranscript ? "chevron-up" : "chevron-down", size: 20, color: theme.muted })
|
|
181
|
+
] }),
|
|
182
|
+
showTranscript ? /* @__PURE__ */ jsx(Text, { style: [styles.transcript, {
|
|
183
|
+
color: theme.ink
|
|
184
|
+
}], children: record.transcript }) : null
|
|
185
|
+
] }) : null,
|
|
186
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.disclaimer, {
|
|
187
|
+
color: theme.faint
|
|
188
|
+
}], children: NOTE_DISCLAIMER })
|
|
189
|
+
] });
|
|
190
|
+
}
|
|
191
|
+
const styles = StyleSheet.create({
|
|
192
|
+
scroll: {
|
|
193
|
+
paddingHorizontal: 16,
|
|
194
|
+
paddingTop: 8
|
|
195
|
+
},
|
|
196
|
+
title: {
|
|
197
|
+
fontSize: 21,
|
|
198
|
+
fontWeight: "700",
|
|
199
|
+
lineHeight: 27
|
|
200
|
+
},
|
|
201
|
+
meta: {
|
|
202
|
+
marginTop: 4,
|
|
203
|
+
fontSize: 13
|
|
204
|
+
},
|
|
205
|
+
verify: {
|
|
206
|
+
marginTop: 16,
|
|
207
|
+
borderRadius: 14,
|
|
208
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
209
|
+
padding: 14
|
|
210
|
+
},
|
|
211
|
+
verifyHead: {
|
|
212
|
+
flexDirection: "row",
|
|
213
|
+
alignItems: "center",
|
|
214
|
+
gap: 8,
|
|
215
|
+
marginBottom: 6
|
|
216
|
+
},
|
|
217
|
+
verifyTitle: {
|
|
218
|
+
fontSize: 14,
|
|
219
|
+
fontWeight: "700"
|
|
220
|
+
},
|
|
221
|
+
verifyItem: {
|
|
222
|
+
fontSize: 14,
|
|
223
|
+
lineHeight: 20,
|
|
224
|
+
marginTop: 4
|
|
225
|
+
},
|
|
226
|
+
card: {
|
|
227
|
+
marginTop: 12,
|
|
228
|
+
borderRadius: 14,
|
|
229
|
+
borderWidth: StyleSheet.hairlineWidth,
|
|
230
|
+
paddingHorizontal: 14,
|
|
231
|
+
paddingVertical: 12
|
|
232
|
+
},
|
|
233
|
+
heading: {
|
|
234
|
+
fontSize: 12,
|
|
235
|
+
fontWeight: "700",
|
|
236
|
+
letterSpacing: 0.8,
|
|
237
|
+
marginBottom: 6
|
|
238
|
+
},
|
|
239
|
+
headingFlat: {
|
|
240
|
+
marginBottom: 0
|
|
241
|
+
},
|
|
242
|
+
item: {
|
|
243
|
+
flexDirection: "row",
|
|
244
|
+
alignItems: "flex-start",
|
|
245
|
+
marginTop: 6
|
|
246
|
+
},
|
|
247
|
+
bullet: {
|
|
248
|
+
width: 5,
|
|
249
|
+
height: 5,
|
|
250
|
+
borderRadius: 2.5,
|
|
251
|
+
marginTop: 8,
|
|
252
|
+
marginRight: 10
|
|
253
|
+
},
|
|
254
|
+
itemText: {
|
|
255
|
+
flex: 1,
|
|
256
|
+
fontSize: 15,
|
|
257
|
+
lineHeight: 21
|
|
258
|
+
},
|
|
259
|
+
med: {
|
|
260
|
+
flexDirection: "row",
|
|
261
|
+
alignItems: "center",
|
|
262
|
+
paddingVertical: 10
|
|
263
|
+
},
|
|
264
|
+
medText: {
|
|
265
|
+
flex: 1,
|
|
266
|
+
paddingRight: 10
|
|
267
|
+
},
|
|
268
|
+
medName: {
|
|
269
|
+
fontSize: 15,
|
|
270
|
+
fontWeight: "600",
|
|
271
|
+
textTransform: "capitalize"
|
|
272
|
+
},
|
|
273
|
+
medDetail: {
|
|
274
|
+
marginTop: 2,
|
|
275
|
+
fontSize: 13
|
|
276
|
+
},
|
|
277
|
+
pill: {
|
|
278
|
+
paddingHorizontal: 10,
|
|
279
|
+
paddingVertical: 4,
|
|
280
|
+
borderRadius: 999
|
|
281
|
+
},
|
|
282
|
+
pillText: {
|
|
283
|
+
fontSize: 12,
|
|
284
|
+
fontWeight: "600",
|
|
285
|
+
textTransform: "capitalize"
|
|
286
|
+
},
|
|
287
|
+
transcriptToggle: {
|
|
288
|
+
flexDirection: "row",
|
|
289
|
+
alignItems: "center",
|
|
290
|
+
justifyContent: "space-between"
|
|
291
|
+
},
|
|
292
|
+
transcript: {
|
|
293
|
+
marginTop: 10,
|
|
294
|
+
fontSize: 14,
|
|
295
|
+
lineHeight: 21
|
|
296
|
+
},
|
|
297
|
+
disclaimer: {
|
|
298
|
+
marginTop: 18,
|
|
299
|
+
fontSize: 12,
|
|
300
|
+
textAlign: "center"
|
|
301
|
+
},
|
|
302
|
+
center: {
|
|
303
|
+
flex: 1,
|
|
304
|
+
alignItems: "center",
|
|
305
|
+
justifyContent: "center",
|
|
306
|
+
paddingHorizontal: 32
|
|
307
|
+
},
|
|
308
|
+
centerTitle: {
|
|
309
|
+
marginTop: 14,
|
|
310
|
+
fontSize: 16,
|
|
311
|
+
fontWeight: "600",
|
|
312
|
+
textAlign: "center"
|
|
313
|
+
},
|
|
314
|
+
centerDetail: {
|
|
315
|
+
marginTop: 6,
|
|
316
|
+
fontSize: 13,
|
|
317
|
+
lineHeight: 19,
|
|
318
|
+
textAlign: "center"
|
|
319
|
+
},
|
|
320
|
+
retry: {
|
|
321
|
+
marginTop: 18,
|
|
322
|
+
paddingHorizontal: 20,
|
|
323
|
+
paddingVertical: 12,
|
|
324
|
+
borderRadius: 999
|
|
325
|
+
},
|
|
326
|
+
retryText: {
|
|
327
|
+
fontSize: 15,
|
|
328
|
+
fontWeight: "600"
|
|
329
|
+
}
|
|
330
|
+
});export{NoteView,dictationDate};//# sourceMappingURL=NoteView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NoteView.js","sources":["../../../../src/features/dictate/components/NoteView.tsx"],"sourcesContent":["/**\n * A dictation's note: what to check first (amber, above everything), the four\n * SOAP sections, the medications with what was dictated for each, follow-up,\n * and the transcript behind a toggle. While the note is being written this\n * shows the stage; when writing failed, why and a Retry that reuses the saved\n * recording.\n */\nimport React, { useEffect, useState } from 'react';\nimport { ActivityIndicator, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { formatDuration, NOTE_DISCLAIMER } from '../noteText';\nimport type { DictateStage } from '../dictateClient';\nimport type { DictateTheme } from '../dictateTheme';\nimport type { DictationRecord, NoteMedication } from '../types';\n\nconst STAGE_TEXT: Record<DictateStage, string> = {\n uploading: 'Uploading the recording…',\n writing: 'Transcribing and writing the note…',\n};\n\nexport function dictationDate(iso: string): string {\n const d = new Date(iso);\n return Number.isNaN(d.getTime())\n ? ''\n : d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n}\n\nfunction Section({ title, items, theme }: { title: string; items: string[]; theme: DictateTheme }) {\n if (!items.length) return null;\n return (\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.heading, { color: theme.muted }]}>{title}</Text>\n {items.map((item, i) => (\n <View key={i} style={styles.item}>\n <View style={[styles.bullet, { backgroundColor: theme.faint }]} />\n <Text style={[styles.itemText, { color: theme.ink }]}>{item}</Text>\n </View>\n ))}\n </View>\n );\n}\n\nfunction actionTone(action: NoteMedication['action'], theme: DictateTheme): { bg: string; ink: string } {\n if (action === 'start') return { bg: theme.goodSoft, ink: theme.good };\n if (action === 'change') return { bg: theme.accentSoft, ink: theme.accent };\n if (action === 'stop') return { bg: theme.recSoft, ink: theme.crit };\n return { bg: theme.chip, ink: theme.muted };\n}\n\nfunction Medications({ meds, theme }: { meds: NoteMedication[]; theme: DictateTheme }) {\n if (!meds.length) return null;\n return (\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Text style={[styles.heading, { color: theme.muted }]}>MEDICATIONS</Text>\n {meds.map((med, i) => {\n const tone = actionTone(med.action, theme);\n const detail = [med.dose, med.route, med.frequency].filter(Boolean).join(' · ');\n return (\n <View key={`${med.name}-${i}`} style={[styles.med, i > 0 && { borderTopColor: theme.border, borderTopWidth: StyleSheet.hairlineWidth }]}>\n <View style={styles.medText}>\n <Text style={[styles.medName, { color: theme.ink }]}>{med.name}</Text>\n <Text style={[styles.medDetail, { color: detail ? theme.muted : theme.warnInk }]}>{detail || 'No dose or frequency dictated'}</Text>\n </View>\n <View style={[styles.pill, { backgroundColor: tone.bg }]}>\n <Text style={[styles.pillText, { color: tone.ink }]}>{med.action}</Text>\n </View>\n </View>\n );\n })}\n </View>\n );\n}\n\nfunction Writing({ stage, theme }: { stage: DictateStage; theme: DictateTheme }) {\n const [seconds, setSeconds] = useState(0);\n useEffect(() => {\n const id = setInterval(() => setSeconds((s) => s + 1), 1000);\n return () => clearInterval(id);\n }, []);\n return (\n <View style={styles.center}>\n <ActivityIndicator color={theme.accent} />\n <Text style={[styles.centerTitle, { color: theme.ink }]}>{STAGE_TEXT[stage]}</Text>\n <Text style={[styles.centerDetail, { color: theme.faint }]}>{seconds}s · usually under a minute</Text>\n </View>\n );\n}\n\nexport function NoteView({\n record,\n stage,\n theme,\n bottomInset,\n onRetry,\n}: {\n record: DictationRecord;\n stage: DictateStage | null;\n theme: DictateTheme;\n bottomInset: number;\n onRetry: () => void;\n}) {\n const [showTranscript, setShowTranscript] = useState(false);\n const meta = [dictationDate(record.createdAt), formatDuration(record.durationMs)].filter(Boolean).join(' · ');\n\n if (record.status === 'writing' || (record.status === 'saved' && stage)) {\n return <Writing stage={stage ?? 'writing'} theme={theme} />;\n }\n if (!record.note) {\n return (\n <View style={styles.center}>\n <MaterialCommunityIcons name=\"alert-circle-outline\" size={28} color={theme.crit} />\n <Text style={[styles.centerTitle, { color: theme.ink }]}>No note yet</Text>\n <Text style={[styles.centerDetail, { color: theme.muted }]}>{record.error ?? 'The recording is saved on this phone.'}</Text>\n {record.audioUri ? (\n <Tap onPress={onRetry} accessibilityRole=\"button\" style={[styles.retry, { backgroundColor: theme.accent }]} pressedStyle={DIM}>\n <Text style={[styles.retryText, { color: theme.accentInk }]}>Write the note</Text>\n </Tap>\n ) : null}\n </View>\n );\n }\n\n const note = record.note;\n return (\n <ScrollView contentContainerStyle={[styles.scroll, { paddingBottom: 24 + bottomInset }]}>\n <Text style={[styles.title, { color: theme.ink }]}>{note.title}</Text>\n <Text style={[styles.meta, { color: theme.faint }]}>{meta}</Text>\n\n {note.to_verify.length ? (\n <View style={[styles.verify, { backgroundColor: theme.warnSoft, borderColor: theme.warnBorder }]}>\n <View style={styles.verifyHead}>\n <MaterialCommunityIcons name=\"alert-outline\" size={18} color={theme.warnInk} />\n <Text style={[styles.verifyTitle, { color: theme.warnInk }]}>Check before you use</Text>\n </View>\n {note.to_verify.map((item, i) => (\n <Text key={i} style={[styles.verifyItem, { color: theme.warnInk }]}>\n {`• ${item}`}\n </Text>\n ))}\n </View>\n ) : null}\n\n <Section title=\"SUBJECTIVE\" items={note.subjective} theme={theme} />\n <Section title=\"OBJECTIVE\" items={note.objective} theme={theme} />\n <Section title=\"ASSESSMENT\" items={note.assessment} theme={theme} />\n <Section title=\"PLAN\" items={note.plan} theme={theme} />\n <Medications meds={note.medications} theme={theme} />\n {note.follow_up ? <Section title=\"FOLLOW-UP\" items={[note.follow_up]} theme={theme} /> : null}\n\n {record.transcript ? (\n <View style={[styles.card, { backgroundColor: theme.card, borderColor: theme.border }]}>\n <Tap\n onPress={() => setShowTranscript((v) => !v)}\n accessibilityRole=\"button\"\n style={styles.transcriptToggle}\n pressedStyle={DIM}\n >\n <Text style={[styles.heading, styles.headingFlat, { color: theme.muted }]}>TRANSCRIPT</Text>\n <MaterialCommunityIcons name={showTranscript ? 'chevron-up' : 'chevron-down'} size={20} color={theme.muted} />\n </Tap>\n {showTranscript ? <Text style={[styles.transcript, { color: theme.ink }]}>{record.transcript}</Text> : null}\n </View>\n ) : null}\n\n <Text style={[styles.disclaimer, { color: theme.faint }]}>{NOTE_DISCLAIMER}</Text>\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n scroll: { paddingHorizontal: 16, paddingTop: 8 },\n title: { fontSize: 21, fontWeight: '700', lineHeight: 27 },\n meta: { marginTop: 4, fontSize: 13 },\n verify: { marginTop: 16, borderRadius: 14, borderWidth: StyleSheet.hairlineWidth, padding: 14 },\n verifyHead: { flexDirection: 'row', alignItems: 'center', gap: 8, marginBottom: 6 },\n verifyTitle: { fontSize: 14, fontWeight: '700' },\n verifyItem: { fontSize: 14, lineHeight: 20, marginTop: 4 },\n card: { marginTop: 12, borderRadius: 14, borderWidth: StyleSheet.hairlineWidth, paddingHorizontal: 14, paddingVertical: 12 },\n heading: { fontSize: 12, fontWeight: '700', letterSpacing: 0.8, marginBottom: 6 },\n headingFlat: { marginBottom: 0 },\n item: { flexDirection: 'row', alignItems: 'flex-start', marginTop: 6 },\n bullet: { width: 5, height: 5, borderRadius: 2.5, marginTop: 8, marginRight: 10 },\n itemText: { flex: 1, fontSize: 15, lineHeight: 21 },\n med: { flexDirection: 'row', alignItems: 'center', paddingVertical: 10 },\n medText: { flex: 1, paddingRight: 10 },\n medName: { fontSize: 15, fontWeight: '600', textTransform: 'capitalize' },\n medDetail: { marginTop: 2, fontSize: 13 },\n pill: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 999 },\n pillText: { fontSize: 12, fontWeight: '600', textTransform: 'capitalize' },\n transcriptToggle: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },\n transcript: { marginTop: 10, fontSize: 14, lineHeight: 21 },\n disclaimer: { marginTop: 18, fontSize: 12, textAlign: 'center' },\n center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 32 },\n centerTitle: { marginTop: 14, fontSize: 16, fontWeight: '600', textAlign: 'center' },\n centerDetail: { marginTop: 6, fontSize: 13, lineHeight: 19, textAlign: 'center' },\n retry: { marginTop: 18, paddingHorizontal: 20, paddingVertical: 12, borderRadius: 999 },\n retryText: { fontSize: 15, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect}from'react';import {View,StyleSheet,Text,ActivityIndicator}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Tap,DIM}from'../../inbox/components/Tap.js';import {formatDuration}from'../noteText.js';const BARS = 32;
|
|
2
|
+
function LevelBars({
|
|
3
|
+
level,
|
|
4
|
+
active,
|
|
5
|
+
theme
|
|
6
|
+
}) {
|
|
7
|
+
const [history, setHistory] = useState(() => Array(BARS).fill(0));
|
|
8
|
+
const levelRef = useRef(level);
|
|
9
|
+
levelRef.current = level;
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (!active) return;
|
|
12
|
+
const id = setInterval(() => setHistory((h) => [...h.slice(1), levelRef.current]), 90);
|
|
13
|
+
return () => clearInterval(id);
|
|
14
|
+
}, [active]);
|
|
15
|
+
return /* @__PURE__ */ jsx(View, { style: styles.bars, accessibilityLabel: "Microphone level", children: history.map((v, i) => /* @__PURE__ */ jsx(View, { style: [styles.bar, {
|
|
16
|
+
height: 6 + Math.round(v * 46),
|
|
17
|
+
backgroundColor: active ? theme.rec : theme.border,
|
|
18
|
+
opacity: active ? 0.35 + 0.65 * (i / BARS) : 1
|
|
19
|
+
}] }, i)) });
|
|
20
|
+
}
|
|
21
|
+
function StartPanel({
|
|
22
|
+
theme,
|
|
23
|
+
starting,
|
|
24
|
+
onStart
|
|
25
|
+
}) {
|
|
26
|
+
return /* @__PURE__ */ jsxs(Tap, { onPress: onStart, disabled: starting, accessibilityRole: "button", accessibilityLabel: "Start dictating", style: styles.start, pressedStyle: DIM, children: [
|
|
27
|
+
/* @__PURE__ */ jsx(View, { style: [styles.micButton, {
|
|
28
|
+
backgroundColor: theme.accent,
|
|
29
|
+
shadowColor: theme.accent
|
|
30
|
+
}], children: starting ? /* @__PURE__ */ jsx(ActivityIndicator, { color: theme.accentInk }) : /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "microphone", size: 42, color: theme.accentInk }) }),
|
|
31
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.startLabel, {
|
|
32
|
+
color: theme.ink
|
|
33
|
+
}], children: "Start dictating" }),
|
|
34
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.startHint, {
|
|
35
|
+
color: theme.muted
|
|
36
|
+
}], children: "Keep Yantra open while you speak." })
|
|
37
|
+
] });
|
|
38
|
+
}
|
|
39
|
+
function RecordingPanel({
|
|
40
|
+
theme,
|
|
41
|
+
phase,
|
|
42
|
+
pauseReason,
|
|
43
|
+
elapsedMs,
|
|
44
|
+
level,
|
|
45
|
+
onPause,
|
|
46
|
+
onResume,
|
|
47
|
+
onDone,
|
|
48
|
+
onDiscard
|
|
49
|
+
}) {
|
|
50
|
+
const live = phase === "recording";
|
|
51
|
+
const notice = pauseReason === "background" ? "Paused because Yantra left the screen. Resume to keep dictating." : pauseReason === "limit" ? "An hour is the most one dictation holds. Tap Done to write the note." : null;
|
|
52
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.recording, children: [
|
|
53
|
+
/* @__PURE__ */ jsxs(View, { style: [styles.status, {
|
|
54
|
+
backgroundColor: live ? theme.recSoft : theme.chip
|
|
55
|
+
}], children: [
|
|
56
|
+
/* @__PURE__ */ jsx(View, { style: [styles.dot, {
|
|
57
|
+
backgroundColor: live ? theme.rec : theme.faint
|
|
58
|
+
}] }),
|
|
59
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.statusText, {
|
|
60
|
+
color: live ? theme.rec : theme.muted
|
|
61
|
+
}], children: live ? "Recording" : "Paused" })
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.timer, {
|
|
64
|
+
color: theme.ink
|
|
65
|
+
}], accessibilityLabel: `Elapsed ${formatDuration(elapsedMs)}`, children: formatDuration(elapsedMs) }),
|
|
66
|
+
/* @__PURE__ */ jsx(LevelBars, { level, active: live, theme }),
|
|
67
|
+
notice ? /* @__PURE__ */ jsxs(View, { style: [styles.notice, {
|
|
68
|
+
backgroundColor: theme.warnSoft,
|
|
69
|
+
borderColor: theme.warnBorder
|
|
70
|
+
}], children: [
|
|
71
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "pause-circle-outline", size: 18, color: theme.warnInk }),
|
|
72
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.noticeText, {
|
|
73
|
+
color: theme.warnInk
|
|
74
|
+
}], children: notice })
|
|
75
|
+
] }) : null,
|
|
76
|
+
/* @__PURE__ */ jsxs(View, { style: styles.controls, children: [
|
|
77
|
+
/* @__PURE__ */ jsx(Tap, { onPress: onDiscard, accessibilityRole: "button", accessibilityLabel: "Discard this dictation", style: [styles.side, {
|
|
78
|
+
backgroundColor: theme.chip
|
|
79
|
+
}], pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "trash-can-outline", size: 24, color: theme.muted }) }),
|
|
80
|
+
/* @__PURE__ */ jsx(Tap, { onPress: live ? onPause : onResume, disabled: pauseReason === "limit", accessibilityRole: "button", accessibilityLabel: live ? "Pause" : "Resume", style: [styles.main, {
|
|
81
|
+
backgroundColor: live ? theme.rec : theme.accent,
|
|
82
|
+
opacity: pauseReason === "limit" ? 0.4 : 1
|
|
83
|
+
}], pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: live ? "pause" : "microphone", size: 34, color: "#ffffff" }) }),
|
|
84
|
+
/* @__PURE__ */ jsx(Tap, { onPress: onDone, disabled: elapsedMs < 1e3, accessibilityRole: "button", accessibilityLabel: "Done, write the note", style: [styles.side, {
|
|
85
|
+
backgroundColor: theme.accentSoft,
|
|
86
|
+
opacity: elapsedMs < 1e3 ? 0.4 : 1
|
|
87
|
+
}], pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 26, color: theme.accent }) })
|
|
88
|
+
] }),
|
|
89
|
+
/* @__PURE__ */ jsxs(View, { style: styles.legend, children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.legendText, {
|
|
91
|
+
color: theme.faint
|
|
92
|
+
}], children: "Discard" }),
|
|
93
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.legendText, {
|
|
94
|
+
color: theme.faint
|
|
95
|
+
}], children: live ? "Pause" : "Resume" }),
|
|
96
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.legendText, {
|
|
97
|
+
color: theme.faint
|
|
98
|
+
}], children: "Done" })
|
|
99
|
+
] })
|
|
100
|
+
] });
|
|
101
|
+
}
|
|
102
|
+
const styles = StyleSheet.create({
|
|
103
|
+
start: {
|
|
104
|
+
alignItems: "center",
|
|
105
|
+
paddingVertical: 28
|
|
106
|
+
},
|
|
107
|
+
micButton: {
|
|
108
|
+
width: 104,
|
|
109
|
+
height: 104,
|
|
110
|
+
borderRadius: 52,
|
|
111
|
+
alignItems: "center",
|
|
112
|
+
justifyContent: "center",
|
|
113
|
+
shadowOpacity: 0.28,
|
|
114
|
+
shadowRadius: 16,
|
|
115
|
+
shadowOffset: {
|
|
116
|
+
width: 0,
|
|
117
|
+
height: 8
|
|
118
|
+
},
|
|
119
|
+
elevation: 6
|
|
120
|
+
},
|
|
121
|
+
startLabel: {
|
|
122
|
+
marginTop: 18,
|
|
123
|
+
fontSize: 17,
|
|
124
|
+
fontWeight: "600"
|
|
125
|
+
},
|
|
126
|
+
startHint: {
|
|
127
|
+
marginTop: 6,
|
|
128
|
+
fontSize: 13
|
|
129
|
+
},
|
|
130
|
+
recording: {
|
|
131
|
+
alignItems: "center",
|
|
132
|
+
paddingTop: 12,
|
|
133
|
+
paddingBottom: 8
|
|
134
|
+
},
|
|
135
|
+
status: {
|
|
136
|
+
flexDirection: "row",
|
|
137
|
+
alignItems: "center",
|
|
138
|
+
paddingHorizontal: 12,
|
|
139
|
+
paddingVertical: 6,
|
|
140
|
+
borderRadius: 999
|
|
141
|
+
},
|
|
142
|
+
dot: {
|
|
143
|
+
width: 8,
|
|
144
|
+
height: 8,
|
|
145
|
+
borderRadius: 4,
|
|
146
|
+
marginRight: 8
|
|
147
|
+
},
|
|
148
|
+
statusText: {
|
|
149
|
+
fontSize: 13,
|
|
150
|
+
fontWeight: "600"
|
|
151
|
+
},
|
|
152
|
+
timer: {
|
|
153
|
+
marginTop: 18,
|
|
154
|
+
fontSize: 56,
|
|
155
|
+
fontWeight: "300",
|
|
156
|
+
fontVariant: ["tabular-nums"],
|
|
157
|
+
letterSpacing: 1
|
|
158
|
+
},
|
|
159
|
+
bars: {
|
|
160
|
+
marginTop: 18,
|
|
161
|
+
height: 56,
|
|
162
|
+
flexDirection: "row",
|
|
163
|
+
alignItems: "center",
|
|
164
|
+
gap: 3
|
|
165
|
+
},
|
|
166
|
+
bar: {
|
|
167
|
+
width: 4,
|
|
168
|
+
borderRadius: 2
|
|
169
|
+
},
|
|
170
|
+
notice: {
|
|
171
|
+
marginTop: 18,
|
|
172
|
+
marginHorizontal: 8,
|
|
173
|
+
flexDirection: "row",
|
|
174
|
+
alignItems: "center",
|
|
175
|
+
gap: 8,
|
|
176
|
+
paddingHorizontal: 12,
|
|
177
|
+
paddingVertical: 10,
|
|
178
|
+
borderRadius: 12,
|
|
179
|
+
borderWidth: StyleSheet.hairlineWidth
|
|
180
|
+
},
|
|
181
|
+
noticeText: {
|
|
182
|
+
flex: 1,
|
|
183
|
+
fontSize: 13,
|
|
184
|
+
lineHeight: 18
|
|
185
|
+
},
|
|
186
|
+
controls: {
|
|
187
|
+
marginTop: 28,
|
|
188
|
+
flexDirection: "row",
|
|
189
|
+
alignItems: "center",
|
|
190
|
+
justifyContent: "center",
|
|
191
|
+
gap: 36
|
|
192
|
+
},
|
|
193
|
+
side: {
|
|
194
|
+
width: 56,
|
|
195
|
+
height: 56,
|
|
196
|
+
borderRadius: 28,
|
|
197
|
+
alignItems: "center",
|
|
198
|
+
justifyContent: "center"
|
|
199
|
+
},
|
|
200
|
+
main: {
|
|
201
|
+
width: 80,
|
|
202
|
+
height: 80,
|
|
203
|
+
borderRadius: 40,
|
|
204
|
+
alignItems: "center",
|
|
205
|
+
justifyContent: "center"
|
|
206
|
+
},
|
|
207
|
+
legend: {
|
|
208
|
+
marginTop: 8,
|
|
209
|
+
flexDirection: "row",
|
|
210
|
+
justifyContent: "center",
|
|
211
|
+
gap: 36
|
|
212
|
+
},
|
|
213
|
+
legendText: {
|
|
214
|
+
width: 68,
|
|
215
|
+
textAlign: "center",
|
|
216
|
+
fontSize: 12
|
|
217
|
+
}
|
|
218
|
+
});export{RecordingPanel,StartPanel};//# sourceMappingURL=RecordPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordPanel.js","sources":["../../../../src/features/dictate/components/RecordPanel.tsx"],"sourcesContent":["/**\n * The microphone: one large button to start, then a timer, a live level,\n * Pause/Resume, Discard and Done. A pause the app made (it left the screen,\n * or the hour ran out) says why, so no audio goes missing unnoticed.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { ActivityIndicator, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { DIM, Tap } from '../../inbox/components/Tap';\nimport { formatDuration } from '../noteText';\nimport type { DictateTheme } from '../dictateTheme';\nimport type { PauseReason, RecorderPhase } from '../useDictationRecorder';\n\nconst BARS = 32;\n\n/** The last few seconds of level, as bars: the clinician can see the phone hears them. */\nfunction LevelBars({ level, active, theme }: { level: number; active: boolean; theme: DictateTheme }) {\n const [history, setHistory] = useState<number[]>(() => Array(BARS).fill(0));\n const levelRef = useRef(level);\n levelRef.current = level;\n useEffect(() => {\n if (!active) return;\n const id = setInterval(() => setHistory((h) => [...h.slice(1), levelRef.current]), 90);\n return () => clearInterval(id);\n }, [active]);\n return (\n <View style={styles.bars} accessibilityLabel=\"Microphone level\">\n {history.map((v, i) => (\n <View\n key={i}\n style={[\n styles.bar,\n {\n height: 6 + Math.round(v * 46),\n backgroundColor: active ? theme.rec : theme.border,\n opacity: active ? 0.35 + 0.65 * (i / BARS) : 1,\n },\n ]}\n />\n ))}\n </View>\n );\n}\n\nexport function StartPanel({\n theme,\n starting,\n onStart,\n}: {\n theme: DictateTheme;\n starting: boolean;\n onStart: () => void;\n}) {\n // One target for the button and its words: \"Start dictating\" reads like the thing to tap.\n return (\n <Tap\n onPress={onStart}\n disabled={starting}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Start dictating\"\n style={styles.start}\n pressedStyle={DIM}\n >\n <View style={[styles.micButton, { backgroundColor: theme.accent, shadowColor: theme.accent }]}>\n {starting ? (\n <ActivityIndicator color={theme.accentInk} />\n ) : (\n <MaterialCommunityIcons name=\"microphone\" size={42} color={theme.accentInk} />\n )}\n </View>\n <Text style={[styles.startLabel, { color: theme.ink }]}>Start dictating</Text>\n <Text style={[styles.startHint, { color: theme.muted }]}>Keep Yantra open while you speak.</Text>\n </Tap>\n );\n}\n\nexport function RecordingPanel({\n theme,\n phase,\n pauseReason,\n elapsedMs,\n level,\n onPause,\n onResume,\n onDone,\n onDiscard,\n}: {\n theme: DictateTheme;\n phase: Exclude<RecorderPhase, 'idle'>;\n pauseReason: PauseReason;\n elapsedMs: number;\n level: number;\n onPause: () => void;\n onResume: () => void;\n onDone: () => void;\n onDiscard: () => void;\n}) {\n const live = phase === 'recording';\n const notice =\n pauseReason === 'background'\n ? 'Paused because Yantra left the screen. Resume to keep dictating.'\n : pauseReason === 'limit'\n ? 'An hour is the most one dictation holds. Tap Done to write the note.'\n : null;\n return (\n <View style={styles.recording}>\n <View style={[styles.status, { backgroundColor: live ? theme.recSoft : theme.chip }]}>\n <View style={[styles.dot, { backgroundColor: live ? theme.rec : theme.faint }]} />\n <Text style={[styles.statusText, { color: live ? theme.rec : theme.muted }]}>{live ? 'Recording' : 'Paused'}</Text>\n </View>\n <Text style={[styles.timer, { color: theme.ink }]} accessibilityLabel={`Elapsed ${formatDuration(elapsedMs)}`}>\n {formatDuration(elapsedMs)}\n </Text>\n <LevelBars level={level} active={live} theme={theme} />\n {notice ? (\n <View style={[styles.notice, { backgroundColor: theme.warnSoft, borderColor: theme.warnBorder }]}>\n <MaterialCommunityIcons name=\"pause-circle-outline\" size={18} color={theme.warnInk} />\n <Text style={[styles.noticeText, { color: theme.warnInk }]}>{notice}</Text>\n </View>\n ) : null}\n <View style={styles.controls}>\n <Tap\n onPress={onDiscard}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Discard this dictation\"\n style={[styles.side, { backgroundColor: theme.chip }]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"trash-can-outline\" size={24} color={theme.muted} />\n </Tap>\n <Tap\n onPress={live ? onPause : onResume}\n disabled={pauseReason === 'limit'}\n accessibilityRole=\"button\"\n accessibilityLabel={live ? 'Pause' : 'Resume'}\n style={[\n styles.main,\n { backgroundColor: live ? theme.rec : theme.accent, opacity: pauseReason === 'limit' ? 0.4 : 1 },\n ]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name={live ? 'pause' : 'microphone'} size={34} color=\"#ffffff\" />\n </Tap>\n <Tap\n onPress={onDone}\n disabled={elapsedMs < 1000}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Done, write the note\"\n style={[styles.side, { backgroundColor: theme.accentSoft, opacity: elapsedMs < 1000 ? 0.4 : 1 }]}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"check\" size={26} color={theme.accent} />\n </Tap>\n </View>\n <View style={styles.legend}>\n <Text style={[styles.legendText, { color: theme.faint }]}>Discard</Text>\n <Text style={[styles.legendText, { color: theme.faint }]}>{live ? 'Pause' : 'Resume'}</Text>\n <Text style={[styles.legendText, { color: theme.faint }]}>Done</Text>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n start: { alignItems: 'center', paddingVertical: 28 },\n micButton: {\n width: 104,\n height: 104,\n borderRadius: 52,\n alignItems: 'center',\n justifyContent: 'center',\n shadowOpacity: 0.28,\n shadowRadius: 16,\n shadowOffset: { width: 0, height: 8 },\n elevation: 6,\n },\n startLabel: { marginTop: 18, fontSize: 17, fontWeight: '600' },\n startHint: { marginTop: 6, fontSize: 13 },\n recording: { alignItems: 'center', paddingTop: 12, paddingBottom: 8 },\n status: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12, paddingVertical: 6, borderRadius: 999 },\n dot: { width: 8, height: 8, borderRadius: 4, marginRight: 8 },\n statusText: { fontSize: 13, fontWeight: '600' },\n timer: { marginTop: 18, fontSize: 56, fontWeight: '300', fontVariant: ['tabular-nums'], letterSpacing: 1 },\n bars: { marginTop: 18, height: 56, flexDirection: 'row', alignItems: 'center', gap: 3 },\n bar: { width: 4, borderRadius: 2 },\n notice: {\n marginTop: 18,\n marginHorizontal: 8,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n },\n noticeText: { flex: 1, fontSize: 13, lineHeight: 18 },\n controls: { marginTop: 28, flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 36 },\n side: { width: 56, height: 56, borderRadius: 28, alignItems: 'center', justifyContent: 'center' },\n main: { width: 80, height: 80, borderRadius: 40, alignItems: 'center', justifyContent: 'center' },\n legend: { marginTop: 8, flexDirection: 'row', justifyContent: 'center', gap: 36 },\n legendText: { width: 68, textAlign: 'center', fontSize: 12 },\n});\n"],"names":[],"mappings":"iTAYA,MAAM,IAAO,GAAA,EAAA;AAGb,SAAS,SAAU,CAAA;AAAA,EACjB,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAIG,EAAA;AACD,EAAM,MAAA,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAmB,MAAM,KAAA,CAAM,IAAI,CAAA,CAAE,IAAK,CAAA,CAAC,CAAC,CAAA;AAC1E,EAAM,MAAA,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAU,GAAA,KAAA;AACnB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAQ,EAAA;AACb,IAAA,MAAM,EAAK,GAAA,WAAA,CAAY,MAAM,UAAA,CAAW,OAAK,CAAC,GAAG,CAAE,CAAA,KAAA,CAAM,CAAC,CAAG,EAAA,QAAA,CAAS,OAAO,CAAC,GAAG,EAAE,CAAA;AACnF,IAAO,OAAA,MAAM,cAAc,EAAE,CAAA;AAAA,GAC/B,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,2BAAQ,IAAK,EAAA,EAAA,KAAA,EAAO,MAAO,CAAA,IAAA,EAAM,oBAAmB,kBACzC,EAAA,QAAA,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,GAAG,CAAM,qBAAA,GAAA,CAAC,QAAa,KAAO,EAAA,CAAC,OAAO,GAAK,EAAA;AAAA,IAC/D,MAAQ,EAAA,CAAA,GAAI,IAAK,CAAA,KAAA,CAAM,IAAI,EAAE,CAAA;AAAA,IAC7B,eAAiB,EAAA,MAAA,GAAS,KAAM,CAAA,GAAA,GAAM,KAAM,CAAA,MAAA;AAAA,IAC5C,OAAS,EAAA,MAAA,GAAS,IAAO,GAAA,IAAA,IAAQ,IAAI,IAAQ,CAAA,GAAA;AAAA,GAC9C,CAAA,EAAA,EAJyC,CAItC,CAAE,CACF,EAAA,CAAA;AACR;AACO,SAAS,UAAW,CAAA;AAAA,EACzB,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAIG,EAAA;AAED,EAAA,uBAAQ,IAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,OAAA,EAAS,UAAU,QAAU,EAAA,iBAAA,EAAkB,QAAS,EAAA,kBAAA,EAAmB,iBAAkB,EAAA,KAAA,EAAO,MAAO,CAAA,KAAA,EAAO,cAAc,GAC3I,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,SAAW,EAAA;AAAA,MACtC,iBAAiB,KAAM,CAAA,MAAA;AAAA,MACvB,aAAa,KAAM,CAAA;AAAA,KACpB,CACY,EAAA,QAAA,EAAA,QAAA,uBAAY,iBAAkB,EAAA,EAAA,KAAA,EAAO,MAAM,SAAW,EAAA,CAAA,mBAAM,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,YAAa,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,KAAA,CAAM,WAAW,CAC5I,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,MACvC,OAAO,KAAM,CAAA;AAAA,KACd,GAAG,QAAe,EAAA,iBAAA,EAAA,CAAA;AAAA,oBACV,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,SAAW,EAAA;AAAA,MACtC,OAAO,KAAM,CAAA;AAAA,KACd,GAAG,QAAiC,EAAA,mCAAA,EAAA;AAAA,GACjC,EAAA,CAAA;AACR;AACO,SAAS,cAAe,CAAA;AAAA,EAC7B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAUG,EAAA;AACD,EAAA,MAAM,OAAO,KAAU,KAAA,WAAA;AACvB,EAAA,MAAM,SAAS,WAAgB,KAAA,YAAA,GAAe,kEAAqE,GAAA,WAAA,KAAgB,UAAU,sEAAyE,GAAA,IAAA;AACtN,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,SACjB,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,MAAQ,EAAA;AAAA,MACnC,eAAiB,EAAA,IAAA,GAAO,KAAM,CAAA,OAAA,GAAU,KAAM,CAAA;AAAA,KAC/C,CACW,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,GAAK,EAAA;AAAA,QAClC,eAAiB,EAAA,IAAA,GAAO,KAAM,CAAA,GAAA,GAAM,KAAM,CAAA;AAAA,OAC3C,CAAG,EAAA,CAAA;AAAA,sBACO,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QACzC,KAAO,EAAA,IAAA,GAAO,KAAM,CAAA,GAAA,GAAM,KAAM,CAAA;AAAA,OACjC,CAAA,EAAI,QAAO,EAAA,IAAA,GAAA,WAAA,GAAc,QAAS,EAAA;AAAA,KAC7B,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,MAClC,OAAO,KAAM,CAAA;AAAA,KACd,CAAG,EAAA,kBAAA,EAAoB,CAAW,QAAA,EAAA,cAAA,CAAe,SAAS,CAAC,CAAA,CAAA,EAC/C,QAAe,EAAA,cAAA,CAAA,SAAS,CAC7B,EAAA,CAAA;AAAA,oBACC,GAAA,CAAA,SAAA,EAAA,EAAU,KAAc,EAAA,MAAA,EAAQ,MAAM,KAAc,EAAA,CAAA;AAAA,IACpD,yBAAU,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,MAAQ,EAAA;AAAA,MAC7C,iBAAiB,KAAM,CAAA,QAAA;AAAA,MACvB,aAAa,KAAM,CAAA;AAAA,KACpB,CACe,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,0BAAuB,IAAK,EAAA,sBAAA,EAAuB,MAAM,EAAI,EAAA,KAAA,EAAO,MAAM,OAAS,EAAA,CAAA;AAAA,sBACnF,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QAC7C,OAAO,KAAM,CAAA;AAAA,OACd,GAAI,QAAO,EAAA,MAAA,EAAA;AAAA,KAAA,EACF,CAAU,GAAA,IAAA;AAAA,oBACb,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,QAChB,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,SAAA,EAAW,iBAAkB,EAAA,QAAA,EAAS,oBAAmB,wBAAyB,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,QAC7H,iBAAiB,KAAM,CAAA;AAAA,OACxB,CAAA,EAAG,YAAc,EAAA,GAAA,EACJ,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAK,EAAA,mBAAA,EAAoB,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,KAAA,CAAM,OAAO,CACnF,EAAA,CAAA;AAAA,0BACC,GAAI,EAAA,EAAA,OAAA,EAAS,OAAO,OAAU,GAAA,QAAA,EAAU,UAAU,WAAgB,KAAA,OAAA,EAAS,iBAAkB,EAAA,QAAA,EAAS,oBAAoB,IAAO,GAAA,OAAA,GAAU,UAAU,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,QACnL,eAAiB,EAAA,IAAA,GAAO,KAAM,CAAA,GAAA,GAAM,KAAM,CAAA,MAAA;AAAA,QAC1C,OAAA,EAAS,WAAgB,KAAA,OAAA,GAAU,GAAM,GAAA;AAAA,OAC1C,CAAA,EAAG,YAAc,EAAA,GAAA,EACJ,8BAAC,sBAAuB,EAAA,EAAA,IAAA,EAAM,IAAO,GAAA,OAAA,GAAU,YAAc,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAM,WAAU,CAC3F,EAAA,CAAA;AAAA,sBACC,GAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,MAAA,EAAQ,UAAU,SAAY,GAAA,GAAA,EAAM,iBAAkB,EAAA,QAAA,EAAS,kBAAmB,EAAA,sBAAA,EAAuB,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,QACpJ,iBAAiB,KAAM,CAAA,UAAA;AAAA,QACvB,OAAA,EAAS,SAAY,GAAA,GAAA,GAAO,GAAM,GAAA;AAAA,OACnC,CAAA,EAAG,YAAc,EAAA,GAAA,EACJ,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,IAAK,EAAA,OAAA,EAAQ,IAAM,EAAA,EAAA,EAAI,KAAO,EAAA,KAAA,CAAM,QAAQ,CACxE,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,oBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,MAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,UAAY,EAAA;AAAA,QACzC,OAAO,KAAM,CAAA;AAAA,OACd,GAAG,QAAO,EAAA,SAAA,EAAA,CAAA;AAAA,sBACA,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QACzC,OAAO,KAAM,CAAA;AAAA,OACd,CAAA,EAAI,QAAO,EAAA,IAAA,GAAA,OAAA,GAAU,QAAS,EAAA,CAAA;AAAA,sBACpB,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,UAAY,EAAA;AAAA,QACzC,OAAO,KAAM,CAAA;AAAA,OACd,GAAG,QAAI,EAAA,MAAA,EAAA;AAAA,KACF,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,KAAO,EAAA;AAAA,IACL,UAAY,EAAA,QAAA;AAAA,IACZ,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,GAAA;AAAA,IACP,MAAQ,EAAA,GAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,aAAe,EAAA,IAAA;AAAA,IACf,YAAc,EAAA,EAAA;AAAA,IACd,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,CAAA;AAAA,MACP,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,SAAW,EAAA;AAAA,GACb;AAAA,EACA,UAAY,EAAA;AAAA,IACV,SAAW,EAAA,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,SAAW,EAAA;AAAA,IACT,SAAW,EAAA,CAAA;AAAA,IACX,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,SAAW,EAAA;AAAA,IACT,UAAY,EAAA,QAAA;AAAA,IACZ,UAAY,EAAA,EAAA;AAAA,IACZ,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA,CAAA;AAAA,IACd,WAAa,EAAA;AAAA,GACf;AAAA,EACA,UAAY,EAAA;AAAA,IACV,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,KAAO,EAAA;AAAA,IACL,SAAW,EAAA,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,WAAA,EAAa,CAAC,cAAc,CAAA;AAAA,IAC5B,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,SAAW,EAAA,EAAA;AAAA,IACX,MAAQ,EAAA,EAAA;AAAA,IACR,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA;AAAA,GACP;AAAA,EACA,GAAK,EAAA;AAAA,IACH,KAAO,EAAA,CAAA;AAAA,IACP,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,SAAW,EAAA,EAAA;AAAA,IACX,gBAAkB,EAAA,CAAA;AAAA,IAClB,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,YAAc,EAAA,EAAA;AAAA,IACd,aAAa,UAAW,CAAA;AAAA,GAC1B;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,QAAU,EAAA;AAAA,IACR,SAAW,EAAA,EAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,EAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,SAAW,EAAA,CAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,cAAgB,EAAA,QAAA;AAAA,IAChB,GAAK,EAAA;AAAA,GACP;AAAA,EACA,UAAY,EAAA;AAAA,IACV,KAAO,EAAA,EAAA;AAAA,IACP,SAAW,EAAA,QAAA;AAAA,IACX,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA"}
|