@adminide-stack/yantra-mobile 12.0.136 → 12.0.137-alpha.0

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.
Files changed (27) hide show
  1. package/lib/features/apps/AppsCatalog.js +3 -3
  2. package/lib/features/apps/AppsCatalog.js.map +1 -1
  3. package/lib/features/apps/appLabelText.js +9 -0
  4. package/lib/features/apps/appLabelText.js.map +1 -0
  5. package/lib/features/devices/readings.js.map +1 -1
  6. package/lib/features/devices/session.js +2 -22
  7. package/lib/features/devices/session.js.map +1 -1
  8. package/lib/features/dictate/DictateExperience.js +48 -25
  9. package/lib/features/dictate/DictateExperience.js.map +1 -1
  10. package/lib/features/dictate/backgroundRecording.js +15 -0
  11. package/lib/features/dictate/backgroundRecording.js.map +1 -0
  12. package/lib/features/dictate/components/DictationList.js.map +1 -1
  13. package/lib/features/dictate/components/NoteView.js +3 -1
  14. package/lib/features/dictate/components/NoteView.js.map +1 -1
  15. package/lib/features/dictate/components/RecordPanel.js +33 -4
  16. package/lib/features/dictate/components/RecordPanel.js.map +1 -1
  17. package/lib/features/dictate/dictateClient.js +7 -2
  18. package/lib/features/dictate/dictateClient.js.map +1 -1
  19. package/lib/features/dictate/dictationStore.js.map +1 -1
  20. package/lib/features/dictate/useDictationRecorder.js +48 -14
  21. package/lib/features/dictate/useDictationRecorder.js.map +1 -1
  22. package/lib/screens/Devices/index.js +3 -205
  23. package/lib/screens/Devices/index.js.map +1 -1
  24. package/lib/screens/DictateNative/index.js.map +1 -1
  25. package/package.json +4 -4
  26. package/lib/features/devices/bodyComposition.js +0 -116
  27. package/lib/features/devices/bodyComposition.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useMemo,useState,useRef,useCallback,useEffect}from'react';import {Alert,BackHandler,Share,View,StyleSheet,Text,ScrollView,Linking}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useSafeInsets}from'../canvas/withRemoteSafeArea.js';import {createRemoteUploadMedia,createRemoteConnectorExec}from'../canvas/videoEditor/remoteMediaClient.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {Tap,DIM}from'../inbox/components/Tap.js';import {DictationList}from'./components/DictationList.js';import {NoteView}from'./components/NoteView.js';import {RecordingPanel,StartPanel}from'./components/RecordPanel.js';import {writeNoteFromRecording,dictateErrorText}from'./dictateClient.js';import {dictateTheme}from'./dictateTheme.js';import {createDictationStore}from'./dictationStore.js';import {noteToText}from'./noteText.js';import {useDictationRecorder,MicrophoneDeniedError}from'./useDictationRecorder.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState,useRef,useCallback,useEffect}from'react';import {Alert,BackHandler,Share,View,StyleSheet,ScrollView,Text,Linking}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useSafeInsets}from'../canvas/withRemoteSafeArea.js';import {createRemoteUploadMedia,createRemoteConnectorExec}from'../canvas/videoEditor/remoteMediaClient.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';import {Tap,DIM}from'../inbox/components/Tap.js';import {DictationList}from'./components/DictationList.js';import {NoteView}from'./components/NoteView.js';import {RecordingPanel,StartPanel}from'./components/RecordPanel.js';import {writeNoteFromRecording,dictateErrorText}from'./dictateClient.js';import {dictateTheme}from'./dictateTheme.js';import {createDictationStore}from'./dictationStore.js';import {noteToText}from'./noteText.js';import {useDictationRecorder,MicrophoneDeniedError}from'./useDictationRecorder.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -59,12 +59,16 @@ function DictateExperience({
59
59
  tokenRef.current = token;
