@adminide-stack/yantra-mobile 12.0.70 → 12.0.71-alpha.1

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.
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {memo,useMemo}from'react';import {Platform,StyleSheet,ScrollView,View,Text,Linking}from'react-native';import Markdown,{MarkdownIt,hasParents}from'react-native-markdown-display';import {ChatCodeBlock}from'./ChatCodeBlock.js';import {prepareAssistantMarkdown}from'./streamingMarkdown.js';const ASSISTANT_MARKDOWN_IT = MarkdownIt({
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {memo,useMemo}from'react';import {Platform,StyleSheet,ScrollView,View,Text,Linking}from'react-native';import Markdown,{MarkdownIt,hasParents}from'react-native-markdown-display';import {ChatCodeBlock}from'./ChatCodeBlock.js';import {ChatImage}from'./ChatImage.js';import {prepareAssistantMarkdown}from'./streamingMarkdown.js';const ASSISTANT_MARKDOWN_IT = MarkdownIt({
2
2
  html: false,
3
3
  breaks: true,
4
4
  linkify: true,
@@ -35,6 +35,10 @@ const AssistantMarkdown = memo(function AssistantMarkdown2({
35
35
  if (!source.trim()) return null;
36
36
  return /* @__PURE__ */ jsx(Markdown, { markdownit: ASSISTANT_MARKDOWN_IT, style, rules, onLinkPress: openMarkdownLink, children: source });
37
37
  });
38
+ function holdsImage(node) {
39
+ var _a;
40
+ return ((_a = node.children) != null ? _a : []).some((child) => child.type === "image" || holdsImage(child));
41
+ }
38
42
  function assistantMarkdownRules(isDark) {
39
43
  const ink = isDark ? "#f3f5f8" : "#121926";
40
44
  const muted = isDark ? "#aab3c2" : "#667085";
@@ -56,15 +60,24 @@ function assistantMarkdownRules(isDark) {
56
60
  html_inline: (node) => /* @__PURE__ */ jsx(Text, { children: node.content }, node.key),
57
61
  html_block: (node) => /* @__PURE__ */ jsx(Text, { children: node.content }, node.key),
58
62
  // View + flexWrap rows clip mixed inline code and inflate list gaps.
59
- // Render copy as Text (same as web <p>) so lines wrap.
63
+ // Render copy as Text (same as web <p>) so lines wrap - except around
64
+ // an image: an image inside Text gets no width to size itself from and
65
+ // renders as nothing.
60
66
  paragraph: (node, children, parent) => {
61
67
  const inList = hasParents(parent, "list_item");
68
+ if (holdsImage(node)) {
69
+ return /* @__PURE__ */ jsx(View, { style: inList ? [local.pBlock, local.pInList] : local.pBlock, children }, node.key);
70
+ }
62
71
  return /* @__PURE__ */ jsx(Text, { style: inList ? [local.p, local.pInList, {
63
72
  color: ink
64
73
  }] : [local.p, {
65
74
  color: ink
66
75
  }], children }, node.key);
67
76
  },
77
+ image: (node) => {
78
+ var _a;
79
+ return ((_a = node.attributes) == null ? void 0 : _a.src) ? /* @__PURE__ */ jsx(ChatImage, { src: node.attributes.src, alt: node.attributes.alt, isDark }, node.key) : null;
80
+ },
68
81
  hardbreak: (node) => /* @__PURE__ */ jsx(Text, { children: "\n" }, node.key),
69
82
  softbreak: (node) => /* @__PURE__ */ jsx(Text, { children: " " }, node.key),
70
83
  list_item: (node, children, parent) => {
@@ -278,6 +291,11 @@ const local = StyleSheet.create({
278
291
  pInList: {
279
292
  marginBottom: 0
280
293
  },
294
+ // A paragraph holding an image: a block, spaced like a text paragraph.
295
+ pBlock: {
296
+ width: "100%",
297
+ marginBottom: 16
298
+ },
281
299
  li: {
282
300
  flexDirection: "row",
283
301
  alignItems: "flex-start",
@@ -310,4 +328,4 @@ const local = StyleSheet.create({
310
328
  tableScrollContent: {
311
329
  flexGrow: 0
312
330
  }
313
- });export{AssistantMarkdown};//# sourceMappingURL=AssistantMarkdown.js.map
331
+ });export{AssistantMarkdown,assistantMarkdownRules};//# sourceMappingURL=AssistantMarkdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMarkdown.js","sources":["../../../src/features/chat/AssistantMarkdown.tsx"],"sourcesContent":["/**\n * Native stand-in for browser `FormattedMessageContent` (remark-gfm +\n * CodeBlockWithActions). Same GFM surface: headings, lists, tables, quotes,\n * autolinks, orange inline code, wrapping fenced cards.\n */\nimport React, { memo, useMemo } from 'react';\nimport { Linking, Platform, ScrollView, StyleSheet, Text as RNText, View } from 'react-native';\nimport Markdown, { MarkdownIt, hasParents } from 'react-native-markdown-display';\nimport { ChatCodeBlock } from './ChatCodeBlock';\nimport { prepareAssistantMarkdown } from './streamingMarkdown';\n\nconst ASSISTANT_MARKDOWN_IT = MarkdownIt({\n html: false,\n breaks: true,\n linkify: true,\n typographer: true,\n});\n\ntype FenceNode = {\n key?: string;\n content?: string;\n sourceInfo?: string;\n children?: Array<{ content?: string; children?: FenceNode['children'] }>;\n};\n\nfunction flattenNodeText(node: { content?: string; children?: FenceNode['children'] } | undefined): string {\n if (!node) return '';\n const own = typeof node.content === 'string' ? node.content : '';\n const kids = (node.children ?? []).map(flattenNodeText).join('');\n return own + kids;\n}\n\nfunction fenceNodeContent(node: FenceNode): { language: string; code: string } {\n const language = (node.sourceInfo || '').trim() || 'code';\n const raw = String(node.content ?? '').trim() ? String(node.content ?? '') : flattenNodeText(node);\n return { language, code: raw.replace(/\\n$/, '') };\n}\n\nfunction openMarkdownLink(url: string) {\n void Linking.openURL(url);\n return false;\n}\n\nexport const AssistantMarkdown = memo(function AssistantMarkdown({\n text,\n streaming = false,\n isDark = false,\n}: {\n text: string;\n streaming?: boolean;\n isDark?: boolean;\n}) {\n const source = useMemo(() => prepareAssistantMarkdown(text, streaming), [text, streaming]);\n const style = useMemo(() => assistantMarkdownStyle(isDark), [isDark]);\n const rules = useMemo(() => assistantMarkdownRules(isDark), [isDark]);\n if (!source.trim()) return null;\n return (\n <Markdown markdownit={ASSISTANT_MARKDOWN_IT} style={style} rules={rules} onLinkPress={openMarkdownLink}>\n {source}\n </Markdown>\n );\n});\n\nfunction assistantMarkdownRules(isDark: boolean) {\n const ink = isDark ? '#f3f5f8' : '#121926';\n const muted = isDark ? '#aab3c2' : '#667085';\n return {\n fence: (node: FenceNode) => {\n const { language, code } = fenceNodeContent(node);\n return <ChatCodeBlock key={node.key} language={language} code={code} isDark={isDark} />;\n },\n code_block: (node: FenceNode) => {\n const { language, code } = fenceNodeContent(node);\n return (\n <ChatCodeBlock\n key={node.key}\n language={language}\n code={code || flattenNodeText(node)}\n isDark={isDark}\n />\n );\n },\n html_inline: (node: { key?: string; content?: string }) => <RNText key={node.key}>{node.content}</RNText>,\n html_block: (node: { key?: string; content?: string }) => <RNText key={node.key}>{node.content}</RNText>,\n // View + flexWrap rows clip mixed inline code and inflate list gaps.\n // Render copy as Text (same as web <p>) so lines wrap.\n paragraph: (node: { key?: string }, children: React.ReactNode[], parent: unknown[]) => {\n const inList = hasParents(parent, 'list_item');\n return (\n <RNText\n key={node.key}\n style={inList ? [local.p, local.pInList, { color: ink }] : [local.p, { color: ink }]}\n >\n {children}\n </RNText>\n );\n },\n hardbreak: (node: { key?: string }) => <RNText key={node.key}>{'\\n'}</RNText>,\n softbreak: (node: { key?: string }) => <RNText key={node.key}> </RNText>,\n list_item: (\n node: { key?: string; index?: number; markup?: string },\n children: React.ReactNode[],\n parent: unknown[],\n ) => {\n if (hasParents(parent, 'bullet_list')) {\n return (\n <View key={node.key} style={local.li}>\n <RNText style={[local.bullet, { color: muted }]} accessible={false}>\n {'\\u2022'}\n </RNText>\n <View style={local.liBody}>{children}</View>\n </View>\n );\n }\n if (hasParents(parent, 'ordered_list')) {\n const ordered = [...parent].reverse().find((el: { type?: string }) => el?.type === 'ordered_list') as\n | { attributes?: { start?: number } }\n | undefined;\n const start = ordered?.attributes?.start ?? 1;\n const n = start + (node.index ?? 0);\n return (\n <View key={node.key} style={local.li}>\n <RNText style={[local.olMarker, { color: muted }]}>{n}.</RNText>\n <View style={local.liBody}>{children}</View>\n </View>\n );\n }\n return (\n <View key={node.key} style={local.li}>\n {children}\n </View>\n );\n },\n table: (\n node: { key?: string },\n children: React.ReactNode[],\n _parent: unknown,\n styles: Record<string, unknown>,\n ) => (\n <ScrollView\n key={node.key}\n horizontal\n nestedScrollEnabled\n showsHorizontalScrollIndicator={false}\n style={local.tableScroll}\n contentContainerStyle={local.tableScrollContent}\n >\n <View style={styles._VIEW_SAFE_table as object}>{children}</View>\n </ScrollView>\n ),\n };\n}\n\nfunction assistantMarkdownStyle(isDark: boolean) {\n const ink = isDark ? '#f3f5f8' : '#121926';\n const muted = isDark ? '#aab3c2' : '#667085';\n const border = isDark ? '#2a3240' : '#e3e7ee';\n const borderStrong = isDark ? '#364052' : '#cfd7e3';\n const surface = isDark ? '#171a20' : '#f6f7f8';\n const inlineBg = isDark ? 'rgba(251, 146, 60, 0.14)' : 'rgba(249, 115, 22, 0.1)';\n const inlineFg = isDark ? '#ffb36b' : '#d96b00';\n const mono = Platform.OS === 'ios' ? 'Menlo' : 'monospace';\n\n return {\n body: {\n color: ink,\n fontSize: 16,\n lineHeight: 26,\n },\n heading1: {\n flexDirection: 'row' as const,\n fontSize: 22,\n fontWeight: '600' as const,\n letterSpacing: -0.3,\n marginTop: 22,\n marginBottom: 12,\n color: ink,\n },\n heading2: {\n flexDirection: 'row' as const,\n fontSize: 20,\n fontWeight: '600' as const,\n letterSpacing: -0.3,\n marginTop: 20,\n marginBottom: 10,\n color: ink,\n },\n heading3: {\n flexDirection: 'row' as const,\n fontSize: 18,\n fontWeight: '600' as const,\n marginTop: 16,\n marginBottom: 8,\n color: ink,\n },\n heading4: {\n flexDirection: 'row' as const,\n fontSize: 16,\n fontWeight: '600' as const,\n marginTop: 14,\n marginBottom: 6,\n color: ink,\n },\n heading5: {\n flexDirection: 'row' as const,\n fontSize: 15,\n fontWeight: '600' as const,\n marginTop: 12,\n marginBottom: 6,\n color: ink,\n },\n heading6: {\n flexDirection: 'row' as const,\n fontSize: 14,\n fontWeight: '600' as const,\n marginTop: 12,\n marginBottom: 6,\n color: ink,\n },\n hr: {\n backgroundColor: border,\n height: StyleSheet.hairlineWidth,\n marginVertical: 20,\n },\n strong: { fontWeight: '600' as const, color: ink },\n em: { fontStyle: 'italic' as const, color: muted },\n s: { textDecorationLine: 'line-through' as const },\n paragraph: {\n marginTop: 0,\n marginBottom: 0,\n color: ink,\n },\n text: { color: ink },\n blockquote: {\n backgroundColor: 'transparent',\n borderColor: borderStrong,\n borderLeftWidth: 2,\n marginLeft: 0,\n marginVertical: 16,\n paddingHorizontal: 16,\n paddingVertical: 4,\n },\n bullet_list: { marginTop: 4, marginBottom: 16 },\n ordered_list: { marginTop: 4, marginBottom: 16 },\n list_item: {\n marginVertical: 0,\n flexDirection: 'row' as const,\n alignItems: 'flex-start' as const,\n },\n bullet_list_icon: { color: muted },\n ordered_list_icon: { color: muted },\n bullet_list_content: { flexGrow: 0, flexShrink: 1, minWidth: 0 },\n ordered_list_content: { flexGrow: 0, flexShrink: 1, minWidth: 0 },\n code_inline: {\n borderWidth: 0,\n padding: 0,\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 5,\n backgroundColor: inlineBg,\n color: inlineFg,\n fontSize: 14,\n fontFamily: mono,\n },\n table: {\n borderWidth: 1,\n borderColor: border,\n borderRadius: 12,\n marginVertical: 12,\n overflow: 'hidden',\n },\n thead: { backgroundColor: surface },\n th: {\n flex: 1,\n paddingVertical: 10,\n paddingHorizontal: 12,\n fontWeight: '600' as const,\n fontSize: 12,\n color: muted,\n },\n td: {\n flex: 1,\n paddingVertical: 10,\n paddingHorizontal: 12,\n color: ink,\n },\n tr: {\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: border,\n flexDirection: 'row' as const,\n },\n link: {\n color: ink,\n textDecorationLine: 'underline' as const,\n },\n };\n}\n\nconst local = StyleSheet.create({\n p: {\n fontSize: 16,\n lineHeight: 26,\n marginBottom: 16,\n },\n pInList: {\n marginBottom: 0,\n },\n li: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n width: '100%',\n marginVertical: 5,\n flexGrow: 0,\n },\n liBody: {\n flex: 1,\n minWidth: 0,\n flexShrink: 1,\n flexGrow: 1,\n },\n bullet: {\n width: 18,\n fontSize: 16,\n lineHeight: 26,\n marginRight: 6,\n },\n olMarker: {\n minWidth: 22,\n fontSize: 16,\n lineHeight: 26,\n marginRight: 8,\n },\n tableScroll: { flexGrow: 0, marginVertical: 8 },\n tableScrollContent: { flexGrow: 0 },\n});\n"],"names":["AssistantMarkdown","RNText"],"mappings":"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"}
1
+ {"version":3,"file":"AssistantMarkdown.js","sources":["../../../src/features/chat/AssistantMarkdown.tsx"],"sourcesContent":["/**\n * Native stand-in for browser `FormattedMessageContent` (remark-gfm +\n * CodeBlockWithActions). Same GFM surface: headings, lists, tables, quotes,\n * autolinks, orange inline code, wrapping fenced cards.\n */\nimport React, { memo, useMemo } from 'react';\nimport { Linking, Platform, ScrollView, StyleSheet, Text as RNText, View } from 'react-native';\nimport Markdown, { MarkdownIt, hasParents } from 'react-native-markdown-display';\nimport { ChatCodeBlock } from './ChatCodeBlock';\nimport { ChatImage } from './ChatImage';\nimport { prepareAssistantMarkdown } from './streamingMarkdown';\n\nconst ASSISTANT_MARKDOWN_IT = MarkdownIt({\n html: false,\n breaks: true,\n linkify: true,\n typographer: true,\n});\n\ntype MarkdownNode = {\n key?: string;\n type?: string;\n attributes?: { src?: string; alt?: string };\n children?: MarkdownNode[];\n};\n\ntype FenceNode = {\n key?: string;\n content?: string;\n sourceInfo?: string;\n children?: Array<{ content?: string; children?: FenceNode['children'] }>;\n};\n\nfunction flattenNodeText(node: { content?: string; children?: FenceNode['children'] } | undefined): string {\n if (!node) return '';\n const own = typeof node.content === 'string' ? node.content : '';\n const kids = (node.children ?? []).map(flattenNodeText).join('');\n return own + kids;\n}\n\nfunction fenceNodeContent(node: FenceNode): { language: string; code: string } {\n const language = (node.sourceInfo || '').trim() || 'code';\n const raw = String(node.content ?? '').trim() ? String(node.content ?? '') : flattenNodeText(node);\n return { language, code: raw.replace(/\\n$/, '') };\n}\n\nfunction openMarkdownLink(url: string) {\n void Linking.openURL(url);\n return false;\n}\n\nexport const AssistantMarkdown = memo(function AssistantMarkdown({\n text,\n streaming = false,\n isDark = false,\n}: {\n text: string;\n streaming?: boolean;\n isDark?: boolean;\n}) {\n const source = useMemo(() => prepareAssistantMarkdown(text, streaming), [text, streaming]);\n const style = useMemo(() => assistantMarkdownStyle(isDark), [isDark]);\n const rules = useMemo(() => assistantMarkdownRules(isDark), [isDark]);\n if (!source.trim()) return null;\n return (\n <Markdown markdownit={ASSISTANT_MARKDOWN_IT} style={style} rules={rules} onLinkPress={openMarkdownLink}>\n {source}\n </Markdown>\n );\n});\n\n/** Whether a paragraph carries an image - it then has to lay out as a block, not a line of text. */\nfunction holdsImage(node: MarkdownNode): boolean {\n return (node.children ?? []).some((child) => child.type === 'image' || holdsImage(child));\n}\n\nexport function assistantMarkdownRules(isDark: boolean) {\n const ink = isDark ? '#f3f5f8' : '#121926';\n const muted = isDark ? '#aab3c2' : '#667085';\n return {\n fence: (node: FenceNode) => {\n const { language, code } = fenceNodeContent(node);\n return <ChatCodeBlock key={node.key} language={language} code={code} isDark={isDark} />;\n },\n code_block: (node: FenceNode) => {\n const { language, code } = fenceNodeContent(node);\n return (\n <ChatCodeBlock\n key={node.key}\n language={language}\n code={code || flattenNodeText(node)}\n isDark={isDark}\n />\n );\n },\n html_inline: (node: { key?: string; content?: string }) => <RNText key={node.key}>{node.content}</RNText>,\n html_block: (node: { key?: string; content?: string }) => <RNText key={node.key}>{node.content}</RNText>,\n // View + flexWrap rows clip mixed inline code and inflate list gaps.\n // Render copy as Text (same as web <p>) so lines wrap - except around\n // an image: an image inside Text gets no width to size itself from and\n // renders as nothing.\n paragraph: (node: MarkdownNode, children: React.ReactNode[], parent: unknown[]) => {\n const inList = hasParents(parent, 'list_item');\n if (holdsImage(node)) {\n return (\n <View key={node.key} style={inList ? [local.pBlock, local.pInList] : local.pBlock}>\n {children}\n </View>\n );\n }\n return (\n <RNText\n key={node.key}\n style={inList ? [local.p, local.pInList, { color: ink }] : [local.p, { color: ink }]}\n >\n {children}\n </RNText>\n );\n },\n image: (node: MarkdownNode) =>\n node.attributes?.src ? (\n <ChatImage key={node.key} src={node.attributes.src} alt={node.attributes.alt} isDark={isDark} />\n ) : null,\n hardbreak: (node: { key?: string }) => <RNText key={node.key}>{'\\n'}</RNText>,\n softbreak: (node: { key?: string }) => <RNText key={node.key}> </RNText>,\n list_item: (\n node: { key?: string; index?: number; markup?: string },\n children: React.ReactNode[],\n parent: unknown[],\n ) => {\n if (hasParents(parent, 'bullet_list')) {\n return (\n <View key={node.key} style={local.li}>\n <RNText style={[local.bullet, { color: muted }]} accessible={false}>\n {'\\u2022'}\n </RNText>\n <View style={local.liBody}>{children}</View>\n </View>\n );\n }\n if (hasParents(parent, 'ordered_list')) {\n const ordered = [...parent].reverse().find((el: { type?: string }) => el?.type === 'ordered_list') as\n | { attributes?: { start?: number } }\n | undefined;\n const start = ordered?.attributes?.start ?? 1;\n const n = start + (node.index ?? 0);\n return (\n <View key={node.key} style={local.li}>\n <RNText style={[local.olMarker, { color: muted }]}>{n}.</RNText>\n <View style={local.liBody}>{children}</View>\n </View>\n );\n }\n return (\n <View key={node.key} style={local.li}>\n {children}\n </View>\n );\n },\n table: (\n node: { key?: string },\n children: React.ReactNode[],\n _parent: unknown,\n styles: Record<string, unknown>,\n ) => (\n <ScrollView\n key={node.key}\n horizontal\n nestedScrollEnabled\n showsHorizontalScrollIndicator={false}\n style={local.tableScroll}\n contentContainerStyle={local.tableScrollContent}\n >\n <View style={styles._VIEW_SAFE_table as object}>{children}</View>\n </ScrollView>\n ),\n };\n}\n\nfunction assistantMarkdownStyle(isDark: boolean) {\n const ink = isDark ? '#f3f5f8' : '#121926';\n const muted = isDark ? '#aab3c2' : '#667085';\n const border = isDark ? '#2a3240' : '#e3e7ee';\n const borderStrong = isDark ? '#364052' : '#cfd7e3';\n const surface = isDark ? '#171a20' : '#f6f7f8';\n const inlineBg = isDark ? 'rgba(251, 146, 60, 0.14)' : 'rgba(249, 115, 22, 0.1)';\n const inlineFg = isDark ? '#ffb36b' : '#d96b00';\n const mono = Platform.OS === 'ios' ? 'Menlo' : 'monospace';\n\n return {\n body: {\n color: ink,\n fontSize: 16,\n lineHeight: 26,\n },\n heading1: {\n flexDirection: 'row' as const,\n fontSize: 22,\n fontWeight: '600' as const,\n letterSpacing: -0.3,\n marginTop: 22,\n marginBottom: 12,\n color: ink,\n },\n heading2: {\n flexDirection: 'row' as const,\n fontSize: 20,\n fontWeight: '600' as const,\n letterSpacing: -0.3,\n marginTop: 20,\n marginBottom: 10,\n color: ink,\n },\n heading3: {\n flexDirection: 'row' as const,\n fontSize: 18,\n fontWeight: '600' as const,\n marginTop: 16,\n marginBottom: 8,\n color: ink,\n },\n heading4: {\n flexDirection: 'row' as const,\n fontSize: 16,\n fontWeight: '600' as const,\n marginTop: 14,\n marginBottom: 6,\n color: ink,\n },\n heading5: {\n flexDirection: 'row' as const,\n fontSize: 15,\n fontWeight: '600' as const,\n marginTop: 12,\n marginBottom: 6,\n color: ink,\n },\n heading6: {\n flexDirection: 'row' as const,\n fontSize: 14,\n fontWeight: '600' as const,\n marginTop: 12,\n marginBottom: 6,\n color: ink,\n },\n hr: {\n backgroundColor: border,\n height: StyleSheet.hairlineWidth,\n marginVertical: 20,\n },\n strong: { fontWeight: '600' as const, color: ink },\n em: { fontStyle: 'italic' as const, color: muted },\n s: { textDecorationLine: 'line-through' as const },\n paragraph: {\n marginTop: 0,\n marginBottom: 0,\n color: ink,\n },\n text: { color: ink },\n blockquote: {\n backgroundColor: 'transparent',\n borderColor: borderStrong,\n borderLeftWidth: 2,\n marginLeft: 0,\n marginVertical: 16,\n paddingHorizontal: 16,\n paddingVertical: 4,\n },\n bullet_list: { marginTop: 4, marginBottom: 16 },\n ordered_list: { marginTop: 4, marginBottom: 16 },\n list_item: {\n marginVertical: 0,\n flexDirection: 'row' as const,\n alignItems: 'flex-start' as const,\n },\n bullet_list_icon: { color: muted },\n ordered_list_icon: { color: muted },\n bullet_list_content: { flexGrow: 0, flexShrink: 1, minWidth: 0 },\n ordered_list_content: { flexGrow: 0, flexShrink: 1, minWidth: 0 },\n code_inline: {\n borderWidth: 0,\n padding: 0,\n paddingHorizontal: 6,\n paddingVertical: 2,\n borderRadius: 5,\n backgroundColor: inlineBg,\n color: inlineFg,\n fontSize: 14,\n fontFamily: mono,\n },\n table: {\n borderWidth: 1,\n borderColor: border,\n borderRadius: 12,\n marginVertical: 12,\n overflow: 'hidden' as const,\n },\n thead: { backgroundColor: surface },\n th: {\n flex: 1,\n paddingVertical: 10,\n paddingHorizontal: 12,\n fontWeight: '600' as const,\n fontSize: 12,\n color: muted,\n },\n td: {\n flex: 1,\n paddingVertical: 10,\n paddingHorizontal: 12,\n color: ink,\n },\n tr: {\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: border,\n flexDirection: 'row' as const,\n },\n link: {\n color: ink,\n textDecorationLine: 'underline' as const,\n },\n };\n}\n\nconst local = StyleSheet.create({\n p: {\n fontSize: 16,\n lineHeight: 26,\n marginBottom: 16,\n },\n pInList: {\n marginBottom: 0,\n },\n // A paragraph holding an image: a block, spaced like a text paragraph.\n pBlock: {\n width: '100%',\n marginBottom: 16,\n },\n li: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n width: '100%',\n marginVertical: 5,\n flexGrow: 0,\n },\n liBody: {\n flex: 1,\n minWidth: 0,\n flexShrink: 1,\n flexGrow: 1,\n },\n bullet: {\n width: 18,\n fontSize: 16,\n lineHeight: 26,\n marginRight: 6,\n },\n olMarker: {\n minWidth: 22,\n fontSize: 16,\n lineHeight: 26,\n marginRight: 8,\n },\n tableScroll: { flexGrow: 0, marginVertical: 8 },\n tableScrollContent: { flexGrow: 0 },\n});\n"],"names":["AssistantMarkdown","RNText"],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import {jsx,jsxs}from'react/jsx-runtime';import {memo,useState}from'react';import {Image}from'expo-image';import {Pressable,StyleSheet,Text,Linking,View}from'react-native';const PLACEHOLDER_RATIO = 16 / 10;
2
+ const MAX_HEIGHT = 440;
3
+ const ChatImage = memo(function ChatImage2({
4
+ src,
5
+ alt,
6
+ isDark = false
7
+ }) {
8
+ const [ratio, setRatio] = useState(null);
9
+ const [failed, setFailed] = useState(false);
10
+ const label = (alt == null ? void 0 : alt.trim()) || "Image";
11
+ const frame = isDark ? darkFrame : lightFrame;
12
+ if (failed) {
13
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => void Linking.openURL(src), accessibilityRole: "link", accessibilityLabel: `${label}, could not be loaded`, style: [styles.frame, frame, styles.failed], children: /* @__PURE__ */ jsxs(Text, { style: [styles.failedText, {
14
+ color: isDark ? "#aab3c2" : "#667085"
15
+ }], numberOfLines: 2, children: [
16
+ label,
17
+ " could not be loaded"
18
+ ] }) });
19
+ }
20
+ return /* @__PURE__ */ jsx(Pressable, { onPress: () => void Linking.openURL(src), accessibilityRole: "imagebutton", accessibilityLabel: label, accessibilityHint: "Opens the full image", style: [styles.frame, frame], children: /* @__PURE__ */ jsx(View, { style: {
21
+ aspectRatio: ratio != null ? ratio : PLACEHOLDER_RATIO,
22
+ maxHeight: MAX_HEIGHT,
23
+ width: "100%"
24
+ }, children: /* @__PURE__ */ jsx(Image, { source: {
25
+ uri: src
26
+ }, style: StyleSheet.absoluteFill, contentFit: "contain", transition: 120, accessible: false, onLoad: (e) => {
27
+ var _a, _b, _c, _d;
28
+ const width = (_b = (_a = e.source) == null ? void 0 : _a.width) != null ? _b : 0;
29
+ const height = (_d = (_c = e.source) == null ? void 0 : _c.height) != null ? _d : 0;
30
+ if (width > 0 && height > 0) setRatio(width / height);
31
+ }, onError: () => setFailed(true) }) }) });
32
+ });
33
+ const lightFrame = {
34
+ backgroundColor: "#f6f7f8",
35
+ borderColor: "#e3e7ee"
36
+ };
37
+ const darkFrame = {
38
+ backgroundColor: "#171a20",
39
+ borderColor: "#2a3240"
40
+ };
41
+ const styles = StyleSheet.create({
42
+ frame: {
43
+ width: "100%",
44
+ borderRadius: 12,
45
+ borderWidth: StyleSheet.hairlineWidth,
46
+ overflow: "hidden"
47
+ },
48
+ failed: {
49
+ paddingHorizontal: 14,
50
+ paddingVertical: 12
51
+ },
52
+ failedText: {
53
+ fontSize: 14,
54
+ lineHeight: 20
55
+ }
56
+ });export{ChatImage};//# sourceMappingURL=ChatImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatImage.js","sources":["../../../src/features/chat/ChatImage.tsx"],"sourcesContent":["/**\n * An image in an assistant reply (`![caption](url)`) - a screenshot of the\n * person's Computer, a product photo - as a block the width of the message.\n *\n * react-native-markdown-display's own image rule is a FitImage with only\n * `flex: 1`, which works out its height from a measured width. Inside the\n * chat's Text paragraphs it has no width to measure, so a screenshot the agent\n * sent rendered as nothing at all. This one sizes itself from the picture:\n * full width, the image's own aspect ratio once it loads, capped so a\n * full-page capture does not fill three screens. Tapping opens the full image.\n */\nimport React, { memo, useState } from 'react';\nimport { Image } from 'expo-image';\nimport { Linking, Pressable, StyleSheet, Text, View } from 'react-native';\n\n/** Before the picture loads: a browser window's shape, so the reply does not jump much. */\nconst PLACEHOLDER_RATIO = 16 / 10;\n/** A full-page capture is tall; past this it is letterboxed and the tap shows all of it. */\nconst MAX_HEIGHT = 440;\n\nexport const ChatImage = memo(function ChatImage({\n src,\n alt,\n isDark = false,\n}: {\n src: string;\n alt?: string;\n isDark?: boolean;\n}) {\n const [ratio, setRatio] = useState<number | null>(null);\n const [failed, setFailed] = useState(false);\n const label = alt?.trim() || 'Image';\n const frame = isDark ? darkFrame : lightFrame;\n\n if (failed) {\n return (\n <Pressable\n onPress={() => void Linking.openURL(src)}\n accessibilityRole=\"link\"\n accessibilityLabel={`${label}, could not be loaded`}\n style={[styles.frame, frame, styles.failed]}\n >\n <Text style={[styles.failedText, { color: isDark ? '#aab3c2' : '#667085' }]} numberOfLines={2}>\n {label} could not be loaded\n </Text>\n </Pressable>\n );\n }\n\n return (\n <Pressable\n onPress={() => void Linking.openURL(src)}\n accessibilityRole=\"imagebutton\"\n accessibilityLabel={label}\n accessibilityHint=\"Opens the full image\"\n style={[styles.frame, frame]}\n >\n <View style={{ aspectRatio: ratio ?? PLACEHOLDER_RATIO, maxHeight: MAX_HEIGHT, width: '100%' }}>\n <Image\n source={{ uri: src }}\n style={StyleSheet.absoluteFill}\n contentFit=\"contain\"\n transition={120}\n accessible={false}\n onLoad={(e) => {\n const width = e.source?.width ?? 0;\n const height = e.source?.height ?? 0;\n if (width > 0 && height > 0) setRatio(width / height);\n }}\n onError={() => setFailed(true)}\n />\n </View>\n </Pressable>\n );\n});\n\nconst lightFrame = { backgroundColor: '#f6f7f8', borderColor: '#e3e7ee' };\nconst darkFrame = { backgroundColor: '#171a20', borderColor: '#2a3240' };\n\nconst styles = StyleSheet.create({\n frame: {\n width: '100%',\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n },\n failed: {\n paddingHorizontal: 14,\n paddingVertical: 12,\n },\n failedText: {\n fontSize: 14,\n lineHeight: 20,\n },\n});\n"],"names":["ChatImage"],"mappings":"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"}
@@ -125,7 +125,11 @@ ${text.trim()}
125
125
  }
126
126
  return text;
127
127
  }
128
+ function holdBackPartialImage(text) {
129
+ const open = text.match(/!\[[^\]\n]*(\](\([^)\s]*)?)?$/);
130
+ return (open == null ? void 0 : open.index) === void 0 ? text : text.slice(0, open.index).replace(/[ \t]+$/, "");
131
+ }
128
132
  function prepareAssistantMarkdown(text, streaming) {
129
133
  const fenced = wrapRawCodeIfNeeded(promoteFolderTrees(promoteBareCodeToFences(text)));
130
- return streaming ? closeOpenMarkdownFences(fenced) : fenced;
131
- }export{closeOpenMarkdownFences,prepareAssistantMarkdown,promoteBareCodeToFences,promoteFolderTrees,wrapRawCodeIfNeeded};//# sourceMappingURL=streamingMarkdown.js.map
134
+ return streaming ? closeOpenMarkdownFences(holdBackPartialImage(fenced)) : fenced;
135
+ }export{closeOpenMarkdownFences,holdBackPartialImage,prepareAssistantMarkdown,promoteBareCodeToFences,promoteFolderTrees,wrapRawCodeIfNeeded};//# sourceMappingURL=streamingMarkdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streamingMarkdown.js","sources":["../../../src/features/chat/streamingMarkdown.ts"],"sourcesContent":["/**\n * Streaming markdown is incomplete: the model often has an open ``` fence\n * when the next token has not arrived. Closing it for the preview makes\n * react-native-markdown-display paint a code block instead of raw fences.\n *\n * Fast-lane / brain answers also dump code as indented prose with no ``` —\n * `promoteBareCodeToFences` wraps those runs so the product code block renders.\n */\nexport function closeOpenMarkdownFences(text: string): string {\n if (!text) return text;\n const opens = text.match(/^ {0,3}```/gm);\n if (!opens || opens.length % 2 === 0) return text;\n return `${text}\\n\\`\\`\\``;\n}\n\nconst CODE_START =\n /^(?:function\\s|const\\s|let\\s|var\\s|class\\s|import\\s|export\\s|return\\s|type\\s|interface\\s|enum\\s|async\\s|await\\s|if\\s*\\(|for\\s*\\(|while\\s*\\(|switch\\s*\\(|<\\/?[A-Z][\\w.]|<[a-z]+[\\s/>]|[{}]$)/;\n\nfunction isCodeStartLine(line: string): boolean {\n const t = line.trim();\n if (!t) return false;\n if (/^[-*]\\s/.test(t) || /^\\d+\\.\\s/.test(t)) return false;\n return CODE_START.test(t) || t.endsWith('{') || t.endsWith('=>') || /^[A-Z][A-Za-z0-9]*\\(/.test(t);\n}\n\nfunction isCodeContinueLine(line: string): boolean {\n const t = line.trim();\n if (!t) return true;\n if (/^[-*]\\s/.test(t) || /^\\d+\\.\\s/.test(t)) return false;\n if (isCodeStartLine(line)) return true;\n return (\n /[;{}()<>]$/.test(t) ||\n t.startsWith('//') ||\n t.startsWith('*') ||\n t.startsWith(')') ||\n t.includes('=>') ||\n /^[\\w$]+\\s*=/.test(t) ||\n /^<[A-Za-z]/.test(t)\n );\n}\n\nfunction guessFenceLang(block: string): string {\n if (/<[A-Za-z][\\w.]*[\\s/>]/.test(block) && /function\\s|=>/.test(block)) return 'jsx';\n if (/<[A-Z][\\w.]*[\\s/>]/.test(block) || /<\\/[A-Z]/.test(block)) return 'jsx';\n if (/\\bdef\\s+\\w+\\(/.test(block) || /\\bprint\\(/.test(block)) return 'python';\n return 'javascript';\n}\n\n/**\n * Wrap consecutive code-like lines that the model forgot to fence so they\n * render through the product code-block UI instead of as body copy.\n */\nexport function promoteBareCodeToFences(text: string): string {\n if (!text) return text;\n const lines = text.split('\\n');\n const out: string[] = [];\n let i = 0;\n let inFence = false;\n\n while (i < lines.length) {\n const line = lines[i];\n if (/^ {0,3}```/.test(line)) {\n inFence = !inFence;\n out.push(line);\n i += 1;\n continue;\n }\n if (inFence || !isCodeStartLine(line)) {\n out.push(line);\n i += 1;\n continue;\n }\n\n const start = i;\n i += 1;\n while (i < lines.length) {\n const next = lines[i];\n if (/^ {0,3}```/.test(next)) break;\n if (isCodeContinueLine(next)) {\n i += 1;\n continue;\n }\n break;\n }\n while (i > start + 1 && lines[i - 1].trim() === '') i -= 1;\n const blockLines = lines.slice(start, i);\n if (blockLines.filter((l) => l.trim()).length < 2) {\n out.push(line);\n i = start + 1;\n continue;\n }\n const block = blockLines.join('\\n');\n out.push(`\\`\\`\\`${guessFenceLang(block)}\\n${block}\\n\\`\\`\\``);\n }\n\n return out.join('\\n');\n}\n\nfunction isFolderTreeLine(line: string): boolean {\n const t = line.trim();\n if (!t) return true;\n if (/[│├└─┬┤]/.test(t)) return true;\n if (/→|->/.test(t) && /\\.\\w{1,8}\\b/.test(t)) return true;\n if (/^[A-Za-z0-9_.\\-]+\\/$/.test(t)) return true;\n if (/^[A-Za-z0-9_.\\-]+\\.\\w{1,8}\\s*$/.test(t)) return true;\n return false;\n}\n\n/**\n * Folder trees the model emits as prose (indents collapsed by markdown-it).\n * Fence them so they keep structure in the product code card.\n */\nexport function promoteFolderTrees(text: string): string {\n if (!text) return text;\n const lines = text.split('\\n');\n const out: string[] = [];\n let i = 0;\n let inFence = false;\n while (i < lines.length) {\n const line = lines[i];\n if (/^ {0,3}```/.test(line)) {\n inFence = !inFence;\n out.push(line);\n i += 1;\n continue;\n }\n if (inFence || !isFolderTreeLine(line) || !line.trim()) {\n out.push(line);\n i += 1;\n continue;\n }\n const start = i;\n i += 1;\n while (i < lines.length && isFolderTreeLine(lines[i]) && !/^ {0,3}```/.test(lines[i])) i += 1;\n while (i > start + 1 && lines[i - 1].trim() === '') i -= 1;\n const blockLines = lines.slice(start, i);\n const filled = blockLines.filter((l) => l.trim());\n const dirs = filled.filter((l) => /\\/$/.test(l.trim()) || /[│├└]/.test(l) || /→|->/.test(l));\n if (filled.length >= 4 && dirs.length >= 2) {\n out.push(`\\`\\`\\`text\\n${blockLines.join('\\n')}\\n\\`\\`\\``);\n continue;\n }\n out.push(...blockLines);\n }\n return out.join('\\n');\n}\n\nexport function wrapRawCodeIfNeeded(text: string): string {\n if (!text || /```/.test(text)) return text;\n const lines = text.split('\\n');\n const hits = lines.filter((l) =>\n /^\\s*(import |export |const |let |function |class |return |\\/\\/|\\/\\*|<[A-Za-z])/.test(l),\n ).length;\n if (hits >= 4 && hits / Math.max(lines.length, 1) >= 0.35) {\n return `\\`\\`\\`${guessFenceLang(text)}\\n${text.trim()}\\n\\`\\`\\``;\n }\n return text;\n}\n\nexport function prepareAssistantMarkdown(text: string, streaming: boolean): string {\n const fenced = wrapRawCodeIfNeeded(promoteFolderTrees(promoteBareCodeToFences(text)));\n return streaming ? closeOpenMarkdownFences(fenced) : fenced;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamingMarkdown.js","sources":["../../../src/features/chat/streamingMarkdown.ts"],"sourcesContent":["/**\n * Streaming markdown is incomplete: the model often has an open ``` fence\n * when the next token has not arrived. Closing it for the preview makes\n * react-native-markdown-display paint a code block instead of raw fences.\n *\n * Fast-lane / brain answers also dump code as indented prose with no ``` —\n * `promoteBareCodeToFences` wraps those runs so the product code block renders.\n */\nexport function closeOpenMarkdownFences(text: string): string {\n if (!text) return text;\n const opens = text.match(/^ {0,3}```/gm);\n if (!opens || opens.length % 2 === 0) return text;\n return `${text}\\n\\`\\`\\``;\n}\n\nconst CODE_START =\n /^(?:function\\s|const\\s|let\\s|var\\s|class\\s|import\\s|export\\s|return\\s|type\\s|interface\\s|enum\\s|async\\s|await\\s|if\\s*\\(|for\\s*\\(|while\\s*\\(|switch\\s*\\(|<\\/?[A-Z][\\w.]|<[a-z]+[\\s/>]|[{}]$)/;\n\nfunction isCodeStartLine(line: string): boolean {\n const t = line.trim();\n if (!t) return false;\n if (/^[-*]\\s/.test(t) || /^\\d+\\.\\s/.test(t)) return false;\n return CODE_START.test(t) || t.endsWith('{') || t.endsWith('=>') || /^[A-Z][A-Za-z0-9]*\\(/.test(t);\n}\n\nfunction isCodeContinueLine(line: string): boolean {\n const t = line.trim();\n if (!t) return true;\n if (/^[-*]\\s/.test(t) || /^\\d+\\.\\s/.test(t)) return false;\n if (isCodeStartLine(line)) return true;\n return (\n /[;{}()<>]$/.test(t) ||\n t.startsWith('//') ||\n t.startsWith('*') ||\n t.startsWith(')') ||\n t.includes('=>') ||\n /^[\\w$]+\\s*=/.test(t) ||\n /^<[A-Za-z]/.test(t)\n );\n}\n\nfunction guessFenceLang(block: string): string {\n if (/<[A-Za-z][\\w.]*[\\s/>]/.test(block) && /function\\s|=>/.test(block)) return 'jsx';\n if (/<[A-Z][\\w.]*[\\s/>]/.test(block) || /<\\/[A-Z]/.test(block)) return 'jsx';\n if (/\\bdef\\s+\\w+\\(/.test(block) || /\\bprint\\(/.test(block)) return 'python';\n return 'javascript';\n}\n\n/**\n * Wrap consecutive code-like lines that the model forgot to fence so they\n * render through the product code-block UI instead of as body copy.\n */\nexport function promoteBareCodeToFences(text: string): string {\n if (!text) return text;\n const lines = text.split('\\n');\n const out: string[] = [];\n let i = 0;\n let inFence = false;\n\n while (i < lines.length) {\n const line = lines[i];\n if (/^ {0,3}```/.test(line)) {\n inFence = !inFence;\n out.push(line);\n i += 1;\n continue;\n }\n if (inFence || !isCodeStartLine(line)) {\n out.push(line);\n i += 1;\n continue;\n }\n\n const start = i;\n i += 1;\n while (i < lines.length) {\n const next = lines[i];\n if (/^ {0,3}```/.test(next)) break;\n if (isCodeContinueLine(next)) {\n i += 1;\n continue;\n }\n break;\n }\n while (i > start + 1 && lines[i - 1].trim() === '') i -= 1;\n const blockLines = lines.slice(start, i);\n if (blockLines.filter((l) => l.trim()).length < 2) {\n out.push(line);\n i = start + 1;\n continue;\n }\n const block = blockLines.join('\\n');\n out.push(`\\`\\`\\`${guessFenceLang(block)}\\n${block}\\n\\`\\`\\``);\n }\n\n return out.join('\\n');\n}\n\nfunction isFolderTreeLine(line: string): boolean {\n const t = line.trim();\n if (!t) return true;\n if (/[│├└─┬┤]/.test(t)) return true;\n if (/→|->/.test(t) && /\\.\\w{1,8}\\b/.test(t)) return true;\n if (/^[A-Za-z0-9_.\\-]+\\/$/.test(t)) return true;\n if (/^[A-Za-z0-9_.\\-]+\\.\\w{1,8}\\s*$/.test(t)) return true;\n return false;\n}\n\n/**\n * Folder trees the model emits as prose (indents collapsed by markdown-it).\n * Fence them so they keep structure in the product code card.\n */\nexport function promoteFolderTrees(text: string): string {\n if (!text) return text;\n const lines = text.split('\\n');\n const out: string[] = [];\n let i = 0;\n let inFence = false;\n while (i < lines.length) {\n const line = lines[i];\n if (/^ {0,3}```/.test(line)) {\n inFence = !inFence;\n out.push(line);\n i += 1;\n continue;\n }\n if (inFence || !isFolderTreeLine(line) || !line.trim()) {\n out.push(line);\n i += 1;\n continue;\n }\n const start = i;\n i += 1;\n while (i < lines.length && isFolderTreeLine(lines[i]) && !/^ {0,3}```/.test(lines[i])) i += 1;\n while (i > start + 1 && lines[i - 1].trim() === '') i -= 1;\n const blockLines = lines.slice(start, i);\n const filled = blockLines.filter((l) => l.trim());\n const dirs = filled.filter((l) => /\\/$/.test(l.trim()) || /[│├└]/.test(l) || /→|->/.test(l));\n if (filled.length >= 4 && dirs.length >= 2) {\n out.push(`\\`\\`\\`text\\n${blockLines.join('\\n')}\\n\\`\\`\\``);\n continue;\n }\n out.push(...blockLines);\n }\n return out.join('\\n');\n}\n\nexport function wrapRawCodeIfNeeded(text: string): string {\n if (!text || /```/.test(text)) return text;\n const lines = text.split('\\n');\n const hits = lines.filter((l) =>\n /^\\s*(import |export |const |let |function |class |return |\\/\\/|\\/\\*|<[A-Za-z])/.test(l),\n ).length;\n if (hits >= 4 && hits / Math.max(lines.length, 1) >= 0.35) {\n return `\\`\\`\\`${guessFenceLang(text)}\\n${text.trim()}\\n\\`\\`\\``;\n }\n return text;\n}\n\n/**\n * While a reply streams, an image arrives as `![caption](` followed by several\n * hundred characters of signed URL before its `)`. Until it closes, markdown\n * reads it as text, so the half-link flashed on screen as a wall of URL. Hold\n * a trailing unfinished image back until it is complete.\n */\nexport function holdBackPartialImage(text: string): string {\n const open = text.match(/!\\[[^\\]\\n]*(\\](\\([^)\\s]*)?)?$/);\n return open?.index === undefined ? text : text.slice(0, open.index).replace(/[ \\t]+$/, '');\n}\n\nexport function prepareAssistantMarkdown(text: string, streaming: boolean): string {\n const fenced = wrapRawCodeIfNeeded(promoteFolderTrees(promoteBareCodeToFences(text)));\n return streaming ? closeOpenMarkdownFences(holdBackPartialImage(fenced)) : fenced;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx,Fragment}from'react/jsx-runtime';import React__default from'react';import {StyleSheet,Platform,View,TouchableOpacity,Text,ScrollView,ActivityIndicator,TextInput,Modal}from'react-native';import {SafeAreaView}from'react-native-safe-area-context';import {Ionicons}from'@expo/vector-icons';import {usePhoneVerification,isChatTestOtpEnabled,CHAT_REGISTRATION_TEST_OTP}from'./usePhoneVerification.js';const COUNTRIES = [{
1
+ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import React__default from'react';import {StyleSheet,Platform,View,TouchableOpacity,Text,ScrollView,ActivityIndicator,TextInput,Modal}from'react-native';import {SafeAreaView}from'react-native-safe-area-context';import {Ionicons}from'@expo/vector-icons';import {usePhoneVerification,isChatTestOtpEnabled,CHAT_REGISTRATION_TEST_OTP}from'./usePhoneVerification.js';const ALL_COUNTRIES = [{
2
2
  code: "US",
3
3
  name: "United States",
4
4
  callingCode: "+1"
@@ -6,6 +6,18 @@ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import React__default from'rea
6
6
  code: "IN",
7
7
  name: "India",
8
8
  callingCode: "+91"
9
+ }, {
10
+ code: "PK",
11
+ name: "Pakistan",
12
+ callingCode: "+92"
13
+ }, {
14
+ code: "BD",
15
+ name: "Bangladesh",
16
+ callingCode: "+880"
17
+ }, {
18
+ code: "AE",
19
+ name: "United Arab Emirates",
20
+ callingCode: "+971"
9
21
  }, {
10
22
  code: "GB",
11
23
  name: "United Kingdom",
@@ -55,6 +67,20 @@ import {jsxs,jsx,Fragment}from'react/jsx-runtime';import React__default from'rea
55
67
  name: "China",
56
68
  callingCode: "+86"
57
69
  }];
70
+ const DEFAULT_ALLOWED_DIAL_CODES = ["+1"];
71
+ function allowedDialCodes(raw = process.env.EXPO_PUBLIC_PHONE_OTP_ALLOWED_DIAL_CODES) {
72
+ const value = raw == null ? void 0 : raw.trim();
73
+ if (value === "*") return null;
74
+ if (!value) return DEFAULT_ALLOWED_DIAL_CODES;
75
+ const codes = value.split(",").map((c) => c.trim()).filter(Boolean).map((c) => c.startsWith("+") ? c : `+${c}`);
76
+ return codes.length ? codes : DEFAULT_ALLOWED_DIAL_CODES;
77
+ }
78
+ function pickerCountries(all = ALL_COUNTRIES, allowed = allowedDialCodes()) {
79
+ if (!allowed) return all;
80
+ const offered = all.filter((c) => allowed.includes(c.callingCode));
81
+ return offered.length ? offered : [all[0]];
82
+ }
83
+ const COUNTRIES = pickerCountries();
58
84
  function PhoneRow({
59
85
  countryCode,
60
86
  callingCode,
@@ -358,4 +384,4 @@ const styles = StyleSheet.create({
358
384
  countryListText: {
359
385
  fontSize: 16
360
386
  }
361
- });export{RegistrationScreen};//# sourceMappingURL=RegistrationScreen.js.map
387
+ });export{RegistrationScreen,allowedDialCodes,pickerCountries};//# sourceMappingURL=RegistrationScreen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegistrationScreen.js","sources":["../../../src/features/messaging/RegistrationScreen.tsx"],"sourcesContent":["/**\n * Registration screen for Yantra Chat.\n *\n * First-time users are prompted to register with their phone number.\n * The flow:\n * 1. User enters mobile number (country code in the same row)\n * 2. OTP is sent to their number\n * 3. User enters the OTP code to verify\n * 4. Phone number becomes their member ID in the Yantra Chat organization\n *\n * Follows the design from issue #1312.\n */\nimport React from 'react';\nimport {\n StyleSheet,\n View,\n Text,\n TouchableOpacity,\n TextInput,\n ActivityIndicator,\n ScrollView,\n Modal,\n Platform,\n} from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport { Ionicons } from '@expo/vector-icons';\nimport { CHAT_REGISTRATION_TEST_OTP, isChatTestOtpEnabled, usePhoneVerification } from './usePhoneVerification';\n\ninterface RegistrationScreenProps {\n /** Called when registration completes successfully. */\n onRegistrationComplete: (phoneNumber: string) => void;\n /** Theme configuration. */\n theme: { colors: Record<string, string>; fonts: Record<string, Record<string, string>> };\n testID?: string;\n}\n\ninterface CountryOption {\n code: string;\n name: string;\n callingCode: string;\n}\n\nconst COUNTRIES: CountryOption[] = [\n { code: 'US', name: 'United States', callingCode: '+1' },\n { code: 'IN', name: 'India', callingCode: '+91' },\n { code: 'GB', name: 'United Kingdom', callingCode: '+44' },\n { code: 'CA', name: 'Canada', callingCode: '+1' },\n { code: 'AU', name: 'Australia', callingCode: '+61' },\n { code: 'FR', name: 'France', callingCode: '+33' },\n { code: 'DE', name: 'Germany', callingCode: '+49' },\n { code: 'ES', name: 'Spain', callingCode: '+34' },\n { code: 'IT', name: 'Italy', callingCode: '+39' },\n { code: 'BR', name: 'Brazil', callingCode: '+55' },\n { code: 'MX', name: 'Mexico', callingCode: '+52' },\n { code: 'SG', name: 'Singapore', callingCode: '+65' },\n { code: 'JP', name: 'Japan', callingCode: '+81' },\n { code: 'CN', name: 'China', callingCode: '+86' },\n];\n\nfunction PhoneRow({\n countryCode,\n callingCode,\n phone,\n onCountryPress,\n onChangePhone,\n disabled,\n theme,\n}: {\n countryCode: string;\n callingCode: string;\n phone: string;\n onCountryPress: () => void;\n onChangePhone: (v: string) => void;\n disabled: boolean;\n theme: RegistrationScreenProps['theme'];\n}) {\n return (\n <View\n style={[\n styles.phoneRow,\n {\n flexDirection: 'row',\n alignItems: 'center',\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.card ?? '#fff',\n },\n ]}\n >\n <TouchableOpacity\n onPress={onCountryPress}\n disabled={disabled}\n style={[styles.countryChip, { flexDirection: 'row', alignItems: 'center' }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Select country code\"\n >\n <Text style={[styles.callingCode, { color: theme.colors.text }]}>{callingCode}</Text>\n <Ionicons name=\"chevron-down\" size={18} color={theme.colors.textSecondary} />\n </TouchableOpacity>\n <View style={[styles.phoneDivider, { backgroundColor: theme.colors.border }]} />\n <TextInput\n style={[styles.phoneInput, { color: theme.colors.text }]}\n placeholder=\"\"\n placeholderTextColor={theme.colors.placeholder}\n keyboardType=\"phone-pad\"\n textContentType=\"telephoneNumber\"\n value={phone}\n onChangeText={onChangePhone}\n editable={!disabled}\n maxLength={15}\n testID=\"chat-registration-phone\"\n />\n </View>\n );\n}\n\nexport function RegistrationScreen({ onRegistrationComplete, theme, testID }: RegistrationScreenProps) {\n const phoneVerification = usePhoneVerification('US');\n const selectedCountry = COUNTRIES.find((c) => c.code === phoneVerification.countryCode) || COUNTRIES[0];\n const [countryModalOpen, setCountryModalOpen] = React.useState(false);\n const accent = theme.colors.primary;\n const otpDigits = phoneVerification.otp.replace(/\\D/g, '');\n const testOtpEnabled = isChatTestOtpEnabled();\n const usingTestOtp = testOtpEnabled && (phoneVerification.testOtpMode || otpDigits === CHAT_REGISTRATION_TEST_OTP);\n\n const { registrationFailed } = phoneVerification;\n React.useEffect(() => {\n if (phoneVerification.stage === 'verified' && phoneVerification.verifiedPhone) {\n // A failed registration used to be dropped here, leaving the screen stuck with no reason.\n Promise.resolve(onRegistrationComplete(phoneVerification.verifiedPhone)).catch((err: unknown) => {\n const message = err instanceof Error && err.message ? err.message : '';\n registrationFailed(\n message\n ? `Could not register: ${message}`\n : 'Could not register for Yantra Chat. Please try again.',\n );\n });\n }\n }, [phoneVerification.stage, phoneVerification.verifiedPhone, onRegistrationComplete, registrationFailed]);\n\n const handleBack = React.useCallback(() => {\n if (phoneVerification.stage === 'otp') {\n phoneVerification.resetToInput();\n }\n }, [phoneVerification]);\n\n const handleSendOtp = React.useCallback(async () => {\n await phoneVerification.sendOtp();\n }, [phoneVerification]);\n\n const handleVerifyOtp = React.useCallback(async () => {\n await phoneVerification.verifyOtp();\n }, [phoneVerification]);\n\n const handleResend = React.useCallback(async () => {\n await phoneVerification.sendOtp();\n }, [phoneVerification]);\n\n return (\n <SafeAreaView\n style={[styles.container, { backgroundColor: theme.colors.background }]}\n edges={['top', 'left', 'right']}\n testID={testID}\n >\n <View style={[styles.header, { flexDirection: 'row', alignItems: 'center' }]}>\n {phoneVerification.stage === 'otp' ? (\n <TouchableOpacity onPress={handleBack} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>\n <Ionicons name=\"chevron-back\" size={28} color={theme.colors.text} />\n </TouchableOpacity>\n ) : (\n <View style={{ width: 28 }} />\n )}\n <Text style={[styles.title, { color: theme.colors.text, flex: 1, textAlign: 'center' }]}>\n Yantra Chat\n </Text>\n <View style={{ width: 28 }} />\n </View>\n\n <ScrollView\n contentContainerStyle={styles.content}\n showsVerticalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n >\n {phoneVerification.stage === 'input' ? (\n <>\n <Text style={[styles.subtitle, { color: theme.colors.text }]}>Register to Chat</Text>\n <Text style={[styles.description, { color: theme.colors.textSecondary }]}>\n Enter your mobile number to get started. You&apos;ll receive an OTP to verify.\n </Text>\n\n <View style={styles.form}>\n <PhoneRow\n countryCode={phoneVerification.countryCode}\n callingCode={selectedCountry.callingCode}\n phone={phoneVerification.inputPhone}\n onCountryPress={() => setCountryModalOpen(true)}\n onChangePhone={phoneVerification.setInputPhone}\n disabled={phoneVerification.loading}\n theme={theme}\n />\n\n {phoneVerification.error ? (\n <View style={[styles.errorBox, { backgroundColor: theme.colors.error + '10' }]}>\n <Ionicons name=\"alert-circle\" size={16} color={theme.colors.error} />\n <Text style={[styles.errorText, { color: theme.colors.error }]}>\n {phoneVerification.error}\n </Text>\n </View>\n ) : null}\n\n {testOtpEnabled ? (\n <TouchableOpacity onPress={phoneVerification.continueWithTestOtp}>\n <Text style={[styles.linkText, { color: accent }]}>Continue with test OTP</Text>\n </TouchableOpacity>\n ) : null}\n\n <TouchableOpacity\n onPress={handleSendOtp}\n disabled={phoneVerification.loading || !phoneVerification.inputPhone.trim()}\n style={[\n styles.button,\n {\n backgroundColor: phoneVerification.inputPhone.trim()\n ? accent\n : theme.colors.border,\n },\n ]}\n >\n {phoneVerification.loading ? (\n <ActivityIndicator color=\"#fff\" size=\"small\" />\n ) : (\n <Text style={styles.buttonText}>Send OTP</Text>\n )}\n </TouchableOpacity>\n </View>\n </>\n ) : (\n <>\n <Text style={[styles.subtitle, { color: theme.colors.text }]}>Verify your number</Text>\n <Text style={[styles.description, { color: theme.colors.textSecondary }]}>\n {usingTestOtp\n ? `Test mode: use code ${CHAT_REGISTRATION_TEST_OTP} and tap Continue.`\n : `Enter the 6-digit code sent to ${selectedCountry.callingCode} ${phoneVerification.inputPhone}`}\n </Text>\n\n <View style={styles.form}>\n <View\n style={[\n styles.otpInputContainer,\n {\n flexDirection: 'row',\n alignItems: 'center',\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.card ?? '#fff',\n },\n ]}\n >\n <TextInput\n style={[styles.otpInput, { color: theme.colors.text, flex: 1 }]}\n placeholder=\"\"\n keyboardType=\"number-pad\"\n value={phoneVerification.otp}\n onChangeText={phoneVerification.setOtp}\n editable={!phoneVerification.loading}\n maxLength={6}\n testID=\"chat-registration-otp\"\n />\n </View>\n\n {phoneVerification.error ? (\n <View style={[styles.errorBox, { backgroundColor: theme.colors.error + '10' }]}>\n <Ionicons name=\"alert-circle\" size={16} color={theme.colors.error} />\n <Text style={[styles.errorText, { color: theme.colors.error }]}>\n {phoneVerification.error}\n </Text>\n </View>\n ) : null}\n\n <TouchableOpacity\n onPress={handleVerifyOtp}\n disabled={phoneVerification.loading || otpDigits.length < 6}\n style={[\n styles.button,\n {\n backgroundColor: otpDigits.length >= 6 ? accent : theme.colors.border,\n },\n ]}\n >\n {phoneVerification.loading ? (\n <ActivityIndicator color=\"#fff\" size=\"small\" />\n ) : (\n <Text style={styles.buttonText}>\n {usingTestOtp ? 'Continue' : 'Verify & Register'}\n </Text>\n )}\n </TouchableOpacity>\n\n {!usingTestOtp ? (\n <TouchableOpacity onPress={handleResend} disabled={phoneVerification.loading}>\n <Text style={[styles.linkText, { color: accent }]}>\n Didn&apos;t get the code? Resend\n </Text>\n </TouchableOpacity>\n ) : null}\n </View>\n </>\n )}\n </ScrollView>\n\n <Modal visible={countryModalOpen} animationType=\"slide\" presentationStyle=\"pageSheet\">\n <SafeAreaView style={[styles.modalFill, { backgroundColor: theme.colors.background }]}>\n <View style={[styles.modalHeader, { flexDirection: 'row', alignItems: 'center' }]}>\n <Text style={[styles.modalTitle, { color: theme.colors.text }]}>Country code</Text>\n <TouchableOpacity onPress={() => setCountryModalOpen(false)}>\n <Ionicons name=\"close\" size={26} color={theme.colors.text} />\n </TouchableOpacity>\n </View>\n <ScrollView>\n {COUNTRIES.map((country) => (\n <TouchableOpacity\n key={country.code}\n onPress={() => {\n phoneVerification.setCountryCode(country.code);\n setCountryModalOpen(false);\n }}\n style={[\n styles.countryListItem,\n phoneVerification.countryCode === country.code && {\n backgroundColor: accent + '18',\n },\n ]}\n >\n <Text style={[styles.countryListText, { color: theme.colors.text }]}>\n {country.name} ({country.callingCode})\n </Text>\n {phoneVerification.countryCode === country.code ? (\n <Ionicons name=\"checkmark\" size={20} color={accent} />\n ) : null}\n </TouchableOpacity>\n ))}\n </ScrollView>\n </SafeAreaView>\n </Modal>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n header: {\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 8,\n },\n title: { fontSize: 17, fontWeight: '600' },\n content: { padding: 20, paddingBottom: 40 },\n subtitle: { fontSize: 22, fontWeight: '700', marginBottom: 8 },\n description: { fontSize: 14, marginBottom: 24, lineHeight: 20 },\n form: { gap: 14 },\n phoneRow: {\n borderWidth: 1,\n borderRadius: 10,\n minHeight: 48,\n overflow: 'hidden',\n },\n countryChip: {\n paddingHorizontal: 12,\n paddingVertical: 12,\n },\n callingCode: { fontSize: 16, fontWeight: '600', marginRight: 4 },\n phoneDivider: { width: StyleSheet.hairlineWidth, alignSelf: 'stretch' },\n phoneInput: {\n flex: 1,\n paddingHorizontal: 12,\n paddingVertical: Platform.OS === 'ios' ? 12 : 10,\n fontSize: 16,\n },\n otpInputContainer: {\n borderWidth: 1,\n borderRadius: 10,\n paddingHorizontal: 16,\n },\n otpInput: {\n paddingVertical: 14,\n fontSize: 22,\n fontWeight: '600',\n letterSpacing: 6,\n textAlign: 'center',\n },\n button: {\n borderRadius: 10,\n paddingVertical: 14,\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: 4,\n },\n buttonText: { color: '#fff', fontSize: 16, fontWeight: '600' },\n errorBox: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n gap: 8,\n },\n errorText: { fontSize: 13, flex: 1 },\n linkText: { fontSize: 14, textAlign: 'center', fontWeight: '500' },\n modalFill: { flex: 1 },\n modalHeader: {\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n modalTitle: { fontSize: 18, fontWeight: '700' },\n countryListItem: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: 'rgba(0,0,0,0.06)',\n },\n countryListText: { fontSize: 16 },\n});\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"RegistrationScreen.js","sources":["../../../src/features/messaging/RegistrationScreen.tsx"],"sourcesContent":["/**\n * Registration screen for Yantra Chat.\n *\n * First-time users are prompted to register with their phone number.\n * The flow:\n * 1. User enters mobile number (country code in the same row)\n * 2. OTP is sent to their number\n * 3. User enters the OTP code to verify\n * 4. Phone number becomes their member ID in the Yantra Chat organization\n *\n * Follows the design from issue #1312.\n */\nimport React from 'react';\nimport {\n StyleSheet,\n View,\n Text,\n TouchableOpacity,\n TextInput,\n ActivityIndicator,\n ScrollView,\n Modal,\n Platform,\n} from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport { Ionicons } from '@expo/vector-icons';\nimport { CHAT_REGISTRATION_TEST_OTP, isChatTestOtpEnabled, usePhoneVerification } from './usePhoneVerification';\n\ninterface RegistrationScreenProps {\n /** Called when registration completes successfully. */\n onRegistrationComplete: (phoneNumber: string) => void;\n /** Theme configuration. */\n theme: { colors: Record<string, string>; fonts: Record<string, Record<string, string>> };\n testID?: string;\n}\n\ninterface CountryOption {\n code: string;\n name: string;\n callingCode: string;\n}\n\n/** Every country the picker knows. Nothing is removed from here when a country is switched off. */\nconst ALL_COUNTRIES: CountryOption[] = [\n { code: 'US', name: 'United States', callingCode: '+1' },\n { code: 'IN', name: 'India', callingCode: '+91' },\n { code: 'PK', name: 'Pakistan', callingCode: '+92' },\n { code: 'BD', name: 'Bangladesh', callingCode: '+880' },\n { code: 'AE', name: 'United Arab Emirates', callingCode: '+971' },\n { code: 'GB', name: 'United Kingdom', callingCode: '+44' },\n { code: 'CA', name: 'Canada', callingCode: '+1' },\n { code: 'AU', name: 'Australia', callingCode: '+61' },\n { code: 'FR', name: 'France', callingCode: '+33' },\n { code: 'DE', name: 'Germany', callingCode: '+49' },\n { code: 'ES', name: 'Spain', callingCode: '+34' },\n { code: 'IT', name: 'Italy', callingCode: '+39' },\n { code: 'BR', name: 'Brazil', callingCode: '+55' },\n { code: 'MX', name: 'Mexico', callingCode: '+52' },\n { code: 'SG', name: 'Singapore', callingCode: '+65' },\n { code: 'JP', name: 'Japan', callingCode: '+81' },\n { code: 'CN', name: 'China', callingCode: '+86' },\n];\n\n/**\n * Which of those the picker offers. SMS verification is US-only for now: the AWS account is\n * still in the SMS sandbox and the non-US origination registrations are pending. The server\n * enforces the same rule (PHONE_OTP_ALLOWED_DIAL_CODES), so this must be widened together with\n * it. Override at build time with EXPO_PUBLIC_PHONE_OTP_ALLOWED_DIAL_CODES (\"+1,+92\", or \"*\").\n */\nconst DEFAULT_ALLOWED_DIAL_CODES = ['+1'];\n\nexport function allowedDialCodes(\n raw: string | undefined = process.env.EXPO_PUBLIC_PHONE_OTP_ALLOWED_DIAL_CODES,\n): string[] | null {\n const value = raw?.trim();\n if (value === '*') return null;\n if (!value) return DEFAULT_ALLOWED_DIAL_CODES;\n const codes = value\n .split(',')\n .map((c) => c.trim())\n .filter(Boolean)\n .map((c) => (c.startsWith('+') ? c : `+${c}`));\n return codes.length ? codes : DEFAULT_ALLOWED_DIAL_CODES;\n}\n\nexport function pickerCountries(\n all: CountryOption[] = ALL_COUNTRIES,\n allowed: string[] | null = allowedDialCodes(),\n): CountryOption[] {\n if (!allowed) return all;\n const offered = all.filter((c) => allowed.includes(c.callingCode));\n return offered.length ? offered : [all[0]];\n}\n\nconst COUNTRIES: CountryOption[] = pickerCountries();\n\nfunction PhoneRow({\n countryCode,\n callingCode,\n phone,\n onCountryPress,\n onChangePhone,\n disabled,\n theme,\n}: {\n countryCode: string;\n callingCode: string;\n phone: string;\n onCountryPress: () => void;\n onChangePhone: (v: string) => void;\n disabled: boolean;\n theme: RegistrationScreenProps['theme'];\n}) {\n return (\n <View\n style={[\n styles.phoneRow,\n {\n flexDirection: 'row',\n alignItems: 'center',\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.card ?? '#fff',\n },\n ]}\n >\n <TouchableOpacity\n onPress={onCountryPress}\n disabled={disabled}\n style={[styles.countryChip, { flexDirection: 'row', alignItems: 'center' }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Select country code\"\n >\n <Text style={[styles.callingCode, { color: theme.colors.text }]}>{callingCode}</Text>\n <Ionicons name=\"chevron-down\" size={18} color={theme.colors.textSecondary} />\n </TouchableOpacity>\n <View style={[styles.phoneDivider, { backgroundColor: theme.colors.border }]} />\n <TextInput\n style={[styles.phoneInput, { color: theme.colors.text }]}\n placeholder=\"\"\n placeholderTextColor={theme.colors.placeholder}\n keyboardType=\"phone-pad\"\n textContentType=\"telephoneNumber\"\n value={phone}\n onChangeText={onChangePhone}\n editable={!disabled}\n maxLength={15}\n testID=\"chat-registration-phone\"\n />\n </View>\n );\n}\n\nexport function RegistrationScreen({ onRegistrationComplete, theme, testID }: RegistrationScreenProps) {\n const phoneVerification = usePhoneVerification('US');\n const selectedCountry = COUNTRIES.find((c) => c.code === phoneVerification.countryCode) || COUNTRIES[0];\n const [countryModalOpen, setCountryModalOpen] = React.useState(false);\n const accent = theme.colors.primary;\n const otpDigits = phoneVerification.otp.replace(/\\D/g, '');\n const testOtpEnabled = isChatTestOtpEnabled();\n const usingTestOtp = testOtpEnabled && (phoneVerification.testOtpMode || otpDigits === CHAT_REGISTRATION_TEST_OTP);\n\n const { registrationFailed } = phoneVerification;\n React.useEffect(() => {\n if (phoneVerification.stage === 'verified' && phoneVerification.verifiedPhone) {\n // A failed registration used to be dropped here, leaving the screen stuck with no reason.\n Promise.resolve(onRegistrationComplete(phoneVerification.verifiedPhone)).catch((err: unknown) => {\n const message = err instanceof Error && err.message ? err.message : '';\n registrationFailed(\n message\n ? `Could not register: ${message}`\n : 'Could not register for Yantra Chat. Please try again.',\n );\n });\n }\n }, [phoneVerification.stage, phoneVerification.verifiedPhone, onRegistrationComplete, registrationFailed]);\n\n const handleBack = React.useCallback(() => {\n if (phoneVerification.stage === 'otp') {\n phoneVerification.resetToInput();\n }\n }, [phoneVerification]);\n\n const handleSendOtp = React.useCallback(async () => {\n await phoneVerification.sendOtp();\n }, [phoneVerification]);\n\n const handleVerifyOtp = React.useCallback(async () => {\n await phoneVerification.verifyOtp();\n }, [phoneVerification]);\n\n const handleResend = React.useCallback(async () => {\n await phoneVerification.sendOtp();\n }, [phoneVerification]);\n\n return (\n <SafeAreaView\n style={[styles.container, { backgroundColor: theme.colors.background }]}\n edges={['top', 'left', 'right']}\n testID={testID}\n >\n <View style={[styles.header, { flexDirection: 'row', alignItems: 'center' }]}>\n {phoneVerification.stage === 'otp' ? (\n <TouchableOpacity onPress={handleBack} hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}>\n <Ionicons name=\"chevron-back\" size={28} color={theme.colors.text} />\n </TouchableOpacity>\n ) : (\n <View style={{ width: 28 }} />\n )}\n <Text style={[styles.title, { color: theme.colors.text, flex: 1, textAlign: 'center' }]}>\n Yantra Chat\n </Text>\n <View style={{ width: 28 }} />\n </View>\n\n <ScrollView\n contentContainerStyle={styles.content}\n showsVerticalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n >\n {phoneVerification.stage === 'input' ? (\n <>\n <Text style={[styles.subtitle, { color: theme.colors.text }]}>Register to Chat</Text>\n <Text style={[styles.description, { color: theme.colors.textSecondary }]}>\n Enter your mobile number to get started. You&apos;ll receive an OTP to verify.\n </Text>\n\n <View style={styles.form}>\n <PhoneRow\n countryCode={phoneVerification.countryCode}\n callingCode={selectedCountry.callingCode}\n phone={phoneVerification.inputPhone}\n onCountryPress={() => setCountryModalOpen(true)}\n onChangePhone={phoneVerification.setInputPhone}\n disabled={phoneVerification.loading}\n theme={theme}\n />\n\n {phoneVerification.error ? (\n <View style={[styles.errorBox, { backgroundColor: theme.colors.error + '10' }]}>\n <Ionicons name=\"alert-circle\" size={16} color={theme.colors.error} />\n <Text style={[styles.errorText, { color: theme.colors.error }]}>\n {phoneVerification.error}\n </Text>\n </View>\n ) : null}\n\n {testOtpEnabled ? (\n <TouchableOpacity onPress={phoneVerification.continueWithTestOtp}>\n <Text style={[styles.linkText, { color: accent }]}>Continue with test OTP</Text>\n </TouchableOpacity>\n ) : null}\n\n <TouchableOpacity\n onPress={handleSendOtp}\n disabled={phoneVerification.loading || !phoneVerification.inputPhone.trim()}\n style={[\n styles.button,\n {\n backgroundColor: phoneVerification.inputPhone.trim()\n ? accent\n : theme.colors.border,\n },\n ]}\n >\n {phoneVerification.loading ? (\n <ActivityIndicator color=\"#fff\" size=\"small\" />\n ) : (\n <Text style={styles.buttonText}>Send OTP</Text>\n )}\n </TouchableOpacity>\n </View>\n </>\n ) : (\n <>\n <Text style={[styles.subtitle, { color: theme.colors.text }]}>Verify your number</Text>\n <Text style={[styles.description, { color: theme.colors.textSecondary }]}>\n {usingTestOtp\n ? `Test mode: use code ${CHAT_REGISTRATION_TEST_OTP} and tap Continue.`\n : `Enter the 6-digit code sent to ${selectedCountry.callingCode} ${phoneVerification.inputPhone}`}\n </Text>\n\n <View style={styles.form}>\n <View\n style={[\n styles.otpInputContainer,\n {\n flexDirection: 'row',\n alignItems: 'center',\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.card ?? '#fff',\n },\n ]}\n >\n <TextInput\n style={[styles.otpInput, { color: theme.colors.text, flex: 1 }]}\n placeholder=\"\"\n keyboardType=\"number-pad\"\n value={phoneVerification.otp}\n onChangeText={phoneVerification.setOtp}\n editable={!phoneVerification.loading}\n maxLength={6}\n testID=\"chat-registration-otp\"\n />\n </View>\n\n {phoneVerification.error ? (\n <View style={[styles.errorBox, { backgroundColor: theme.colors.error + '10' }]}>\n <Ionicons name=\"alert-circle\" size={16} color={theme.colors.error} />\n <Text style={[styles.errorText, { color: theme.colors.error }]}>\n {phoneVerification.error}\n </Text>\n </View>\n ) : null}\n\n <TouchableOpacity\n onPress={handleVerifyOtp}\n disabled={phoneVerification.loading || otpDigits.length < 6}\n style={[\n styles.button,\n {\n backgroundColor: otpDigits.length >= 6 ? accent : theme.colors.border,\n },\n ]}\n >\n {phoneVerification.loading ? (\n <ActivityIndicator color=\"#fff\" size=\"small\" />\n ) : (\n <Text style={styles.buttonText}>\n {usingTestOtp ? 'Continue' : 'Verify & Register'}\n </Text>\n )}\n </TouchableOpacity>\n\n {!usingTestOtp ? (\n <TouchableOpacity onPress={handleResend} disabled={phoneVerification.loading}>\n <Text style={[styles.linkText, { color: accent }]}>\n Didn&apos;t get the code? Resend\n </Text>\n </TouchableOpacity>\n ) : null}\n </View>\n </>\n )}\n </ScrollView>\n\n <Modal visible={countryModalOpen} animationType=\"slide\" presentationStyle=\"pageSheet\">\n <SafeAreaView style={[styles.modalFill, { backgroundColor: theme.colors.background }]}>\n <View style={[styles.modalHeader, { flexDirection: 'row', alignItems: 'center' }]}>\n <Text style={[styles.modalTitle, { color: theme.colors.text }]}>Country code</Text>\n <TouchableOpacity onPress={() => setCountryModalOpen(false)}>\n <Ionicons name=\"close\" size={26} color={theme.colors.text} />\n </TouchableOpacity>\n </View>\n <ScrollView>\n {COUNTRIES.map((country) => (\n <TouchableOpacity\n key={country.code}\n onPress={() => {\n phoneVerification.setCountryCode(country.code);\n setCountryModalOpen(false);\n }}\n style={[\n styles.countryListItem,\n phoneVerification.countryCode === country.code && {\n backgroundColor: accent + '18',\n },\n ]}\n >\n <Text style={[styles.countryListText, { color: theme.colors.text }]}>\n {country.name} ({country.callingCode})\n </Text>\n {phoneVerification.countryCode === country.code ? (\n <Ionicons name=\"checkmark\" size={20} color={accent} />\n ) : null}\n </TouchableOpacity>\n ))}\n </ScrollView>\n </SafeAreaView>\n </Modal>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: { flex: 1 },\n header: {\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 8,\n },\n title: { fontSize: 17, fontWeight: '600' },\n content: { padding: 20, paddingBottom: 40 },\n subtitle: { fontSize: 22, fontWeight: '700', marginBottom: 8 },\n description: { fontSize: 14, marginBottom: 24, lineHeight: 20 },\n form: { gap: 14 },\n phoneRow: {\n borderWidth: 1,\n borderRadius: 10,\n minHeight: 48,\n overflow: 'hidden',\n },\n countryChip: {\n paddingHorizontal: 12,\n paddingVertical: 12,\n },\n callingCode: { fontSize: 16, fontWeight: '600', marginRight: 4 },\n phoneDivider: { width: StyleSheet.hairlineWidth, alignSelf: 'stretch' },\n phoneInput: {\n flex: 1,\n paddingHorizontal: 12,\n paddingVertical: Platform.OS === 'ios' ? 12 : 10,\n fontSize: 16,\n },\n otpInputContainer: {\n borderWidth: 1,\n borderRadius: 10,\n paddingHorizontal: 16,\n },\n otpInput: {\n paddingVertical: 14,\n fontSize: 22,\n fontWeight: '600',\n letterSpacing: 6,\n textAlign: 'center',\n },\n button: {\n borderRadius: 10,\n paddingVertical: 14,\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: 4,\n },\n buttonText: { color: '#fff', fontSize: 16, fontWeight: '600' },\n errorBox: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n gap: 8,\n },\n errorText: { fontSize: 13, flex: 1 },\n linkText: { fontSize: 14, textAlign: 'center', fontWeight: '500' },\n modalFill: { flex: 1 },\n modalHeader: {\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n modalTitle: { fontSize: 18, fontWeight: '700' },\n countryListItem: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingVertical: 14,\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderBottomColor: 'rgba(0,0,0,0.06)',\n },\n countryListText: { fontSize: 16 },\n});\n"],"names":["React"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminide-stack/yantra-mobile",
3
- "version": "12.0.70",
3
+ "version": "12.0.71-alpha.1",
4
4
  "description": "Sample core for higher packages to depend on",
5
5
  "license": "ISC",
6
6
  "author": "CDMBase LLC",
@@ -26,7 +26,7 @@
26
26
  "uuid": "^9.0.0"
27
27
  },
28
28
  "devDependencies": {
29
- "common": "^12.0.70"
29
+ "common": "12.0.71-alpha.1"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@admin-layout/gluestack-ui-mobile": "*",
@@ -42,7 +42,7 @@
42
42
  "@messenger-box/platform-mobile": "*",
43
43
  "@react-native-async-storage/async-storage": "*",
44
44
  "@react-navigation/native": "*",
45
- "common": "12.0.69",
45
+ "common": "12.0.71-alpha.0",
46
46
  "expo-constants": "*",
47
47
  "expo-secure-store": "*",
48
48
  "expo-web-browser": "*",
@@ -59,5 +59,5 @@
59
59
  "typescript": {
60
60
  "definition": "lib/index.d.ts"
61
61
  },
62
- "gitHead": "ec2d330651b983c209a7f482ff6a38755ec7e761"
62
+ "gitHead": "2ecb8c967ee7dce09b0de6a4e0a6d9a148933368"
63
63
  }