@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141
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/features/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/devices/bodyComposition.js +116 -0
- package/lib/features/devices/bodyComposition.js.map +1 -0
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +22 -2
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/discover/DiscoverArticle.js +105 -92
- package/lib/features/discover/DiscoverArticle.js.map +1 -1
- package/lib/features/discover/DiscoverFeed.js +97 -48
- package/lib/features/discover/DiscoverFeed.js.map +1 -1
- package/lib/features/discover/DiscoverFollowUp.js +135 -0
- package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
- package/lib/features/discover/DiscoverSidebar.js +555 -0
- package/lib/features/discover/DiscoverSidebar.js.map +1 -0
- package/lib/features/discover/DiscoverSkeletons.js +123 -0
- package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
- package/lib/features/discover/DiscoverStoryCards.js +193 -87
- package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
- package/lib/features/discover/followUpQuery.js +42 -0
- package/lib/features/discover/followUpQuery.js.map +1 -0
- package/lib/features/discover/markets.js +37 -0
- package/lib/features/discover/markets.js.map +1 -0
- package/lib/features/discover/useDiscoverSidebar.js +148 -0
- package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
- package/lib/features/discover/weather.js +42 -0
- package/lib/features/discover/weather.js.map +1 -0
- package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
- package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
- package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
- package/lib/features/notion/NotionBlockSheets.js +206 -0
- package/lib/features/notion/NotionBlockSheets.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +36 -0
- package/lib/features/notion/NotionBlockView.js.map +1 -0
- package/lib/features/notion/NotionCommentsSheet.js +461 -0
- package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
- package/lib/features/notion/NotionConnectionsSheet.js +244 -0
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
- package/lib/features/notion/NotionHistorySheet.js +439 -0
- package/lib/features/notion/NotionHistorySheet.js.map +1 -0
- package/lib/features/notion/NotionMediaBlocks.js +803 -0
- package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
- package/lib/features/notion/NotionMentionSheet.js +279 -0
- package/lib/features/notion/NotionMentionSheet.js.map +1 -0
- package/lib/features/notion/NotionPageMenu.js +585 -0
- package/lib/features/notion/NotionPageMenu.js.map +1 -0
- package/lib/features/notion/NotionPageTree.js +220 -0
- package/lib/features/notion/NotionPageTree.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +1253 -152
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionShareSheet.js +606 -0
- package/lib/features/notion/NotionShareSheet.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +87 -15
- package/lib/features/notion/NotionSheets.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +492 -0
- package/lib/features/notion/NotionSidebarSections.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +257 -45
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +554 -0
- package/lib/features/notion/database/DatabaseCells.js.map +1 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseLayouts.js +461 -0
- package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseSheets.js +791 -0
- package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
- package/lib/features/notion/database/NotionDatabaseView.js +817 -0
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
- package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
- package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
- package/lib/features/notion/database/chartData.js +89 -0
- package/lib/features/notion/database/chartData.js.map +1 -0
- package/lib/features/notion/database/chartView.js +112 -0
- package/lib/features/notion/database/chartView.js.map +1 -0
- package/lib/features/notion/database/connectorButton.js +33 -0
- package/lib/features/notion/database/connectorButton.js.map +1 -0
- package/lib/features/notion/database/databaseCalc.js +208 -0
- package/lib/features/notion/database/databaseCalc.js.map +1 -0
- package/lib/features/notion/database/databaseCalendar.js +157 -0
- package/lib/features/notion/database/databaseCalendar.js.map +1 -0
- package/lib/features/notion/database/databaseCsv.js +98 -0
- package/lib/features/notion/database/databaseCsv.js.map +1 -0
- package/lib/features/notion/database/databaseCsvActions.js +58 -0
- package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
- package/lib/features/notion/database/databaseFilter.js +473 -0
- package/lib/features/notion/database/databaseFilter.js.map +1 -0
- package/lib/features/notion/database/databaseFormula.js +1072 -0
- package/lib/features/notion/database/databaseFormula.js.map +1 -0
- package/lib/features/notion/database/databaseGroup.js +151 -0
- package/lib/features/notion/database/databaseGroup.js.map +1 -0
- package/lib/features/notion/database/databaseRollup.js +58 -0
- package/lib/features/notion/database/databaseRollup.js.map +1 -0
- package/lib/features/notion/database/databaseTimeline.js +156 -0
- package/lib/features/notion/database/databaseTimeline.js.map +1 -0
- package/lib/features/notion/database/databaseView.js +1188 -0
- package/lib/features/notion/database/databaseView.js.map +1 -0
- package/lib/features/notion/database/databaseViews.js +310 -0
- package/lib/features/notion/database/databaseViews.js.map +1 -0
- package/lib/features/notion/database/relationSource.js +92 -0
- package/lib/features/notion/database/relationSource.js.map +1 -0
- package/lib/features/notion/database/uniqueId.js +17 -0
- package/lib/features/notion/database/uniqueId.js.map +1 -0
- package/lib/features/notion/database/useNotionDatabase.js +617 -0
- package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
- package/lib/features/notion/notionAgentRunStatus.js +39 -0
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
- package/lib/features/notion/notionCodeLanguages.js +112 -0
- package/lib/features/notion/notionCodeLanguages.js.map +1 -0
- package/lib/features/notion/notionComments.js +86 -0
- package/lib/features/notion/notionComments.js.map +1 -0
- package/lib/features/notion/notionConnections.js +74 -0
- package/lib/features/notion/notionConnections.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +453 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionEditorModel.js +142 -7
- package/lib/features/notion/notionEditorModel.js.map +1 -1
- package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
- package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
- package/lib/features/notion/notionMedia.js +119 -0
- package/lib/features/notion/notionMedia.js.map +1 -0
- package/lib/features/notion/notionMentionDate.js +32 -0
- package/lib/features/notion/notionMentionDate.js.map +1 -0
- package/lib/features/notion/notionMentionOptions.js +162 -0
- package/lib/features/notion/notionMentionOptions.js.map +1 -0
- package/lib/features/notion/notionNotesAgent.js +445 -0
- package/lib/features/notion/notionNotesAgent.js.map +1 -0
- package/lib/features/notion/notionPageAccess.js +168 -0
- package/lib/features/notion/notionPageAccess.js.map +1 -0
- package/lib/features/notion/notionPageActions.js +138 -0
- package/lib/features/notion/notionPageActions.js.map +1 -0
- package/lib/features/notion/notionPageHistory.js +154 -0
- package/lib/features/notion/notionPageHistory.js.map +1 -0
- package/lib/features/notion/notionPageKinds.js +200 -0
- package/lib/features/notion/notionPageKinds.js.map +1 -0
- package/lib/features/notion/notionRecents.js +48 -0
- package/lib/features/notion/notionRecents.js.map +1 -0
- package/lib/features/notion/notionRichText.js +177 -0
- package/lib/features/notion/notionRichText.js.map +1 -0
- package/lib/features/notion/notionRichTitle.js +336 -0
- package/lib/features/notion/notionRichTitle.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +272 -13
- package/lib/features/notion/useNotionWorkspace.js.map +1 -1
- package/lib/features/notion/usePageActions.js +155 -0
- package/lib/features/notion/usePageActions.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +1 -1
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
- package/lib/features/study/StudyAgentChatPane.js +1 -1
- package/lib/features/study/StudyAgentChatPane.js.map +1 -1
- package/lib/features/travel/TravelAgentChatPane.js +1 -1
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +1 -1
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +302 -0
- package/lib/features/webbuilder/codeFiles.js.map +1 -0
- package/lib/features/webbuilder/codeHighlight.js +209 -0
- package/lib/features/webbuilder/codeHighlight.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +682 -52
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +3 -3
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/stepLabels.js +68 -0
- package/lib/features/webbuilder/stepLabels.js.map +1 -0
- package/lib/hooks/useHostChatSteering.js +45 -0
- package/lib/hooks/useHostChatSteering.js.map +1 -0
- package/lib/screens/Chat/index.js +2 -12
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
- package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
- package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
- package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
- package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
- package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
- package/lib/screens/NotionPage/index.js +2 -2
- package/lib/screens/NotionPage/index.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
- package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/screens/Devices/index.tsx"],"sourcesContent":["/**\n * Devices: the Bluetooth health devices the person paired, and pairing a new\n * one. One route with its own small stack (home -> pick a kind -> measure, or\n * home -> a device -> measure), so the flow never leaves the screen:\n *\n * - home: the paired devices with their last reading, and \"Add a device\";\n * - pick: which kind of device (scale, blood pressure, heart rate ...);\n * - measure: how to wake it, the devices found nearby, connecting, waiting for\n * a measurement (or live heart rate / oxygen), and what it measured;\n * - device: its readings, take another, forget it.\n *\n * Only devices that speak the Bluetooth SIG health profiles pair here. A brand\n * scale with its own app (RENPHO, Withings ...) keeps that app; it writes to\n * Apple Health / Health Connect and Yantra reads it there, which the home says.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n Animated,\n BackHandler,\n Easing,\n Linking,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n View,\n} from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport {\n CommonActions,\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} from '@react-navigation/native';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { mobileColors, mobileTokens } from '../../theme/mobileTokens';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { DEVICE_KINDS, deviceKind, type DeviceKindId } from '../../features/devices/catalog';\nimport { deviceStore, platformWriter, useDeviceSession, useDevices } from '../../features/devices/devices';\nimport { describeReading, type DeviceReading } from '../../features/devices/readings';\nimport type { PairedDevice } from '../../features/devices/deviceStore';\nimport type { FoundDevice, RadioState } from '../../features/devices/link';\nimport { useHealthSync } from '../../features/health/healthSync';\n\ntype Colors = ReturnType<typeof mobileColors>;\ntype Glyph = keyof typeof Ionicons.glyphMap;\n/** `add`: open straight on \"Which device\" (the Fitness page's Add a device). */\ntype DevicesParams = { orgName?: string; add?: boolean } | undefined;\ntype Step =\n | { name: 'home' }\n | { name: 'pick' }\n | { name: 'measure'; kind: DeviceKindId; deviceId?: string }\n | { name: 'device'; id: string };\n\nconst IS_IOS = Platform.OS === 'ios';\n/** The app's surfaces are white on a white page in light mode; an edge keeps each card readable as one. */\nconst CARD_EDGE = 'rgba(148,163,184,0.3)';\nconst STORE_NAME = IS_IOS ? 'Apple Health' : 'Health Connect';\nconst WORKOUT_TYPES: Array<{ id: string; label: string }> = [\n { id: 'run', label: 'Run' },\n { id: 'walk', label: 'Walk' },\n { id: 'cycle', label: 'Ride' },\n { id: 'strength', label: 'Strength' },\n { id: 'hiit', label: 'HIIT' },\n { id: 'other', label: 'Other' },\n];\n\nconst styles = StyleSheet.create({\n safe: { flex: 1 },\n header: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, paddingBottom: 8, minHeight: 52 },\n backCircle: {\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: 'center',\n justifyContent: 'center',\n ...mobileTokens.shadow.card,\n },\n headerTitle: { flex: 1, textAlign: 'center', fontSize: 17, fontWeight: '600', marginHorizontal: 8 },\n headerSpacer: { width: 40, height: 40 },\n pressed: { opacity: 0.72 },\n loading: { marginTop: 48 },\n scroll: { paddingHorizontal: 16, paddingBottom: 40 },\n hero: { alignItems: 'center', paddingTop: 8, paddingBottom: 16, gap: 10 },\n heroIcon: { width: 64, height: 64, borderRadius: 32, alignItems: 'center', justifyContent: 'center' },\n heroTitle: { fontSize: 20, fontWeight: '700', textAlign: 'center' },\n heroBody: { fontSize: 15, lineHeight: 21, textAlign: 'center', paddingHorizontal: 8 },\n card: { borderRadius: 16, overflow: 'hidden', borderWidth: 1, borderColor: CARD_EDGE },\n secondaryCard: { marginTop: 20 },\n sectionTitle: {\n fontSize: 13,\n fontWeight: '600',\n letterSpacing: 0.4,\n marginTop: 24,\n marginBottom: 8,\n marginLeft: 16,\n },\n row: { flexDirection: 'row', alignItems: 'center', minHeight: 52, paddingHorizontal: 16, gap: 12 },\n rowLabelWide: { flex: 1, fontSize: 16 },\n rowLine: { height: StyleSheet.hairlineWidth, marginLeft: 16 },\n deviceRow: { flexDirection: 'row', alignItems: 'center', minHeight: 64, paddingHorizontal: 16, gap: 12 },\n deviceText: { flex: 1, minWidth: 0 },\n deviceName: { fontSize: 16, fontWeight: '600' },\n deviceMeta: { fontSize: 14, marginTop: 2 },\n kindIcon: { alignItems: 'center', justifyContent: 'center' },\n question: { fontSize: 22, fontWeight: '700', textAlign: 'center', marginTop: 8, marginBottom: 20, lineHeight: 28 },\n kindList: { gap: 10 },\n kindCard: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 16,\n padding: 14,\n gap: 14,\n borderWidth: 1,\n borderColor: CARD_EDGE,\n },\n kindTitle: { fontSize: 16, fontWeight: '600' },\n center: { alignItems: 'center', paddingTop: 24, gap: 12 },\n statusTitle: { fontSize: 19, fontWeight: '700', textAlign: 'center', marginTop: 4 },\n statusBody: { fontSize: 15, lineHeight: 21, textAlign: 'center', paddingHorizontal: 8 },\n guidance: { marginTop: 16, paddingVertical: 8 },\n guidanceRow: { flexDirection: 'row', alignItems: 'flex-start', paddingHorizontal: 16, paddingVertical: 8, gap: 12 },\n stepDot: { width: 24, height: 24, borderRadius: 12, alignItems: 'center', justifyContent: 'center', marginTop: 1 },\n stepNumber: { fontSize: 13, fontWeight: '700' },\n guidanceText: { flex: 1, fontSize: 15, lineHeight: 22 },\n pulseBox: {\n alignSelf: 'center',\n width: 120,\n height: 120,\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: 16,\n },\n pulseRing: { position: 'absolute', width: 64, height: 64, borderRadius: 32 },\n pulseCore: { width: 64, height: 64, borderRadius: 32, alignItems: 'center', justifyContent: 'center' },\n signal: { flexDirection: 'row', alignItems: 'flex-end', gap: 2, height: 16 },\n signalBar: { width: 4, borderRadius: 1 },\n livePanel: { alignItems: 'center', padding: 20, marginTop: 16, gap: 12 },\n liveValue: { fontSize: 56, fontWeight: '700', fontVariant: ['tabular-nums'] },\n liveUnit: { fontSize: 18, fontWeight: '500' },\n liveMeta: { fontSize: 15, fontVariant: ['tabular-nums'] },\n chips: { flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'center', gap: 8 },\n chip: { borderWidth: 1, borderRadius: 999, paddingHorizontal: 14, paddingVertical: 8 },\n chipLabel: { fontSize: 14, fontWeight: '600' },\n readingRow: { paddingHorizontal: 16, paddingVertical: 12, gap: 2 },\n readingValue: { fontSize: 16, fontWeight: '600' },\n readingWhen: { fontSize: 14 },\n readingNote: { fontSize: 14, marginTop: 2 },\n savedLine: { flexDirection: 'row', alignItems: 'center', gap: 8, marginTop: 12, marginHorizontal: 4 },\n savedBlock: { marginTop: 12, gap: 10 },\n savedText: { flex: 1, fontSize: 14, lineHeight: 20 },\n notice: { flexDirection: 'row', borderRadius: 14, padding: 12, marginTop: 12, gap: 8 },\n noticeIcon: { marginTop: 1 },\n noticeText: { flex: 1, fontSize: 14, lineHeight: 20 },\n actions: { marginTop: 20, gap: 10, alignItems: 'stretch' },\n actionHint: { fontSize: 15, lineHeight: 21, textAlign: 'center' },\n primary: {\n backgroundColor: mobileTokens.color.primary,\n borderRadius: 14,\n minHeight: 50,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 18,\n alignSelf: 'stretch',\n },\n primaryLabel: { color: '#fff', fontSize: 16, fontWeight: '600' },\n secondary: {\n borderRadius: 14,\n minHeight: 48,\n alignItems: 'center',\n justifyContent: 'center',\n borderWidth: 1,\n paddingHorizontal: 18,\n },\n secondaryLabel: { fontSize: 16, fontWeight: '600' },\n footnote: { fontSize: 13, lineHeight: 18, marginTop: 16, marginHorizontal: 16 },\n linkRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n marginTop: 10,\n marginHorizontal: 16,\n alignSelf: 'flex-start',\n },\n link: { fontSize: 14, fontWeight: '600' },\n});\n\nfunction stepTitle(step: Step, paired: PairedDevice[]): string {\n switch (step.name) {\n case 'pick':\n return 'Add a device';\n case 'measure':\n return deviceKind(step.kind).title;\n case 'device':\n return paired.find((d) => d.id === step.id)?.name ?? 'Device';\n default:\n return 'Devices';\n }\n}\n\n/** What to say when the radio is not ready to scan. */\nfunction radioCopy(radio: RadioState): { title: string; body: string } {\n if (radio === 'off') return { title: 'Turn on Bluetooth', body: 'Yantra finds your device over Bluetooth.' };\n if (radio === 'unauthorized') {\n return {\n title: 'Allow Bluetooth for Yantra',\n body: 'Yantra needs Bluetooth to find and read your device. Turn it on for Yantra in Settings.',\n };\n }\n return { title: 'This phone has no Bluetooth Yantra can use', body: '' };\n}\n\n/** Bars for the signal strength of a device found nearby. */\nfunction signalBars(rssi: number | undefined): number {\n if (rssi === undefined) return 1;\n if (rssi > -60) return 3;\n if (rssi > -80) return 2;\n return 1;\n}\n\nfunction whenLabel(at: number, now: number): string {\n const d = new Date(at);\n const time = d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n const startOf = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const days = Math.round((startOf(new Date(now)) - startOf(d)) / 86_400_000);\n if (days === 0) return `Today, ${time}`;\n if (days === 1) return `Yesterday, ${time}`;\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n}\n\n/** \"Today, 7:31 AM\" wraps as one piece, never with \"AM\" alone on the next line. */\nfunction keepTogether(text: string): string {\n return text.replace(/\\s/g, '\\u00a0');\n}\n\nfunction clockOf(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${String(s).padStart(2, '0')}`;\n}\n\n// ------------------------------------------------------------------ Pieces\n\nfunction KindIcon({ kind, colors, large }: { kind: DeviceKindId; colors: Colors; large?: boolean }) {\n const size = large ? 48 : 36;\n return (\n <View\n style={[\n styles.kindIcon,\n { width: size, height: size, borderRadius: size / 2, backgroundColor: colors.primarySoft },\n ]}\n >\n <Ionicons name={deviceKind(kind).icon as Glyph} size={large ? 24 : 18} color={colors.primary} />\n </View>\n );\n}\n\n/** The Bluetooth mark with a ring that breathes while scanning. */\nfunction BluetoothPulse({ colors, active, connected }: { colors: Colors; active: boolean; connected?: boolean }) {\n const pulse = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n if (!active) return undefined;\n const loop = Animated.loop(\n Animated.timing(pulse, {\n toValue: 1,\n duration: 1600,\n easing: Easing.out(Easing.ease),\n useNativeDriver: true,\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [active, pulse]);\n const scale = pulse.interpolate({ inputRange: [0, 1], outputRange: [1, 1.9] });\n const opacity = pulse.interpolate({ inputRange: [0, 1], outputRange: [0.45, 0] });\n return (\n <View style={styles.pulseBox} accessibilityElementsHidden importantForAccessibility=\"no-hide-descendants\">\n {active ? (\n <Animated.View\n style={[styles.pulseRing, { backgroundColor: colors.primary, opacity, transform: [{ scale }] }]}\n />\n ) : null}\n <View style={[styles.pulseCore, { backgroundColor: connected ? colors.successText : colors.primary }]}>\n <Ionicons name={connected ? 'checkmark' : 'bluetooth'} size={28} color=\"#fff\" />\n </View>\n </View>\n );\n}\n\nfunction Notice({\n colors,\n tone,\n icon,\n text,\n}: {\n colors: Colors;\n tone: 'warning' | 'danger';\n icon: Glyph;\n text: string;\n}) {\n const bg = tone === 'danger' ? colors.dangerSoft : colors.warningSoft;\n const fg = tone === 'danger' ? colors.dangerText : colors.warningText;\n return (\n <View style={[styles.notice, { backgroundColor: bg }]} accessibilityRole=\"alert\">\n <Ionicons name={icon} size={18} color={fg} style={styles.noticeIcon} />\n <Text style={[styles.noticeText, { color: fg }]}>{text}</Text>\n </View>\n );\n}\n\nfunction PrimaryButton({ label, onPress }: { label: string; onPress: () => void }) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={({ pressed }) => [styles.primary, pressed && styles.pressed]}\n >\n <Text style={styles.primaryLabel}>{label}</Text>\n </Pressable>\n );\n}\n\nfunction SecondaryButton({ label, onPress, colors }: { label: string; onPress: () => void; colors: Colors }) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={({ pressed }) => [\n styles.secondary,\n { borderColor: colors.border, backgroundColor: colors.surface },\n pressed && styles.pressed,\n ]}\n >\n <Text style={[styles.secondaryLabel, { color: colors.text }]}>{label}</Text>\n </Pressable>\n );\n}\n\nfunction ReadingsCard({\n title,\n readings,\n colors,\n units,\n now,\n}: {\n title: string;\n readings: DeviceReading[];\n colors: Colors;\n units: 'metric' | 'imperial';\n now: number;\n}) {\n return (\n <>\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>{title}</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {readings.map((r, i) => (\n <React.Fragment key={r.id}>\n {i > 0 ? <View style={[styles.rowLine, { backgroundColor: colors.border }]} /> : null}\n <View style={styles.readingRow}>\n <Text style={[styles.readingValue, { color: colors.text }]}>\n {describeReading(r, units)}\n </Text>\n <Text style={[styles.readingWhen, { color: colors.textMuted }]}>\n {whenLabel(r.at, now)}\n </Text>\n {r.kind === 'blood-pressure' && r.problems?.length ? (\n <Text style={[styles.readingNote, { color: colors.warningText }]}>\n {r.problems.join(' ')}\n </Text>\n ) : null}\n </View>\n </React.Fragment>\n ))}\n </View>\n </>\n );\n}\n\n/** Where the readings went, and how to have them saved to the health store too. */\nfunction SavedLine({ colors, onHealth }: { colors: Colors; onHealth: () => void }) {\n const health = useHealthSync();\n const [asked, setAsked] = useState<boolean | null>(null);\n useEffect(() => {\n let live = true;\n void platformWriter().then(async (w) => {\n const a = w ? await w.asked().catch(() => true) : true;\n if (live) setAsked(a);\n });\n return () => {\n live = false;\n };\n }, [health.sync.connected]);\n const allowSaving = async () => {\n const w = await platformWriter();\n if (!w) return;\n await w.requestAccess().catch(() => undefined);\n setAsked(true);\n void deviceStore.flush();\n };\n if (!health.sync.connected) {\n return (\n <Pressable\n onPress={onHealth}\n accessibilityRole=\"link\"\n style={({ pressed }) => [styles.savedLine, pressed && styles.pressed]}\n >\n <Ionicons name=\"checkmark-circle\" size={18} color={colors.successText} />\n <Text style={[styles.savedText, { color: colors.textMuted }]}>\n Saved for your coach. <Text style={{ color: colors.primary }}>Connect {STORE_NAME}</Text> to keep it\n there too.\n </Text>\n </Pressable>\n );\n }\n if (asked === false) {\n return (\n <View style={styles.savedBlock}>\n <Text style={[styles.savedText, { color: colors.textMuted }]}>Saved for your coach.</Text>\n <SecondaryButton\n label={`Also save to ${STORE_NAME}`}\n colors={colors}\n onPress={() => {\n void allowSaving();\n }}\n />\n </View>\n );\n }\n return (\n <View style={styles.savedLine}>\n <Ionicons name=\"checkmark-circle\" size={18} color={colors.successText} />\n <Text style={[styles.savedText, { color: colors.textMuted }]}>\n Saved for your coach and to {STORE_NAME}.\n </Text>\n </View>\n );\n}\n\nfunction FoundRow({\n found,\n first,\n colors,\n onPress,\n}: {\n found: FoundDevice;\n first: boolean;\n colors: Colors;\n onPress: () => void;\n}) {\n const bars = signalBars(found.rssi);\n return (\n <>\n {!first ? <View style={[styles.rowLine, { backgroundColor: colors.border }]} /> : null}\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`Connect ${found.name}`}\n style={({ pressed }) => [styles.deviceRow, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n {found.kind ? (\n <KindIcon kind={found.kind} colors={colors} />\n ) : (\n <Ionicons name=\"bluetooth\" size={22} color={colors.primary} />\n )}\n <Text style={[styles.deviceName, styles.deviceText, { color: colors.text }]} numberOfLines={1}>\n {found.name}\n </Text>\n <View style={styles.signal} accessibilityLabel={`Signal ${bars} of 3`}>\n {[1, 2, 3].map((b) => (\n <View\n key={b}\n style={[\n styles.signalBar,\n { height: 4 + b * 4, backgroundColor: b <= bars ? colors.primary : colors.border },\n ]}\n />\n ))}\n </View>\n </Pressable>\n </>\n );\n}\n\n// ------------------------------------------------------------------- Home\n\nfunction Home({\n colors,\n isDark,\n units,\n onAdd,\n onOpen,\n onHealth,\n}: {\n colors: Colors;\n isDark: boolean;\n units: 'metric' | 'imperial';\n onAdd: () => void;\n onOpen: (id: string) => void;\n onHealth: () => void;\n}) {\n const devices = useDevices();\n const now = Date.now();\n if (!devices.loaded) return <ActivityIndicator style={styles.loading} color={colors.primary} />;\n const latestOf = (d: PairedDevice) =>\n devices.readings\n .filter((r) => r.deviceId === d.id)\n .reduce<DeviceReading | undefined>((a, b) => (!a || b.at > a.at ? b : a), undefined);\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n {devices.devices.length ? (\n <>\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>MY DEVICES</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {devices.devices.map((d, i) => {\n const latest = latestOf(d);\n return (\n <React.Fragment key={d.id}>\n {i > 0 ? (\n <View style={[styles.rowLine, { backgroundColor: colors.border }]} />\n ) : null}\n <Pressable\n onPress={() => onOpen(d.id)}\n accessibilityRole=\"button\"\n accessibilityLabel={d.name}\n style={({ pressed }) => [\n styles.deviceRow,\n pressed && { backgroundColor: colors.surfaceMuted },\n ]}\n >\n <KindIcon kind={d.kind} colors={colors} />\n <View style={styles.deviceText}>\n <Text style={[styles.deviceName, { color: colors.text }]} numberOfLines={1}>\n {d.name}\n </Text>\n <Text\n style={[styles.deviceMeta, { color: colors.textMuted }]}\n numberOfLines={2}\n >\n {latest\n ? `${describeReading(latest, units)} · ${keepTogether(whenLabel(latest.at, now))}`\n : 'No readings yet'}\n </Text>\n </View>\n <Ionicons\n name=\"chevron-forward\"\n size={16}\n color={isDark ? '#64748b' : '#c4c4c4'}\n />\n </Pressable>\n </React.Fragment>\n );\n })}\n </View>\n </>\n ) : (\n <View style={styles.hero}>\n <View style={[styles.heroIcon, { backgroundColor: colors.primarySoft }]}>\n <Ionicons name=\"bluetooth\" size={30} color={colors.primary} />\n </View>\n <Text style={[styles.heroTitle, { color: colors.text }]}>Connect a device</Text>\n <Text style={[styles.heroBody, { color: colors.textMuted }]}>\n Pair a scale, blood-pressure monitor, heart-rate strap, pulse oximeter, thermometer or glucose\n meter. Each reading goes to your coach, and to {STORE_NAME} when you connected it.\n </Text>\n </View>\n )}\n {devices.lastError && devices.pendingDates.length ? (\n <Notice\n colors={colors}\n tone=\"warning\"\n icon=\"cloud-offline-outline\"\n text={`Readings are kept on this phone and sent when Yantra can reach your coach. ${devices.lastError}`}\n />\n ) : null}\n <View style={styles.actions}>\n <PrimaryButton label=\"Add a device\" onPress={onAdd} />\n </View>\n <Text style={[styles.footnote, { color: colors.textMuted }]}>\n Devices that use the Bluetooth health standards pair here. For a brand scale with its own app, such as\n RENPHO or Withings, turn on its {STORE_NAME} sync; Yantra reads it there.\n </Text>\n <Pressable\n onPress={onHealth}\n accessibilityRole=\"link\"\n style={({ pressed }) => [styles.linkRow, pressed && styles.pressed]}\n >\n <Text style={[styles.link, { color: colors.primary }]}>{STORE_NAME} settings</Text>\n <Ionicons name=\"chevron-forward\" size={14} color={colors.primary} />\n </Pressable>\n </ScrollView>\n );\n}\n\n// --------------------------------------------------------------- Pick kind\n\nfunction PickKind({\n colors,\n isDark,\n onPick,\n}: {\n colors: Colors;\n isDark: boolean;\n onPick: (kind: DeviceKindId) => void;\n}) {\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n <Text style={[styles.question, { color: colors.text }]}>Which device do you want to connect?</Text>\n <View style={styles.kindList}>\n {DEVICE_KINDS.map((k) => (\n <Pressable\n key={k.id}\n onPress={() => onPick(k.id)}\n accessibilityRole=\"button\"\n accessibilityLabel={k.title}\n style={({ pressed }) => [\n styles.kindCard,\n { backgroundColor: colors.surface },\n pressed && { backgroundColor: colors.surfaceMuted },\n ]}\n >\n <KindIcon kind={k.id} colors={colors} large />\n <View style={styles.deviceText}>\n <Text style={[styles.kindTitle, { color: colors.text }]}>{k.title}</Text>\n <Text style={[styles.deviceMeta, { color: colors.textMuted }]}>{k.subtitle}</Text>\n </View>\n <Ionicons name=\"chevron-forward\" size={16} color={isDark ? '#64748b' : '#c4c4c4'} />\n </Pressable>\n ))}\n </View>\n </ScrollView>\n );\n}\n\n// ----------------------------------------------------------------- Measure\n\nfunction LivePanel({\n kind,\n colors,\n live,\n recording,\n connected,\n onStart,\n onStop,\n onSave,\n}: {\n kind: DeviceKindId;\n colors: Colors;\n live: { bpm?: number; spo2?: number; pulse?: number };\n recording?: { startedAt: number; workoutType: string; avgHr?: number; maxHr?: number };\n connected: boolean;\n onStart: (type: string) => void;\n onStop: () => void;\n onSave: () => void;\n}) {\n const [type, setType] = useState('run');\n const [, tick] = useState(0);\n useEffect(() => {\n if (!recording) return undefined;\n const t = setInterval(() => tick((n) => n + 1), 1000);\n return () => clearInterval(t);\n }, [recording]);\n if (kind === 'heart-rate') {\n const elapsed = recording ? Math.max(0, Math.floor((Date.now() - recording.startedAt) / 1000)) : 0;\n return (\n <View style={[styles.card, styles.livePanel, { backgroundColor: colors.surface }]}>\n <Text\n style={[styles.liveValue, { color: colors.text }]}\n accessibilityLabel={`Heart rate ${live.bpm ?? 0} beats per minute`}\n >\n {live.bpm ?? '--'}\n <Text style={[styles.liveUnit, { color: colors.textMuted }]}> bpm</Text>\n </Text>\n {recording ? (\n <>\n <Text style={[styles.liveMeta, { color: colors.textMuted }]}>\n {clockOf(elapsed)} · average {recording.avgHr ?? '--'} · max {recording.maxHr ?? '--'}\n </Text>\n <PrimaryButton label=\"Stop and save\" onPress={onStop} />\n </>\n ) : null}\n {!recording && connected ? (\n <>\n <View style={styles.chips}>\n {WORKOUT_TYPES.map((w) => (\n <Pressable\n key={w.id}\n onPress={() => setType(w.id)}\n accessibilityRole=\"radio\"\n accessibilityState={{ selected: type === w.id }}\n style={[\n styles.chip,\n { borderColor: type === w.id ? colors.primary : colors.border },\n type === w.id && { backgroundColor: colors.primarySoft },\n ]}\n >\n <Text\n style={[\n styles.chipLabel,\n { color: type === w.id ? colors.primary : colors.text },\n ]}\n >\n {w.label}\n </Text>\n </Pressable>\n ))}\n </View>\n <PrimaryButton label=\"Start session\" onPress={() => onStart(type)} />\n </>\n ) : null}\n </View>\n );\n }\n return (\n <View style={[styles.card, styles.livePanel, { backgroundColor: colors.surface }]}>\n <Text style={[styles.liveValue, { color: colors.text }]}>\n {live.spo2 ?? '--'}\n <Text style={[styles.liveUnit, { color: colors.textMuted }]}>%</Text>\n </Text>\n <Text style={[styles.liveMeta, { color: colors.textMuted }]}>\n Blood oxygen{live.pulse ? ` · pulse ${live.pulse}` : ''}\n </Text>\n {connected ? <PrimaryButton label=\"Save this reading\" onPress={onSave} /> : null}\n </View>\n );\n}\n\nfunction Measure({\n kind,\n deviceId,\n colors,\n units,\n onDone,\n onHealth,\n}: {\n kind: DeviceKindId;\n deviceId?: string;\n colors: Colors;\n units: 'metric' | 'imperial';\n onDone: () => void;\n onHealth: () => void;\n}) {\n const { snapshot, session } = useDeviceSession(kind, deviceId);\n const { state, readings, live, recording, notices } = snapshot;\n const info = deviceKind(kind);\n const now = Date.now();\n const retry = () => {\n void session?.start();\n };\n\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n {state.step === 'starting' ? <ActivityIndicator style={styles.loading} color={colors.primary} /> : null}\n\n {state.step === 'unavailable' ? (\n <Notice colors={colors} tone=\"warning\" icon=\"information-circle\" text={state.reason} />\n ) : null}\n\n {state.step === 'radio' ? (\n <View style={styles.center}>\n <BluetoothPulse colors={colors} active={false} />\n <Text style={[styles.statusTitle, { color: colors.text }]}>{radioCopy(state.radio).title}</Text>\n <Text style={[styles.statusBody, { color: colors.textMuted }]}>{radioCopy(state.radio).body}</Text>\n {state.radio === 'unauthorized' ? (\n <PrimaryButton\n label=\"Open Settings\"\n onPress={() => {\n void Linking.openSettings();\n }}\n />\n ) : null}\n {state.radio === 'off' ? <PrimaryButton label=\"Try again\" onPress={retry} /> : null}\n </View>\n ) : null}\n\n {state.step === 'scanning' ? (\n <>\n <BluetoothPulse colors={colors} active />\n <Text style={[styles.statusTitle, { color: colors.text }]}>\n {deviceId ? 'Looking for your device' : 'Looking for devices nearby'}\n </Text>\n <View style={[styles.card, styles.guidance, { backgroundColor: colors.surface }]}>\n {info.steps.map((line, i) => (\n <View key={line} style={styles.guidanceRow}>\n <View style={[styles.stepDot, { backgroundColor: colors.primarySoft }]}>\n <Text style={[styles.stepNumber, { color: colors.primary }]}>{i + 1}</Text>\n </View>\n <Text style={[styles.guidanceText, { color: colors.text }]}>{line}</Text>\n </View>\n ))}\n </View>\n {state.hint ? (\n <Notice\n colors={colors}\n tone=\"warning\"\n icon=\"information-circle\"\n text={`Nothing yet. ${state.hint} Keep it close to the phone.`}\n />\n ) : null}\n {state.found.length ? (\n <>\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>NEARBY</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {state.found.map((f, i) => (\n <FoundRow\n key={f.id}\n found={f}\n first={i === 0}\n colors={colors}\n onPress={() => {\n void session?.pick(f);\n }}\n />\n ))}\n </View>\n </>\n ) : null}\n </>\n ) : null}\n\n {state.step === 'connecting' ? (\n <View style={styles.center}>\n <ActivityIndicator color={colors.primary} size=\"large\" />\n <Text style={[styles.statusTitle, { color: colors.text }]}>Connecting to {state.device.name}</Text>\n <Text style={[styles.statusBody, { color: colors.textMuted }]}>\n If your phone asks to pair, tap Pair.\n </Text>\n </View>\n ) : null}\n\n {state.step === 'connected' && !readings.length && !live ? (\n <View style={styles.center}>\n <BluetoothPulse colors={colors} active connected />\n <Text style={[styles.statusTitle, { color: colors.text }]}>{info.waitingFor}</Text>\n <Text style={[styles.statusBody, { color: colors.textMuted }]}>\n Connected to {state.device.name}.\n </Text>\n </View>\n ) : null}\n\n {(state.step === 'connected' || state.step === 'ended') && live ? (\n <LivePanel\n kind={kind}\n colors={colors}\n live={live}\n recording={recording}\n connected={state.step === 'connected'}\n onStart={(type) => session?.startRecording(type)}\n onStop={() => {\n void session?.stopRecording();\n }}\n onSave={() => {\n void session?.saveLive();\n }}\n />\n ) : null}\n\n {notices.map((n) => (\n <Notice key={n} colors={colors} tone=\"warning\" icon=\"information-circle\" text={n} />\n ))}\n\n {readings.length ? (\n <ReadingsCard title=\"JUST MEASURED\" readings={readings} colors={colors} units={units} now={now} />\n ) : null}\n {readings.length ? <SavedLine colors={colors} onHealth={onHealth} /> : null}\n\n {state.step === 'ended' ? (\n <View style={styles.actions}>\n {!readings.length ? (\n <Text style={[styles.actionHint, { color: colors.textMuted }]}>\n The device went to sleep before it sent a measurement.\n </Text>\n ) : null}\n <PrimaryButton label=\"Done\" onPress={onDone} />\n <SecondaryButton label=\"Measure again\" colors={colors} onPress={() => session?.scan()} />\n </View>\n ) : null}\n\n {state.step === 'connected' && readings.length ? (\n <View style={styles.actions}>\n <PrimaryButton label=\"Done\" onPress={onDone} />\n </View>\n ) : null}\n\n {state.step === 'error' ? (\n <View style={styles.center}>\n <Ionicons name=\"alert-circle\" size={40} color={colors.dangerText} />\n <Text style={[styles.statusTitle, { color: colors.text }]}>{state.message}</Text>\n <PrimaryButton label=\"Try again\" onPress={retry} />\n </View>\n ) : null}\n </ScrollView>\n );\n}\n\n// ------------------------------------------------------------ Device detail\n\nfunction DeviceDetail({\n id,\n colors,\n units,\n onMeasure,\n onForgot,\n}: {\n id: string;\n colors: Colors;\n units: 'metric' | 'imperial';\n onMeasure: (kind: DeviceKindId) => void;\n onForgot: () => void;\n}) {\n const devices = useDevices();\n const device = devices.devices.find((d) => d.id === id);\n const readings = useMemo(\n () =>\n devices.readings\n .filter((r) => r.deviceId === id)\n .sort((a, b) => b.at - a.at)\n .slice(0, 20),\n [devices.readings, id],\n );\n if (!device) return null;\n const forget = () =>\n Alert.alert(`Forget ${device.name}?`, 'Its readings stay in Yantra. To use it again, pair it again.', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Forget',\n style: 'destructive',\n onPress: () => {\n void deviceStore.forget(id).then(onForgot);\n },\n },\n ]);\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n <View style={styles.hero}>\n <KindIcon kind={device.kind} colors={colors} large />\n <Text style={[styles.heroTitle, { color: colors.text }]}>{device.name}</Text>\n <Text style={[styles.heroBody, { color: colors.textMuted }]}>\n {deviceKind(device.kind).title}\n {device.scaleUser ? ` · user ${device.scaleUser.userIndex} on this scale` : ''}\n </Text>\n </View>\n <View style={styles.actions}>\n <PrimaryButton\n label={device.kind === 'heart-rate' ? 'Start a session' : 'Take a reading'}\n onPress={() => onMeasure(device.kind)}\n />\n </View>\n {readings.length ? (\n <ReadingsCard title=\"READINGS\" readings={readings} colors={colors} units={units} now={Date.now()} />\n ) : (\n <Text style={[styles.footnote, { color: colors.textMuted }]}>No readings from this device yet.</Text>\n )}\n <View style={[styles.card, styles.secondaryCard, { backgroundColor: colors.surface }]}>\n <Pressable\n onPress={forget}\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n <Text style={[styles.rowLabelWide, { color: colors.dangerText }]}>Forget this device</Text>\n </Pressable>\n </View>\n </ScrollView>\n );\n}\n\nexport default function DevicesScreen() {\n const navigation = useNavigation<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, DevicesParams>, string>>();\n const { isDark } = useAppTheme();\n const colors = mobileColors(isDark);\n const insets = useSafeAreaInsets();\n const devices = useDevices();\n const [stack, setStack] = useState<Step[]>(() =>\n route?.params?.add ? [{ name: 'home' }, { name: 'pick' }] : [{ name: 'home' }],\n );\n const step = stack[stack.length - 1];\n const units = devices.person?.units ?? 'metric';\n\n const orgName = useMemo(() => {\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [route?.params?.orgName]);\n\n const push = useCallback((next: Step) => setStack((s) => [...s, next]), []);\n const pop = useCallback(() => {\n if (stack.length > 1) {\n setStack((s) => s.slice(0, -1));\n return true;\n }\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return true;\n }\n navigation?.dispatch?.(\n CommonActions.navigate({ name: 'MainStack.Account', params: orgName ? { orgName } : undefined }),\n );\n return true;\n }, [stack.length, navigation, orgName]);\n\n useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', pop);\n return () => sub.remove();\n }, [pop]);\n\n const openHealth = useCallback(() => {\n navigation?.navigate?.('MainStack.Health', orgName ? { orgName } : undefined);\n }, [navigation, orgName]);\n\n const title = stepTitle(step, devices.devices);\n\n return (\n <SafeAreaView edges={['top', 'left', 'right']} style={[styles.safe, { backgroundColor: colors.bg }]}>\n <View style={[styles.header, { paddingTop: insets.top > 0 ? 4 : 10 }]}>\n <Pressable\n onPress={pop}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Go back\"\n style={({ pressed }) => [\n styles.backCircle,\n { backgroundColor: colors.surface },\n pressed && styles.pressed,\n ]}\n >\n <Ionicons name=\"chevron-back\" size={22} color={colors.text} />\n </Pressable>\n <Text style={[styles.headerTitle, { color: colors.text }]} numberOfLines={1}>\n {title}\n </Text>\n <View style={styles.headerSpacer} />\n </View>\n {step.name === 'home' ? (\n <Home\n colors={colors}\n isDark={isDark}\n units={units}\n onAdd={() => push({ name: 'pick' })}\n onOpen={(id) => push({ name: 'device', id })}\n onHealth={openHealth}\n />\n ) : null}\n {step.name === 'pick' ? (\n <PickKind colors={colors} isDark={isDark} onPick={(kind) => push({ name: 'measure', kind })} />\n ) : null}\n {step.name === 'measure' ? (\n <Measure\n key={`${step.kind}:${step.deviceId ?? ''}`}\n kind={step.kind}\n deviceId={step.deviceId}\n colors={colors}\n units={units}\n onDone={() => setStack([{ name: 'home' }])}\n onHealth={openHealth}\n />\n ) : null}\n {step.name === 'device' ? (\n <DeviceDetail\n id={step.id}\n colors={colors}\n units={units}\n onMeasure={(kind) => push({ name: 'measure', kind, deviceId: step.id })}\n onForgot={() => setStack([{ name: 'home' }])}\n />\n ) : null}\n </SafeAreaView>\n );\n}\n"],"names":["React","_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/screens/Devices/index.tsx"],"sourcesContent":["/**\n * Devices: the Bluetooth health devices the person paired, and pairing a new\n * one. One route with its own small stack (home -> pick a kind -> measure, or\n * home -> a device -> measure), so the flow never leaves the screen:\n *\n * - home: the paired devices with their last reading, and \"Add a device\";\n * - pick: which kind of device (scale, blood pressure, heart rate ...);\n * - measure: how to wake it, the devices found nearby, connecting, waiting for\n * a measurement (or live heart rate / oxygen), and what it measured;\n * - device: its readings, take another, forget it.\n *\n * Only devices that speak the Bluetooth SIG health profiles pair here. A brand\n * scale with its own app (RENPHO, Withings ...) keeps that app; it writes to\n * Apple Health / Health Connect and Yantra reads it there, which the home says.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n Alert,\n Animated,\n BackHandler,\n Easing,\n Linking,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n View,\n} from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport {\n CommonActions,\n useNavigation,\n useRoute,\n type NavigationProp,\n type ParamListBase,\n type RouteProp,\n} from '@react-navigation/native';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { mobileColors, mobileTokens } from '../../theme/mobileTokens';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\nimport { DEVICE_KINDS, deviceKind, type DeviceKindId } from '../../features/devices/catalog';\nimport { deviceStore, platformWriter, useDeviceSession, useDevices } from '../../features/devices/devices';\nimport { describeReading, type DeviceReading } from '../../features/devices/readings';\nimport { compositionRows } from '../../features/devices/bodyComposition';\nimport type { PairedDevice } from '../../features/devices/deviceStore';\nimport type { FoundDevice, RadioState } from '../../features/devices/link';\nimport type { LiveValue } from '../../features/devices/drivers';\nimport { useHealthSync } from '../../features/health/healthSync';\n\ntype Colors = ReturnType<typeof mobileColors>;\ntype Glyph = keyof typeof Ionicons.glyphMap;\n/** `add`: open straight on \"Which device\" (the Fitness page's Add a device). */\ntype DevicesParams = { orgName?: string; add?: boolean } | undefined;\ntype Step =\n | { name: 'home' }\n | { name: 'pick' }\n | { name: 'measure'; kind: DeviceKindId; deviceId?: string }\n | { name: 'device'; id: string };\n\nconst IS_IOS = Platform.OS === 'ios';\n/** The app's surfaces are white on a white page in light mode; an edge keeps each card readable as one. */\nconst CARD_EDGE = 'rgba(148,163,184,0.3)';\nconst STORE_NAME = IS_IOS ? 'Apple Health' : 'Health Connect';\nconst WORKOUT_TYPES: Array<{ id: string; label: string }> = [\n { id: 'run', label: 'Run' },\n { id: 'walk', label: 'Walk' },\n { id: 'cycle', label: 'Ride' },\n { id: 'strength', label: 'Strength' },\n { id: 'hiit', label: 'HIIT' },\n { id: 'other', label: 'Other' },\n];\n\nconst styles = StyleSheet.create({\n safe: { flex: 1 },\n header: { flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, paddingBottom: 8, minHeight: 52 },\n backCircle: {\n width: 40,\n height: 40,\n borderRadius: 20,\n alignItems: 'center',\n justifyContent: 'center',\n ...mobileTokens.shadow.card,\n },\n headerTitle: { flex: 1, textAlign: 'center', fontSize: 17, fontWeight: '600', marginHorizontal: 8 },\n headerSpacer: { width: 40, height: 40 },\n pressed: { opacity: 0.72 },\n loading: { marginTop: 48 },\n scroll: { paddingHorizontal: 16, paddingBottom: 40 },\n hero: { alignItems: 'center', paddingTop: 8, paddingBottom: 16, gap: 10 },\n heroIcon: { width: 64, height: 64, borderRadius: 32, alignItems: 'center', justifyContent: 'center' },\n heroTitle: { fontSize: 20, fontWeight: '700', textAlign: 'center' },\n heroBody: { fontSize: 15, lineHeight: 21, textAlign: 'center', paddingHorizontal: 8 },\n card: { borderRadius: 16, overflow: 'hidden', borderWidth: 1, borderColor: CARD_EDGE },\n secondaryCard: { marginTop: 20 },\n sectionTitle: {\n fontSize: 13,\n fontWeight: '600',\n letterSpacing: 0.4,\n marginTop: 24,\n marginBottom: 8,\n marginLeft: 16,\n },\n row: { flexDirection: 'row', alignItems: 'center', minHeight: 52, paddingHorizontal: 16, gap: 12 },\n rowLabelWide: { flex: 1, fontSize: 16 },\n rowLine: { height: StyleSheet.hairlineWidth, marginLeft: 16 },\n deviceRow: { flexDirection: 'row', alignItems: 'center', minHeight: 64, paddingHorizontal: 16, gap: 12 },\n deviceText: { flex: 1, minWidth: 0 },\n deviceName: { fontSize: 16, fontWeight: '600' },\n deviceMeta: { fontSize: 14, marginTop: 2 },\n kindIcon: { alignItems: 'center', justifyContent: 'center' },\n question: { fontSize: 22, fontWeight: '700', textAlign: 'center', marginTop: 8, marginBottom: 20, lineHeight: 28 },\n kindList: { gap: 10 },\n kindCard: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 16,\n padding: 14,\n gap: 14,\n borderWidth: 1,\n borderColor: CARD_EDGE,\n },\n kindTitle: { fontSize: 16, fontWeight: '600' },\n center: { alignItems: 'center', paddingTop: 24, gap: 12 },\n statusTitle: { fontSize: 19, fontWeight: '700', textAlign: 'center', marginTop: 4 },\n statusBody: { fontSize: 15, lineHeight: 21, textAlign: 'center', paddingHorizontal: 8 },\n guidance: { marginTop: 16, paddingVertical: 8 },\n guidanceRow: { flexDirection: 'row', alignItems: 'flex-start', paddingHorizontal: 16, paddingVertical: 8, gap: 12 },\n stepDot: { width: 24, height: 24, borderRadius: 12, alignItems: 'center', justifyContent: 'center', marginTop: 1 },\n stepNumber: { fontSize: 13, fontWeight: '700' },\n guidanceText: { flex: 1, fontSize: 15, lineHeight: 22 },\n pulseBox: {\n alignSelf: 'center',\n width: 120,\n height: 120,\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: 16,\n },\n pulseRing: { position: 'absolute', width: 64, height: 64, borderRadius: 32 },\n pulseCore: { width: 64, height: 64, borderRadius: 32, alignItems: 'center', justifyContent: 'center' },\n signal: { flexDirection: 'row', alignItems: 'flex-end', gap: 2, height: 16 },\n signalBar: { width: 4, borderRadius: 1 },\n livePanel: { alignItems: 'center', padding: 20, marginTop: 16, gap: 12 },\n liveValue: { fontSize: 56, fontWeight: '700', fontVariant: ['tabular-nums'] },\n liveUnit: { fontSize: 18, fontWeight: '500' },\n liveMeta: { fontSize: 15, fontVariant: ['tabular-nums'] },\n chips: { flexDirection: 'row', flexWrap: 'wrap', justifyContent: 'center', gap: 8 },\n chip: { borderWidth: 1, borderRadius: 999, paddingHorizontal: 14, paddingVertical: 8 },\n chipLabel: { fontSize: 14, fontWeight: '600' },\n readingRow: { paddingHorizontal: 16, paddingVertical: 12, gap: 2 },\n readingValue: { fontSize: 16, fontWeight: '600' },\n readingWhen: { fontSize: 14 },\n readingNote: { fontSize: 14, marginTop: 2 },\n measureBox: { alignItems: 'center', paddingVertical: 24, gap: 6 },\n measureRing: { position: 'absolute', top: 24, width: 176, height: 176, borderRadius: 88, borderWidth: 2 },\n measureCore: {\n width: 176,\n height: 176,\n borderRadius: 88,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 12,\n },\n measureWeight: { fontSize: 44, fontWeight: '700' },\n measureUnit: { fontSize: 18, fontWeight: '600' },\n compositionGrid: { flexDirection: 'row', flexWrap: 'wrap', marginTop: 10, rowGap: 10 },\n compositionItem: { width: '33.33%', paddingRight: 8 },\n compositionLabel: { fontSize: 12 },\n compositionValue: { fontSize: 15, fontWeight: '600', marginTop: 1 },\n savedLine: { flexDirection: 'row', alignItems: 'center', gap: 8, marginTop: 12, marginHorizontal: 4 },\n savedBlock: { marginTop: 12, gap: 10 },\n savedText: { flex: 1, fontSize: 14, lineHeight: 20 },\n notice: { flexDirection: 'row', borderRadius: 14, padding: 12, marginTop: 12, gap: 8 },\n noticeIcon: { marginTop: 1 },\n noticeText: { flex: 1, fontSize: 14, lineHeight: 20 },\n actions: { marginTop: 20, gap: 10, alignItems: 'stretch' },\n actionHint: { fontSize: 15, lineHeight: 21, textAlign: 'center' },\n primary: {\n backgroundColor: mobileTokens.color.primary,\n borderRadius: 14,\n minHeight: 50,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 18,\n alignSelf: 'stretch',\n },\n primaryLabel: { color: '#fff', fontSize: 16, fontWeight: '600' },\n secondary: {\n borderRadius: 14,\n minHeight: 48,\n alignItems: 'center',\n justifyContent: 'center',\n borderWidth: 1,\n paddingHorizontal: 18,\n },\n secondaryLabel: { fontSize: 16, fontWeight: '600' },\n footnote: { fontSize: 13, lineHeight: 18, marginTop: 16, marginHorizontal: 16 },\n linkRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n marginTop: 10,\n marginHorizontal: 16,\n alignSelf: 'flex-start',\n },\n link: { fontSize: 14, fontWeight: '600' },\n});\n\nfunction stepTitle(step: Step, paired: PairedDevice[]): string {\n switch (step.name) {\n case 'pick':\n return 'Add a device';\n case 'measure':\n return deviceKind(step.kind).title;\n case 'device':\n return paired.find((d) => d.id === step.id)?.name ?? 'Device';\n default:\n return 'Devices';\n }\n}\n\n/** What to say when the radio is not ready to scan. */\nfunction radioCopy(radio: RadioState): { title: string; body: string } {\n if (radio === 'off') return { title: 'Turn on Bluetooth', body: 'Yantra finds your device over Bluetooth.' };\n if (radio === 'unauthorized') {\n return {\n title: 'Allow Bluetooth for Yantra',\n body: 'Yantra needs Bluetooth to find and read your device. Turn it on for Yantra in Settings.',\n };\n }\n return { title: 'This phone has no Bluetooth Yantra can use', body: '' };\n}\n\n/** Bars for the signal strength of a device found nearby. */\nfunction signalBars(rssi: number | undefined): number {\n if (rssi === undefined) return 1;\n if (rssi > -60) return 3;\n if (rssi > -80) return 2;\n return 1;\n}\n\nfunction whenLabel(at: number, now: number): string {\n const d = new Date(at);\n const time = d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });\n const startOf = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const days = Math.round((startOf(new Date(now)) - startOf(d)) / 86_400_000);\n if (days === 0) return `Today, ${time}`;\n if (days === 1) return `Yesterday, ${time}`;\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });\n}\n\n/** \"Today, 7:31 AM\" wraps as one piece, never with \"AM\" alone on the next line. */\nfunction keepTogether(text: string): string {\n return text.replace(/\\s/g, '\\u00a0');\n}\n\nfunction clockOf(seconds: number): string {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}:${String(s).padStart(2, '0')}`;\n}\n\n// ------------------------------------------------------------------ Pieces\n\nfunction KindIcon({ kind, colors, large }: { kind: DeviceKindId; colors: Colors; large?: boolean }) {\n const size = large ? 48 : 36;\n return (\n <View\n style={[\n styles.kindIcon,\n { width: size, height: size, borderRadius: size / 2, backgroundColor: colors.primarySoft },\n ]}\n >\n <Ionicons name={deviceKind(kind).icon as Glyph} size={large ? 24 : 18} color={colors.primary} />\n </View>\n );\n}\n\n/** The Bluetooth mark with a ring that breathes while scanning. */\nfunction BluetoothPulse({ colors, active, connected }: { colors: Colors; active: boolean; connected?: boolean }) {\n const pulse = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n if (!active) return undefined;\n const loop = Animated.loop(\n Animated.timing(pulse, {\n toValue: 1,\n duration: 1600,\n easing: Easing.out(Easing.ease),\n useNativeDriver: true,\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [active, pulse]);\n const scale = pulse.interpolate({ inputRange: [0, 1], outputRange: [1, 1.9] });\n const opacity = pulse.interpolate({ inputRange: [0, 1], outputRange: [0.45, 0] });\n return (\n <View style={styles.pulseBox} accessibilityElementsHidden importantForAccessibility=\"no-hide-descendants\">\n {active ? (\n <Animated.View\n style={[styles.pulseRing, { backgroundColor: colors.primary, opacity, transform: [{ scale }] }]}\n />\n ) : null}\n <View style={[styles.pulseCore, { backgroundColor: connected ? colors.successText : colors.primary }]}>\n <Ionicons name={connected ? 'checkmark' : 'bluetooth'} size={28} color=\"#fff\" />\n </View>\n </View>\n );\n}\n\nfunction Notice({\n colors,\n tone,\n icon,\n text,\n}: {\n colors: Colors;\n tone: 'warning' | 'danger';\n icon: Glyph;\n text: string;\n}) {\n const bg = tone === 'danger' ? colors.dangerSoft : colors.warningSoft;\n const fg = tone === 'danger' ? colors.dangerText : colors.warningText;\n return (\n <View style={[styles.notice, { backgroundColor: bg }]} accessibilityRole=\"alert\">\n <Ionicons name={icon} size={18} color={fg} style={styles.noticeIcon} />\n <Text style={[styles.noticeText, { color: fg }]}>{text}</Text>\n </View>\n );\n}\n\nfunction PrimaryButton({ label, onPress }: { label: string; onPress: () => void }) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={({ pressed }) => [styles.primary, pressed && styles.pressed]}\n >\n <Text style={styles.primaryLabel}>{label}</Text>\n </Pressable>\n );\n}\n\nfunction SecondaryButton({ label, onPress, colors }: { label: string; onPress: () => void; colors: Colors }) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={({ pressed }) => [\n styles.secondary,\n { borderColor: colors.border, backgroundColor: colors.surface },\n pressed && styles.pressed,\n ]}\n >\n <Text style={[styles.secondaryLabel, { color: colors.text }]}>{label}</Text>\n </Pressable>\n );\n}\n\nfunction ReadingsCard({\n title,\n readings,\n colors,\n units,\n now,\n}: {\n title: string;\n readings: DeviceReading[];\n colors: Colors;\n units: 'metric' | 'imperial';\n now: number;\n}) {\n return (\n <>\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>{title}</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {readings.map((r, i) => (\n <React.Fragment key={r.id}>\n {i > 0 ? <View style={[styles.rowLine, { backgroundColor: colors.border }]} /> : null}\n <View style={styles.readingRow}>\n <Text style={[styles.readingValue, { color: colors.text }]}>\n {describeReading(r, units)}\n </Text>\n <Text style={[styles.readingWhen, { color: colors.textMuted }]}>\n {whenLabel(r.at, now)}\n </Text>\n {r.kind === 'blood-pressure' && r.problems?.length ? (\n <Text style={[styles.readingNote, { color: colors.warningText }]}>\n {r.problems.join(' ')}\n </Text>\n ) : null}\n {r.kind === 'body' && r.composition ? (\n <View style={styles.compositionGrid}>\n {compositionRows(r.composition, units).map((m) => (\n <View key={m.label} style={styles.compositionItem}>\n <Text style={[styles.compositionLabel, { color: colors.textMuted }]}>\n {m.label}\n </Text>\n <Text style={[styles.compositionValue, { color: colors.text }]}>\n {m.value}\n </Text>\n </View>\n ))}\n </View>\n ) : null}\n </View>\n </React.Fragment>\n ))}\n </View>\n </>\n );\n}\n\n/** Where the readings went, and how to have them saved to the health store too. */\nfunction SavedLine({ colors, onHealth }: { colors: Colors; onHealth: () => void }) {\n const health = useHealthSync();\n const [asked, setAsked] = useState<boolean | null>(null);\n useEffect(() => {\n let live = true;\n void platformWriter().then(async (w) => {\n const a = w ? await w.asked().catch(() => true) : true;\n if (live) setAsked(a);\n });\n return () => {\n live = false;\n };\n }, [health.sync.connected]);\n const allowSaving = async () => {\n const w = await platformWriter();\n if (!w) return;\n await w.requestAccess().catch(() => undefined);\n setAsked(true);\n void deviceStore.flush();\n };\n if (!health.sync.connected) {\n return (\n <Pressable\n onPress={onHealth}\n accessibilityRole=\"link\"\n style={({ pressed }) => [styles.savedLine, pressed && styles.pressed]}\n >\n <Ionicons name=\"checkmark-circle\" size={18} color={colors.successText} />\n <Text style={[styles.savedText, { color: colors.textMuted }]}>\n Saved for your coach. <Text style={{ color: colors.primary }}>Connect {STORE_NAME}</Text> to keep it\n there too.\n </Text>\n </Pressable>\n );\n }\n if (asked === false) {\n return (\n <View style={styles.savedBlock}>\n <Text style={[styles.savedText, { color: colors.textMuted }]}>Saved for your coach.</Text>\n <SecondaryButton\n label={`Also save to ${STORE_NAME}`}\n colors={colors}\n onPress={() => {\n void allowSaving();\n }}\n />\n </View>\n );\n }\n return (\n <View style={styles.savedLine}>\n <Ionicons name=\"checkmark-circle\" size={18} color={colors.successText} />\n <Text style={[styles.savedText, { color: colors.textMuted }]}>\n Saved for your coach and to {STORE_NAME}.\n </Text>\n </View>\n );\n}\n\nfunction FoundRow({\n found,\n first,\n colors,\n onPress,\n}: {\n found: FoundDevice;\n first: boolean;\n colors: Colors;\n onPress: () => void;\n}) {\n const bars = signalBars(found.rssi);\n return (\n <>\n {!first ? <View style={[styles.rowLine, { backgroundColor: colors.border }]} /> : null}\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`Connect ${found.name}`}\n style={({ pressed }) => [styles.deviceRow, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n {found.kind ? (\n <KindIcon kind={found.kind} colors={colors} />\n ) : (\n <Ionicons name=\"bluetooth\" size={22} color={colors.primary} />\n )}\n <Text style={[styles.deviceName, styles.deviceText, { color: colors.text }]} numberOfLines={1}>\n {found.name}\n </Text>\n <View style={styles.signal} accessibilityLabel={`Signal ${bars} of 3`}>\n {[1, 2, 3].map((b) => (\n <View\n key={b}\n style={[\n styles.signalBar,\n { height: 4 + b * 4, backgroundColor: b <= bars ? colors.primary : colors.border },\n ]}\n />\n ))}\n </View>\n </Pressable>\n </>\n );\n}\n\n// ------------------------------------------------------------------- Home\n\nfunction Home({\n colors,\n isDark,\n units,\n onAdd,\n onOpen,\n onHealth,\n}: {\n colors: Colors;\n isDark: boolean;\n units: 'metric' | 'imperial';\n onAdd: () => void;\n onOpen: (id: string) => void;\n onHealth: () => void;\n}) {\n const devices = useDevices();\n const now = Date.now();\n if (!devices.loaded) return <ActivityIndicator style={styles.loading} color={colors.primary} />;\n const latestOf = (d: PairedDevice) =>\n devices.readings\n .filter((r) => r.deviceId === d.id)\n .reduce<DeviceReading | undefined>((a, b) => (!a || b.at > a.at ? b : a), undefined);\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n {devices.devices.length ? (\n <>\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>MY DEVICES</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {devices.devices.map((d, i) => {\n const latest = latestOf(d);\n return (\n <React.Fragment key={d.id}>\n {i > 0 ? (\n <View style={[styles.rowLine, { backgroundColor: colors.border }]} />\n ) : null}\n <Pressable\n onPress={() => onOpen(d.id)}\n accessibilityRole=\"button\"\n accessibilityLabel={d.name}\n style={({ pressed }) => [\n styles.deviceRow,\n pressed && { backgroundColor: colors.surfaceMuted },\n ]}\n >\n <KindIcon kind={d.kind} colors={colors} />\n <View style={styles.deviceText}>\n <Text style={[styles.deviceName, { color: colors.text }]} numberOfLines={1}>\n {d.name}\n </Text>\n <Text\n style={[styles.deviceMeta, { color: colors.textMuted }]}\n numberOfLines={2}\n >\n {latest\n ? `${describeReading(latest, units)} · ${keepTogether(whenLabel(latest.at, now))}`\n : 'No readings yet'}\n </Text>\n </View>\n <Ionicons\n name=\"chevron-forward\"\n size={16}\n color={isDark ? '#64748b' : '#c4c4c4'}\n />\n </Pressable>\n </React.Fragment>\n );\n })}\n </View>\n </>\n ) : (\n <View style={styles.hero}>\n <View style={[styles.heroIcon, { backgroundColor: colors.primarySoft }]}>\n <Ionicons name=\"bluetooth\" size={30} color={colors.primary} />\n </View>\n <Text style={[styles.heroTitle, { color: colors.text }]}>Connect a device</Text>\n <Text style={[styles.heroBody, { color: colors.textMuted }]}>\n Pair a scale, blood-pressure monitor, heart-rate strap, pulse oximeter, thermometer or glucose\n meter. Each reading goes to your coach, and to {STORE_NAME} when you connected it.\n </Text>\n </View>\n )}\n {devices.lastError && devices.pendingDates.length ? (\n <Notice\n colors={colors}\n tone=\"warning\"\n icon=\"cloud-offline-outline\"\n text={`Readings are kept on this phone and sent when Yantra can reach your coach. ${devices.lastError}`}\n />\n ) : null}\n <View style={styles.actions}>\n <PrimaryButton label=\"Add a device\" onPress={onAdd} />\n </View>\n <Text style={[styles.footnote, { color: colors.textMuted }]}>\n Devices that use the Bluetooth health standards pair here. For a brand scale with its own app, such as\n RENPHO or Withings, turn on its {STORE_NAME} sync; Yantra reads it there.\n </Text>\n <Pressable\n onPress={onHealth}\n accessibilityRole=\"link\"\n style={({ pressed }) => [styles.linkRow, pressed && styles.pressed]}\n >\n <Text style={[styles.link, { color: colors.primary }]}>{STORE_NAME} settings</Text>\n <Ionicons name=\"chevron-forward\" size={14} color={colors.primary} />\n </Pressable>\n </ScrollView>\n );\n}\n\n// --------------------------------------------------------------- Pick kind\n\nfunction PickKind({\n colors,\n isDark,\n onPick,\n}: {\n colors: Colors;\n isDark: boolean;\n onPick: (kind: DeviceKindId) => void;\n}) {\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n <Text style={[styles.question, { color: colors.text }]}>Which device do you want to connect?</Text>\n <View style={styles.kindList}>\n {DEVICE_KINDS.map((k) => (\n <Pressable\n key={k.id}\n onPress={() => onPick(k.id)}\n accessibilityRole=\"button\"\n accessibilityLabel={k.title}\n style={({ pressed }) => [\n styles.kindCard,\n { backgroundColor: colors.surface },\n pressed && { backgroundColor: colors.surfaceMuted },\n ]}\n >\n <KindIcon kind={k.id} colors={colors} large />\n <View style={styles.deviceText}>\n <Text style={[styles.kindTitle, { color: colors.text }]}>{k.title}</Text>\n <Text style={[styles.deviceMeta, { color: colors.textMuted }]}>{k.subtitle}</Text>\n </View>\n <Ionicons name=\"chevron-forward\" size={16} color={isDark ? '#64748b' : '#c4c4c4'} />\n </Pressable>\n ))}\n </View>\n </ScrollView>\n );\n}\n\n// ----------------------------------------------------------------- Measure\n\n/** kg to the person's units, as a string with one decimal. */\nfunction formatWeight(kg: number | undefined, units: 'metric' | 'imperial'): string {\n if (kg === undefined) return '--';\n const v = units === 'imperial' ? kg / 0.45359237 : kg;\n return (Math.round(v * 10) / 10).toFixed(1);\n}\n\n/**\n * The scale's live weighing: the number rises as the person settles onto the\n * scale, inside a soft pulsing ring. An original Yantra design, not a copy of\n * any scale maker's screen.\n */\nfunction ScaleMeasuring({ colors, live, units }: { colors: Colors; live: LiveValue; units: 'metric' | 'imperial' }) {\n const pulse = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n const loop = Animated.loop(\n Animated.timing(pulse, {\n toValue: 1,\n duration: 1400,\n easing: Easing.out(Easing.ease),\n useNativeDriver: true,\n }),\n );\n loop.start();\n return () => loop.stop();\n }, [pulse]);\n const ringScale = pulse.interpolate({ inputRange: [0, 1], outputRange: [0.9, 1.5] });\n const ringOpacity = pulse.interpolate({ inputRange: [0, 1], outputRange: [0.5, 0] });\n const unitLabel = units === 'imperial' ? 'lb' : 'kg';\n return (\n <View style={styles.measureBox}>\n <Animated.View\n style={[\n styles.measureRing,\n { borderColor: colors.primary, opacity: ringOpacity, transform: [{ scale: ringScale }] },\n ]}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n />\n <View style={[styles.measureCore, { backgroundColor: colors.primarySoft }]}>\n <Text style={[styles.measureWeight, { color: colors.text }]} accessibilityLabel={`${formatWeight(live.weightKg, units)} ${unitLabel}`}>\n {formatWeight(live.weightKg, units)}\n <Text style={[styles.measureUnit, { color: colors.textMuted }]}> {unitLabel}</Text>\n </Text>\n </View>\n <Text style={[styles.statusTitle, { color: colors.text }]}>Measuring</Text>\n <Text style={[styles.statusBody, { color: colors.textMuted }]}>\n Stand still, barefoot, until it settles.\n </Text>\n </View>\n );\n}\n\n/** A plain live readout for the other brand devices (kitchen scale, tape, rope, treadmill, ring). */\nfunction BrandLive({\n kind,\n colors,\n live,\n units,\n}: {\n kind: DeviceKindId;\n colors: Colors;\n live: LiveValue;\n units: 'metric' | 'imperial';\n}) {\n const items: Array<{ label: string; value: string }> = [];\n const round1 = (n: number) => Math.round(n * 10) / 10;\n if (kind === 'kitchen-scale') items.push({ label: 'Weight', value: `${Math.round(live.grams ?? 0)} g` });\n if (kind === 'tape') {\n const cm = live.lengthCm ?? 0;\n items.push({\n label: live.bodyPart ? live.bodyPart.replace(/_/g, ' ') : 'Length',\n value: units === 'imperial' ? `${round1(cm / 2.54)} in` : `${round1(cm)} cm`,\n });\n }\n if (kind === 'jump-rope') {\n items.push({ label: 'Jumps', value: String(live.jumps ?? 0) });\n if (live.elapsedS !== undefined) items.push({ label: 'Time', value: clockOf(live.elapsedS) });\n }\n if (kind === 'treadmill') {\n if (live.speedKmh !== undefined) items.push({ label: 'Speed', value: `${round1(live.speedKmh)} km/h` });\n if (live.distanceM !== undefined) items.push({ label: 'Distance', value: `${round1(live.distanceM / 1000)} km` });\n if (live.kcal !== undefined) items.push({ label: 'Calories', value: `${Math.round(live.kcal)} kcal` });\n if (live.elapsedS !== undefined) items.push({ label: 'Time', value: clockOf(live.elapsedS) });\n }\n if (kind === 'ring') {\n if (live.bpm !== undefined) items.push({ label: 'Heart rate', value: `${live.bpm} bpm` });\n if (live.spo2 !== undefined) items.push({ label: 'Blood oxygen', value: `${live.spo2}%` });\n if (live.skinTempC !== undefined) items.push({ label: 'Skin temp', value: `${round1(live.skinTempC)} °C` });\n if (live.steps !== undefined) items.push({ label: 'Steps', value: String(live.steps) });\n }\n if (live.battery !== undefined) items.push({ label: 'Battery', value: `${live.battery}%` });\n return (\n <View style={[styles.card, styles.livePanel, { backgroundColor: colors.surface }]}>\n <View style={styles.compositionGrid}>\n {items.map((m) => (\n <View key={m.label} style={styles.compositionItem}>\n <Text style={[styles.compositionLabel, { color: colors.textMuted }]}>{m.label}</Text>\n <Text style={[styles.compositionValue, { color: colors.text }]}>{m.value}</Text>\n </View>\n ))}\n </View>\n </View>\n );\n}\n\nfunction LivePanel({\n kind,\n colors,\n live,\n units,\n recording,\n connected,\n onStart,\n onStop,\n onSave,\n}: {\n kind: DeviceKindId;\n colors: Colors;\n live: LiveValue;\n units: 'metric' | 'imperial';\n recording?: { startedAt: number; workoutType: string; avgHr?: number; maxHr?: number };\n connected: boolean;\n onStart: (type: string) => void;\n onStop: () => void;\n onSave: () => void;\n}) {\n const [type, setType] = useState('run');\n if (kind === 'scale') {\n return <ScaleMeasuring colors={colors} live={live} units={units} />;\n }\n if (kind === 'kitchen-scale' || kind === 'tape' || kind === 'jump-rope' || kind === 'treadmill' || kind === 'ring') {\n return <BrandLive kind={kind} colors={colors} live={live} units={units} />;\n }\n const [, tick] = useState(0);\n useEffect(() => {\n if (!recording) return undefined;\n const t = setInterval(() => tick((n) => n + 1), 1000);\n return () => clearInterval(t);\n }, [recording]);\n if (kind === 'heart-rate') {\n const elapsed = recording ? Math.max(0, Math.floor((Date.now() - recording.startedAt) / 1000)) : 0;\n return (\n <View style={[styles.card, styles.livePanel, { backgroundColor: colors.surface }]}>\n <Text\n style={[styles.liveValue, { color: colors.text }]}\n accessibilityLabel={`Heart rate ${live.bpm ?? 0} beats per minute`}\n >\n {live.bpm ?? '--'}\n <Text style={[styles.liveUnit, { color: colors.textMuted }]}> bpm</Text>\n </Text>\n {recording ? (\n <>\n <Text style={[styles.liveMeta, { color: colors.textMuted }]}>\n {clockOf(elapsed)} · average {recording.avgHr ?? '--'} · max {recording.maxHr ?? '--'}\n </Text>\n <PrimaryButton label=\"Stop and save\" onPress={onStop} />\n </>\n ) : null}\n {!recording && connected ? (\n <>\n <View style={styles.chips}>\n {WORKOUT_TYPES.map((w) => (\n <Pressable\n key={w.id}\n onPress={() => setType(w.id)}\n accessibilityRole=\"radio\"\n accessibilityState={{ selected: type === w.id }}\n style={[\n styles.chip,\n { borderColor: type === w.id ? colors.primary : colors.border },\n type === w.id && { backgroundColor: colors.primarySoft },\n ]}\n >\n <Text\n style={[\n styles.chipLabel,\n { color: type === w.id ? colors.primary : colors.text },\n ]}\n >\n {w.label}\n </Text>\n </Pressable>\n ))}\n </View>\n <PrimaryButton label=\"Start session\" onPress={() => onStart(type)} />\n </>\n ) : null}\n </View>\n );\n }\n return (\n <View style={[styles.card, styles.livePanel, { backgroundColor: colors.surface }]}>\n <Text style={[styles.liveValue, { color: colors.text }]}>\n {live.spo2 ?? '--'}\n <Text style={[styles.liveUnit, { color: colors.textMuted }]}>%</Text>\n </Text>\n <Text style={[styles.liveMeta, { color: colors.textMuted }]}>\n Blood oxygen{live.pulse ? ` · pulse ${live.pulse}` : ''}\n </Text>\n {connected ? <PrimaryButton label=\"Save this reading\" onPress={onSave} /> : null}\n </View>\n );\n}\n\nfunction Measure({\n kind,\n deviceId,\n colors,\n units,\n onDone,\n onHealth,\n}: {\n kind: DeviceKindId;\n deviceId?: string;\n colors: Colors;\n units: 'metric' | 'imperial';\n onDone: () => void;\n onHealth: () => void;\n}) {\n const { snapshot, session } = useDeviceSession(kind, deviceId);\n const { state, readings, live, recording, notices } = snapshot;\n const info = deviceKind(kind);\n const now = Date.now();\n const retry = () => {\n void session?.start();\n };\n\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n {state.step === 'starting' ? <ActivityIndicator style={styles.loading} color={colors.primary} /> : null}\n\n {state.step === 'unavailable' ? (\n <Notice colors={colors} tone=\"warning\" icon=\"information-circle\" text={state.reason} />\n ) : null}\n\n {state.step === 'radio' ? (\n <View style={styles.center}>\n <BluetoothPulse colors={colors} active={false} />\n <Text style={[styles.statusTitle, { color: colors.text }]}>{radioCopy(state.radio).title}</Text>\n <Text style={[styles.statusBody, { color: colors.textMuted }]}>{radioCopy(state.radio).body}</Text>\n {state.radio === 'unauthorized' ? (\n <PrimaryButton\n label=\"Open Settings\"\n onPress={() => {\n void Linking.openSettings();\n }}\n />\n ) : null}\n {state.radio === 'off' ? <PrimaryButton label=\"Try again\" onPress={retry} /> : null}\n </View>\n ) : null}\n\n {state.step === 'scanning' ? (\n <>\n <BluetoothPulse colors={colors} active />\n <Text style={[styles.statusTitle, { color: colors.text }]}>\n {deviceId ? 'Looking for your device' : 'Looking for devices nearby'}\n </Text>\n <View style={[styles.card, styles.guidance, { backgroundColor: colors.surface }]}>\n {info.steps.map((line, i) => (\n <View key={line} style={styles.guidanceRow}>\n <View style={[styles.stepDot, { backgroundColor: colors.primarySoft }]}>\n <Text style={[styles.stepNumber, { color: colors.primary }]}>{i + 1}</Text>\n </View>\n <Text style={[styles.guidanceText, { color: colors.text }]}>{line}</Text>\n </View>\n ))}\n </View>\n {state.hint ? (\n <Notice\n colors={colors}\n tone=\"warning\"\n icon=\"information-circle\"\n text={`Nothing yet. ${state.hint} Keep it close to the phone.`}\n />\n ) : null}\n {state.found.length ? (\n <>\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>NEARBY</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {state.found.map((f, i) => (\n <FoundRow\n key={f.id}\n found={f}\n first={i === 0}\n colors={colors}\n onPress={() => {\n void session?.pick(f);\n }}\n />\n ))}\n </View>\n </>\n ) : null}\n </>\n ) : null}\n\n {state.step === 'connecting' ? (\n <View style={styles.center}>\n <ActivityIndicator color={colors.primary} size=\"large\" />\n <Text style={[styles.statusTitle, { color: colors.text }]}>Connecting to {state.device.name}</Text>\n <Text style={[styles.statusBody, { color: colors.textMuted }]}>\n If your phone asks to pair, tap Pair.\n </Text>\n </View>\n ) : null}\n\n {state.step === 'connected' && !readings.length && !live ? (\n <View style={styles.center}>\n <BluetoothPulse colors={colors} active connected />\n <Text style={[styles.statusTitle, { color: colors.text }]}>{info.waitingFor}</Text>\n <Text style={[styles.statusBody, { color: colors.textMuted }]}>\n Connected to {state.device.name}.\n </Text>\n </View>\n ) : null}\n\n {(state.step === 'connected' || state.step === 'ended') && live ? (\n <LivePanel\n kind={kind}\n colors={colors}\n live={live}\n units={units}\n recording={recording}\n connected={state.step === 'connected'}\n onStart={(type) => session?.startRecording(type)}\n onStop={() => {\n void session?.stopRecording();\n }}\n onSave={() => {\n void session?.saveLive();\n }}\n />\n ) : null}\n\n {notices.map((n) => (\n <Notice key={n} colors={colors} tone=\"warning\" icon=\"information-circle\" text={n} />\n ))}\n\n {readings.length ? (\n <ReadingsCard title=\"JUST MEASURED\" readings={readings} colors={colors} units={units} now={now} />\n ) : null}\n {readings.length ? <SavedLine colors={colors} onHealth={onHealth} /> : null}\n\n {state.step === 'ended' ? (\n <View style={styles.actions}>\n {!readings.length ? (\n <Text style={[styles.actionHint, { color: colors.textMuted }]}>\n The device went to sleep before it sent a measurement.\n </Text>\n ) : null}\n <PrimaryButton label=\"Done\" onPress={onDone} />\n <SecondaryButton label=\"Measure again\" colors={colors} onPress={() => session?.scan()} />\n </View>\n ) : null}\n\n {state.step === 'connected' && readings.length ? (\n <View style={styles.actions}>\n <PrimaryButton label=\"Done\" onPress={onDone} />\n </View>\n ) : null}\n\n {state.step === 'error' ? (\n <View style={styles.center}>\n <Ionicons name=\"alert-circle\" size={40} color={colors.dangerText} />\n <Text style={[styles.statusTitle, { color: colors.text }]}>{state.message}</Text>\n <PrimaryButton label=\"Try again\" onPress={retry} />\n </View>\n ) : null}\n </ScrollView>\n );\n}\n\n// ------------------------------------------------------------ Device detail\n\nfunction DeviceDetail({\n id,\n colors,\n units,\n onMeasure,\n onForgot,\n}: {\n id: string;\n colors: Colors;\n units: 'metric' | 'imperial';\n onMeasure: (kind: DeviceKindId) => void;\n onForgot: () => void;\n}) {\n const devices = useDevices();\n const device = devices.devices.find((d) => d.id === id);\n const readings = useMemo(\n () =>\n devices.readings\n .filter((r) => r.deviceId === id)\n .sort((a, b) => b.at - a.at)\n .slice(0, 20),\n [devices.readings, id],\n );\n if (!device) return null;\n const forget = () =>\n Alert.alert(`Forget ${device.name}?`, 'Its readings stay in Yantra. To use it again, pair it again.', [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Forget',\n style: 'destructive',\n onPress: () => {\n void deviceStore.forget(id).then(onForgot);\n },\n },\n ]);\n return (\n <ScrollView contentContainerStyle={styles.scroll}>\n <View style={styles.hero}>\n <KindIcon kind={device.kind} colors={colors} large />\n <Text style={[styles.heroTitle, { color: colors.text }]}>{device.name}</Text>\n <Text style={[styles.heroBody, { color: colors.textMuted }]}>\n {deviceKind(device.kind).title}\n {device.scaleUser ? ` · user ${device.scaleUser.userIndex} on this scale` : ''}\n </Text>\n </View>\n <View style={styles.actions}>\n <PrimaryButton\n label={device.kind === 'heart-rate' ? 'Start a session' : 'Take a reading'}\n onPress={() => onMeasure(device.kind)}\n />\n </View>\n {readings.length ? (\n <ReadingsCard title=\"READINGS\" readings={readings} colors={colors} units={units} now={Date.now()} />\n ) : (\n <Text style={[styles.footnote, { color: colors.textMuted }]}>No readings from this device yet.</Text>\n )}\n <View style={[styles.card, styles.secondaryCard, { backgroundColor: colors.surface }]}>\n <Pressable\n onPress={forget}\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n <Text style={[styles.rowLabelWide, { color: colors.dangerText }]}>Forget this device</Text>\n </Pressable>\n </View>\n </ScrollView>\n );\n}\n\nexport default function DevicesScreen() {\n const navigation = useNavigation<NavigationProp<ParamListBase>>();\n const route = useRoute<RouteProp<Record<string, DevicesParams>, string>>();\n const { isDark } = useAppTheme();\n const colors = mobileColors(isDark);\n const insets = useSafeAreaInsets();\n const devices = useDevices();\n const [stack, setStack] = useState<Step[]>(() =>\n route?.params?.add ? [{ name: 'home' }, { name: 'pick' }] : [{ name: 'home' }],\n );\n const step = stack[stack.length - 1];\n const units = devices.person?.units ?? 'metric';\n\n const orgName = useMemo(() => {\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [route?.params?.orgName]);\n\n const push = useCallback((next: Step) => setStack((s) => [...s, next]), []);\n const pop = useCallback(() => {\n if (stack.length > 1) {\n setStack((s) => s.slice(0, -1));\n return true;\n }\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return true;\n }\n navigation?.dispatch?.(\n CommonActions.navigate({ name: 'MainStack.Account', params: orgName ? { orgName } : undefined }),\n );\n return true;\n }, [stack.length, navigation, orgName]);\n\n useEffect(() => {\n const sub = BackHandler.addEventListener('hardwareBackPress', pop);\n return () => sub.remove();\n }, [pop]);\n\n const openHealth = useCallback(() => {\n navigation?.navigate?.('MainStack.Health', orgName ? { orgName } : undefined);\n }, [navigation, orgName]);\n\n const title = stepTitle(step, devices.devices);\n\n return (\n <SafeAreaView edges={['top', 'left', 'right']} style={[styles.safe, { backgroundColor: colors.bg }]}>\n <View style={[styles.header, { paddingTop: insets.top > 0 ? 4 : 10 }]}>\n <Pressable\n onPress={pop}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Go back\"\n style={({ pressed }) => [\n styles.backCircle,\n { backgroundColor: colors.surface },\n pressed && styles.pressed,\n ]}\n >\n <Ionicons name=\"chevron-back\" size={22} color={colors.text} />\n </Pressable>\n <Text style={[styles.headerTitle, { color: colors.text }]} numberOfLines={1}>\n {title}\n </Text>\n <View style={styles.headerSpacer} />\n </View>\n {step.name === 'home' ? (\n <Home\n colors={colors}\n isDark={isDark}\n units={units}\n onAdd={() => push({ name: 'pick' })}\n onOpen={(id) => push({ name: 'device', id })}\n onHealth={openHealth}\n />\n ) : null}\n {step.name === 'pick' ? (\n <PickKind colors={colors} isDark={isDark} onPick={(kind) => push({ name: 'measure', kind })} />\n ) : null}\n {step.name === 'measure' ? (\n <Measure\n key={`${step.kind}:${step.deviceId ?? ''}`}\n kind={step.kind}\n deviceId={step.deviceId}\n colors={colors}\n units={units}\n onDone={() => setStack([{ name: 'home' }])}\n onHealth={openHealth}\n />\n ) : null}\n {step.name === 'device' ? (\n <DeviceDetail\n id={step.id}\n colors={colors}\n units={units}\n onMeasure={(kind) => push({ name: 'measure', kind, deviceId: step.id })}\n onForgot={() => setStack([{ name: 'home' }])}\n />\n ) : null}\n </SafeAreaView>\n );\n}\n"],"names":["React","_a","_b"],"mappings":"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"}
|
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.js';import {stripExpensesContext}from'../../features/expenses/expensesContext.js';
|
|
1
|
+
import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostChatChannel}from'../../hooks/useHostChatChannel.js';import {useHostChatSteering}from'../../hooks/useHostChatSteering.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.js';import {stripExpensesContext}from'../../features/expenses/expensesContext.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
function useExpensesHostChat(routeOrg, handedOffChannelId) {
|
|
2
18
|
var _a;
|
|
3
19
|
const {
|
|
4
20
|
orgName,
|
|
@@ -31,18 +47,22 @@ import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid'
|
|
|
31
47
|
recoverAgentAuth: cdecli.recoverAgentAuth
|
|
32
48
|
}), [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode]);
|
|
33
49
|
const chat = useChatStream(channelId, chatRouting);
|
|
50
|
+
const {
|
|
51
|
+
visibleMessages,
|
|
52
|
+
steering
|
|
53
|
+
} = useHostChatSteering(chat, stripExpensesContext);
|
|
34
54
|
const {
|
|
35
55
|
displayMessages,
|
|
36
56
|
displayStreaming,
|
|
37
57
|
renderConnectorCard
|
|
38
58
|
} = useHostConnectorCard(chat, channelId);
|
|
39
|
-
const messages = useMemo(() => displayMessages(
|
|
59
|
+
const messages = useMemo(() => displayMessages(visibleMessages.map((m, index) => ({
|
|
40
60
|
id: `${m.role}-${index}`,
|
|
41
61
|
role: m.role,
|
|
42
62
|
// The expenses context line is for the agent; the user sees their own words.
|
|
43
63
|
content: m.role === "user" ? stripExpensesContext(m.content) : m.content,
|
|
44
64
|
attachments: m.attachments
|
|
45
|
-
}))), [
|
|
65
|
+
}))), [visibleMessages, displayMessages]);
|
|
46
66
|
const send = useCallback((text, attachments) => {
|
|
47
67
|
void ensureChannel().then(() => chat.sendMessage(text, attachments, channelId));
|
|
48
68
|
}, [chat, channelId, ensureChannel]);
|
|
@@ -50,7 +70,7 @@ import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid'
|
|
|
50
70
|
chat.clearMessages();
|
|
51
71
|
setChannelId(v4());
|
|
52
72
|
}, [chat]);
|
|
53
|
-
return useMemo(() => ({
|
|
73
|
+
return useMemo(() => __spreadValues({
|
|
54
74
|
messages,
|
|
55
75
|
streaming: displayStreaming(chat.response),
|
|
56
76
|
busy: chat.isLoading || chat.isStreaming,
|
|
@@ -59,5 +79,5 @@ import {useState,useEffect,useMemo,useCallback}from'react';import {v4}from'uuid'
|
|
|
59
79
|
send,
|
|
60
80
|
clear,
|
|
61
81
|
renderConnectorCard
|
|
62
|
-
}), [messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, clear, renderConnectorCard]);
|
|
82
|
+
}, steering), [steering, messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, clear, renderConnectorCard]);
|
|
63
83
|
}export{useExpensesHostChat};//# sourceMappingURL=useExpensesHostChat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useExpensesHostChat.js","sources":["../../../src/screens/ExpensesNative/useExpensesHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for the native Expenses agent - same role as web `services.hostChat`.\n * Lives on the Expenses screen (MF host), not in the remote, so Apollo / cdecli\n * stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { ExpensesHostChat } from '../../features/expenses/hostChat';\nimport { stripExpensesContext } from '../../features/expenses/expensesContext';\n\nexport function useExpensesHostChat(routeOrg?: string, handedOffChannelId?: string): ExpensesHostChat {\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n\n // A hand-off from an empty Chat names the chat it was typed into: Expenses carries\n // on in that chat (it already exists) instead of leaving an empty \"New chat\".\n const [channelId, setChannelId] = useState(() => handedOffChannelId || uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: projectId ?? '',\n exists: Boolean(handedOffChannelId) && channelId === handedOffChannelId,\n label: 'ExpensesNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n
|
|
1
|
+
{"version":3,"file":"useExpensesHostChat.js","sources":["../../../src/screens/ExpensesNative/useExpensesHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for the native Expenses agent - same role as web `services.hostChat`.\n * Lives on the Expenses screen (MF host), not in the remote, so Apollo / cdecli\n * stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostChatChannel } from '../../hooks/useHostChatChannel';\nimport { useHostChatSteering } from '../../hooks/useHostChatSteering';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { ExpensesHostChat } from '../../features/expenses/hostChat';\nimport { stripExpensesContext } from '../../features/expenses/expensesContext';\n\nexport function useExpensesHostChat(routeOrg?: string, handedOffChannelId?: string): ExpensesHostChat {\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n\n // A hand-off from an empty Chat names the chat it was typed into: Expenses carries\n // on in that chat (it already exists) instead of leaving an empty \"New chat\".\n const [channelId, setChannelId] = useState(() => handedOffChannelId || uuidv4());\n\n const cdecli = useCdecliConnection();\n const { setActiveChannelId } = cdecli;\n useEffect(() => {\n setActiveChannelId(channelId);\n return undefined;\n }, [channelId, setActiveChannelId]);\n\n const { ensureChannel } = useHostChatChannel({\n channelId,\n orgName: effectiveOrg,\n projectId: projectId ?? '',\n exists: Boolean(handedOffChannelId) && channelId === handedOffChannelId,\n label: 'ExpensesNative',\n });\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // Mid-reply sends queue behind the running turn; the pane shows them above its composer.\n const { visibleMessages, steering } = useHostChatSteering(chat, stripExpensesContext);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n visibleMessages.map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n // The expenses context line is for the agent; the user sees their own words.\n content: m.role === 'user' ? stripExpensesContext(m.content) : m.content,\n attachments: m.attachments,\n })),\n ),\n [visibleMessages, displayMessages],\n );\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[]) => {\n // The chat is created by the first message, not by opening the screen.\n void ensureChannel().then(() => chat.sendMessage(text, attachments, channelId));\n },\n [chat, channelId, ensureChannel],\n );\n\n const clear = useCallback(() => {\n // Stop mid-turn, wipe the local transcript, then open a fresh channel so\n // gateway history cannot rehydrate the cleared thread.\n chat.clearMessages();\n setChannelId(uuidv4());\n }, [chat]);\n\n return useMemo(\n () => ({\n messages,\n streaming: displayStreaming(chat.response),\n busy: chat.isLoading || chat.isStreaming,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n clear,\n renderConnectorCard,\n ...steering,\n }),\n [\n steering,\n messages,\n chat.response,\n displayStreaming,\n chat.isLoading,\n chat.isStreaming,\n chat.error,\n cdecli.channelConnected,\n send,\n clear,\n renderConnectorCard,\n ],\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|