@adminide-stack/yantra-mobile 12.0.125-alpha.1 → 12.0.126
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/canvas/AudioEditorExperience.js +207 -109
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +87 -72
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +494 -387
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js +78 -59
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +126 -84
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +108 -126
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +178 -166
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLibrarySheet.js +119 -123
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +113 -89
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasModelPicker.js +79 -79
- package/lib/features/canvas/CanvasModelPicker.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +193 -128
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTemplatesPanel.js +106 -94
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
- package/lib/features/canvas/CanvasToolDock.js +195 -127
- package/lib/features/canvas/CanvasToolDock.js.map +1 -1
- package/lib/features/canvas/FrameExtractorExperience.js +163 -100
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
- package/lib/features/canvas/GeneratorReferenceSlots.js +132 -69
- package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -1
- package/lib/features/canvas/ImageEditorExperience.js +278 -209
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/InfluencerStudioExperience.js +167 -125
- package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -1
- package/lib/features/canvas/MoodboardExperience.js +102 -85
- package/lib/features/canvas/MoodboardExperience.js.map +1 -1
- package/lib/features/canvas/NativeCanvasViewer.js +203 -192
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
- package/lib/features/canvas/PromoContextFields.js +125 -92
- package/lib/features/canvas/PromoContextFields.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +225 -143
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoClipsExperience.js +126 -92
- package/lib/features/canvas/VideoClipsExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditExperience.js +154 -142
- package/lib/features/canvas/VideoEditExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +551 -492
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +284 -131
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +7 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +265 -0
- package/lib/features/canvas/canvasTheme.js.map +1 -0
- package/lib/features/canvas/canvasUi.js +381 -0
- package/lib/features/canvas/canvasUi.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -52
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/serverTasks.js +1 -1
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js +1 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +8 -7
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -1
- package/lib/features/canvas/videoEditor/ExportTaskCard.js +44 -41
- package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +50 -45
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +3 -2
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/formWidgets.js +116 -64
- package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -1
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +77 -63
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -1
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +95 -79
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +241 -160
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +300 -143
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/health/HealthSyncRunner.js +9 -1
- package/lib/features/health/HealthSyncRunner.js.map +1 -1
- package/lib/features/health/backgroundSync.js +41 -0
- package/lib/features/health/backgroundSync.js.map +1 -0
- package/lib/features/health/healthConnectBackground.js +32 -0
- package/lib/features/health/healthConnectBackground.js.map +1 -0
- package/lib/features/health/healthConnectReader.js +16 -2
- package/lib/features/health/healthConnectReader.js.map +1 -1
- package/lib/features/health/healthSync.js +31 -3
- package/lib/features/health/healthSync.js.map +1 -1
- package/lib/features/health/healthSyncStore.js +89 -5
- package/lib/features/health/healthSyncStore.js.map +1 -1
- package/lib/features/health/healthkitBackground.js +17 -0
- package/lib/features/health/healthkitBackground.js.map +1 -0
- package/lib/features/health/reader.js.map +1 -1
- package/lib/features/health/sessionVault.js +38 -0
- package/lib/features/health/sessionVault.js.map +1 -0
- package/lib/features/health/syncState.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +3 -2
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js +1 -1
- package/lib/features/webbuilder/components/PublishSheet.js.map +1 -1
- package/lib/features/webbuilder/webbuilderPrompts.js +2 -5
- package/lib/features/webbuilder/webbuilderPrompts.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/screens/Health/index.js +12 -2
- package/lib/screens/Health/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +120 -0
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/useRestoredSandboxes.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +26 -4
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/lib/screens/WebBuilderNative/webbuilderTransport.js +110 -7
- package/lib/screens/WebBuilderNative/webbuilderTransport.js.map +1 -1
- package/package.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublishSheet.js","sources":["../../../../src/features/webbuilder/components/PublishSheet.tsx"],"sourcesContent":["/**\n * Publish a build: the web PublishControls dialog on a sheet. The person\n * picks the site's name (`<name>.pages.dev`), the host starts the deploy, and\n * the live address arrives later on a chat post - so the sheet says\n * \"Publishing…\" until the build carries it, then shows it with Open / Share.\n */\nimport React, { useEffect, useState } from 'react';\nimport { Linking, Share, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { displayHost, isValidPublishSlug, publishSlug } from '../buildFragments';\nimport type { WebBuilderBuild, WebBuilderPublishResult } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { PrimaryButton, SecondaryButton, Sheet } from './ui';\n\nexport function PublishSheet({\n visible,\n build,\n publishing,\n onPublish,\n onClose,\n theme,\n}: {\n visible: boolean;\n build: WebBuilderBuild | null;\n /** A deploy is running on this site (started here, or seen on the chat). */\n publishing: boolean;\n onPublish?: (build: WebBuilderBuild, projectName: string) => Promise<WebBuilderPublishResult>;\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n const [name, setName] = useState('');\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!visible || !build) return;\n setName((prev) => prev || publishSlug(build.title));\n setError(null);\n }, [visible, build]);\n\n const live = build?.liveUrl ?? null;\n const valid = isValidPublishSlug(name);\n\n const publish = async () => {\n if (!build || !onPublish || !valid) return;\n setStarting(true);\n setError(null);\n try {\n const result = await onPublish(build, name);\n if (!result.ok) setError(result.message || \"Publishing didn't start. Try again.\");\n } catch {\n setError(\"Publishing didn't start. Check your connection and try again.\");\n } finally {\n setStarting(false);\n }\n };\n\n let body: React.ReactNode;\n if (!build?.sandboxId) {\n body = (\n <Text style={[styles.note, { color: theme.muted }]}>\n There is nothing to publish yet. Build the site first, then publish it here.\n </Text>\n );\n } else if (publishing && !starting) {\n body = (\n <View style={styles.block} testID=\"webbuilder-publishing\">\n <PrimaryButton label=\"Publishing…\" onPress={() => undefined} theme={theme} busy />\n <Text style={[styles.note, { color: theme.muted }]}>\n This takes a minute or two. You can keep editing; the address appears here when it is live.\n </Text>\n </View>\n );\n } else {\n body = (\n <View style={styles.block}>\n {live ? (\n <View style={[styles.liveCard, { backgroundColor: theme.goodSoft }]} testID=\"webbuilder-live\">\n <MaterialCommunityIcons name=\"earth\" size={20} color={theme.good} />\n <Text style={[styles.liveHost, { color: theme.good }]} numberOfLines={1}>\n {displayHost(live)}\n </Text>\n </View>\n ) : null}\n {live ? (\n <View style={styles.row}>\n <SecondaryButton\n label=\"Open\"\n icon=\"open-in-new\"\n onPress={() => {\n Linking.openURL(live).catch(() => undefined);\n }}\n theme={theme}\n />\n <SecondaryButton\n label=\"Share\"\n icon=\"share-variant-outline\"\n onPress={() => {\n Share.share({ message: live, url: live }).catch(() => undefined);\n }}\n theme={theme}\n />\n </View>\n ) : null}\n <Text style={[styles.label, { color: theme.muted }]}>\n {live ? 'Publish the latest version' : 'Site address'}\n </Text>\n <View\n style={[\n styles.field,\n { backgroundColor: theme.chip, borderColor: valid ? theme.border : theme.crit },\n ]}\n >\n <TextInput\n value={name}\n onChangeText={(text) =>\n setName(\n text\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '')\n .slice(0, 58),\n )\n }\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder=\"my-site\"\n placeholderTextColor={theme.faint}\n style={[styles.input, { color: theme.ink }]}\n accessibilityLabel=\"Site name\"\n testID=\"webbuilder-publish-name\"\n />\n <Text style={[styles.suffix, { color: theme.muted }]}>.pages.dev</Text>\n </View>\n {!valid && name ? (\n <Text style={[styles.help, { color: theme.crit }]}>\n Letters, numbers and dashes; it cannot start or end with a dash.\n </Text>\n ) : null}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n <PrimaryButton\n label={live ? 'Publish update' : 'Publish'}\n icon=\"rocket-launch-outline\"\n onPress={() => {\n publish().catch(() => undefined);\n }}\n theme={theme}\n busy={starting}\n disabled={!valid || !onPublish}\n testID=\"webbuilder-publish-submit\"\n />\n </View>\n );\n }\n\n return (\n <Sheet visible={visible} title=\"Publish\" onClose={onClose} theme={theme} testID=\"webbuilder-publish-sheet\">\n {body}\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create({\n block: { gap: 12, paddingTop: 4 },\n row: { flexDirection: 'row', gap: 10 },\n liveCard: { flexDirection: 'row', alignItems: 'center', gap: 10, padding: 14, borderRadius: 12 },\n liveHost: { flex: 1, fontSize: 15, fontWeight: '700' },\n label: { fontSize: 13, fontWeight: '600', marginTop: 4 },\n field: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 14,\n minHeight: 48,\n },\n input: { flex: 1, fontSize: 16, paddingVertical: 10 },\n suffix: { fontSize: 15 },\n help: { fontSize: 13 },\n note: { fontSize: 14, lineHeight: 20, paddingVertical: 8 },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PublishSheet.js","sources":["../../../../src/features/webbuilder/components/PublishSheet.tsx"],"sourcesContent":["/**\n * Publish a build: the web PublishControls dialog on a sheet. The person\n * picks the site's name (`<name>.yarntra.com`), the host starts the deploy, and\n * the live address arrives later on a chat post - so the sheet says\n * \"Publishing…\" until the build carries it, then shows it with Open / Share.\n */\nimport React, { useEffect, useState } from 'react';\nimport { Linking, Share, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { displayHost, isValidPublishSlug, publishSlug } from '../buildFragments';\nimport type { WebBuilderBuild, WebBuilderPublishResult } from '../types';\nimport type { WebBuilderTheme } from '../webbuilderTheme';\nimport { PrimaryButton, SecondaryButton, Sheet } from './ui';\n\nexport function PublishSheet({\n visible,\n build,\n publishing,\n onPublish,\n onClose,\n theme,\n}: {\n visible: boolean;\n build: WebBuilderBuild | null;\n /** A deploy is running on this site (started here, or seen on the chat). */\n publishing: boolean;\n onPublish?: (build: WebBuilderBuild, projectName: string) => Promise<WebBuilderPublishResult>;\n onClose: () => void;\n theme: WebBuilderTheme;\n}) {\n const [name, setName] = useState('');\n const [starting, setStarting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!visible || !build) return;\n setName((prev) => prev || publishSlug(build.title));\n setError(null);\n }, [visible, build]);\n\n const live = build?.liveUrl ?? null;\n const valid = isValidPublishSlug(name);\n\n const publish = async () => {\n if (!build || !onPublish || !valid) return;\n setStarting(true);\n setError(null);\n try {\n const result = await onPublish(build, name);\n if (!result.ok) setError(result.message || \"Publishing didn't start. Try again.\");\n } catch {\n setError(\"Publishing didn't start. Check your connection and try again.\");\n } finally {\n setStarting(false);\n }\n };\n\n let body: React.ReactNode;\n if (!build?.sandboxId) {\n body = (\n <Text style={[styles.note, { color: theme.muted }]}>\n There is nothing to publish yet. Build the site first, then publish it here.\n </Text>\n );\n } else if (publishing && !starting) {\n body = (\n <View style={styles.block} testID=\"webbuilder-publishing\">\n <PrimaryButton label=\"Publishing…\" onPress={() => undefined} theme={theme} busy />\n <Text style={[styles.note, { color: theme.muted }]}>\n This takes a minute or two. You can keep editing; the address appears here when it is live.\n </Text>\n </View>\n );\n } else {\n body = (\n <View style={styles.block}>\n {live ? (\n <View style={[styles.liveCard, { backgroundColor: theme.goodSoft }]} testID=\"webbuilder-live\">\n <MaterialCommunityIcons name=\"earth\" size={20} color={theme.good} />\n <Text style={[styles.liveHost, { color: theme.good }]} numberOfLines={1}>\n {displayHost(live)}\n </Text>\n </View>\n ) : null}\n {live ? (\n <View style={styles.row}>\n <SecondaryButton\n label=\"Open\"\n icon=\"open-in-new\"\n onPress={() => {\n Linking.openURL(live).catch(() => undefined);\n }}\n theme={theme}\n />\n <SecondaryButton\n label=\"Share\"\n icon=\"share-variant-outline\"\n onPress={() => {\n Share.share({ message: live, url: live }).catch(() => undefined);\n }}\n theme={theme}\n />\n </View>\n ) : null}\n <Text style={[styles.label, { color: theme.muted }]}>\n {live ? 'Publish the latest version' : 'Site address'}\n </Text>\n <View\n style={[\n styles.field,\n { backgroundColor: theme.chip, borderColor: valid ? theme.border : theme.crit },\n ]}\n >\n <TextInput\n value={name}\n onChangeText={(text) =>\n setName(\n text\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '')\n .slice(0, 58),\n )\n }\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder=\"my-site\"\n placeholderTextColor={theme.faint}\n style={[styles.input, { color: theme.ink }]}\n accessibilityLabel=\"Site name\"\n testID=\"webbuilder-publish-name\"\n />\n <Text style={[styles.suffix, { color: theme.muted }]}>.yarntra.com</Text>\n </View>\n {!valid && name ? (\n <Text style={[styles.help, { color: theme.crit }]}>\n Letters, numbers and dashes; it cannot start or end with a dash.\n </Text>\n ) : null}\n {error ? <Text style={[styles.help, { color: theme.crit }]}>{error}</Text> : null}\n <PrimaryButton\n label={live ? 'Publish update' : 'Publish'}\n icon=\"rocket-launch-outline\"\n onPress={() => {\n publish().catch(() => undefined);\n }}\n theme={theme}\n busy={starting}\n disabled={!valid || !onPublish}\n testID=\"webbuilder-publish-submit\"\n />\n </View>\n );\n }\n\n return (\n <Sheet visible={visible} title=\"Publish\" onClose={onClose} theme={theme} testID=\"webbuilder-publish-sheet\">\n {body}\n </Sheet>\n );\n}\n\nconst styles = StyleSheet.create({\n block: { gap: 12, paddingTop: 4 },\n row: { flexDirection: 'row', gap: 10 },\n liveCard: { flexDirection: 'row', alignItems: 'center', gap: 10, padding: 14, borderRadius: 12 },\n liveHost: { flex: 1, fontSize: 15, fontWeight: '700' },\n label: { fontSize: 13, fontWeight: '600', marginTop: 4 },\n field: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 14,\n minHeight: 48,\n },\n input: { flex: 1, fontSize: 16, paddingVertical: 10 },\n suffix: { fontSize: 15 },\n help: { fontSize: 13 },\n note: { fontSize: 14, lineHeight: 20, paddingVertical: 8 },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -36,11 +36,8 @@ function webbuilderAgentSuggestions(hasBuild, siteTitle) {
|
|
|
36
36
|
prompt: "Check the site for errors and fix anything broken."
|
|
37
37
|
}];
|
|
38
38
|
}
|
|
39
|
-
function wakePreviewPrompt(
|
|
40
|
-
|
|
41
|
-
return "The live preview is not responding. Restart the dev server for this site so the preview loads again.";
|
|
42
|
-
}
|
|
43
|
-
return [`The live preview of this site${build.title ? ` ("${build.title}")` : ""} is not responding`, build.previewUrl ? ` at ${build.previewUrl}` : "", build.sandboxId ? ` (sandbox ${build.sandboxId})` : "", ". Reconnect that sandbox and restart its dev server.", build.snapshotId ? ` If that sandbox is gone, boot from its latest restore point (snapshotId ${build.snapshotId}).` : " If the sandbox no longer exists, recreate the site in a new sandbox from its latest saved version.", " Then send me the preview link."].join("");
|
|
39
|
+
function wakePreviewPrompt() {
|
|
40
|
+
return "Open a live preview of my latest build.";
|
|
44
41
|
}
|
|
45
42
|
function agentEditNote(build) {
|
|
46
43
|
return `[Open build] The user is looking at the live preview of "${build.title || "this site"}" that you built${build.sandboxId ? ` (sandbox ${build.sandboxId}${build.previewUrl ? `, ${build.previewUrl}` : ""})` : ""}. Apply their request to that site in that sandbox - do not start a new one - and reply with the preview link.${build.snapshotId ? ` If that sandbox is gone, boot from its latest restore point (snapshotId ${build.snapshotId}).` : ""}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webbuilderPrompts.js","sources":["../../../src/features/webbuilder/webbuilderPrompts.ts"],"sourcesContent":["/**\n * Follow-ups for the Web Builder agent: the first asks of a site with nothing\n * built yet, and the edits people make most after a first build.\n */\nimport type { AgentChatSuggestion } from '../agent-chat';\n\n/**\n * Starter prompts in an empty chat (web `CHAT_STARTERS`, Lovable): complete briefs\n * that build on one tap - specific enough that the agent asks nothing.\n */\nexport const CHAT_STARTERS: readonly AgentChatSuggestion[] = [\n {\n id: 'cafe',\n label: 'Café website with menu',\n prompt: 'Build a website for a neighbourhood specialty coffee shop: hero, menu with prices, opening hours, location map and an Instagram-style gallery. Warm, modern look.',\n },\n {\n id: 'saas',\n label: 'SaaS landing page',\n prompt: 'Build a landing page for a project-management SaaS: hero with product screenshot, features, pricing (3 tiers), testimonials, FAQ and a sign-up call to action.',\n },\n {\n id: 'portfolio',\n label: 'Photographer portfolio',\n prompt: 'Build a portfolio for a wedding photographer: full-bleed gallery, about, packages with prices, and a contact form for booking enquiries. Elegant, minimal.',\n },\n {\n id: 'booking',\n label: 'Booking app with database',\n prompt: 'Build a booking app for a yoga studio: class schedule, book a spot (saved in a database), and an admin page listing bookings.',\n },\n];\n\nexport function webbuilderAgentSuggestions(hasBuild: boolean, siteTitle: string | null): AgentChatSuggestion[] {\n if (!hasBuild) return [...CHAT_STARTERS];\n const name = siteTitle ? ` on ${siteTitle}` : '';\n return [\n { id: 'mobile', label: 'Make it great on phones', prompt: `Make every page${name} look great on phones.` },\n { id: 'colors', label: 'New color scheme', prompt: 'Give the site a fresh, modern color scheme.' },\n { id: 'section', label: 'Add a section', prompt: 'Add a testimonials section above the footer.' },\n { id: 'fix', label: 'Fix what is broken', prompt: 'Check the site for errors and fix anything broken.' },\n ];\n}\n\ntype BuildRef = {\n title?: string;\n previewUrl: string | null;\n sandboxId: string | null;\n snapshotId?: string | null;\n};\n\n/**\n * Sent when the preview does not answer: the sandbox slept or was reclaimed (E2B
|
|
1
|
+
{"version":3,"file":"webbuilderPrompts.js","sources":["../../../src/features/webbuilder/webbuilderPrompts.ts"],"sourcesContent":["/**\n * Follow-ups for the Web Builder agent: the first asks of a site with nothing\n * built yet, and the edits people make most after a first build.\n */\nimport type { AgentChatSuggestion } from '../agent-chat';\n\n/**\n * Starter prompts in an empty chat (web `CHAT_STARTERS`, Lovable): complete briefs\n * that build on one tap - specific enough that the agent asks nothing.\n */\nexport const CHAT_STARTERS: readonly AgentChatSuggestion[] = [\n {\n id: 'cafe',\n label: 'Café website with menu',\n prompt: 'Build a website for a neighbourhood specialty coffee shop: hero, menu with prices, opening hours, location map and an Instagram-style gallery. Warm, modern look.',\n },\n {\n id: 'saas',\n label: 'SaaS landing page',\n prompt: 'Build a landing page for a project-management SaaS: hero with product screenshot, features, pricing (3 tiers), testimonials, FAQ and a sign-up call to action.',\n },\n {\n id: 'portfolio',\n label: 'Photographer portfolio',\n prompt: 'Build a portfolio for a wedding photographer: full-bleed gallery, about, packages with prices, and a contact form for booking enquiries. Elegant, minimal.',\n },\n {\n id: 'booking',\n label: 'Booking app with database',\n prompt: 'Build a booking app for a yoga studio: class schedule, book a spot (saved in a database), and an admin page listing bookings.',\n },\n];\n\nexport function webbuilderAgentSuggestions(hasBuild: boolean, siteTitle: string | null): AgentChatSuggestion[] {\n if (!hasBuild) return [...CHAT_STARTERS];\n const name = siteTitle ? ` on ${siteTitle}` : '';\n return [\n { id: 'mobile', label: 'Make it great on phones', prompt: `Make every page${name} look great on phones.` },\n { id: 'colors', label: 'New color scheme', prompt: 'Give the site a fresh, modern color scheme.' },\n { id: 'section', label: 'Add a section', prompt: 'Add a testimonials section above the footer.' },\n { id: 'fix', label: 'Fix what is broken', prompt: 'Check the site for errors and fix anything broken.' },\n ];\n}\n\ntype BuildRef = {\n title?: string;\n previewUrl: string | null;\n sandboxId: string | null;\n snapshotId?: string | null;\n};\n\n/**\n * Sent when the preview does not answer and the app could not bring it back\n * itself: the sandbox slept or was reclaimed (E2B sandboxes live about an hour\n * after the last change). The words are the web's (#428); the host's\n * `[Open build]` note names this build's sandbox and restore point, so the agent\n * reopens THIS site, booting the snapshot when the sandbox is gone.\n */\nexport function wakePreviewPrompt(): string {\n return 'Open a live preview of my latest build.';\n}\n\n/**\n * The note a change to an agent-chat build carries (web `agentEditForChat`): the\n * site lives in the agent's sandbox, so the change goes to that sandbox - never a\n * new one - with the restore point for when it expired.\n */\nexport function agentEditNote(build: BuildRef): string {\n return `[Open build] The user is looking at the live preview of \"${build.title || 'this site'}\" that you built${\n build.sandboxId ? ` (sandbox ${build.sandboxId}${build.previewUrl ? `, ${build.previewUrl}` : ''})` : ''\n }. Apply their request to that site in that sandbox - do not start a new one - and reply with the preview link.${\n build.snapshotId\n ? ` If that sandbox is gone, boot from its latest restore point (snapshotId ${build.snapshotId}).`\n : ''\n }`;\n}\n\n/** What Publish asks the agent for an agent-chat build (web `agentPublishMessage`). */\nexport function agentPublishMessage(build: BuildRef, projectName: string, customDomain?: string): string {\n return `Publish \"${build.title || 'this site'}\" as ${projectName}${customDomain ? ` on ${customDomain}` : ''}.`;\n}\n"],"names":[],"mappings":"AAUO,MAAM,gBAAgD,CAAC;AAAA,EAC5D,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,2BAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,mBAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,WAAA;AAAA,EACJ,KAAO,EAAA,wBAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA,2BAAA;AAAA,EACP,MAAQ,EAAA;AACV,CAAC;AACe,SAAA,0BAAA,CAA2B,UAAmB,SAAiD,EAAA;AAC7G,EAAA,IAAI,CAAC,QAAA,EAAiB,OAAA,CAAC,GAAG,aAAa,CAAA;AACvC,EAAA,MAAM,IAAO,GAAA,SAAA,GAAY,CAAO,IAAA,EAAA,SAAS,CAAK,CAAA,GAAA,EAAA;AAC9C,EAAA,OAAO,CAAC;AAAA,IACN,EAAI,EAAA,QAAA;AAAA,IACJ,KAAO,EAAA,yBAAA;AAAA,IACP,MAAA,EAAQ,kBAAkB,IAAI,CAAA,sBAAA;AAAA,GAC7B,EAAA;AAAA,IACD,EAAI,EAAA,QAAA;AAAA,IACJ,KAAO,EAAA,kBAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACP,EAAA;AAAA,IACD,EAAI,EAAA,SAAA;AAAA,IACJ,KAAO,EAAA,eAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACP,EAAA;AAAA,IACD,EAAI,EAAA,KAAA;AAAA,IACJ,KAAO,EAAA,oBAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACT,CAAA;AACH;AAeO,SAAS,iBAA4B,GAAA;AAC1C,EAAO,OAAA,yCAAA;AACT;AAOO,SAAS,cAAc,KAAyB,EAAA;AACrD,EAAO,OAAA,CAAA,yDAAA,EAA4D,KAAM,CAAA,KAAA,IAAS,WAAW,CAAA,gBAAA,EAAmB,KAAM,CAAA,SAAA,GAAY,CAAa,UAAA,EAAA,KAAA,CAAM,SAAS,CAAA,EAAG,KAAM,CAAA,UAAA,GAAa,CAAK,EAAA,EAAA,KAAA,CAAM,UAAU,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,8GAAA,EAAiH,KAAM,CAAA,UAAA,GAAa,CAA4E,yEAAA,EAAA,KAAA,CAAM,UAAU,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,CAAA;AACnc;AAGgB,SAAA,mBAAA,CAAoB,KAAiB,EAAA,WAAA,EAAqB,YAA+B,EAAA;AACvG,EAAO,OAAA,CAAA,SAAA,EAAY,KAAM,CAAA,KAAA,IAAS,WAAW,CAAA,KAAA,EAAQ,WAAW,CAAA,EAA0C,EAAE,CAAA,CAAA,CAAA;AAC9G"}
|
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {Feature}from'@common-stack/client-react';import YantraMobileModule from'./module.js';export{default as Home}from'./screens/Home/HomeScreen.js';export{default as NewChat}from'./screens/NewChat/index.js';export{default as Account}from'./screens/Account/index.js';export{default as ChatHistory}from'./screens/ChatHistory/index.js';export{default as Apps}from'./screens/Apps/index.js';export{default as WebBuilder}from'./screens/WebBuilder/index.js';export{GatewayContextProvider,useGatewayContext}from'./contexts/GatewayContext.js';export{CdecliConnectionProvider,useCdecliConnection}from'./contexts/CdecliConnectionContext.js';export{ChatLiveStreamEngine}from'./contexts/ChatLiveStreamContext.js';export{MemoryPressureResponder}from'./features/memory/MemoryPressureResponder.js';export{BUILTIN_MOBILE_GATEWAYS,MAX_CONCURRENT_TASKS,STORAGE_KEYS}from'./config/constants.js';export{config}from'./config/env-config.js';export{useCdecliAutoConnect}from'./hooks/useCdecliAutoConnect.js';export{useObtainSystemToken}from'./hooks/useObtainSystemToken.js';export{mintSurfaceSystemToken,resolveSurfaceCatalogBackend}from'./hooks/mintSurfaceSystemToken.js';export{buildCdecliTokenInjection,buildSurfaceGateRecoveryScript}from'./hooks/surfaceHandoffScript.js';export{isInstanceNotFoundError,useGatewayConnection}from'./hooks/useGatewayConnection.js';export{usePrerequisiteIds}from'./hooks/usePrerequisiteIds.js';export{useWorkspaceProvisioner}from'./hooks/useWorkspaceProvisioner.js';export{useGatewayRegistry}from'./hooks/useGatewayRegistry.js';export{agentSessionManager}from'./services/agentSessionManager.js';export{ensureGatewayApiKeys,resetGatewayApiKeyBridge}from'./services/gatewayApiKeyBridge.js';export{GatewayClient}from'./services/gatewayClient.js';export{BRIDGE_PROTOCOL_VERSION,BRIDGE_READY_ACTION,DEFAULT_BRIDGE_TIMEOUT_MS,DEFAULT_CHUNK_SIZE,MessageType}from'./bridge/types.js';export{WebViewManager}from'./bridge/WebViewManager.js';export{NativeWebViewBridge}from'./bridge/NativeWebViewBridge.js';export{TypedBridge}from'./bridge/TypedBridge.js';export{CancellableRequest}from'./bridge/CancellableRequest.js';export{ChunkedMessageHandler}from'./bridge/ChunkedMessageHandler.js';export{BridgeDebugger}from'./bridge/BridgeDebugger.js';export{WEB_BRIDGE_BOOTSTRAP}from'./bridge/webBridgeBootstrap.js';export{AuthenticatedFetch}from'./bridge/AuthenticatedFetch.js';export{AuthBridgeHandler}from'./bridge/handlers/AuthBridgeHandler.js';export{NavigationBridgeHandler}from'./bridge/handlers/NavigationBridgeHandler.js';export{AnalyticsBridgeHandler}from'./bridge/handlers/AnalyticsBridgeHandler.js';export{SURFACE_HOST_ACTIONS,SurfaceHostBridgeHandler}from'./bridge/handlers/SurfaceHostBridgeHandler.js';export{classifySurfaceNavigation}from'./bridge/surfaceLinkRouting.js';export{getPackagerHost,resolveMobileWebUrl}from'./bridge/resolveMobileWebUrl.js';export{YANTRA_LOADER_SIZE_COMPACT,YANTRA_LOADER_SIZE_DEFAULT,YantraBrandLoader}from'./components/YantraBrandLoader.js';export{default as CustomDrawer}from'./components/CustomDrawer.js';export{AppThemeProvider,useAppTheme}from'./theme/AppThemeProvider.js';export{InviteDeepLink}from'./features/invite/InviteDeepLink.js';export{ChatInviteDeepLink}from'./features/messaging/ChatInviteDeepLink.js';export{HealthSyncRunner}from'./features/health/HealthSyncRunner.js';export{FitnessWidgetRunner}from'./features/fitness-widgets/FitnessWidgetRunner.js';export{FitnessDeepLink}from'./features/fitness-widgets/FitnessDeepLink.js';export{inviteTokenFromUrl,isInviteUrl}from'./features/invite/inviteLink.js';export{isKeyboardControllerAvailable}from'./utils/keyboardController.js';export{getNativeCanvasExperience,getNativeCanvasViewer,preloadNativeCanvasExperience,registerCanvasExperiencePreload,registerNativeCanvasExperience,registerNativeCanvasViewer}from'./features/canvas/nativeViewerRegistry.js';export{getNativeCharactersExperience,registerNativeCharactersExperience}from'./features/characters/nativeCharactersRegistry.js';export{getNativeChatExperience,registerNativeChatExperience}from'./features/messaging/nativeChatRegistry.js';export{forgetChatPushToken,rememberChatPushToken}from'./features/messaging/chatPushToken.js';export{CHAT_NOTIFICATION_CONFIG_KEY,CHAT_NOTIFICATION_KEYS,chatPrefsFromSettings}from'./features/messaging/chatNotificationPrefs.js';export{settingsUriForAccount}from'./utils/cdecodeUri.js';export{getNativeShoppingExperience,preloadNativeShoppingExperience,registerNativeShoppingExperience,registerShoppingExperiencePreload}from'./features/shopping/nativeShoppingRegistry.js';export{getNativeTravelExperience,preloadNativeTravelExperience,registerNativeTravelExperience,registerTravelExperiencePreload}from'./features/travel/nativeTravelRegistry.js';export{getNativeJobSearchExperience,preloadNativeJobSearchExperience,registerJobSearchExperiencePreload,registerNativeJobSearchExperience}from'./features/job-search/nativeJobSearchRegistry.js';export{getNativeResumeExperience,preloadNativeResumeExperience,registerNativeResumeExperience,registerResumeExperiencePreload}from'./features/resume/nativeResumeRegistry.js';export{getNativeInboxExperience,preloadNativeInboxExperience,registerInboxExperiencePreload,registerNativeInboxExperience}from'./features/inbox/nativeInboxRegistry.js';export{getNativeStudyExperience,preloadNativeStudyExperience,registerNativeStudyExperience,registerStudyExperiencePreload}from'./features/study/nativeStudyRegistry.js';export{getNativeLocalServicesExperience,preloadNativeLocalServicesExperience,registerLocalServicesExperiencePreload,registerNativeLocalServicesExperience}from'./features/local-services/nativeLocalServicesRegistry.js';export{getNativeMoviesExperience,preloadNativeMoviesExperience,registerMoviesExperiencePreload,registerNativeMoviesExperience}from'./features/movies/nativeMoviesRegistry.js';export{getNativeExpensesExperience,preloadNativeExpensesExperience,registerExpensesExperiencePreload,registerNativeExpensesExperience}from'./features/expenses/nativeExpensesRegistry.js';export{getNativeWebBuilderExperience,preloadNativeWebBuilderExperience,registerNativeWebBuilderExperience,registerWebBuilderExperiencePreload}from'./features/webbuilder/nativeWebBuilderRegistry.js';export{NativeAgentChat}from'./features/agent-chat/NativeAgentChat.js';export{ChatLinkOpenerProvider}from'./features/links/ChatLinkOpenerProvider.js';export{resolveSurfaceAuthGraphqlUrl}from'./hooks/resolveSurfaceAuthGraphqlUrl.js';var index = new Feature(YantraMobileModule);export{index as default};//# sourceMappingURL=index.js.map
|
|
1
|
+
import {Feature}from'@common-stack/client-react';import YantraMobileModule from'./module.js';export{default as Home}from'./screens/Home/HomeScreen.js';export{default as NewChat}from'./screens/NewChat/index.js';export{default as Account}from'./screens/Account/index.js';export{default as ChatHistory}from'./screens/ChatHistory/index.js';export{default as Apps}from'./screens/Apps/index.js';export{default as WebBuilder}from'./screens/WebBuilder/index.js';export{GatewayContextProvider,useGatewayContext}from'./contexts/GatewayContext.js';export{CdecliConnectionProvider,useCdecliConnection}from'./contexts/CdecliConnectionContext.js';export{ChatLiveStreamEngine}from'./contexts/ChatLiveStreamContext.js';export{MemoryPressureResponder}from'./features/memory/MemoryPressureResponder.js';export{BUILTIN_MOBILE_GATEWAYS,MAX_CONCURRENT_TASKS,STORAGE_KEYS}from'./config/constants.js';export{config}from'./config/env-config.js';export{useCdecliAutoConnect}from'./hooks/useCdecliAutoConnect.js';export{useObtainSystemToken}from'./hooks/useObtainSystemToken.js';export{mintSurfaceSystemToken,resolveSurfaceCatalogBackend}from'./hooks/mintSurfaceSystemToken.js';export{buildCdecliTokenInjection,buildSurfaceGateRecoveryScript}from'./hooks/surfaceHandoffScript.js';export{isInstanceNotFoundError,useGatewayConnection}from'./hooks/useGatewayConnection.js';export{usePrerequisiteIds}from'./hooks/usePrerequisiteIds.js';export{useWorkspaceProvisioner}from'./hooks/useWorkspaceProvisioner.js';export{useGatewayRegistry}from'./hooks/useGatewayRegistry.js';export{agentSessionManager}from'./services/agentSessionManager.js';export{ensureGatewayApiKeys,resetGatewayApiKeyBridge}from'./services/gatewayApiKeyBridge.js';export{GatewayClient}from'./services/gatewayClient.js';export{BRIDGE_PROTOCOL_VERSION,BRIDGE_READY_ACTION,DEFAULT_BRIDGE_TIMEOUT_MS,DEFAULT_CHUNK_SIZE,MessageType}from'./bridge/types.js';export{WebViewManager}from'./bridge/WebViewManager.js';export{NativeWebViewBridge}from'./bridge/NativeWebViewBridge.js';export{TypedBridge}from'./bridge/TypedBridge.js';export{CancellableRequest}from'./bridge/CancellableRequest.js';export{ChunkedMessageHandler}from'./bridge/ChunkedMessageHandler.js';export{BridgeDebugger}from'./bridge/BridgeDebugger.js';export{WEB_BRIDGE_BOOTSTRAP}from'./bridge/webBridgeBootstrap.js';export{AuthenticatedFetch}from'./bridge/AuthenticatedFetch.js';export{AuthBridgeHandler}from'./bridge/handlers/AuthBridgeHandler.js';export{NavigationBridgeHandler}from'./bridge/handlers/NavigationBridgeHandler.js';export{AnalyticsBridgeHandler}from'./bridge/handlers/AnalyticsBridgeHandler.js';export{SURFACE_HOST_ACTIONS,SurfaceHostBridgeHandler}from'./bridge/handlers/SurfaceHostBridgeHandler.js';export{classifySurfaceNavigation}from'./bridge/surfaceLinkRouting.js';export{getPackagerHost,resolveMobileWebUrl}from'./bridge/resolveMobileWebUrl.js';export{YANTRA_LOADER_SIZE_COMPACT,YANTRA_LOADER_SIZE_DEFAULT,YantraBrandLoader}from'./components/YantraBrandLoader.js';export{default as CustomDrawer}from'./components/CustomDrawer.js';export{AppThemeProvider,useAppTheme}from'./theme/AppThemeProvider.js';export{InviteDeepLink}from'./features/invite/InviteDeepLink.js';export{ChatInviteDeepLink}from'./features/messaging/ChatInviteDeepLink.js';export{HealthSyncRunner}from'./features/health/HealthSyncRunner.js';export{startHealthBackgroundSync}from'./features/health/backgroundSync.js';export{FitnessWidgetRunner}from'./features/fitness-widgets/FitnessWidgetRunner.js';export{FitnessDeepLink}from'./features/fitness-widgets/FitnessDeepLink.js';export{inviteTokenFromUrl,isInviteUrl}from'./features/invite/inviteLink.js';export{isKeyboardControllerAvailable}from'./utils/keyboardController.js';export{getNativeCanvasExperience,getNativeCanvasViewer,preloadNativeCanvasExperience,registerCanvasExperiencePreload,registerNativeCanvasExperience,registerNativeCanvasViewer}from'./features/canvas/nativeViewerRegistry.js';export{getNativeCharactersExperience,registerNativeCharactersExperience}from'./features/characters/nativeCharactersRegistry.js';export{getNativeChatExperience,registerNativeChatExperience}from'./features/messaging/nativeChatRegistry.js';export{forgetChatPushToken,rememberChatPushToken}from'./features/messaging/chatPushToken.js';export{CHAT_NOTIFICATION_CONFIG_KEY,CHAT_NOTIFICATION_KEYS,chatPrefsFromSettings}from'./features/messaging/chatNotificationPrefs.js';export{settingsUriForAccount}from'./utils/cdecodeUri.js';export{getNativeShoppingExperience,preloadNativeShoppingExperience,registerNativeShoppingExperience,registerShoppingExperiencePreload}from'./features/shopping/nativeShoppingRegistry.js';export{getNativeTravelExperience,preloadNativeTravelExperience,registerNativeTravelExperience,registerTravelExperiencePreload}from'./features/travel/nativeTravelRegistry.js';export{getNativeJobSearchExperience,preloadNativeJobSearchExperience,registerJobSearchExperiencePreload,registerNativeJobSearchExperience}from'./features/job-search/nativeJobSearchRegistry.js';export{getNativeResumeExperience,preloadNativeResumeExperience,registerNativeResumeExperience,registerResumeExperiencePreload}from'./features/resume/nativeResumeRegistry.js';export{getNativeInboxExperience,preloadNativeInboxExperience,registerInboxExperiencePreload,registerNativeInboxExperience}from'./features/inbox/nativeInboxRegistry.js';export{getNativeStudyExperience,preloadNativeStudyExperience,registerNativeStudyExperience,registerStudyExperiencePreload}from'./features/study/nativeStudyRegistry.js';export{getNativeLocalServicesExperience,preloadNativeLocalServicesExperience,registerLocalServicesExperiencePreload,registerNativeLocalServicesExperience}from'./features/local-services/nativeLocalServicesRegistry.js';export{getNativeMoviesExperience,preloadNativeMoviesExperience,registerMoviesExperiencePreload,registerNativeMoviesExperience}from'./features/movies/nativeMoviesRegistry.js';export{getNativeExpensesExperience,preloadNativeExpensesExperience,registerExpensesExperiencePreload,registerNativeExpensesExperience}from'./features/expenses/nativeExpensesRegistry.js';export{getNativeWebBuilderExperience,preloadNativeWebBuilderExperience,registerNativeWebBuilderExperience,registerWebBuilderExperiencePreload}from'./features/webbuilder/nativeWebBuilderRegistry.js';export{NativeAgentChat}from'./features/agent-chat/NativeAgentChat.js';export{ChatLinkOpenerProvider}from'./features/links/ChatLinkOpenerProvider.js';export{resolveSurfaceAuthGraphqlUrl}from'./hooks/resolveSurfaceAuthGraphqlUrl.js';var index = new Feature(YantraMobileModule);export{index as default};//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { Feature } from '@common-stack/client-react';\nimport YantraMobileModule from './module';\n\nexport default new Feature(YantraMobileModule);\nexport * from './screens';\nexport { GatewayContextProvider, useGatewayContext } from './contexts/GatewayContext';\nexport { CdecliConnectionProvider, useCdecliConnection } from './contexts/CdecliConnectionContext';\nexport { ChatLiveStreamEngine } from './contexts/ChatLiveStreamContext';\nexport { MemoryPressureResponder } from './features/memory/MemoryPressureResponder';\nexport * from './config/constants';\nexport { config } from './config/env-config';\nexport { useCdecliAutoConnect } from './hooks/useCdecliAutoConnect';\nexport { useObtainSystemToken } from './hooks/useObtainSystemToken';\nexport {\n mintSurfaceSystemToken,\n resolveSurfaceCatalogBackend,\n resolveSurfaceAuthGraphqlUrl,\n} from './hooks/mintSurfaceSystemToken';\nexport { buildCdecliTokenInjection, buildSurfaceGateRecoveryScript } from './hooks/surfaceHandoffScript';\nexport { useGatewayConnection, isInstanceNotFoundError } from './hooks/useGatewayConnection';\nexport { usePrerequisiteIds } from './hooks/usePrerequisiteIds';\nexport { useWorkspaceProvisioner } from './hooks/useWorkspaceProvisioner';\nexport { useGatewayRegistry } from './hooks/useGatewayRegistry';\nexport * from './services';\nexport * from './bridge';\nexport {\n YantraBrandLoader,\n YANTRA_LOADER_SIZE_DEFAULT,\n YANTRA_LOADER_SIZE_COMPACT,\n} from './components/YantraBrandLoader';\nexport { default as CustomDrawer } from './components/CustomDrawer';\nexport { AppThemeProvider, useAppTheme } from './theme/AppThemeProvider';\n// Invite deep links. Mounted by the app at the root (see portable-devices/mobile\n// App.tsx) rather than routed to: the invitee has neither an org nor a session,\n// and every mobile route requires both.\nexport { InviteDeepLink } from './features/invite/InviteDeepLink';\nexport { ChatInviteDeepLink } from './features/messaging/ChatInviteDeepLink';\n// Apple Health / Health Connect sync. Mounted at the app root like the invite\n// handlers: it syncs on every return to the foreground, whatever screen is open.\nexport { HealthSyncRunner } from './features/health/HealthSyncRunner';\n// Fitness widgets (iOS): keeps the home / lock screen snapshot fresh, and opens the\n// Fitness surface when a widget or the workout Live Activity is tapped. Both at the root.\nexport { FitnessWidgetRunner } from './features/fitness-widgets/FitnessWidgetRunner';\nexport { FitnessDeepLink } from './features/fitness-widgets/FitnessDeepLink';\nexport { inviteTokenFromUrl, isInviteUrl } from './features/invite/inviteLink';\nexport { isKeyboardControllerAvailable } from './utils/keyboardController';\n// The canvas viewer seam. Exported from the index on purpose: the app (the MF\n// host) registers the federated viewer here and the CanvasBoard screen reads\n// it. Reachability from this entry is what makes rollup emit the registry as a\n// real shared module - as an internal-only file, `registerNativeCanvasViewer`\n// is never called inside the package, so rollup tree-shakes it and constant-\n// folds the screen down to its fallback branch.\nexport {\n registerNativeCanvasViewer,\n getNativeCanvasViewer,\n registerNativeCanvasExperience,\n getNativeCanvasExperience,\n registerCanvasExperiencePreload,\n preloadNativeCanvasExperience,\n} from './features/canvas/nativeViewerRegistry';\n// Characters seam - same reachability contract as the canvas registry above.\nexport {\n registerNativeCharactersExperience,\n getNativeCharactersExperience,\n} from './features/characters/nativeCharactersRegistry';\n// Chat seam - same reachability contract as the two registries above.\nexport { registerNativeChatExperience, getNativeChatExperience } from './features/messaging/nativeChatRegistry';\n// Chat push + notification preferences: the app (which owns expo-notifications and the\n// settings session) registers the token and serves the preferences through these.\nexport { rememberChatPushToken, forgetChatPushToken } from './features/messaging/chatPushToken';\nexport {\n CHAT_NOTIFICATION_CONFIG_KEY,\n CHAT_NOTIFICATION_KEYS,\n chatPrefsFromSettings,\n} from './features/messaging/chatNotificationPrefs';\nexport { settingsUriForAccount } from './utils/cdecodeUri';\nexport {\n registerNativeShoppingExperience,\n getNativeShoppingExperience,\n registerShoppingExperiencePreload,\n preloadNativeShoppingExperience,\n} from './features/shopping/nativeShoppingRegistry';\nexport type { ShoppingExperienceProps } from './features/shopping/ShoppingExperience';\nexport type { ShoppingHostChat } from './features/shopping/hostChat';\nexport {\n registerNativeTravelExperience,\n getNativeTravelExperience,\n registerTravelExperiencePreload,\n preloadNativeTravelExperience,\n} from './features/travel/nativeTravelRegistry';\nexport type { TravelExperienceProps } from './features/travel/TravelExperience';\nexport type { TravelHostChat } from './features/travel/hostChat';\nexport {\n registerNativeJobSearchExperience,\n getNativeJobSearchExperience,\n registerJobSearchExperiencePreload,\n preloadNativeJobSearchExperience,\n} from './features/job-search/nativeJobSearchRegistry';\nexport type { JobSearchExperienceProps } from './features/job-search/JobSearchExperience';\nexport type { JobSearchHostChat } from './features/job-search/hostChat';\nexport {\n registerNativeResumeExperience,\n getNativeResumeExperience,\n registerResumeExperiencePreload,\n preloadNativeResumeExperience,\n} from './features/resume/nativeResumeRegistry';\nexport type { ResumeExperienceProps } from './features/resume/ResumeExperience';\nexport type { ResumeHostChat } from './features/resume/hostChat';\nexport {\n registerNativeInboxExperience,\n getNativeInboxExperience,\n registerInboxExperiencePreload,\n preloadNativeInboxExperience,\n} from './features/inbox/nativeInboxRegistry';\nexport type { InboxExperienceProps } from './features/inbox/InboxExperience';\nexport type { InboxHostChat } from './features/inbox/hostChat';\nexport {\n registerNativeStudyExperience,\n getNativeStudyExperience,\n registerStudyExperiencePreload,\n preloadNativeStudyExperience,\n} from './features/study/nativeStudyRegistry';\nexport type { StudyExperienceProps } from './features/study/StudyExperience';\nexport type { StudyHostChat } from './features/study/hostChat';\nexport {\n registerNativeLocalServicesExperience,\n getNativeLocalServicesExperience,\n registerLocalServicesExperiencePreload,\n preloadNativeLocalServicesExperience,\n} from './features/local-services/nativeLocalServicesRegistry';\nexport type { LocalServicesExperienceProps } from './features/local-services/LocalServicesExperience';\nexport type { LocalServicesHostChat } from './features/local-services/hostChat';\nexport {\n registerNativeMoviesExperience,\n getNativeMoviesExperience,\n registerMoviesExperiencePreload,\n preloadNativeMoviesExperience,\n} from './features/movies/nativeMoviesRegistry';\nexport type { MoviesExperienceProps } from './features/movies/MoviesExperience';\nexport type { MoviesHostChat } from './features/movies/hostChat';\nexport {\n registerNativeExpensesExperience,\n getNativeExpensesExperience,\n registerExpensesExperiencePreload,\n preloadNativeExpensesExperience,\n} from './features/expenses/nativeExpensesRegistry';\nexport type { ExpensesExperienceProps } from './features/expenses/ExpensesExperience';\nexport type { ExpensesHostChat } from './features/expenses/hostChat';\nexport {\n registerNativeWebBuilderExperience,\n getNativeWebBuilderExperience,\n registerWebBuilderExperiencePreload,\n preloadNativeWebBuilderExperience,\n} from './features/webbuilder/nativeWebBuilderRegistry';\nexport type { WebBuilderExperienceProps } from './features/webbuilder/WebBuilderExperience';\nexport type { WebBuilderHostChat } from './features/webbuilder/hostChat';\nexport { NativeAgentChat } from './features/agent-chat';\nexport { ChatLinkOpenerProvider } from './features/links/ChatLinkOpenerProvider';\nexport type { AgentChatMessage, AgentChatSuggestion, NativeAgentChatProps } from './features/agent-chat';\nexport type {\n ChatHostServices,\n ChatViewer,\n FederatedChatProps,\n NativeChatExperienceProps,\n} from './features/messaging/chatHost';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { Feature } from '@common-stack/client-react';\nimport YantraMobileModule from './module';\n\nexport default new Feature(YantraMobileModule);\nexport * from './screens';\nexport { GatewayContextProvider, useGatewayContext } from './contexts/GatewayContext';\nexport { CdecliConnectionProvider, useCdecliConnection } from './contexts/CdecliConnectionContext';\nexport { ChatLiveStreamEngine } from './contexts/ChatLiveStreamContext';\nexport { MemoryPressureResponder } from './features/memory/MemoryPressureResponder';\nexport * from './config/constants';\nexport { config } from './config/env-config';\nexport { useCdecliAutoConnect } from './hooks/useCdecliAutoConnect';\nexport { useObtainSystemToken } from './hooks/useObtainSystemToken';\nexport {\n mintSurfaceSystemToken,\n resolveSurfaceCatalogBackend,\n resolveSurfaceAuthGraphqlUrl,\n} from './hooks/mintSurfaceSystemToken';\nexport { buildCdecliTokenInjection, buildSurfaceGateRecoveryScript } from './hooks/surfaceHandoffScript';\nexport { useGatewayConnection, isInstanceNotFoundError } from './hooks/useGatewayConnection';\nexport { usePrerequisiteIds } from './hooks/usePrerequisiteIds';\nexport { useWorkspaceProvisioner } from './hooks/useWorkspaceProvisioner';\nexport { useGatewayRegistry } from './hooks/useGatewayRegistry';\nexport * from './services';\nexport * from './bridge';\nexport {\n YantraBrandLoader,\n YANTRA_LOADER_SIZE_DEFAULT,\n YANTRA_LOADER_SIZE_COMPACT,\n} from './components/YantraBrandLoader';\nexport { default as CustomDrawer } from './components/CustomDrawer';\nexport { AppThemeProvider, useAppTheme } from './theme/AppThemeProvider';\n// Invite deep links. Mounted by the app at the root (see portable-devices/mobile\n// App.tsx) rather than routed to: the invitee has neither an org nor a session,\n// and every mobile route requires both.\nexport { InviteDeepLink } from './features/invite/InviteDeepLink';\nexport { ChatInviteDeepLink } from './features/messaging/ChatInviteDeepLink';\n// Apple Health / Health Connect sync. Mounted at the app root like the invite\n// handlers: it syncs on every return to the foreground, whatever screen is open.\nexport { HealthSyncRunner } from './features/health/HealthSyncRunner';\n// Apple Health while the app is closed: started once at launch, before anything renders.\nexport { startHealthBackgroundSync } from './features/health/backgroundSync';\n// Fitness widgets (iOS): keeps the home / lock screen snapshot fresh, and opens the\n// Fitness surface when a widget or the workout Live Activity is tapped. Both at the root.\nexport { FitnessWidgetRunner } from './features/fitness-widgets/FitnessWidgetRunner';\nexport { FitnessDeepLink } from './features/fitness-widgets/FitnessDeepLink';\nexport { inviteTokenFromUrl, isInviteUrl } from './features/invite/inviteLink';\nexport { isKeyboardControllerAvailable } from './utils/keyboardController';\n// The canvas viewer seam. Exported from the index on purpose: the app (the MF\n// host) registers the federated viewer here and the CanvasBoard screen reads\n// it. Reachability from this entry is what makes rollup emit the registry as a\n// real shared module - as an internal-only file, `registerNativeCanvasViewer`\n// is never called inside the package, so rollup tree-shakes it and constant-\n// folds the screen down to its fallback branch.\nexport {\n registerNativeCanvasViewer,\n getNativeCanvasViewer,\n registerNativeCanvasExperience,\n getNativeCanvasExperience,\n registerCanvasExperiencePreload,\n preloadNativeCanvasExperience,\n} from './features/canvas/nativeViewerRegistry';\n// Characters seam - same reachability contract as the canvas registry above.\nexport {\n registerNativeCharactersExperience,\n getNativeCharactersExperience,\n} from './features/characters/nativeCharactersRegistry';\n// Chat seam - same reachability contract as the two registries above.\nexport { registerNativeChatExperience, getNativeChatExperience } from './features/messaging/nativeChatRegistry';\n// Chat push + notification preferences: the app (which owns expo-notifications and the\n// settings session) registers the token and serves the preferences through these.\nexport { rememberChatPushToken, forgetChatPushToken } from './features/messaging/chatPushToken';\nexport {\n CHAT_NOTIFICATION_CONFIG_KEY,\n CHAT_NOTIFICATION_KEYS,\n chatPrefsFromSettings,\n} from './features/messaging/chatNotificationPrefs';\nexport { settingsUriForAccount } from './utils/cdecodeUri';\nexport {\n registerNativeShoppingExperience,\n getNativeShoppingExperience,\n registerShoppingExperiencePreload,\n preloadNativeShoppingExperience,\n} from './features/shopping/nativeShoppingRegistry';\nexport type { ShoppingExperienceProps } from './features/shopping/ShoppingExperience';\nexport type { ShoppingHostChat } from './features/shopping/hostChat';\nexport {\n registerNativeTravelExperience,\n getNativeTravelExperience,\n registerTravelExperiencePreload,\n preloadNativeTravelExperience,\n} from './features/travel/nativeTravelRegistry';\nexport type { TravelExperienceProps } from './features/travel/TravelExperience';\nexport type { TravelHostChat } from './features/travel/hostChat';\nexport {\n registerNativeJobSearchExperience,\n getNativeJobSearchExperience,\n registerJobSearchExperiencePreload,\n preloadNativeJobSearchExperience,\n} from './features/job-search/nativeJobSearchRegistry';\nexport type { JobSearchExperienceProps } from './features/job-search/JobSearchExperience';\nexport type { JobSearchHostChat } from './features/job-search/hostChat';\nexport {\n registerNativeResumeExperience,\n getNativeResumeExperience,\n registerResumeExperiencePreload,\n preloadNativeResumeExperience,\n} from './features/resume/nativeResumeRegistry';\nexport type { ResumeExperienceProps } from './features/resume/ResumeExperience';\nexport type { ResumeHostChat } from './features/resume/hostChat';\nexport {\n registerNativeInboxExperience,\n getNativeInboxExperience,\n registerInboxExperiencePreload,\n preloadNativeInboxExperience,\n} from './features/inbox/nativeInboxRegistry';\nexport type { InboxExperienceProps } from './features/inbox/InboxExperience';\nexport type { InboxHostChat } from './features/inbox/hostChat';\nexport {\n registerNativeStudyExperience,\n getNativeStudyExperience,\n registerStudyExperiencePreload,\n preloadNativeStudyExperience,\n} from './features/study/nativeStudyRegistry';\nexport type { StudyExperienceProps } from './features/study/StudyExperience';\nexport type { StudyHostChat } from './features/study/hostChat';\nexport {\n registerNativeLocalServicesExperience,\n getNativeLocalServicesExperience,\n registerLocalServicesExperiencePreload,\n preloadNativeLocalServicesExperience,\n} from './features/local-services/nativeLocalServicesRegistry';\nexport type { LocalServicesExperienceProps } from './features/local-services/LocalServicesExperience';\nexport type { LocalServicesHostChat } from './features/local-services/hostChat';\nexport {\n registerNativeMoviesExperience,\n getNativeMoviesExperience,\n registerMoviesExperiencePreload,\n preloadNativeMoviesExperience,\n} from './features/movies/nativeMoviesRegistry';\nexport type { MoviesExperienceProps } from './features/movies/MoviesExperience';\nexport type { MoviesHostChat } from './features/movies/hostChat';\nexport {\n registerNativeExpensesExperience,\n getNativeExpensesExperience,\n registerExpensesExperiencePreload,\n preloadNativeExpensesExperience,\n} from './features/expenses/nativeExpensesRegistry';\nexport type { ExpensesExperienceProps } from './features/expenses/ExpensesExperience';\nexport type { ExpensesHostChat } from './features/expenses/hostChat';\nexport {\n registerNativeWebBuilderExperience,\n getNativeWebBuilderExperience,\n registerWebBuilderExperiencePreload,\n preloadNativeWebBuilderExperience,\n} from './features/webbuilder/nativeWebBuilderRegistry';\nexport type { WebBuilderExperienceProps } from './features/webbuilder/WebBuilderExperience';\nexport type { WebBuilderHostChat } from './features/webbuilder/hostChat';\nexport { NativeAgentChat } from './features/agent-chat';\nexport { ChatLinkOpenerProvider } from './features/links/ChatLinkOpenerProvider';\nexport type { AgentChatMessage, AgentChatSuggestion, NativeAgentChatProps } from './features/agent-chat';\nexport type {\n ChatHostServices,\n ChatViewer,\n FederatedChatProps,\n NativeChatExperienceProps,\n} from './features/messaging/chatHost';\n"],"names":[],"mappings":"m3MAEA,YAAe,IAAI,QAAQ,kBAAkB,CAAA"}
|
|
@@ -33,7 +33,8 @@ function HealthScreen() {
|
|
|
33
33
|
granted,
|
|
34
34
|
running,
|
|
35
35
|
busy,
|
|
36
|
-
types
|
|
36
|
+
types,
|
|
37
|
+
backgroundAccess
|
|
37
38
|
} = snapshot;
|
|
38
39
|
const [now, setNow] = useState(() => Date.now());
|
|
39
40
|
const orgName = useMemo(() => {
|
|
@@ -137,6 +138,7 @@ function HealthScreen() {
|
|
|
137
138
|
var _a2;
|
|
138
139
|
return (_a2 = sync.needsAccessTypes) == null ? void 0 : _a2.includes(t.id);
|
|
139
140
|
});
|
|
141
|
+
const backgroundOff = sync.connected && backgroundAccess === false;
|
|
140
142
|
return /* @__PURE__ */ jsxs(SafeAreaView, { edges: ["top", "left", "right"], style: [styles.safe, {
|
|
141
143
|
backgroundColor: colors.bg
|
|
142
144
|
}], children: [
|
|
@@ -177,6 +179,7 @@ function HealthScreen() {
|
|
|
177
179
|
sync.lastError ? /* @__PURE__ */ jsx(Notice, { tone: "danger", colors, icon: "alert-circle", text: sync.lastError }) : null,
|
|
178
180
|
sync.connected && unreadable.length ? /* @__PURE__ */ jsx(Notice, { tone: "warning", colors, icon: "information-circle", text: `Could not read ${unreadable.map(labelOf).join(", ")} last time. Everything else synced.` }) : null,
|
|
179
181
|
sync.connected && needsAccess.length ? /* @__PURE__ */ jsx(Notice, { tone: "info", colors, icon: "add-circle", text: `Yantra can now also read ${needsAccess.map((t) => t.label).join(", ")}. Tap Sync now to allow ${needsAccess.length === 1 ? "it" : "them"}.` }) : null,
|
|
182
|
+
backgroundOff && !sync.backgroundAskedAt ? /* @__PURE__ */ jsx(Notice, { tone: "info", colors, icon: "add-circle", text: "Yantra can now sync while it is closed. Tap Sync now to allow it." }) : null,
|
|
180
183
|
/* @__PURE__ */ jsx(View, { style: styles.actions, children: renderActions() }),
|
|
181
184
|
/* @__PURE__ */ jsx(Text, { style: [styles.sectionTitle, {
|
|
182
185
|
color: colors.textMuted
|
|
@@ -202,7 +205,7 @@ function HealthScreen() {
|
|
|
202
205
|
color: colors.textMuted
|
|
203
206
|
}], children: [
|
|
204
207
|
IS_IOS ? "Apple Health does not tell apps which types you allowed; types you turned off are left out. " : "",
|
|
205
|
-
|
|
208
|
+
describeCadence(backgroundAccess, backgroundOff && Boolean(sync.backgroundAskedAt))
|
|
206
209
|
] }),
|
|
207
210
|
/* @__PURE__ */ jsx(Text, { style: [styles.sectionTitle, {
|
|
208
211
|
color: colors.textMuted
|
|
@@ -293,6 +296,13 @@ function describeStatus(loaded, running, connected) {
|
|
|
293
296
|
if (running) return "Syncing...";
|
|
294
297
|
return connected ? "Connected" : "Off";
|
|
295
298
|
}
|
|
299
|
+
function describeCadence(backgroundAccess, howToAllow) {
|
|
300
|
+
const first = "The last 30 days sync first, then";
|
|
301
|
+
if (IS_IOS) return `${first} new data as your watch saves it, even while Yantra is closed.`;
|
|
302
|
+
if (backgroundAccess) return `${first} new data about every hour, even while Yantra is closed.`;
|
|
303
|
+
const onOpen = `${first} new days each time you open Yantra.`;
|
|
304
|
+
return howToAllow ? `${onOpen} To also sync while it is closed, allow background access under Choose what Yantra reads.` : onOpen;
|
|
305
|
+
}
|
|
296
306
|
function typeState(connected, granted, id) {
|
|
297
307
|
if (!connected) return "idle";
|
|
298
308
|
if (granted === null || granted === void 0) return "requested";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/screens/Health/index.tsx"],"sourcesContent":["/**\n * Health: connect Apple Health (iOS) or Health Connect (Android) so the\n * fitness coach gets Sleep, Recovery and Strain from real data. Shows what\n * is shared, when it last synced, how many days, and any problem in plain\n * words. Reached from Account. Same grouped-card layout as the Account screen.\n */\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ActivityIndicator, Alert, Linking, Platform, Pressable, ScrollView, StyleSheet, View } from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { CommonActions, useFocusEffect, useNavigation, useRoute } 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 { healthSyncStore, useHealthSync } from '../../features/health/healthSync';\nimport { HEALTH_DATA_TYPES, labelOf, type HealthDataType } from '../../features/health/reader';\nimport { formatDaysSynced, formatLastSync } from '../../features/health/format';\nimport { openHealthConnectInstall } from '../../features/health/healthConnectLinks';\nimport { useDevices } from '../../features/devices/devices';\n\nconst IS_IOS = Platform.OS === 'ios';\nconst STORE_NAME = IS_IOS ? 'Apple Health' : 'Health Connect';\n\nexport default function HealthScreen() {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const { isDark } = useAppTheme();\n const colors = mobileColors(isDark);\n const insets = useSafeAreaInsets();\n const snapshot = useHealthSync();\n const devices = useDevices();\n const { sync, availability, granted, running, busy, types } = snapshot;\n const [now, setNow] = useState(() => Date.now());\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 useFocusEffect(\n useCallback(() => {\n void healthSyncStore.refreshStatus();\n setNow(Date.now());\n }, []),\n );\n\n // Keep \"5 min ago\" honest while the screen is open.\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 30_000);\n return () => clearInterval(timer);\n }, []);\n\n const handleBack = useCallback(() => {\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return;\n }\n navigation?.dispatch?.(\n CommonActions.navigate({ name: 'MainStack.Account', params: orgName ? { orgName } : undefined }),\n );\n }, [navigation, orgName]);\n\n const openDevices = useCallback(() => {\n navigation?.navigate?.('MainStack.Devices', orgName ? { orgName } : undefined);\n }, [navigation, orgName]);\n\n const handleConnect = useCallback(async () => {\n const ok = await healthSyncStore.connect();\n if (!ok && healthSyncStore.getSnapshot().availability?.status === 'available') {\n const message = healthSyncStore.getSnapshot().sync.lastError;\n if (message) Alert.alert(`Could not connect ${STORE_NAME}`, message);\n }\n }, []);\n\n const handleSyncNow = useCallback(() => {\n void healthSyncStore.syncNow({ interactive: true });\n }, []);\n\n const handleInstall = useCallback(async () => {\n try {\n await openHealthConnectInstall();\n } catch {\n Alert.alert('Could not open Google Play', 'Search for \"Health Connect\" in Google Play to install it.');\n }\n }, []);\n\n const handleManageAccess = useCallback(() => {\n if (IS_IOS) {\n Alert.alert(\n 'Choose what Yantra reads',\n 'Open the Health app, tap your profile picture, then Apps > Yantra, and turn data types on or off.',\n [\n { text: 'Not now', style: 'cancel' },\n {\n text: 'Open Health',\n onPress: () => void Linking.openURL('x-apple-health://').catch(() => undefined),\n },\n ],\n );\n return;\n }\n void healthSyncStore.openStoreSettings().then((opened) => {\n if (!opened) Alert.alert('Could not open Health Connect', 'Open Health Connect from your phone settings.');\n });\n }, []);\n\n const runDisconnect = useCallback(async (deleteData: boolean) => {\n const res = await healthSyncStore.disconnect({ deleteData });\n if (!res.ok) {\n Alert.alert('Could not disconnect', res.message ?? 'Please try again.');\n return;\n }\n if (IS_IOS) {\n Alert.alert(\n 'Sync stopped',\n 'Yantra no longer reads Apple Health. To remove its access completely, open the Health app > Apps > Yantra.',\n );\n }\n }, []);\n\n const handleDisconnect = useCallback(() => {\n Alert.alert(\n `Disconnect ${STORE_NAME}?`,\n 'Yantra stops reading your health data. Your coach keeps what was already synced unless you delete it.',\n [\n { text: 'Cancel', style: 'cancel' },\n { text: 'Stop syncing', onPress: () => void runDisconnect(false) },\n { text: 'Stop and delete synced data', style: 'destructive', onPress: () => void runDisconnect(true) },\n ],\n );\n }, [runDisconnect]);\n\n const statusLabel = describeStatus(snapshot.loaded, running, sync.connected);\n\n // Only what this phone's health store is read for (no \"Not allowed\" for a type it does not have).\n const listed = types ? HEALTH_DATA_TYPES.filter((t) => types.includes(t.id)) : HEALTH_DATA_TYPES;\n const notGranted = granted ? listed.filter((t) => !granted.includes(t.id)) : [];\n const unreadable = (sync.unreadableTypes ?? []).filter((t) => !notGranted.some((n) => n.id === t));\n const needsAccess = listed.filter((t) => sync.needsAccessTypes?.includes(t.id));\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={handleBack}\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 }]}>Health</Text>\n <View style={styles.headerSpacer} />\n </View>\n\n <ScrollView contentContainerStyle={styles.scroll}>\n <View style={styles.hero}>\n <View style={[styles.heroIcon, { backgroundColor: colors.primarySoft }]}>\n <Ionicons name=\"heart\" size={30} color={colors.primary} />\n </View>\n <Text style={[styles.heroTitle, { color: colors.text }]}>{STORE_NAME}</Text>\n <Text style={[styles.heroBody, { color: colors.textMuted }]}>\n Yantra reads your sleep, heart rate, activity and body measurements so your fitness coach can\n score your Sleep, Recovery and Strain each day and follow your weight. It saves only the\n measurements it takes from devices you pair in Yantra.\n </Text>\n </View>\n\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n <Row label=\"Status\" value={statusLabel} colors={colors} />\n <Divider color={colors.border} />\n <Row label=\"Last sync\" value={formatLastSync(sync.lastSyncAt, now)} colors={colors} />\n <Divider color={colors.border} />\n <Row label=\"Days synced\" value={formatDaysSynced(sync.syncedDates.length)} colors={colors} />\n </View>\n\n {sync.lastError ? (\n <Notice tone=\"danger\" colors={colors} icon=\"alert-circle\" text={sync.lastError} />\n ) : null}\n {sync.connected && unreadable.length ? (\n <Notice\n tone=\"warning\"\n colors={colors}\n icon=\"information-circle\"\n text={`Could not read ${unreadable.map(labelOf).join(', ')} last time. Everything else synced.`}\n />\n ) : null}\n {sync.connected && needsAccess.length ? (\n <Notice\n tone=\"info\"\n colors={colors}\n icon=\"add-circle\"\n text={`Yantra can now also read ${needsAccess.map((t) => t.label).join(', ')}. Tap Sync now to allow ${needsAccess.length === 1 ? 'it' : 'them'}.`}\n />\n ) : null}\n\n <View style={styles.actions}>{renderActions()}</View>\n\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>DATA YANTRA READS</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {listed.map((t, i) => {\n const state = typeState(sync.connected, granted, t.id);\n return (\n <React.Fragment key={t.id}>\n {i > 0 ? <Divider color={colors.border} /> : null}\n <View style={styles.row}>\n <Text style={[styles.typeLabel, { color: colors.text }]}>{t.label}</Text>\n {state === 'allowed' ? (\n <Ionicons name=\"checkmark-circle\" size={20} color={colors.successText} />\n ) : null}\n {state === 'off' ? (\n <Text style={[styles.rowValue, { color: colors.textMuted }]}>Not allowed</Text>\n ) : null}\n </View>\n </React.Fragment>\n );\n })}\n </View>\n <Text style={[styles.footnote, { color: colors.textMuted }]}>\n {IS_IOS\n ? 'Apple Health does not tell apps which types you allowed; types you turned off are left out. '\n : ''}\n The last 30 days sync first, then new days each time you open Yantra.\n </Text>\n\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>DEVICES</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n <Pressable\n onPress={openDevices}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Bluetooth devices\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n <Text style={[styles.rowLabelWide, { color: colors.text }]}>Bluetooth devices</Text>\n <Text style={[styles.rowValueShort, { color: colors.textMuted }]}>\n {devices.loaded ? (devices.devices.length ? String(devices.devices.length) : 'None') : ''}\n </Text>\n <Ionicons name=\"chevron-forward\" size={16} color={isDark ? '#64748b' : '#c4c4c4'} />\n </Pressable>\n </View>\n <Text style={[styles.footnote, { color: colors.textMuted }]}>\n A scale, blood-pressure monitor or heart-rate strap you pair in Yantra sends its readings to your\n coach, and Yantra saves them to {STORE_NAME} too. Nothing else is ever written to {STORE_NAME}.\n </Text>\n </ScrollView>\n </SafeAreaView>\n );\n\n function renderActions() {\n if (!snapshot.loaded || (!availability && !sync.connected)) {\n return <ActivityIndicator color={colors.primary} />;\n }\n if (!sync.connected) {\n if (availability?.status === 'not-installed') {\n return (\n <>\n <Text style={[styles.actionHint, { color: colors.textMuted }]}>\n Health Connect is not installed on this phone. Install it from Google Play, then come back\n to connect.\n </Text>\n <PrimaryButton label=\"Install Health Connect\" onPress={handleInstall} />\n </>\n );\n }\n if (availability?.status === 'needs-update') {\n return (\n <>\n <Text style={[styles.actionHint, { color: colors.textMuted }]}>\n Health Connect needs an update before Yantra can use it.\n </Text>\n <PrimaryButton label=\"Update Health Connect\" onPress={handleInstall} />\n </>\n );\n }\n if (availability?.status === 'unsupported') {\n return <Text style={[styles.actionHint, { color: colors.textMuted }]}>{availability.reason}</Text>;\n }\n return (\n <PrimaryButton\n label={`Connect ${STORE_NAME}`}\n loading={busy === 'connecting'}\n onPress={() => void handleConnect()}\n />\n );\n }\n return (\n <>\n <PrimaryButton label=\"Sync now\" loading={running} onPress={handleSyncNow} />\n <View style={[styles.card, styles.secondaryCard, { backgroundColor: colors.surface }]}>\n <Pressable\n onPress={handleManageAccess}\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n <Text style={[styles.rowLabelWide, { color: colors.text }]}>Choose what Yantra reads</Text>\n <Ionicons name=\"chevron-forward\" size={16} color={isDark ? '#64748b' : '#c4c4c4'} />\n </Pressable>\n <Divider color={colors.border} />\n <Pressable\n onPress={handleDisconnect}\n disabled={busy === 'disconnecting'}\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n {busy === 'disconnecting' ? (\n <ActivityIndicator color={colors.dangerText} />\n ) : (\n <Text style={[styles.rowLabelWide, { color: colors.dangerText }]}>Disconnect</Text>\n )}\n </Pressable>\n </View>\n </>\n );\n }\n}\n\ntype Colors = ReturnType<typeof mobileColors>;\n\nfunction describeStatus(loaded: boolean, running: boolean, connected: boolean): string {\n if (!loaded) return ' ';\n if (running) return 'Syncing...';\n return connected ? 'Connected' : 'Off';\n}\n\n/** Android reports grants per type; Apple Health does not (null). */\nfunction typeState(\n connected: boolean,\n granted: HealthDataType[] | null | undefined,\n id: HealthDataType,\n): 'idle' | 'requested' | 'allowed' | 'off' {\n if (!connected) return 'idle';\n if (granted === null || granted === undefined) return 'requested';\n return granted.includes(id) ? 'allowed' : 'off';\n}\n\nfunction Row({ label, value, colors }: { label: string; value: string; colors: Colors }) {\n return (\n <View style={styles.row}>\n <Text style={[styles.rowLabel, { color: colors.text }]}>{label}</Text>\n <Text style={[styles.rowValue, { color: colors.textMuted }]} numberOfLines={1}>\n {value}\n </Text>\n </View>\n );\n}\n\nfunction Divider({ color }: { color: string }) {\n return <View style={[styles.rowLine, { backgroundColor: color }]} />;\n}\n\nfunction Notice({\n tone,\n colors,\n icon,\n text,\n}: {\n tone: 'danger' | 'warning' | 'info';\n colors: Colors;\n icon: keyof typeof Ionicons.glyphMap;\n text: string;\n}) {\n const bg = { danger: colors.dangerSoft, warning: colors.warningSoft, info: colors.primarySoft }[tone];\n const fg = { danger: colors.dangerText, warning: colors.warningText, info: colors.primary }[tone];\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, loading }: { label: string; onPress: () => void; loading?: boolean }) {\n return (\n <Pressable\n onPress={onPress}\n disabled={loading}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={({ pressed }) => [styles.primary, (pressed || loading) && styles.pressed]}\n >\n {loading ? <ActivityIndicator color=\"#fff\" /> : <Text style={styles.primaryLabel}>{label}</Text>}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n safe: { flex: 1 },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingBottom: 8,\n minHeight: 52,\n },\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' },\n headerSpacer: { width: 40, height: 40 },\n pressed: { opacity: 0.72 },\n scroll: { paddingHorizontal: 16, paddingBottom: 40 },\n hero: { alignItems: 'center', paddingTop: 8, paddingBottom: 24, gap: 10 },\n heroIcon: { width: 64, height: 64, borderRadius: 32, alignItems: 'center', justifyContent: 'center' },\n heroTitle: { fontSize: 20, fontWeight: '700' },\n heroBody: { fontSize: 15, lineHeight: 21, textAlign: 'center', paddingHorizontal: 8 },\n card: { borderRadius: 16, overflow: 'hidden' },\n secondaryCard: { marginTop: 12, alignSelf: 'stretch' },\n row: { flexDirection: 'row', alignItems: 'center', minHeight: 52, paddingHorizontal: 16, gap: 12 },\n rowLabel: { fontSize: 16, width: 110 },\n rowLabelWide: { flex: 1, fontSize: 16 },\n typeLabel: { flex: 1, fontSize: 16 },\n rowValue: { flex: 1, fontSize: 16, textAlign: 'right' },\n rowValueShort: { fontSize: 16 },\n rowLine: { height: StyleSheet.hairlineWidth, marginLeft: 16 },\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, alignItems: 'stretch' },\n actionHint: { fontSize: 15, lineHeight: 21, textAlign: 'center', marginBottom: 12 },\n primary: {\n backgroundColor: mobileTokens.color.primary,\n borderRadius: 14,\n minHeight: 50,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 18,\n },\n primaryLabel: { color: '#fff', fontSize: 16, fontWeight: '600' },\n sectionTitle: {\n fontSize: 13,\n fontWeight: '600',\n letterSpacing: 0.4,\n marginTop: 28,\n marginBottom: 8,\n marginLeft: 16,\n },\n footnote: { fontSize: 13, lineHeight: 18, marginTop: 8, marginHorizontal: 16 },\n});\n"],"names":["_a","_b","React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/screens/Health/index.tsx"],"sourcesContent":["/**\n * Health: connect Apple Health (iOS) or Health Connect (Android) so the\n * fitness coach gets Sleep, Recovery and Strain from real data. Shows what\n * is shared, when it last synced, how many days, and any problem in plain\n * words. Reached from Account. Same grouped-card layout as the Account screen.\n */\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ActivityIndicator, Alert, Linking, Platform, Pressable, ScrollView, StyleSheet, View } from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { CommonActions, useFocusEffect, useNavigation, useRoute } 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 { healthSyncStore, useHealthSync } from '../../features/health/healthSync';\nimport { HEALTH_DATA_TYPES, labelOf, type HealthDataType } from '../../features/health/reader';\nimport { formatDaysSynced, formatLastSync } from '../../features/health/format';\nimport { openHealthConnectInstall } from '../../features/health/healthConnectLinks';\nimport { useDevices } from '../../features/devices/devices';\n\nconst IS_IOS = Platform.OS === 'ios';\nconst STORE_NAME = IS_IOS ? 'Apple Health' : 'Health Connect';\n\nexport default function HealthScreen() {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const { isDark } = useAppTheme();\n const colors = mobileColors(isDark);\n const insets = useSafeAreaInsets();\n const snapshot = useHealthSync();\n const devices = useDevices();\n const { sync, availability, granted, running, busy, types, backgroundAccess } = snapshot;\n const [now, setNow] = useState(() => Date.now());\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 useFocusEffect(\n useCallback(() => {\n void healthSyncStore.refreshStatus();\n setNow(Date.now());\n }, []),\n );\n\n // Keep \"5 min ago\" honest while the screen is open.\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 30_000);\n return () => clearInterval(timer);\n }, []);\n\n const handleBack = useCallback(() => {\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return;\n }\n navigation?.dispatch?.(\n CommonActions.navigate({ name: 'MainStack.Account', params: orgName ? { orgName } : undefined }),\n );\n }, [navigation, orgName]);\n\n const openDevices = useCallback(() => {\n navigation?.navigate?.('MainStack.Devices', orgName ? { orgName } : undefined);\n }, [navigation, orgName]);\n\n const handleConnect = useCallback(async () => {\n const ok = await healthSyncStore.connect();\n if (!ok && healthSyncStore.getSnapshot().availability?.status === 'available') {\n const message = healthSyncStore.getSnapshot().sync.lastError;\n if (message) Alert.alert(`Could not connect ${STORE_NAME}`, message);\n }\n }, []);\n\n const handleSyncNow = useCallback(() => {\n void healthSyncStore.syncNow({ interactive: true });\n }, []);\n\n const handleInstall = useCallback(async () => {\n try {\n await openHealthConnectInstall();\n } catch {\n Alert.alert('Could not open Google Play', 'Search for \"Health Connect\" in Google Play to install it.');\n }\n }, []);\n\n const handleManageAccess = useCallback(() => {\n if (IS_IOS) {\n Alert.alert(\n 'Choose what Yantra reads',\n 'Open the Health app, tap your profile picture, then Apps > Yantra, and turn data types on or off.',\n [\n { text: 'Not now', style: 'cancel' },\n {\n text: 'Open Health',\n onPress: () => void Linking.openURL('x-apple-health://').catch(() => undefined),\n },\n ],\n );\n return;\n }\n void healthSyncStore.openStoreSettings().then((opened) => {\n if (!opened) Alert.alert('Could not open Health Connect', 'Open Health Connect from your phone settings.');\n });\n }, []);\n\n const runDisconnect = useCallback(async (deleteData: boolean) => {\n const res = await healthSyncStore.disconnect({ deleteData });\n if (!res.ok) {\n Alert.alert('Could not disconnect', res.message ?? 'Please try again.');\n return;\n }\n if (IS_IOS) {\n Alert.alert(\n 'Sync stopped',\n 'Yantra no longer reads Apple Health. To remove its access completely, open the Health app > Apps > Yantra.',\n );\n }\n }, []);\n\n const handleDisconnect = useCallback(() => {\n Alert.alert(\n `Disconnect ${STORE_NAME}?`,\n 'Yantra stops reading your health data. Your coach keeps what was already synced unless you delete it.',\n [\n { text: 'Cancel', style: 'cancel' },\n { text: 'Stop syncing', onPress: () => void runDisconnect(false) },\n { text: 'Stop and delete synced data', style: 'destructive', onPress: () => void runDisconnect(true) },\n ],\n );\n }, [runDisconnect]);\n\n const statusLabel = describeStatus(snapshot.loaded, running, sync.connected);\n\n // Only what this phone's health store is read for (no \"Not allowed\" for a type it does not have).\n const listed = types ? HEALTH_DATA_TYPES.filter((t) => types.includes(t.id)) : HEALTH_DATA_TYPES;\n const notGranted = granted ? listed.filter((t) => !granted.includes(t.id)) : [];\n const unreadable = (sync.unreadableTypes ?? []).filter((t) => !notGranted.some((n) => n.id === t));\n const needsAccess = listed.filter((t) => sync.needsAccessTypes?.includes(t.id));\n // Health Connect only: reading while Yantra is closed is a permission of its own.\n const backgroundOff = sync.connected && backgroundAccess === false;\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={handleBack}\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 }]}>Health</Text>\n <View style={styles.headerSpacer} />\n </View>\n\n <ScrollView contentContainerStyle={styles.scroll}>\n <View style={styles.hero}>\n <View style={[styles.heroIcon, { backgroundColor: colors.primarySoft }]}>\n <Ionicons name=\"heart\" size={30} color={colors.primary} />\n </View>\n <Text style={[styles.heroTitle, { color: colors.text }]}>{STORE_NAME}</Text>\n <Text style={[styles.heroBody, { color: colors.textMuted }]}>\n Yantra reads your sleep, heart rate, activity and body measurements so your fitness coach can\n score your Sleep, Recovery and Strain each day and follow your weight. It saves only the\n measurements it takes from devices you pair in Yantra.\n </Text>\n </View>\n\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n <Row label=\"Status\" value={statusLabel} colors={colors} />\n <Divider color={colors.border} />\n <Row label=\"Last sync\" value={formatLastSync(sync.lastSyncAt, now)} colors={colors} />\n <Divider color={colors.border} />\n <Row label=\"Days synced\" value={formatDaysSynced(sync.syncedDates.length)} colors={colors} />\n </View>\n\n {sync.lastError ? (\n <Notice tone=\"danger\" colors={colors} icon=\"alert-circle\" text={sync.lastError} />\n ) : null}\n {sync.connected && unreadable.length ? (\n <Notice\n tone=\"warning\"\n colors={colors}\n icon=\"information-circle\"\n text={`Could not read ${unreadable.map(labelOf).join(', ')} last time. Everything else synced.`}\n />\n ) : null}\n {sync.connected && needsAccess.length ? (\n <Notice\n tone=\"info\"\n colors={colors}\n icon=\"add-circle\"\n text={`Yantra can now also read ${needsAccess.map((t) => t.label).join(', ')}. Tap Sync now to allow ${needsAccess.length === 1 ? 'it' : 'them'}.`}\n />\n ) : null}\n {backgroundOff && !sync.backgroundAskedAt ? (\n <Notice\n tone=\"info\"\n colors={colors}\n icon=\"add-circle\"\n text=\"Yantra can now sync while it is closed. Tap Sync now to allow it.\"\n />\n ) : null}\n\n <View style={styles.actions}>{renderActions()}</View>\n\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>DATA YANTRA READS</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n {listed.map((t, i) => {\n const state = typeState(sync.connected, granted, t.id);\n return (\n <React.Fragment key={t.id}>\n {i > 0 ? <Divider color={colors.border} /> : null}\n <View style={styles.row}>\n <Text style={[styles.typeLabel, { color: colors.text }]}>{t.label}</Text>\n {state === 'allowed' ? (\n <Ionicons name=\"checkmark-circle\" size={20} color={colors.successText} />\n ) : null}\n {state === 'off' ? (\n <Text style={[styles.rowValue, { color: colors.textMuted }]}>Not allowed</Text>\n ) : null}\n </View>\n </React.Fragment>\n );\n })}\n </View>\n <Text style={[styles.footnote, { color: colors.textMuted }]}>\n {IS_IOS\n ? 'Apple Health does not tell apps which types you allowed; types you turned off are left out. '\n : ''}\n {describeCadence(backgroundAccess, backgroundOff && Boolean(sync.backgroundAskedAt))}\n </Text>\n\n <Text style={[styles.sectionTitle, { color: colors.textMuted }]}>DEVICES</Text>\n <View style={[styles.card, { backgroundColor: colors.surface }]}>\n <Pressable\n onPress={openDevices}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Bluetooth devices\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n <Text style={[styles.rowLabelWide, { color: colors.text }]}>Bluetooth devices</Text>\n <Text style={[styles.rowValueShort, { color: colors.textMuted }]}>\n {devices.loaded ? (devices.devices.length ? String(devices.devices.length) : 'None') : ''}\n </Text>\n <Ionicons name=\"chevron-forward\" size={16} color={isDark ? '#64748b' : '#c4c4c4'} />\n </Pressable>\n </View>\n <Text style={[styles.footnote, { color: colors.textMuted }]}>\n A scale, blood-pressure monitor or heart-rate strap you pair in Yantra sends its readings to your\n coach, and Yantra saves them to {STORE_NAME} too. Nothing else is ever written to {STORE_NAME}.\n </Text>\n </ScrollView>\n </SafeAreaView>\n );\n\n function renderActions() {\n if (!snapshot.loaded || (!availability && !sync.connected)) {\n return <ActivityIndicator color={colors.primary} />;\n }\n if (!sync.connected) {\n if (availability?.status === 'not-installed') {\n return (\n <>\n <Text style={[styles.actionHint, { color: colors.textMuted }]}>\n Health Connect is not installed on this phone. Install it from Google Play, then come back\n to connect.\n </Text>\n <PrimaryButton label=\"Install Health Connect\" onPress={handleInstall} />\n </>\n );\n }\n if (availability?.status === 'needs-update') {\n return (\n <>\n <Text style={[styles.actionHint, { color: colors.textMuted }]}>\n Health Connect needs an update before Yantra can use it.\n </Text>\n <PrimaryButton label=\"Update Health Connect\" onPress={handleInstall} />\n </>\n );\n }\n if (availability?.status === 'unsupported') {\n return <Text style={[styles.actionHint, { color: colors.textMuted }]}>{availability.reason}</Text>;\n }\n return (\n <PrimaryButton\n label={`Connect ${STORE_NAME}`}\n loading={busy === 'connecting'}\n onPress={() => void handleConnect()}\n />\n );\n }\n return (\n <>\n <PrimaryButton label=\"Sync now\" loading={running} onPress={handleSyncNow} />\n <View style={[styles.card, styles.secondaryCard, { backgroundColor: colors.surface }]}>\n <Pressable\n onPress={handleManageAccess}\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n <Text style={[styles.rowLabelWide, { color: colors.text }]}>Choose what Yantra reads</Text>\n <Ionicons name=\"chevron-forward\" size={16} color={isDark ? '#64748b' : '#c4c4c4'} />\n </Pressable>\n <Divider color={colors.border} />\n <Pressable\n onPress={handleDisconnect}\n disabled={busy === 'disconnecting'}\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: colors.surfaceMuted }]}\n >\n {busy === 'disconnecting' ? (\n <ActivityIndicator color={colors.dangerText} />\n ) : (\n <Text style={[styles.rowLabelWide, { color: colors.dangerText }]}>Disconnect</Text>\n )}\n </Pressable>\n </View>\n </>\n );\n }\n}\n\ntype Colors = ReturnType<typeof mobileColors>;\n\nfunction describeStatus(loaded: boolean, running: boolean, connected: boolean): string {\n if (!loaded) return ' ';\n if (running) return 'Syncing...';\n return connected ? 'Connected' : 'Off';\n}\n\n/** When new data comes in. On Android, while closed only with Health Connect's background access. */\nfunction describeCadence(backgroundAccess: boolean | undefined, howToAllow: boolean): string {\n const first = 'The last 30 days sync first, then';\n if (IS_IOS) return `${first} new data as your watch saves it, even while Yantra is closed.`;\n if (backgroundAccess) return `${first} new data about every hour, even while Yantra is closed.`;\n const onOpen = `${first} new days each time you open Yantra.`;\n return howToAllow\n ? `${onOpen} To also sync while it is closed, allow background access under Choose what Yantra reads.`\n : onOpen;\n}\n\n/** Android reports grants per type; Apple Health does not (null). */\nfunction typeState(\n connected: boolean,\n granted: HealthDataType[] | null | undefined,\n id: HealthDataType,\n): 'idle' | 'requested' | 'allowed' | 'off' {\n if (!connected) return 'idle';\n if (granted === null || granted === undefined) return 'requested';\n return granted.includes(id) ? 'allowed' : 'off';\n}\n\nfunction Row({ label, value, colors }: { label: string; value: string; colors: Colors }) {\n return (\n <View style={styles.row}>\n <Text style={[styles.rowLabel, { color: colors.text }]}>{label}</Text>\n <Text style={[styles.rowValue, { color: colors.textMuted }]} numberOfLines={1}>\n {value}\n </Text>\n </View>\n );\n}\n\nfunction Divider({ color }: { color: string }) {\n return <View style={[styles.rowLine, { backgroundColor: color }]} />;\n}\n\nfunction Notice({\n tone,\n colors,\n icon,\n text,\n}: {\n tone: 'danger' | 'warning' | 'info';\n colors: Colors;\n icon: keyof typeof Ionicons.glyphMap;\n text: string;\n}) {\n const bg = { danger: colors.dangerSoft, warning: colors.warningSoft, info: colors.primarySoft }[tone];\n const fg = { danger: colors.dangerText, warning: colors.warningText, info: colors.primary }[tone];\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, loading }: { label: string; onPress: () => void; loading?: boolean }) {\n return (\n <Pressable\n onPress={onPress}\n disabled={loading}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={({ pressed }) => [styles.primary, (pressed || loading) && styles.pressed]}\n >\n {loading ? <ActivityIndicator color=\"#fff\" /> : <Text style={styles.primaryLabel}>{label}</Text>}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n safe: { flex: 1 },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingBottom: 8,\n minHeight: 52,\n },\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' },\n headerSpacer: { width: 40, height: 40 },\n pressed: { opacity: 0.72 },\n scroll: { paddingHorizontal: 16, paddingBottom: 40 },\n hero: { alignItems: 'center', paddingTop: 8, paddingBottom: 24, gap: 10 },\n heroIcon: { width: 64, height: 64, borderRadius: 32, alignItems: 'center', justifyContent: 'center' },\n heroTitle: { fontSize: 20, fontWeight: '700' },\n heroBody: { fontSize: 15, lineHeight: 21, textAlign: 'center', paddingHorizontal: 8 },\n card: { borderRadius: 16, overflow: 'hidden' },\n secondaryCard: { marginTop: 12, alignSelf: 'stretch' },\n row: { flexDirection: 'row', alignItems: 'center', minHeight: 52, paddingHorizontal: 16, gap: 12 },\n rowLabel: { fontSize: 16, width: 110 },\n rowLabelWide: { flex: 1, fontSize: 16 },\n typeLabel: { flex: 1, fontSize: 16 },\n rowValue: { flex: 1, fontSize: 16, textAlign: 'right' },\n rowValueShort: { fontSize: 16 },\n rowLine: { height: StyleSheet.hairlineWidth, marginLeft: 16 },\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, alignItems: 'stretch' },\n actionHint: { fontSize: 15, lineHeight: 21, textAlign: 'center', marginBottom: 12 },\n primary: {\n backgroundColor: mobileTokens.color.primary,\n borderRadius: 14,\n minHeight: 50,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 18,\n },\n primaryLabel: { color: '#fff', fontSize: 16, fontWeight: '600' },\n sectionTitle: {\n fontSize: 13,\n fontWeight: '600',\n letterSpacing: 0.4,\n marginTop: 28,\n marginBottom: 8,\n marginLeft: 16,\n },\n footnote: { fontSize: 13, lineHeight: 18, marginTop: 8, marginHorizontal: 16 },\n});\n"],"names":["_a","_b","React"],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {useRef,useCallback,useMemo}from'react';import {useApolloClient,gql}from'@apollo/client/index.js';import {OUTDATED_SERVER_RE,proxyResult}from'./webbuilderTransport.js';const SANDBOX_ACTION_MUTATION = gql`
|
|
2
|
+
mutation aiCodeSandboxAction($channelId: String!, $sandboxId: String!, $action: String!, $params: JSON) {
|
|
3
|
+
aiCodeSandboxAction(channelId: $channelId, sandboxId: $sandboxId, action: $action, params: $params)
|
|
4
|
+
}
|
|
5
|
+
`;
|
|
6
|
+
const PERSIST_SANDBOX_MUTATION = gql`
|
|
7
|
+
mutation aiCodePersistSandboxIdentity(
|
|
8
|
+
$channelId: String!
|
|
9
|
+
$sandboxId: String!
|
|
10
|
+
$sandboxUrl: String
|
|
11
|
+
$snapshotId: String
|
|
12
|
+
$previousSandboxId: String
|
|
13
|
+
) {
|
|
14
|
+
aiCodePersistSandboxIdentity(
|
|
15
|
+
channelId: $channelId
|
|
16
|
+
sandboxId: $sandboxId
|
|
17
|
+
sandboxUrl: $sandboxUrl
|
|
18
|
+
snapshotId: $snapshotId
|
|
19
|
+
previousSandboxId: $previousSandboxId
|
|
20
|
+
) {
|
|
21
|
+
success
|
|
22
|
+
message
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
function messageOf(err) {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
const e = err;
|
|
29
|
+
return ((_b = (_a = e == null ? void 0 : e.graphQLErrors) == null ? void 0 : _a.find((g) => g == null ? void 0 : g.message)) == null ? void 0 : _b.message) || (e == null ? void 0 : e.message) || String(err);
|
|
30
|
+
}
|
|
31
|
+
function useSandboxProxyApi() {
|
|
32
|
+
const client = useApolloClient();
|
|
33
|
+
const proxyMissing = useRef(false);
|
|
34
|
+
const proxy = useCallback(async (variables, timeoutMs) => {
|
|
35
|
+
var _a, _b, _c;
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs + 3e4);
|
|
38
|
+
try {
|
|
39
|
+
const result = await client.mutate({
|
|
40
|
+
mutation: SANDBOX_ACTION_MUTATION,
|
|
41
|
+
variables,
|
|
42
|
+
fetchPolicy: "no-cache",
|
|
43
|
+
errorPolicy: "all",
|
|
44
|
+
context: {
|
|
45
|
+
fetchOptions: {
|
|
46
|
+
signal: controller.signal
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
const first = (_b = (_a = result.errors) == null ? void 0 : _a.find((e) => e == null ? void 0 : e.message)) == null ? void 0 : _b.message;
|
|
51
|
+
if (first) {
|
|
52
|
+
if (OUTDATED_SERVER_RE.test(first)) return {
|
|
53
|
+
outdated: true
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
outdated: false,
|
|
57
|
+
result: {
|
|
58
|
+
successful: false,
|
|
59
|
+
error: first
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
outdated: false,
|
|
65
|
+
result: proxyResult((_c = result.data) == null ? void 0 : _c.aiCodeSandboxAction)
|
|
66
|
+
};
|
|
67
|
+
} catch (err) {
|
|
68
|
+
const message = messageOf(err);
|
|
69
|
+
if (OUTDATED_SERVER_RE.test(message)) return {
|
|
70
|
+
outdated: true
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
outdated: false,
|
|
74
|
+
result: {
|
|
75
|
+
successful: false,
|
|
76
|
+
error: message
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
} finally {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
}
|
|
82
|
+
}, [client]);
|
|
83
|
+
const persist = useCallback(async (input) => {
|
|
84
|
+
var _a, _b, _c;
|
|
85
|
+
try {
|
|
86
|
+
const result = await client.mutate({
|
|
87
|
+
mutation: PERSIST_SANDBOX_MUTATION,
|
|
88
|
+
variables: {
|
|
89
|
+
channelId: input.channelId,
|
|
90
|
+
sandboxId: input.sandboxId,
|
|
91
|
+
sandboxUrl: input.sandboxUrl || void 0,
|
|
92
|
+
snapshotId: input.snapshotId || void 0,
|
|
93
|
+
previousSandboxId: input.previousSandboxId || void 0
|
|
94
|
+
},
|
|
95
|
+
fetchPolicy: "no-cache",
|
|
96
|
+
errorPolicy: "all"
|
|
97
|
+
});
|
|
98
|
+
const first = (_b = (_a = result.errors) == null ? void 0 : _a.find((e) => e == null ? void 0 : e.message)) == null ? void 0 : _b.message;
|
|
99
|
+
if (first) return {
|
|
100
|
+
ok: false,
|
|
101
|
+
message: first
|
|
102
|
+
};
|
|
103
|
+
const payload = (_c = result.data) == null ? void 0 : _c.aiCodePersistSandboxIdentity;
|
|
104
|
+
return {
|
|
105
|
+
ok: (payload == null ? void 0 : payload.success) !== false,
|
|
106
|
+
message: payload == null ? void 0 : payload.message
|
|
107
|
+
};
|
|
108
|
+
} catch (err) {
|
|
109
|
+
return {
|
|
110
|
+
ok: false,
|
|
111
|
+
message: messageOf(err)
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}, [client]);
|
|
115
|
+
return useMemo(() => ({
|
|
116
|
+
proxy,
|
|
117
|
+
persist,
|
|
118
|
+
proxyMissing
|
|
119
|
+
}), [proxy, persist]);
|
|
120
|
+
}export{useSandboxProxyApi};//# sourceMappingURL=sandboxProxyApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxProxyApi.js","sources":["../../../src/screens/WebBuilderNative/sandboxProxyApi.ts"],"sourcesContent":["/**\n * The two backend fields a preview restore goes through (web `sandbox/sandboxProxy.ts`,\n * `previewDeployApi.persistSandboxIdentity`), on the app's Apollo client - the\n * backend that owns the build channels:\n *\n * - `aiCodeSandboxAction`: one connector action on a project's sandbox. The server\n * adds the sandbox key from the channel's settings (an agent build's too), so\n * the app never holds a key; a CREATE through it records the new sandbox.\n * - `aiCodePersistSandboxIdentity`: the new sandbox (and its preview) after a\n * restore, so the web and other devices open it instead of the expired one.\n *\n * Neither has a generated hook in `common/graphql`, so the documents live here.\n */\nimport { useCallback, useMemo, useRef } from 'react';\nimport { gql, useApolloClient } from '@apollo/client';\nimport { OUTDATED_SERVER_RE, proxyResult, type SandboxProxyCall } from './webbuilderTransport';\n\nconst SANDBOX_ACTION_MUTATION = gql`\n mutation aiCodeSandboxAction($channelId: String!, $sandboxId: String!, $action: String!, $params: JSON) {\n aiCodeSandboxAction(channelId: $channelId, sandboxId: $sandboxId, action: $action, params: $params)\n }\n`;\n\nconst PERSIST_SANDBOX_MUTATION = gql`\n mutation aiCodePersistSandboxIdentity(\n $channelId: String!\n $sandboxId: String!\n $sandboxUrl: String\n $snapshotId: String\n $previousSandboxId: String\n ) {\n aiCodePersistSandboxIdentity(\n channelId: $channelId\n sandboxId: $sandboxId\n sandboxUrl: $sandboxUrl\n snapshotId: $snapshotId\n previousSandboxId: $previousSandboxId\n ) {\n success\n message\n }\n }\n`;\n\nfunction messageOf(err: unknown): string {\n const e = err as { graphQLErrors?: Array<{ message?: string }>; message?: string } | null;\n return e?.graphQLErrors?.find((g) => g?.message)?.message || e?.message || String(err);\n}\n\nexport interface PersistSandboxInput {\n channelId: string;\n sandboxId: string;\n sandboxUrl?: string | null;\n snapshotId?: string | null;\n previousSandboxId?: string | null;\n}\n\nexport function useSandboxProxyApi() {\n const client = useApolloClient();\n /** Set once a server answers without the proxy: the session stays direct (web router `missing`). */\n const proxyMissing = useRef(false);\n\n const proxy = useCallback<SandboxProxyCall>(\n async (variables, timeoutMs) => {\n const controller = new AbortController();\n // The proxy waits for the connector: allow its timeout plus a margin (web: +30 s).\n const timer = setTimeout(() => controller.abort(), timeoutMs + 30_000);\n try {\n const result = await client.mutate({\n mutation: SANDBOX_ACTION_MUTATION,\n variables,\n fetchPolicy: 'no-cache',\n errorPolicy: 'all',\n context: { fetchOptions: { signal: controller.signal } },\n });\n const first = result.errors?.find((e) => e?.message)?.message;\n if (first) {\n if (OUTDATED_SERVER_RE.test(first)) return { outdated: true };\n return { outdated: false, result: { successful: false, error: first } };\n }\n return {\n outdated: false,\n result: proxyResult((result.data as { aiCodeSandboxAction?: unknown } | null)?.aiCodeSandboxAction),\n };\n } catch (err) {\n const message = messageOf(err);\n if (OUTDATED_SERVER_RE.test(message)) return { outdated: true };\n return { outdated: false, result: { successful: false, error: message } };\n } finally {\n clearTimeout(timer);\n }\n },\n [client],\n );\n\n const persist = useCallback(\n async (input: PersistSandboxInput): Promise<{ ok: boolean; message?: string }> => {\n try {\n const result = await client.mutate({\n mutation: PERSIST_SANDBOX_MUTATION,\n variables: {\n channelId: input.channelId,\n sandboxId: input.sandboxId,\n sandboxUrl: input.sandboxUrl || undefined,\n snapshotId: input.snapshotId || undefined,\n previousSandboxId: input.previousSandboxId || undefined,\n },\n fetchPolicy: 'no-cache',\n errorPolicy: 'all',\n });\n const first = result.errors?.find((e) => e?.message)?.message;\n if (first) return { ok: false, message: first };\n const payload = (\n result.data as { aiCodePersistSandboxIdentity?: { success?: boolean; message?: string } } | null\n )?.aiCodePersistSandboxIdentity;\n return { ok: payload?.success !== false, message: payload?.message };\n } catch (err) {\n return { ok: false, message: messageOf(err) };\n }\n },\n [client],\n );\n\n return useMemo(() => ({ proxy, persist, proxyMissing }), [proxy, persist]);\n}\n"],"names":[],"mappings":"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"}
|