60
60
  const agent = useMemo(() => deps != null ? deps : {
61
61
  exec: (connector, action, params, options) => {
62
- const current = tokenRef.current;
62
+ const {
63
+ current
64
+ } = tokenRef;
63
65
  if (!current) return Promise.reject(new Error("Network request failed: not signed in yet"));
64
66
  return createRemoteConnectorExec(current, indexUrl)(connector, action, params, options);
65
67
  },
66
68
  upload: (uri) => {
67
- const current = tokenRef.current;
69
+ const {
70
+ current
71
+ } = tokenRef;
68
72
  if (!current) return Promise.reject(new Error("Network request failed: not signed in yet"));
69
73
  return createRemoteUploadMedia(current, indexUrl)(uri);
70
74
  }
@@ -179,7 +183,9 @@ function DictateExperience({
179
183
  style: "cancel"
180
184
  }, {
181
185
  text: "Write the note",
182
- onPress: () => void done()
186
+ onPress: () => {
187
+ void done();
188
+ }
183
189
  }, {
184
190
  text: "Discard",
185
191
  style: "destructive",
@@ -218,7 +224,8 @@ function DictateExperience({
218
224
  }, [open]);
219
225
  const remove = useCallback(() => {
220
226
  if (!open) return;
221
- Alert.alert("Delete this dictation?", "The note and transcript are removed from this phone.", [{
227
+ const removed = open.note ? "The note and transcript are removed from this phone." : "The recording is removed from this phone.";
228
+ Alert.alert("Delete this dictation?", removed, [{
222
229
  text: "Cancel",
223
230
  style: "cancel"
224
231
  }, {
@@ -236,23 +243,17 @@ function DictateExperience({
236
243
  }]);
237
244
  }, [open, store, refresh]);
238
245
  const title = screen.kind === "note" ? "Note" : "Dictate";
239
- return /* @__PURE__ */ jsxs(View, { style: [styles.screen, {
240
- backgroundColor: theme.screen,
241
- paddingTop: insets.top
242
- }], children: [
243
- /* @__PURE__ */ jsxs(View, { style: [styles.header, {
244
- borderBottomColor: theme.border
245
- }], children: [
246
- /* @__PURE__ */ jsx(Tap, { onPress: back, accessibilityRole: "button", accessibilityLabel: "Back", style: styles.headerButton, pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-left", size: 28, color: theme.ink }) }),
247
- /* @__PURE__ */ jsx(Text, { style: [styles.headerTitle, {
248
- color: theme.ink
249
- }], children: title }),
250
- /* @__PURE__ */ jsx(View, { style: styles.headerActions, children: (open == null ? void 0 : open.note) ? /* @__PURE__ */ jsxs(Fragment, { children: [
251
- /* @__PURE__ */ jsx(Tap, { onPress: share, accessibilityRole: "button", accessibilityLabel: "Share the note", style: styles.headerButton, pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "export-variant", size: 22, color: theme.ink }) }),
252
- /* @__PURE__ */ jsx(Tap, { onPress: remove, accessibilityRole: "button", accessibilityLabel: "Delete", style: styles.headerButton, pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "trash-can-outline", size: 22, color: theme.ink }) })
253
- ] }) : null })
254
- ] }),
255
- screen.kind === "note" && open ? /* @__PURE__ */ jsx(NoteView, { record: open, stage: (_b = stages[open.id]) != null ? _b : null, theme, bottomInset: insets.bottom, onRetry: () => void write(open) }) : screen.kind === "record" && recorder.phase !== "idle" ? /* @__PURE__ */ jsx(View, { style: styles.recordBody, children: /* @__PURE__ */ jsx(RecordingPanel, { theme, phase: recorder.phase, pauseReason: recorder.pauseReason, elapsedMs: recorder.elapsedMs, level: recorder.level, onPause: recorder.pause, onResume: recorder.resume, onDone: () => void done(), onDiscard: discard }) }) : /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: [styles.home, {
246
+ let body;
247
+ if (screen.kind === "note" && open) {
248
+ body = /* @__PURE__ */ jsx(NoteView, { record: open, stage: (_b = stages[open.id]) != null ? _b : null, theme, bottomInset: insets.bottom, onRetry: () => {
249
+ void write(open);
250
+ } });
251
+ } else if (screen.kind === "record" && recorder.phase !== "idle") {
252
+ body = /* @__PURE__ */ jsx(View, { style: styles.recordBody, children: /* @__PURE__ */ jsx(RecordingPanel, { theme, phase: recorder.phase, pauseReason: recorder.pauseReason, elapsedMs: recorder.elapsedMs, level: recorder.level, noInput: recorder.noInput, onPause: recorder.pause, onResume: recorder.resume, onDone: () => {
253
+ void done();
254
+ }, onDiscard: discard }) });
255
+ } else {
256
+ body = /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: [styles.home, {
256
257
  paddingBottom: 24 + insets.bottom
257
258
  }], children: [
258
259
  /* @__PURE__ */ jsx(Text, { style: [styles.lead, {
@@ -261,7 +262,9 @@ function DictateExperience({
261
262
  /* @__PURE__ */ jsx(Text, { style: [styles.leadDetail, {
262
263
  color: theme.muted
263
264
  }], children: "Speak your note. Yantra writes it up as a SOAP note and lists what to check before you use it." }),
264
- /* @__PURE__ */ jsx(StartPanel, { theme, starting, onStart: () => void start() }),
265
+ /* @__PURE__ */ jsx(StartPanel, { theme, starting, recordsInBackground: recorder.recordsInBackground, onStart: () => {
266
+ void start();
267
+ } }),
265
268
  error ? /* @__PURE__ */ jsx(Text, { style: [styles.error, {
266
269
  color: theme.crit
267
270
  }], children: error }) : null,
@@ -272,7 +275,9 @@ function DictateExperience({
272
275
  /* @__PURE__ */ jsx(Text, { style: [styles.bannerText, {
273
276
  color: theme.crit
274
277
  }], children: "Microphone access is off for Yantra." }),
275
- /* @__PURE__ */ jsx(Tap, { onPress: () => void Linking.openSettings(), accessibilityRole: "button", style: [styles.bannerAction, {
278
+ /* @__PURE__ */ jsx(Tap, { onPress: () => {
279
+ void Linking.openSettings();
280
+ }, accessibilityRole: "button", style: [styles.bannerAction, {
276
281
  backgroundColor: theme.card,
277
282
  borderColor: theme.border
278
283
  }], pressedStyle: DIM, children: /* @__PURE__ */ jsx(Text, { style: [styles.bannerActionText, {
@@ -301,7 +306,25 @@ function DictateExperience({
301
306
  kind: "note",
302
307
  id: r.id
303
308
  }) })
304
- ] })
309
+ ] });
310
+ }
311
+ return /* @__PURE__ */ jsxs(View, { style: [styles.screen, {
312
+ backgroundColor: theme.screen,
313
+ paddingTop: insets.top
314
+ }], children: [
315
+ /* @__PURE__ */ jsxs(View, { style: [styles.header, {
316
+ borderBottomColor: theme.border
317
+ }], children: [
318
+ /* @__PURE__ */ jsx(Tap, { onPress: back, accessibilityRole: "button", accessibilityLabel: "Back", style: styles.headerButton, pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-left", size: 28, color: theme.ink }) }),
319
+ /* @__PURE__ */ jsx(Text, { style: [styles.headerTitle, {
320
+ color: theme.ink
321
+ }], children: title }),
322
+ /* @__PURE__ */ jsxs(View, { style: styles.headerActions, children: [
323
+ (open == null ? void 0 : open.note) ? /* @__PURE__ */ jsx(Tap, { onPress: share, accessibilityRole: "button", accessibilityLabel: "Share the note", style: styles.headerButton, pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "export-variant", size: 22, color: theme.ink }) }) : null,
324
+ open && !stages[open.id] ? /* @__PURE__ */ jsx(Tap, { onPress: remove, accessibilityRole: "button", accessibilityLabel: "Delete", style: styles.headerButton, pressedStyle: DIM, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "trash-can-outline", size: 22, color: theme.ink }) }) : null
325
+ ] })
326
+ ] }),
327
+ body
305
328
  ] });
306
329
  }
307
330
  const styles = StyleSheet.create({
@@ -1 +1 @@
1
- {"version":3,"file":"DictateExperience.js","sources":["../../../src/features/dictate/DictateExperience.tsx"],"sourcesContent":["/**\n * Dictate: a clinician speaks a visit note; Yantra writes it up as a SOAP note\n * with the points to check before it is used.\n *\n * Record (screen kept awake, paused honestly if the app leaves the screen) ->\n * the recording is kept on the phone at once -> uploaded and handed to\n * YANTRA_MEETINGS_CLINICAL_NOTE (medical speech-to-text, then the note) ->\n * the note is saved on the phone and the recording deleted. A note that could\n * not be written keeps its recording for Retry, across restarts.\n *\n * The host screen passes the session (token + surface index URL); everything\n * else - the recorder, the store, the agent calls - lives here.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Alert, BackHandler, Linking, ScrollView, Share, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport { createRemoteConnectorExec, createRemoteUploadMedia } from '../canvas/videoEditor/remoteMediaClient';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { DIM, Tap } from '../inbox/components/Tap';\nimport { DictationList } from './components/DictationList';\nimport { NoteView } from './components/NoteView';\nimport { RecordingPanel, StartPanel } from './components/RecordPanel';\nimport { dictateErrorText, writeNoteFromRecording, type DictateDeps, type DictateStage } from './dictateClient';\nimport { dictateTheme } from './dictateTheme';\nimport { createDictationStore, type DictationStore } from './dictationStore';\nimport { noteToText } from './noteText';\nimport type { DictationRecord } from './types';\nimport { MicrophoneDeniedError, useDictationRecorder } from './useDictationRecorder';\n\nexport interface DictateExperienceProps {\n isDark?: boolean;\n token?: string | null;\n /** The surface index URL; the agent (uploads, the note) is derived from it. */\n indexUrl: string;\n sessionError?: string | null;\n onRetrySession?: () => void;\n onExit: () => void;\n /** Tests and previews inject these; the app builds them from the session. */\n deps?: DictateDeps;\n store?: DictationStore;\n}\n\ntype Screen = { kind: 'home' } | { kind: 'record' } | { kind: 'note'; id: string };\n\nexport const PREVIEW_NOTICE =\n 'Preview: dictate made-up visits only. Real patient information needs your practice’s HIPAA agreement with Yantra first.';\n\nexport function DictateExperience({ isDark: hostDark, token, indexUrl, sessionError, onRetrySession, onExit, deps, store: injectedStore }: DictateExperienceProps) {\n const appTheme = useAppTheme();\n const theme = useMemo(() => dictateTheme(hostDark ?? appTheme.isDark), [hostDark, appTheme.isDark]);\n const insets = useSafeInsets();\n const store = useMemo(() => injectedStore ?? createDictationStore(), [injectedStore]);\n const recorder = useDictationRecorder();\n const [screen, setScreen] = useState<Screen>({ kind: 'home' });\n const [records, setRecords] = useState<DictationRecord[]>([]);\n const [stages, setStages] = useState<Record<string, DictateStage>>({});\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [micDenied, setMicDenied] = useState(false);\n\n const tokenRef = useRef(token);\n tokenRef.current = token;\n const agent = useMemo<DictateDeps>(\n () =>\n deps ?? {\n exec: (connector, action, params, options) => {\n const current = tokenRef.current;\n if (!current) return Promise.reject(new Error('Network request failed: not signed in yet'));\n return createRemoteConnectorExec(current, indexUrl)(connector, action, params, options);\n },\n upload: (uri) => {\n const current = tokenRef.current;\n if (!current) return Promise.reject(new Error('Network request failed: not signed in yet'));\n return createRemoteUploadMedia(current, indexUrl)(uri);\n },\n },\n [deps, indexUrl],\n );\n\n const refresh = useCallback(async () => setRecords(await store.list()), [store]);\n\n // A note being written when the app last closed never finished: offer it again.\n useEffect(() => {\n void (async () => {\n for (const r of await store.list()) {\n if (r.status === 'writing') await store.update(r.id, { status: r.audioUri ? 'saved' : 'failed' });\n }\n await refresh();\n })();\n }, [store, refresh]);\n\n const write = useCallback(\n async (record: DictationRecord) => {\n if (!record.audioUri) return;\n setStages((s) => ({ ...s, [record.id]: 'uploading' }));\n await store.update(record.id, { status: 'writing', error: undefined });\n await refresh();\n try {\n const written = await writeNoteFromRecording(record.audioUri, agent, {}, (stage) =>\n setStages((s) => ({ ...s, [record.id]: stage })),\n );\n await store.update(record.id, { status: 'ready', note: written.note, transcript: written.transcript, model: written.model, error: undefined });\n await store.dropAudio(record.id);\n } catch (err) {\n await store.update(record.id, { status: 'failed', error: dictateErrorText(err) });\n } finally {\n setStages(({ [record.id]: _done, ...rest }) => rest);\n await refresh();\n }\n },\n [agent, store, refresh],\n );\n\n const start = useCallback(async () => {\n setError(null);\n setStarting(true);\n try {\n await recorder.start();\n setMicDenied(false);\n setScreen({ kind: 'record' });\n } catch (err) {\n // A declined microphone is not an error to retry: it is a setting, so offer the way there.\n if (err instanceof MicrophoneDeniedError) setMicDenied(true);\n else setError('The microphone could not start. Try again.');\n } finally {\n setStarting(false);\n }\n }, [recorder]);\n\n const done = useCallback(async () => {\n const out = await recorder.finish();\n if (!out) {\n setScreen({ kind: 'home' });\n setError('The recording could not be saved. Try again.');\n return;\n }\n const record = await store.keepRecording(out.uri, out.durationMs);\n await refresh();\n setScreen({ kind: 'note', id: record.id });\n void write(record);\n }, [recorder, store, refresh, write]);\n\n const discard = useCallback(() => {\n Alert.alert('Discard this dictation?', 'The recording is deleted and no note is written.', [\n { text: 'Keep dictating', style: 'cancel' },\n {\n text: 'Discard',\n style: 'destructive',\n onPress: () => {\n void (async () => {\n const out = await recorder.finish();\n if (out) await store.discardRecording(out.uri);\n setScreen({ kind: 'home' });\n })();\n },\n },\n ]);\n }, [recorder, store]);\n\n const back = useCallback(() => {\n if (screen.kind === 'record') {\n if (recorder.phase === 'recording') recorder.pause();\n Alert.alert('Stop dictating?', 'Write the note from what you have recorded, or discard it.', [\n { text: 'Keep dictating', style: 'cancel' },\n { text: 'Write the note', onPress: () => void done() },\n {\n text: 'Discard',\n style: 'destructive',\n onPress: () => {\n void (async () => {\n const out = await recorder.finish();\n if (out) await store.discardRecording(out.uri);\n setScreen({ kind: 'home' });\n })();\n },\n },\n ]);\n return true;\n }\n if (screen.kind === 'note') {\n setScreen({ kind: 'home' });\n return true;\n }\n onExit();\n return true;\n }, [screen.kind, recorder, done, store, onExit]);\n\n useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', back);\n return () => sub.remove();\n }, [back]);\n\n const open = screen.kind === 'note' ? records.find((r) => r.id === screen.id) ?? null : null;\n\n const share = useCallback(() => {\n if (!open?.note) return;\n void Share.share({ title: open.note.title, message: noteToText(open.note) });\n }, [open]);\n\n const remove = useCallback(() => {\n if (!open) return;\n Alert.alert('Delete this dictation?', 'The note and transcript are removed from this phone.', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: () => {\n void (async () => {\n await store.remove(open.id);\n await refresh();\n setScreen({ kind: 'home' });\n })();\n },\n },\n ]);\n }, [open, store, refresh]);\n\n const title = screen.kind === 'note' ? 'Note' : 'Dictate';\n\n return (\n <View style={[styles.screen, { backgroundColor: theme.screen, paddingTop: insets.top }]}>\n <View style={[styles.header, { borderBottomColor: theme.border }]}>\n <Tap onPress={back} accessibilityRole=\"button\" accessibilityLabel=\"Back\" style={styles.headerButton} pressedStyle={DIM}>\n <MaterialCommunityIcons name=\"chevron-left\" size={28} color={theme.ink} />\n </Tap>\n <Text style={[styles.headerTitle, { color: theme.ink }]}>{title}</Text>\n <View style={styles.headerActions}>\n {open?.note ? (\n <>\n <Tap onPress={share} accessibilityRole=\"button\" accessibilityLabel=\"Share the note\" style={styles.headerButton} pressedStyle={DIM}>\n <MaterialCommunityIcons name=\"export-variant\" size={22} color={theme.ink} />\n </Tap>\n <Tap onPress={remove} accessibilityRole=\"button\" accessibilityLabel=\"Delete\" style={styles.headerButton} pressedStyle={DIM}>\n <MaterialCommunityIcons name=\"trash-can-outline\" size={22} color={theme.ink} />\n </Tap>\n </>\n ) : null}\n </View>\n </View>\n\n {screen.kind === 'note' && open ? (\n <NoteView record={open} stage={stages[open.id] ?? null} theme={theme} bottomInset={insets.bottom} onRetry={() => void write(open)} />\n ) : screen.kind === 'record' && recorder.phase !== 'idle' ? (\n <View style={styles.recordBody}>\n <RecordingPanel\n theme={theme}\n phase={recorder.phase}\n pauseReason={recorder.pauseReason}\n elapsedMs={recorder.elapsedMs}\n level={recorder.level}\n onPause={recorder.pause}\n onResume={recorder.resume}\n onDone={() => void done()}\n onDiscard={discard}\n />\n </View>\n ) : (\n <ScrollView contentContainerStyle={[styles.home, { paddingBottom: 24 + insets.bottom }]}>\n <Text style={[styles.lead, { color: theme.ink }]}>Dictate a visit</Text>\n <Text style={[styles.leadDetail, { color: theme.muted }]}>\n Speak your note. Yantra writes it up as a SOAP note and lists what to check before you use it.\n </Text>\n <StartPanel theme={theme} starting={starting} onStart={() => void start()} />\n {error ? <Text style={[styles.error, { color: theme.crit }]}>{error}</Text> : null}\n {micDenied ? (\n <View style={[styles.banner, { backgroundColor: theme.recSoft }]}>\n <MaterialCommunityIcons name=\"microphone-off\" size={18} color={theme.crit} />\n <Text style={[styles.bannerText, { color: theme.crit }]}>Microphone access is off for Yantra.</Text>\n <Tap\n onPress={() => void Linking.openSettings()}\n accessibilityRole=\"button\"\n style={[styles.bannerAction, { backgroundColor: theme.card, borderColor: theme.border }]}\n pressedStyle={DIM}\n >\n <Text style={[styles.bannerActionText, { color: theme.ink }]}>Open Settings</Text>\n </Tap>\n </View>\n ) : null}\n {sessionError ? (\n <Tap onPress={onRetrySession} accessibilityRole=\"button\" style={[styles.banner, { backgroundColor: theme.recSoft }]} pressedStyle={DIM}>\n <Text style={[styles.bannerText, { color: theme.crit }]}>Not connected, so notes cannot be written yet. Tap to retry.</Text>\n </Tap>\n ) : null}\n <View style={[styles.banner, { backgroundColor: theme.warnSoft, borderColor: theme.warnBorder, borderWidth: StyleSheet.hairlineWidth }]}>\n <MaterialCommunityIcons name=\"shield-alert-outline\" size={18} color={theme.warnInk} />\n <Text style={[styles.bannerText, { color: theme.warnInk }]}>{PREVIEW_NOTICE}</Text>\n </View>\n <Text style={[styles.sectionLabel, { color: theme.muted }]}>RECENT</Text>\n <DictationList records={records} theme={theme} onOpen={(r) => setScreen({ kind: 'note', id: r.id })} />\n </ScrollView>\n )}\n </View>\n );\n}\n\nexport default DictateExperience;\n\nconst styles = StyleSheet.create({\n screen: { flex: 1 },\n header: { height: 52, flexDirection: 'row', alignItems: 'center', paddingHorizontal: 4, borderBottomWidth: StyleSheet.hairlineWidth },\n headerButton: { width: 44, height: 44, alignItems: 'center', justifyContent: 'center' },\n headerTitle: { flex: 1, fontSize: 17, fontWeight: '600' },\n headerActions: { flexDirection: 'row', alignItems: 'center' },\n home: { paddingHorizontal: 16, paddingTop: 20 },\n lead: { fontSize: 24, fontWeight: '700' },\n leadDetail: { marginTop: 6, fontSize: 15, lineHeight: 21 },\n error: { textAlign: 'center', fontSize: 13, marginBottom: 8 },\n banner: { flexDirection: 'row', alignItems: 'center', gap: 10, borderRadius: 12, paddingHorizontal: 12, paddingVertical: 10, marginBottom: 12 },\n bannerText: { flex: 1, fontSize: 13, lineHeight: 18 },\n bannerAction: { paddingHorizontal: 12, paddingVertical: 7, borderRadius: 999, borderWidth: StyleSheet.hairlineWidth },\n bannerActionText: { fontSize: 13, fontWeight: '600' },\n sectionLabel: { marginTop: 12, marginBottom: 8, fontSize: 12, fontWeight: '700', letterSpacing: 0.8 },\n recordBody: { flex: 1, justifyContent: 'center', paddingHorizontal: 16 },\n});\n"],"names":["_b","_a"],"mappings":"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"}
1
+ {"version":3,"file":"DictateExperience.js","sources":["../../../src/features/dictate/DictateExperience.tsx"],"sourcesContent":["/**\n * Dictate: a clinician speaks a visit note; Yantra writes it up as a SOAP note\n * with the points to check before it is used.\n *\n * Record (screen kept awake, paused honestly if the app leaves the screen) ->\n * the recording is kept on the phone at once -> uploaded and handed to\n * YANTRA_MEETINGS_CLINICAL_NOTE (medical speech-to-text, then the note) ->\n * the note is saved on the phone and the recording deleted. A note that could\n * not be written keeps its recording for Retry, across restarts.\n *\n * The host screen passes the session (token + surface index URL); everything\n * else - the recorder, the store, the agent calls - lives here.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Alert, BackHandler, Linking, ScrollView, Share, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport { createRemoteConnectorExec, createRemoteUploadMedia } from '../canvas/videoEditor/remoteMediaClient';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { DIM, Tap } from '../inbox/components/Tap';\nimport { DictationList } from './components/DictationList';\nimport { NoteView } from './components/NoteView';\nimport { RecordingPanel, StartPanel } from './components/RecordPanel';\nimport { dictateErrorText, writeNoteFromRecording, type DictateDeps, type DictateStage } from './dictateClient';\nimport { dictateTheme } from './dictateTheme';\nimport { createDictationStore, type DictationStore } from './dictationStore';\nimport { noteToText } from './noteText';\nimport type { DictationRecord } from './types';\nimport { MicrophoneDeniedError, useDictationRecorder } from './useDictationRecorder';\n\nexport interface DictateExperienceProps {\n isDark?: boolean;\n token?: string | null;\n /** The surface index URL; the agent (uploads, the note) is derived from it. */\n indexUrl: string;\n sessionError?: string | null;\n onRetrySession?: () => void;\n onExit: () => void;\n /** Tests and previews inject these; the app builds them from the session. */\n deps?: DictateDeps;\n store?: DictationStore;\n}\n\ntype Screen = { kind: 'home' } | { kind: 'record' } | { kind: 'note'; id: string };\n\nexport const PREVIEW_NOTICE =\n 'Preview: dictate made-up visits only. Real patient information needs your practice’s HIPAA agreement with Yantra first.';\n\nexport function DictateExperience({\n isDark: hostDark,\n token,\n indexUrl,\n sessionError,\n onRetrySession,\n onExit,\n deps,\n store: injectedStore,\n}: DictateExperienceProps) {\n const appTheme = useAppTheme();\n const theme = useMemo(() => dictateTheme(hostDark ?? appTheme.isDark), [hostDark, appTheme.isDark]);\n const insets = useSafeInsets();\n const store = useMemo(() => injectedStore ?? createDictationStore(), [injectedStore]);\n const recorder = useDictationRecorder();\n const [screen, setScreen] = useState<Screen>({ kind: 'home' });\n const [records, setRecords] = useState<DictationRecord[]>([]);\n const [stages, setStages] = useState<Record<string, DictateStage>>({});\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [micDenied, setMicDenied] = useState(false);\n\n const tokenRef = useRef(token);\n tokenRef.current = token;\n const agent = useMemo<DictateDeps>(\n () =>\n deps ?? {\n exec: (connector, action, params, options) => {\n const { current } = tokenRef;\n if (!current) return Promise.reject(new Error('Network request failed: not signed in yet'));\n return createRemoteConnectorExec(current, indexUrl)(connector, action, params, options);\n },\n upload: (uri) => {\n const { current } = tokenRef;\n if (!current) return Promise.reject(new Error('Network request failed: not signed in yet'));\n return createRemoteUploadMedia(current, indexUrl)(uri);\n },\n },\n [deps, indexUrl],\n );\n\n const refresh = useCallback(async () => setRecords(await store.list()), [store]);\n\n // A note being written when the app last closed never finished: offer it again.\n useEffect(() => {\n void (async () => {\n for (const r of await store.list()) {\n if (r.status === 'writing') await store.update(r.id, { status: r.audioUri ? 'saved' : 'failed' });\n }\n await refresh();\n })();\n }, [store, refresh]);\n\n const write = useCallback(\n async (record: DictationRecord) => {\n if (!record.audioUri) return;\n setStages((s) => ({ ...s, [record.id]: 'uploading' }));\n await store.update(record.id, { status: 'writing', error: undefined });\n await refresh();\n try {\n const written = await writeNoteFromRecording(record.audioUri, agent, {}, (stage) =>\n setStages((s) => ({ ...s, [record.id]: stage })),\n );\n await store.update(record.id, {\n status: 'ready',\n note: written.note,\n transcript: written.transcript,\n model: written.model,\n error: undefined,\n });\n await store.dropAudio(record.id);\n } catch (err) {\n await store.update(record.id, { status: 'failed', error: dictateErrorText(err) });\n } finally {\n setStages(({ [record.id]: _done, ...rest }) => rest);\n await refresh();\n }\n },\n [agent, store, refresh],\n );\n\n const start = useCallback(async () => {\n setError(null);\n setStarting(true);\n try {\n await recorder.start();\n setMicDenied(false);\n setScreen({ kind: 'record' });\n } catch (err) {\n // A declined microphone is not an error to retry: it is a setting, so offer the way there.\n if (err instanceof MicrophoneDeniedError) setMicDenied(true);\n else setError('The microphone could not start. Try again.');\n } finally {\n setStarting(false);\n }\n }, [recorder]);\n\n const done = useCallback(async () => {\n const out = await recorder.finish();\n if (!out) {\n setScreen({ kind: 'home' });\n setError('The recording could not be saved. Try again.');\n return;\n }\n const record = await store.keepRecording(out.uri, out.durationMs);\n await refresh();\n setScreen({ kind: 'note', id: record.id });\n void write(record);\n }, [recorder, store, refresh, write]);\n\n const discard = useCallback(() => {\n Alert.alert('Discard this dictation?', 'The recording is deleted and no note is written.', [\n { text: 'Keep dictating', style: 'cancel' },\n {\n text: 'Discard',\n style: 'destructive',\n onPress: () => {\n void (async () => {\n const out = await recorder.finish();\n if (out) await store.discardRecording(out.uri);\n setScreen({ kind: 'home' });\n })();\n },\n },\n ]);\n }, [recorder, store]);\n\n const back = useCallback(() => {\n if (screen.kind === 'record') {\n if (recorder.phase === 'recording') recorder.pause();\n Alert.alert('Stop dictating?', 'Write the note from what you have recorded, or discard it.', [\n { text: 'Keep dictating', style: 'cancel' },\n {\n text: 'Write the note',\n onPress: () => {\n void done();\n },\n },\n {\n text: 'Discard',\n style: 'destructive',\n onPress: () => {\n void (async () => {\n const out = await recorder.finish();\n if (out) await store.discardRecording(out.uri);\n setScreen({ kind: 'home' });\n })();\n },\n },\n ]);\n return true;\n }\n if (screen.kind === 'note') {\n setScreen({ kind: 'home' });\n return true;\n }\n onExit();\n return true;\n }, [screen.kind, recorder, done, store, onExit]);\n\n useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', back);\n return () => sub.remove();\n }, [back]);\n\n const open = screen.kind === 'note' ? (records.find((r) => r.id === screen.id) ?? null) : null;\n\n const share = useCallback(() => {\n if (!open?.note) return;\n void Share.share({ title: open.note.title, message: noteToText(open.note) });\n }, [open]);\n\n const remove = useCallback(() => {\n if (!open) return;\n const removed = open.note\n ? 'The note and transcript are removed from this phone.'\n : 'The recording is removed from this phone.';\n Alert.alert('Delete this dictation?', removed, [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: () => {\n void (async () => {\n await store.remove(open.id);\n await refresh();\n setScreen({ kind: 'home' });\n })();\n },\n },\n ]);\n }, [open, store, refresh]);\n\n const title = screen.kind === 'note' ? 'Note' : 'Dictate';\n\n // The note, the live recording, or the home list - whichever screen is open.\n let body: React.ReactNode;\n if (screen.kind === 'note' && open) {\n body = (\n <NoteView\n record={open}\n stage={stages[open.id] ?? null}\n theme={theme}\n bottomInset={insets.bottom}\n onRetry={() => {\n void write(open);\n }}\n />\n );\n } else if (screen.kind === 'record' && recorder.phase !== 'idle') {\n body = (\n <View style={styles.recordBody}>\n <RecordingPanel\n theme={theme}\n phase={recorder.phase}\n pauseReason={recorder.pauseReason}\n elapsedMs={recorder.elapsedMs}\n level={recorder.level}\n noInput={recorder.noInput}\n onPause={recorder.pause}\n onResume={recorder.resume}\n onDone={() => {\n void done();\n }}\n onDiscard={discard}\n />\n </View>\n );\n } else {\n body = (\n <ScrollView contentContainerStyle={[styles.home, { paddingBottom: 24 + insets.bottom }]}>\n <Text style={[styles.lead, { color: theme.ink }]}>Dictate a visit</Text>\n <Text style={[styles.leadDetail, { color: theme.muted }]}>\n Speak your note. Yantra writes it up as a SOAP note and lists what to check before you use it.\n </Text>\n <StartPanel\n theme={theme}\n starting={starting}\n recordsInBackground={recorder.recordsInBackground}\n onStart={() => {\n void start();\n }}\n />\n {error ? <Text style={[styles.error, { color: theme.crit }]}>{error}</Text> : null}\n {micDenied ? (\n <View style={[styles.banner, { backgroundColor: theme.recSoft }]}>\n <MaterialCommunityIcons name=\"microphone-off\" size={18} color={theme.crit} />\n <Text style={[styles.bannerText, { color: theme.crit }]}>\n Microphone access is off for Yantra.\n </Text>\n <Tap\n onPress={() => {\n void Linking.openSettings();\n }}\n accessibilityRole=\"button\"\n style={[styles.bannerAction, { backgroundColor: theme.card, borderColor: theme.border }]}\n pressedStyle={DIM}\n >\n <Text style={[styles.bannerActionText, { color: theme.ink }]}>Open Settings</Text>\n </Tap>\n </View>\n ) : null}\n {sessionError ? (\n <Tap\n onPress={onRetrySession}\n accessibilityRole=\"button\"\n style={[styles.banner, { backgroundColor: theme.recSoft }]}\n pressedStyle={DIM}\n >\n <Text style={[styles.bannerText, { color: theme.crit }]}>\n Not connected, so notes cannot be written yet. Tap to retry.\n </Text>\n </Tap>\n ) : null}\n <View\n style={[\n styles.banner,\n {\n backgroundColor: theme.warnSoft,\n borderColor: theme.warnBorder,\n borderWidth: StyleSheet.hairlineWidth,\n },\n ]}\n >\n <MaterialCommunityIcons name=\"shield-alert-outline\" size={18} color={theme.warnInk} />\n <Text style={[styles.bannerText, { color: theme.warnInk }]}>{PREVIEW_NOTICE}</Text>\n </View>\n <Text style={[styles.sectionLabel, { color: theme.muted }]}>RECENT</Text>\n <DictationList records={records} theme={theme} onOpen={(r) => setScreen({ kind: 'note', id: r.id })} />\n </ScrollView>\n );\n }\n\n return (\n <View style={[styles.screen, { backgroundColor: theme.screen, paddingTop: insets.top }]}>\n <View style={[styles.header, { borderBottomColor: theme.border }]}>\n <Tap\n onPress={back}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Back\"\n style={styles.headerButton}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={28} color={theme.ink} />\n </Tap>\n <Text style={[styles.headerTitle, { color: theme.ink }]}>{title}</Text>\n <View style={styles.headerActions}>\n {open?.note ? (\n <Tap\n onPress={share}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Share the note\"\n style={styles.headerButton}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"export-variant\" size={22} color={theme.ink} />\n </Tap>\n ) : null}\n {/* Any dictation can go, note or not; just not while its note is being written. */}\n {open && !stages[open.id] ? (\n <Tap\n onPress={remove}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Delete\"\n style={styles.headerButton}\n pressedStyle={DIM}\n >\n <MaterialCommunityIcons name=\"trash-can-outline\" size={22} color={theme.ink} />\n </Tap>\n ) : null}\n </View>\n </View>\n\n {body}\n </View>\n );\n}\n\nexport default DictateExperience;\n\nconst styles = StyleSheet.create({\n screen: { flex: 1 },\n header: {\n height: 52,\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 4,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headerButton: { width: 44, height: 44, alignItems: 'center', justifyContent: 'center' },\n headerTitle: { flex: 1, fontSize: 17, fontWeight: '600' },\n headerActions: { flexDirection: 'row', alignItems: 'center' },\n home: { paddingHorizontal: 16, paddingTop: 20 },\n lead: { fontSize: 24, fontWeight: '700' },\n leadDetail: { marginTop: 6, fontSize: 15, lineHeight: 21 },\n error: { textAlign: 'center', fontSize: 13, marginBottom: 8 },\n banner: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n borderRadius: 12,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginBottom: 12,\n },\n bannerText: { flex: 1, fontSize: 13, lineHeight: 18 },\n bannerAction: {\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n },\n bannerActionText: { fontSize: 13, fontWeight: '600' },\n sectionLabel: { marginTop: 12, marginBottom: 8, fontSize: 12, fontWeight: '700', letterSpacing: 0.8 },\n recordBody: { flex: 1, justifyContent: 'center', paddingHorizontal: 16 },\n});\n"],"names":["_b","_a"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import {requireOptionalNativeModule}from'expo-modules-core';let cached;
2
+ function backgroundRecordingNative() {
3
+ if (cached === void 0) {
4
+ try {
5
+ cached = requireOptionalNativeModule("YantraBackgroundRecording");
6
+ } catch (e) {
7
+ cached = null;
8
+ }
9
+ }
10
+ return cached;
11
+ }
12
+ const BACKGROUND_NOTICE = {
13
+ title: "Dictating",
14
+ text: "Yantra is recording your dictation. Tap to return."
15
+ };export{BACKGROUND_NOTICE,backgroundRecordingNative};//# sourceMappingURL=backgroundRecording.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundRecording.js","sources":["../../../src/features/dictate/backgroundRecording.ts"],"sourcesContent":["/**\n * The app's background-recording module (portable-devices/mobile/modules/\n * yantra-background-recording), which keeps a dictation going when Yantra\n * leaves the screen, the way a call does:\n * - iOS: the binary declares the `audio` background mode; iOS shows its own\n * recording indicator. The module also reports interruptions (a phone call,\n * another app recording), which expo-audio does not.\n * - Android: a microphone foreground service with an ongoing notification,\n * without which Android gives a backgrounded app only silence.\n *\n * Optional on purpose: an over-the-air JS update can reach a binary built\n * before the module existed. That reads as \"not supported\", and Dictate\n * pauses when it leaves the screen, as before.\n */\nimport { requireOptionalNativeModule } from 'expo-modules-core';\n\nexport type InterruptionEvent = { state: 'began' } | { state: 'ended'; shouldResume: boolean };\n\nexport interface BackgroundRecordingNative {\n /** The binary may keep recording in the background. */\n readonly supported: boolean;\n /** Android starts the microphone service (title and text show in its notification); iOS has nothing to start. */\n start(title: string, text: string): Promise<void>;\n stop(): Promise<void>;\n addListener(event: 'onInterruption', listener: (event: InterruptionEvent) => void): { remove(): void };\n}\n\nlet cached: BackgroundRecordingNative | null | undefined;\n\nexport function backgroundRecordingNative(): BackgroundRecordingNative | null {\n if (cached === undefined) {\n try {\n cached = requireOptionalNativeModule<BackgroundRecordingNative>('YantraBackgroundRecording');\n } catch {\n cached = null;\n }\n }\n return cached;\n}\n\n/** What the Android notification says while a dictation records in the background. */\nexport const BACKGROUND_NOTICE = { title: 'Dictating', text: 'Yantra is recording your dictation. Tap to return.' };\n"],"names":[],"mappings":"4DA+BA,IAAI,MAAA;AACG,SAAS,yBAA8D,GAAA;AAC5E,EAAA,IAAI,WAAW,MAAW,EAAA;AACxB,IAAI,IAAA;AACF,MAAA,MAAA,GAAS,4BAAuD,2BAA2B,CAAA;AAAA,KACrF,CAAA,OAAA,CAAA,EAAA;AACN,MAAS,MAAA,GAAA,IAAA;AAAA;AACX;AAEF,EAAO,OAAA,MAAA;AACT;AAGO,MAAM,iBAAoB,GAAA;AAAA,EAC/B,KAAO,EAAA,WAAA;AAAA,EACP,IAAM,EAAA;AACR"}
@@ -1 +1 @@
1
- {"version":3,"file":"DictationList.js","sources":["../../../../src/features/dictate/components/DictationList.tsx"],"sourcesContent":["/** Earlier dictations on this phone, newest first: title (or length), when, and where the note stands. */\nimport React from 'react';\nimport { 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 { DictationRecord } from '../types';\nimport { dictationDate } from './NoteView';\n\nfunction statusOf(record: DictationRecord, theme: DictateTheme): { label: string; ink: string; bg: string } | null {\n if (record.status === 'ready') {\n return record.note?.to_verify.length\n ? { label: `${record.note.to_verify.length} to check`, ink: theme.warnInk, bg: theme.warnSoft }\n : null;\n }\n if (record.status === 'failed' || record.status === 'saved') return { label: 'No note yet', ink: theme.crit, bg: theme.recSoft };\n return { label: 'Writing…', ink: theme.accent, bg: theme.accentSoft };\n}\n\nexport function DictationList({\n records,\n theme,\n onOpen,\n}: {\n records: DictationRecord[];\n theme: DictateTheme;\n onOpen: (record: DictationRecord) => void;\n}) {\n if (!records.length) {\n return <Text style={[styles.empty, { color: theme.faint }]}>Your dictations stay on this phone and show up here.</Text>;\n }\n return (\n <View style={[styles.list, { backgroundColor: theme.card, borderColor: theme.border }]}>\n {records.map((record, i) => {\n const status = statusOf(record, theme);\n return (\n <Tap\n key={record.id}\n onPress={() => onOpen(record)}\n accessibilityRole=\"button\"\n style={[styles.row, i > 0 && { borderTopColor: theme.border, borderTopWidth: StyleSheet.hairlineWidth }]}\n pressedStyle={{ backgroundColor: theme.chip }}\n >\n <View style={[styles.icon, { backgroundColor: theme.accentSoft }]}>\n <MaterialCommunityIcons name=\"file-document-outline\" size={18} color={theme.accent} />\n </View>\n <View style={styles.text}>\n <Text numberOfLines={1} style={[styles.title, { color: theme.ink }]}>\n {record.note?.title ?? 'Dictation'}\n </Text>\n <Text style={[styles.sub, { color: theme.faint }]}>\n {[dictationDate(record.createdAt), formatDuration(record.durationMs)].filter(Boolean).join(' · ')}\n </Text>\n </View>\n {status ? (\n <View style={[styles.pill, { backgroundColor: status.bg }]}>\n <Text style={[styles.pillText, { color: status.ink }]}>{status.label}</Text>\n </View>\n ) : null}\n <MaterialCommunityIcons name=\"chevron-right\" size={20} color={theme.faint} style={DIM} />\n </Tap>\n );\n })}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n empty: { fontSize: 13, textAlign: 'center', paddingVertical: 12, paddingHorizontal: 24, lineHeight: 19 },\n list: { borderRadius: 14, borderWidth: StyleSheet.hairlineWidth, overflow: 'hidden' },\n row: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12, paddingVertical: 12, gap: 10 },\n icon: { width: 34, height: 34, borderRadius: 10, alignItems: 'center', justifyContent: 'center' },\n text: { flex: 1 },\n title: { fontSize: 15, fontWeight: '600' },\n sub: { marginTop: 2, fontSize: 12 },\n pill: { paddingHorizontal: 8, paddingVertical: 3, borderRadius: 999 },\n pillText: { fontSize: 11, fontWeight: '600' },\n});\n"],"names":[],"mappings":"2RASA,SAAS,QAAA,CAAS,QAAyB,KAIlC,EAAA;AAbT,EAAA,IAAA,EAAA;AAcE,EAAI,IAAA,MAAA,CAAO,WAAW,OAAS,EAAA;AAC7B,IAAA,OAAA,CAAA,CAAO,EAAO,GAAA,MAAA,CAAA,IAAA,KAAP,IAAa,GAAA,MAAA,GAAA,EAAA,CAAA,SAAA,CAAU,MAAS,IAAA;AAAA,MACrC,KAAO,EAAA,CAAA,EAAG,MAAO,CAAA,IAAA,CAAK,UAAU,MAAM,CAAA,SAAA,CAAA;AAAA,MACtC,KAAK,KAAM,CAAA,OAAA;AAAA,MACX,IAAI,KAAM,CAAA;AAAA,KACR,GAAA,IAAA;AAAA;AAEN,EAAA,IAAI,OAAO,MAAW,KAAA,QAAA,IAAY,MAAO,CAAA,MAAA,KAAW,SAAgB,OAAA;AAAA,IAClE,KAAO,EAAA,aAAA;AAAA,IACP,KAAK,KAAM,CAAA,IAAA;AAAA,IACX,IAAI,KAAM,CAAA;AAAA,GACZ;AACA,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,eAAA;AAAA,IACP,KAAK,KAAM,CAAA,MAAA;AAAA,IACX,IAAI,KAAM,CAAA;AAAA,GACZ;AACF;AACO,SAAS,aAAc,CAAA;AAAA,EAC5B,OAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAIG,EAAA;AACD,EAAI,IAAA,CAAC,QAAQ,MAAQ,EAAA;AACnB,IAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,MACjC,OAAO,KAAM,CAAA;AAAA,KACd,GAAG,QAAoD,EAAA,sDAAA,EAAA,CAAA;AAAA;AAE1D,EAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,IAChC,iBAAiB,KAAM,CAAA,IAAA;AAAA,IACvB,aAAa,KAAM,CAAA;AAAA,GACpB,CACU,EAAA,QAAA,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,QAAQ,CAAM,KAAA;AAlDxC,IAAA,IAAA,EAAA,EAAA,EAAA;AAmDM,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,MAAA,EAAQ,KAAK,CAAA;AACrC,IAAA,uBAAQ,IAAA,CAAA,GAAA,EAAA,EAAoB,OAAS,EAAA,MAAM,OAAO,MAAM,CAAA,EAAG,iBAAkB,EAAA,QAAA,EAAS,KAAO,EAAA,CAAC,MAAO,CAAA,GAAA,EAAK,IAAI,CAAK,IAAA;AAAA,MACjH,gBAAgB,KAAM,CAAA,MAAA;AAAA,MACtB,gBAAgB,UAAW,CAAA;AAAA,KAC5B,GAAG,YAAc,EAAA;AAAA,MAChB,iBAAiB,KAAM,CAAA;AAAA,KAEP,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,QACzC,iBAAiB,KAAM,CAAA;AAAA,OACxB,CACmB,EAAA,QAAA,kBAAA,GAAA,CAAC,sBAAuB,EAAA,EAAA,IAAA,EAAK,uBAAwB,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAO,KAAM,CAAA,MAAA,EAAQ,CACxF,EAAA,CAAA;AAAA,sBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,IAChB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAK,aAAe,EAAA,CAAA,EAAG,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,UAC9D,OAAO,KAAM,CAAA;AAAA,SACd,CACsB,EAAA,QAAA,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,SAAP,IAAa,GAAA,MAAA,GAAA,EAAA,CAAA,KAAA,KAAb,YAAsB,WAC3B,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,GAAK,EAAA;AAAA,UAC1C,OAAO,KAAM,CAAA;AAAA,SACd,CACsB,EAAA,QAAA,EAAA,CAAC,aAAc,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA,cAAA,CAAe,MAAO,CAAA,UAAU,CAAC,CAAE,CAAA,MAAA,CAAO,OAAO,CAAE,CAAA,IAAA,CAAK,QAAK,CACpG,EAAA;AAAA,OACJ,EAAA,CAAA;AAAA,MACC,yBAAU,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,QACnD,iBAAiB,MAAO,CAAA;AAAA,OACzB,CACuB,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,QACnD,OAAO,MAAO,CAAA;AAAA,OACf,CAAA,EAAI,QAAO,EAAA,MAAA,CAAA,KAAA,EAAM,GACA,CAAU,GAAA,IAAA;AAAA,sBACd,GAAA,CAAC,sBAAuB,EAAA,EAAA,IAAA,EAAK,eAAgB,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,KAAA,CAAM,KAAO,EAAA,KAAA,EAAO,GAAK,EAAA;AAAA,KAAA,EAAA,EA9BxF,OAAO,EA+BV,CAAA;AAAA,GACf,CACG,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,QAAA;AAAA,IACX,eAAiB,EAAA,EAAA;AAAA,IACjB,iBAAmB,EAAA,EAAA;AAAA,IACnB,UAAY,EAAA;AAAA,GACd;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,YAAc,EAAA,EAAA;AAAA,IACd,aAAa,UAAW,CAAA,aAAA;AAAA,IACxB,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,GAAK,EAAA;AAAA,IACH,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,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,IAAM,EAAA;AAAA,GACR;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,GAAK,EAAA;AAAA,IACH,SAAW,EAAA,CAAA;AAAA,IACX,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,iBAAmB,EAAA,CAAA;AAAA,IACnB,eAAiB,EAAA,CAAA;AAAA,IACjB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAC,CAAA"}
1
+ {"version":3,"file":"DictationList.js","sources":["../../../../src/features/dictate/components/DictationList.tsx"],"sourcesContent":["/** Earlier dictations on this phone, newest first: title (or length), when, and where the note stands. */\nimport React from 'react';\nimport { 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 { DictationRecord } from '../types';\nimport { dictationDate } from './NoteView';\n\nfunction statusOf(record: DictationRecord, theme: DictateTheme): { label: string; ink: string; bg: string } | null {\n if (record.status === 'ready') {\n return record.note?.to_verify.length\n ? { label: `${record.note.to_verify.length} to check`, ink: theme.warnInk, bg: theme.warnSoft }\n : null;\n }\n if (record.status === 'failed' || record.status === 'saved')\n return { label: 'No note yet', ink: theme.crit, bg: theme.recSoft };\n return { label: 'Writing…', ink: theme.accent, bg: theme.accentSoft };\n}\n\nexport function DictationList({\n records,\n theme,\n onOpen,\n}: {\n records: DictationRecord[];\n theme: DictateTheme;\n onOpen: (record: DictationRecord) => void;\n}) {\n if (!records.length) {\n return (\n <Text style={[styles.empty, { color: theme.faint }]}>\n Your dictations stay on this phone and show up here.\n </Text>\n );\n }\n return (\n <View style={[styles.list, { backgroundColor: theme.card, borderColor: theme.border }]}>\n {records.map((record, i) => {\n const status = statusOf(record, theme);\n return (\n <Tap\n key={record.id}\n onPress={() => onOpen(record)}\n accessibilityRole=\"button\"\n style={[\n styles.row,\n i > 0 && { borderTopColor: theme.border, borderTopWidth: StyleSheet.hairlineWidth },\n ]}\n pressedStyle={{ backgroundColor: theme.chip }}\n >\n <View style={[styles.icon, { backgroundColor: theme.accentSoft }]}>\n <MaterialCommunityIcons name=\"file-document-outline\" size={18} color={theme.accent} />\n </View>\n <View style={styles.text}>\n <Text numberOfLines={1} style={[styles.title, { color: theme.ink }]}>\n {record.note?.title ?? 'Dictation'}\n </Text>\n <Text style={[styles.sub, { color: theme.faint }]}>\n {[dictationDate(record.createdAt), formatDuration(record.durationMs)]\n .filter(Boolean)\n .join(' · ')}\n </Text>\n </View>\n {status ? (\n <View style={[styles.pill, { backgroundColor: status.bg }]}>\n <Text style={[styles.pillText, { color: status.ink }]}>{status.label}</Text>\n </View>\n ) : null}\n <MaterialCommunityIcons name=\"chevron-right\" size={20} color={theme.faint} style={DIM} />\n </Tap>\n );\n })}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n empty: { fontSize: 13, textAlign: 'center', paddingVertical: 12, paddingHorizontal: 24, lineHeight: 19 },\n list: { borderRadius: 14, borderWidth: StyleSheet.hairlineWidth, overflow: 'hidden' },\n row: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 12, paddingVertical: 12, gap: 10 },\n icon: { width: 34, height: 34, borderRadius: 10, alignItems: 'center', justifyContent: 'center' },\n text: { flex: 1 },\n title: { fontSize: 15, fontWeight: '600' },\n sub: { marginTop: 2, fontSize: 12 },\n pill: { paddingHorizontal: 8, paddingVertical: 3, borderRadius: 999 },\n pillText: { fontSize: 11, fontWeight: '600' },\n});\n"],"names":[],"mappings":"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"}
@@ -139,7 +139,9 @@ function NoteView({
139
139
  }], children: "Write the note" }) }) : null
140
140
  ] });
141
141
  }
142
- const note = record.note;
142
+ const {
143
+ note
144
+ } = record;
143
145
  return /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: [styles.scroll, {
144
146
  paddingBottom: 24 + bottomInset
145
147
  }], children: [
@@ -1 +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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"}
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\n key={`${med.name}-${i}`}\n style={[\n styles.med,\n i > 0 && { borderTopColor: theme.border, borderTopWidth: StyleSheet.hairlineWidth },\n ]}\n >\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 }]}>\n {detail || 'No dose or frequency dictated'}\n </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 }]}>\n {record.error ?? 'The recording is saved on this phone.'}\n </Text>\n {record.audioUri ? (\n <Tap\n onPress={onRetry}\n accessibilityRole=\"button\"\n style={[styles.retry, { backgroundColor: theme.accent }]}\n pressedStyle={DIM}\n >\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;\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\n name={showTranscript ? 'chevron-up' : 'chevron-down'}\n size={20}\n color={theme.muted}\n />\n </Tap>\n {showTranscript ? (\n <Text style={[styles.transcript, { color: theme.ink }]}>{record.transcript}</Text>\n ) : 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: {\n marginTop: 12,\n borderRadius: 14,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 14,\n paddingVertical: 12,\n },\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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"}
@@ -21,6 +21,7 @@ function LevelBars({
21
21
  function StartPanel({
22
22
  theme,
23
23
  starting,
24
+ recordsInBackground,
24
25
  onStart
25
26
  }) {
26
27
  return /* @__PURE__ */ jsxs(Tap, { onPress: onStart, disabled: starting, accessibilityRole: "button", accessibilityLabel: "Start dictating", style: styles.start, pressedStyle: DIM, children: [
@@ -33,22 +34,50 @@ function StartPanel({
33
34
  }], children: "Start dictating" }),
34
35
  /* @__PURE__ */ jsx(Text, { style: [styles.startHint, {
35
36
  color: theme.muted
36
- }], children: "Keep Yantra open while you speak." })
37
+ }], children: recordsInBackground ? "Keeps recording if you lock the phone or switch apps." : "Keep Yantra open while you speak." })
37
38
  ] });
38
39
  }
40
+ function recordingNotice(pauseReason, noInput) {
41
+ if (pauseReason === "background") {
42
+ return {
43
+ icon: "pause-circle-outline",
44
+ text: "Paused because Yantra left the screen. Resume to keep dictating."
45
+ };
46
+ }
47
+ if (pauseReason === "interrupted") {
48
+ return {
49
+ icon: "pause-circle-outline",
50
+ text: "Paused for a call or another app using the microphone. Resume to keep dictating."
51
+ };
52
+ }
53
+ if (pauseReason === "limit") {
54
+ return {
55
+ icon: "pause-circle-outline",
56
+ text: "An hour is the most one dictation holds. Tap Done to write the note."
57
+ };
58
+ }
59
+ if (noInput) {
60
+ return {
61
+ icon: "microphone-off",
62
+ text: "No sound is reaching the microphone. Check that nothing covers it and no other app is using it."
63
+ };
64
+ }
65
+ return null;
66
+ }
39
67
  function RecordingPanel({
40
68
  theme,
41
69
  phase,
42
70
  pauseReason,
43
71
  elapsedMs,
44
72
  level,
73
+ noInput,
45
74
  onPause,
46
75
  onResume,
47
76
  onDone,
48
77
  onDiscard
49
78
  }) {
50
79
  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;
80
+ const notice = recordingNotice(pauseReason, live && noInput);
52
81
  return /* @__PURE__ */ jsxs(View, { style: styles.recording, children: [
53
82
  /* @__PURE__ */ jsxs(View, { style: [styles.status, {
54
83
  backgroundColor: live ? theme.recSoft : theme.chip
@@ -68,10 +97,10 @@ function RecordingPanel({
68
97
  backgroundColor: theme.warnSoft,
69
98
  borderColor: theme.warnBorder
70
99
  }], children: [
71
- /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "pause-circle-outline", size: 18, color: theme.warnInk }),
100
+ /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: notice.icon, size: 18, color: theme.warnInk }),
72
101
  /* @__PURE__ */ jsx(Text, { style: [styles.noticeText, {
73
102
  color: theme.warnInk
74
- }], children: notice })
103
+ }], children: notice.text })
75
104
  ] }) : null,
76
105
  /* @__PURE__ */ jsxs(View, { style: styles.controls, children: [
77
106
  /* @__PURE__ */ jsx(Tap, { onPress: onDiscard, accessibilityRole: "button", accessibilityLabel: "Discard this dictation", style: [styles.side, {