@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.142-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/lib/features/agent-chat/NativeAgentChat.js +21 -4
  2. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  3. package/lib/features/chat/ApprovalCard.js +353 -0
  4. package/lib/features/chat/ApprovalCard.js.map +1 -0
  5. package/lib/features/chat/AskUserCard.js +9 -2
  6. package/lib/features/chat/AskUserCard.js.map +1 -1
  7. package/lib/features/chat/askUser.js +25 -3
  8. package/lib/features/chat/askUser.js.map +1 -1
  9. package/lib/features/chat/queuedFollowUpRows.js +13 -0
  10. package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
  11. package/lib/features/dictate/DictateExperience.js +59 -7
  12. package/lib/features/dictate/DictateExperience.js.map +1 -1
  13. package/lib/features/dictate/components/NoteView.js +227 -12
  14. package/lib/features/dictate/components/NoteView.js.map +1 -1
  15. package/lib/features/dictate/dictateClient.js +93 -23
  16. package/lib/features/dictate/dictateClient.js.map +1 -1
  17. package/lib/features/dictate/dictatePreference.js +19 -0
  18. package/lib/features/dictate/dictatePreference.js.map +1 -0
  19. package/lib/features/dictate/noteText.js +17 -2
  20. package/lib/features/dictate/noteText.js.map +1 -1
  21. package/lib/features/dictate/privacy.js +96 -0
  22. package/lib/features/dictate/privacy.js.map +1 -0
  23. package/lib/features/dictate/shownNote.js +24 -0
  24. package/lib/features/dictate/shownNote.js.map +1 -0
  25. package/lib/features/discover/DiscoverArticle.js +105 -92
  26. package/lib/features/discover/DiscoverArticle.js.map +1 -1
  27. package/lib/features/discover/DiscoverFeed.js +97 -48
  28. package/lib/features/discover/DiscoverFeed.js.map +1 -1
  29. package/lib/features/discover/DiscoverFollowUp.js +135 -0
  30. package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
  31. package/lib/features/discover/DiscoverSidebar.js +555 -0
  32. package/lib/features/discover/DiscoverSidebar.js.map +1 -0
  33. package/lib/features/discover/DiscoverSkeletons.js +123 -0
  34. package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
  35. package/lib/features/discover/DiscoverStoryCards.js +193 -87
  36. package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
  37. package/lib/features/discover/followUpQuery.js +42 -0
  38. package/lib/features/discover/followUpQuery.js.map +1 -0
  39. package/lib/features/discover/markets.js +37 -0
  40. package/lib/features/discover/markets.js.map +1 -0
  41. package/lib/features/discover/useDiscoverSidebar.js +148 -0
  42. package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
  43. package/lib/features/discover/weather.js +42 -0
  44. package/lib/features/discover/weather.js.map +1 -0
  45. package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
  46. package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
  47. package/lib/features/inbox/InboxAgentChatPane.js +1 -1
  48. package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
  49. package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
  50. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
  51. package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
  52. package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
  53. package/lib/features/movies/MoviesAgentChatPane.js +1 -1
  54. package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
  55. package/lib/features/notion/NotionBlockSheets.js +206 -0
  56. package/lib/features/notion/NotionBlockSheets.js.map +1 -0
  57. package/lib/features/notion/NotionBlockView.js +36 -0
  58. package/lib/features/notion/NotionBlockView.js.map +1 -0
  59. package/lib/features/notion/NotionCommentsSheet.js +461 -0
  60. package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
  61. package/lib/features/notion/NotionConnectionsSheet.js +244 -0
  62. package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
  63. package/lib/features/notion/NotionHistorySheet.js +439 -0
  64. package/lib/features/notion/NotionHistorySheet.js.map +1 -0
  65. package/lib/features/notion/NotionMediaBlocks.js +803 -0
  66. package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
  67. package/lib/features/notion/NotionMentionSheet.js +279 -0
  68. package/lib/features/notion/NotionMentionSheet.js.map +1 -0
  69. package/lib/features/notion/NotionPageMenu.js +585 -0
  70. package/lib/features/notion/NotionPageMenu.js.map +1 -0
  71. package/lib/features/notion/NotionPageTree.js +220 -0
  72. package/lib/features/notion/NotionPageTree.js.map +1 -0
  73. package/lib/features/notion/NotionPageView.js +1253 -152
  74. package/lib/features/notion/NotionPageView.js.map +1 -1
  75. package/lib/features/notion/NotionShareSheet.js +606 -0
  76. package/lib/features/notion/NotionShareSheet.js.map +1 -0
  77. package/lib/features/notion/NotionSheets.js +87 -15
  78. package/lib/features/notion/NotionSheets.js.map +1 -1
  79. package/lib/features/notion/NotionSidebarSections.js +492 -0
  80. package/lib/features/notion/NotionSidebarSections.js.map +1 -0
  81. package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
  82. package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
  83. package/lib/features/notion/NotionWorkspaceView.js +257 -45
  84. package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
  85. package/lib/features/notion/database/DatabaseCells.js +554 -0
  86. package/lib/features/notion/database/DatabaseCells.js.map +1 -0
  87. package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
  88. package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
  89. package/lib/features/notion/database/DatabaseLayouts.js +461 -0
  90. package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
  91. package/lib/features/notion/database/DatabaseSheets.js +791 -0
  92. package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
  93. package/lib/features/notion/database/NotionDatabaseView.js +817 -0
  94. package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
  95. package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
  96. package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
  97. package/lib/features/notion/database/chartData.js +89 -0
  98. package/lib/features/notion/database/chartData.js.map +1 -0
  99. package/lib/features/notion/database/chartView.js +112 -0
  100. package/lib/features/notion/database/chartView.js.map +1 -0
  101. package/lib/features/notion/database/connectorButton.js +33 -0
  102. package/lib/features/notion/database/connectorButton.js.map +1 -0
  103. package/lib/features/notion/database/databaseCalc.js +208 -0
  104. package/lib/features/notion/database/databaseCalc.js.map +1 -0
  105. package/lib/features/notion/database/databaseCalendar.js +157 -0
  106. package/lib/features/notion/database/databaseCalendar.js.map +1 -0
  107. package/lib/features/notion/database/databaseCsv.js +98 -0
  108. package/lib/features/notion/database/databaseCsv.js.map +1 -0
  109. package/lib/features/notion/database/databaseCsvActions.js +58 -0
  110. package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
  111. package/lib/features/notion/database/databaseFilter.js +473 -0
  112. package/lib/features/notion/database/databaseFilter.js.map +1 -0
  113. package/lib/features/notion/database/databaseFormula.js +1072 -0
  114. package/lib/features/notion/database/databaseFormula.js.map +1 -0
  115. package/lib/features/notion/database/databaseGroup.js +151 -0
  116. package/lib/features/notion/database/databaseGroup.js.map +1 -0
  117. package/lib/features/notion/database/databaseRollup.js +58 -0
  118. package/lib/features/notion/database/databaseRollup.js.map +1 -0
  119. package/lib/features/notion/database/databaseTimeline.js +156 -0
  120. package/lib/features/notion/database/databaseTimeline.js.map +1 -0
  121. package/lib/features/notion/database/databaseView.js +1188 -0
  122. package/lib/features/notion/database/databaseView.js.map +1 -0
  123. package/lib/features/notion/database/databaseViews.js +310 -0
  124. package/lib/features/notion/database/databaseViews.js.map +1 -0
  125. package/lib/features/notion/database/relationSource.js +92 -0
  126. package/lib/features/notion/database/relationSource.js.map +1 -0
  127. package/lib/features/notion/database/uniqueId.js +17 -0
  128. package/lib/features/notion/database/uniqueId.js.map +1 -0
  129. package/lib/features/notion/database/useNotionDatabase.js +617 -0
  130. package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
  131. package/lib/features/notion/notionAgentRunStatus.js +39 -0
  132. package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
  133. package/lib/features/notion/notionCodeLanguages.js +112 -0
  134. package/lib/features/notion/notionCodeLanguages.js.map +1 -0
  135. package/lib/features/notion/notionComments.js +86 -0
  136. package/lib/features/notion/notionComments.js.map +1 -0
  137. package/lib/features/notion/notionConnections.js +74 -0
  138. package/lib/features/notion/notionConnections.js.map +1 -0
  139. package/lib/features/notion/notionDocuments.js +453 -1
  140. package/lib/features/notion/notionDocuments.js.map +1 -1
  141. package/lib/features/notion/notionEditorModel.js +142 -7
  142. package/lib/features/notion/notionEditorModel.js.map +1 -1
  143. package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
  144. package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
  145. package/lib/features/notion/notionMedia.js +119 -0
  146. package/lib/features/notion/notionMedia.js.map +1 -0
  147. package/lib/features/notion/notionMentionDate.js +32 -0
  148. package/lib/features/notion/notionMentionDate.js.map +1 -0
  149. package/lib/features/notion/notionMentionOptions.js +162 -0
  150. package/lib/features/notion/notionMentionOptions.js.map +1 -0
  151. package/lib/features/notion/notionNotesAgent.js +445 -0
  152. package/lib/features/notion/notionNotesAgent.js.map +1 -0
  153. package/lib/features/notion/notionPageAccess.js +168 -0
  154. package/lib/features/notion/notionPageAccess.js.map +1 -0
  155. package/lib/features/notion/notionPageActions.js +138 -0
  156. package/lib/features/notion/notionPageActions.js.map +1 -0
  157. package/lib/features/notion/notionPageHistory.js +154 -0
  158. package/lib/features/notion/notionPageHistory.js.map +1 -0
  159. package/lib/features/notion/notionPageKinds.js +200 -0
  160. package/lib/features/notion/notionPageKinds.js.map +1 -0
  161. package/lib/features/notion/notionRecents.js +48 -0
  162. package/lib/features/notion/notionRecents.js.map +1 -0
  163. package/lib/features/notion/notionRichText.js +177 -0
  164. package/lib/features/notion/notionRichText.js.map +1 -0
  165. package/lib/features/notion/notionRichTitle.js +336 -0
  166. package/lib/features/notion/notionRichTitle.js.map +1 -0
  167. package/lib/features/notion/useNotionWorkspace.js +272 -13
  168. package/lib/features/notion/useNotionWorkspace.js.map +1 -1
  169. package/lib/features/notion/usePageActions.js +155 -0
  170. package/lib/features/notion/usePageActions.js.map +1 -0
  171. package/lib/features/resume/ResumeAgentChatPane.js +1 -1
  172. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
  173. package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
  174. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
  175. package/lib/features/study/StudyAgentChatPane.js +1 -1
  176. package/lib/features/study/StudyAgentChatPane.js.map +1 -1
  177. package/lib/features/travel/TravelAgentChatPane.js +1 -1
  178. package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
  179. package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
  180. package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
  181. package/lib/features/webbuilder/buildFragments.js +1 -1
  182. package/lib/features/webbuilder/buildFragments.js.map +1 -1
  183. package/lib/features/webbuilder/codeFiles.js +302 -0
  184. package/lib/features/webbuilder/codeFiles.js.map +1 -0
  185. package/lib/features/webbuilder/codeHighlight.js +209 -0
  186. package/lib/features/webbuilder/codeHighlight.js.map +1 -0
  187. package/lib/features/webbuilder/components/CodeView.js +682 -52
  188. package/lib/features/webbuilder/components/CodeView.js.map +1 -1
  189. package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
  190. package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
  191. package/lib/features/webbuilder/components/ProjectChat.js +3 -3
  192. package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
  193. package/lib/features/webbuilder/stepLabels.js +68 -0
  194. package/lib/features/webbuilder/stepLabels.js.map +1 -0
  195. package/lib/hooks/useHostChatSteering.js +45 -0
  196. package/lib/hooks/useHostChatSteering.js.map +1 -0
  197. package/lib/screens/Chat/index.js +2 -12
  198. package/lib/screens/Chat/index.js.map +1 -1
  199. package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
  200. package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
  201. package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
  202. package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
  203. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
  204. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  205. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
  206. package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
  207. package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
  208. package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
  209. package/lib/screens/NotionPage/index.js +2 -2
  210. package/lib/screens/NotionPage/index.js.map +1 -1
  211. package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
  212. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  213. package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
  214. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  215. package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
  216. package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
  217. package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
  218. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  219. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
  220. package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
  221. package/lib/screens/WebBuilderNative/index.js +1 -1
  222. package/lib/screens/WebBuilderNative/index.js.map +1 -1
  223. package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
  224. package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
  225. package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
  226. package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
  227. package/package.json +3 -3
@@ -1,33 +1,60 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useState,useRef,useEffect,useCallback}from'react';import {View,StyleSheet,ActivityIndicator,FlatList,RefreshControl,ScrollView,Pressable,Text}from'react-native';import {useNavigation}from'@react-navigation/native';import {getStoryId}from'./articleContent.js';import {discoverPalette,openDiscoverArticle,LeadStoryCard,CompactStoryCard}from'./DiscoverStoryCards.js';import {DISCOVER_TOPICS,useNewsArticlesInfinite}from'./useDiscoverNews.js';const BLOCK_SIZE = 5;
2
- function TopicTabs({
1
+ import {jsxs,jsx}from'react/jsx-runtime';import React__default,{useMemo,useState,useRef,useEffect,useCallback}from'react';import {View,StyleSheet,FlatList,RefreshControl,ActivityIndicator,Text,ScrollView,Pressable}from'react-native';import {useNavigation}from'@react-navigation/native';import {getStoryId}from'./articleContent.js';import {DiscoverSidebar}from'./DiscoverSidebar.js';import {DiscoverNewsSkeleton}from'./DiscoverSkeletons.js';import {discoverPalette,openDiscoverArticle,SummaryStoryCard,CompactStoryCard,DISCOVER_SERIF}from'./DiscoverStoryCards.js';import {DISCOVER_TOPICS,useNewsArticlesInfinite}from'./useDiscoverNews.js';import {useDiscoverSidebar}from'./useDiscoverSidebar.js';const BLOCK_SIZE = 5;
2
+ function chunkStories(stories) {
3
+ const blocks = [];
4
+ for (let index = 0; index < stories.length; index += BLOCK_SIZE) {
5
+ blocks.push(stories.slice(index, index + BLOCK_SIZE));
6
+ }
7
+ return blocks;
8
+ }
9
+ function DiscoverHeader({
3
10
  active,
4
11
  onChange,
5
12
  palette
6
13
  }) {
7
- return /* @__PURE__ */ jsx(View, { style: [styles.tabsBar, {
14
+ var _a, _b;
15
+ const label = (_b = (_a = DISCOVER_TOPICS.find((topic) => topic.key === active)) == null ? void 0 : _a.label) != null ? _b : "Top";
16
+ return /* @__PURE__ */ jsxs(View, { style: [styles.header, {
8
17
  borderBottomColor: palette.border,
9
18
  backgroundColor: palette.bg
10
- }], children: /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.tabsContent, accessibilityRole: "tablist", children: DISCOVER_TOPICS.map((topic) => {
11
- const selected = topic.key === active;
12
- return /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "tab", accessibilityState: {
13
- selected
14
- }, onPress: () => onChange(topic.key), style: [styles.tab, selected && {
15
- backgroundColor: palette.primarySoft,
16
- borderColor: palette.primaryBorder
17
- }], children: /* @__PURE__ */ jsx(Text, { style: [styles.tabLabel, {
18
- color: selected ? palette.primary : palette.textMuted
19
- }, selected && styles.tabLabelSelected], children: topic.label }) }, topic.key);
20
- }) }) });
21
- }
22
- function Separator() {
23
- return /* @__PURE__ */ jsx(View, { style: styles.separator });
19
+ }], children: [
20
+ /* @__PURE__ */ jsx(Text, { style: [styles.pageTitle, {
21
+ color: palette.text
22
+ }], accessibilityRole: "header", numberOfLines: 1, children: label }),
23
+ /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.tabsContent, accessibilityRole: "tablist", accessibilityLabel: "Discover navigation", children: DISCOVER_TOPICS.map((topic) => {
24
+ const selected = topic.key === active;
25
+ return /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "tab", accessibilityState: {
26
+ selected
27
+ }, onPress: () => onChange(topic.key), style: [styles.tab, selected && {
28
+ backgroundColor: palette.primarySoft
29
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.tabLabel, {
30
+ color: selected ? palette.primary : palette.textMuted
31
+ }], children: topic.label }) }, topic.key);
32
+ }) })
33
+ ] });
24
34
  }
35
+ const StoryBlock = React__default.memo(function StoryBlock2({
36
+ stories,
37
+ palette,
38
+ onOpen
39
+ }) {
40
+ const [lead, ...rest] = stories;
41
+ const closing = stories.length === BLOCK_SIZE ? rest[rest.length - 1] : void 0;
42
+ const compact = closing ? rest.slice(0, -1) : rest;
43
+ if (!lead) return null;
44
+ return /* @__PURE__ */ jsxs(View, { style: styles.block, children: [
45
+ /* @__PURE__ */ jsx(SummaryStoryCard, { story: lead, palette, onPress: onOpen, lead: true }),
46
+ compact.map((story) => /* @__PURE__ */ jsx(CompactStoryCard, { story, palette, onPress: onOpen }, getStoryId(story))),
47
+ closing ? /* @__PURE__ */ jsx(SummaryStoryCard, { story: closing, palette, onPress: onOpen }) : null
48
+ ] });
49
+ });
25
50
  function StateMessage({
26
51
  title,
27
52
  description,
28
53
  palette
29
54
  }) {
30
- return /* @__PURE__ */ jsxs(View, { style: styles.state, children: [
55
+ return /* @__PURE__ */ jsxs(View, { style: [styles.state, {
56
+ backgroundColor: palette.card
57
+ }], children: [
31
58
  /* @__PURE__ */ jsx(Text, { style: [styles.stateTitle, {
32
59
  color: palette.text
33
60
  }], children: title }),
@@ -36,6 +63,13 @@ function StateMessage({
36
63
  }], children: description })
37
64
  ] });
38
65
  }
66
+ function BlockDivider({
67
+ palette
68
+ }) {
69
+ return /* @__PURE__ */ jsx(View, { style: [styles.divider, {
70
+ backgroundColor: palette.border
71
+ }] });
72
+ }
39
73
  function DiscoverFeed({
40
74
  orgName,
41
75
  isDark
@@ -47,6 +81,7 @@ function DiscoverFeed({
47
81
  const topicLabel = (_b = (_a = DISCOVER_TOPICS.find((t) => t.key === topic)) == null ? void 0 : _a.label) != null ? _b : "Top";
48
82
  const listRef = useRef(null);
49
83
  const [refreshing, setRefreshing] = useState(false);
84
+ const sidebar = useDiscoverSidebar();
50
85
  const {
51
86
  articles,
52
87
  loading,
@@ -58,6 +93,7 @@ function DiscoverFeed({
58
93
  } = useNewsArticlesInfinite({
59
94
  topic
60
95
  });
96
+ const blocks = useMemo(() => chunkStories(articles), [articles]);
61
97
  useEffect(() => {
62
98
  var _a2;
63
99
  (_a2 = listRef.current) == null ? void 0 : _a2.scrollToOffset({
@@ -66,22 +102,26 @@ function DiscoverFeed({
66
102
  });
67
103
  }, [topic]);
68
104
  const onOpen = useCallback((story) => openDiscoverArticle(navigation, story, orgName), [navigation, orgName]);
105
+ const refetchSidebar = sidebar.refetch;
69
106
  const onRefresh = useCallback(async () => {
70
107
  setRefreshing(true);
71
108
  try {
72
- await refetch();
109
+ await Promise.all([refetch(), refetchSidebar()]);
73
110
  } catch (e) {
74
111
  } finally {
75
112
  setRefreshing(false);
76
113
  }
77
- }, [refetch]);
114
+ }, [refetch, refetchSidebar]);
78
115
  const renderItem = useCallback(({
79
116
  item,
80
117
  index
81
- }) => index % BLOCK_SIZE === 0 ? /* @__PURE__ */ jsx(LeadStoryCard, { story: item, palette, onPress: onOpen }) : /* @__PURE__ */ jsx(CompactStoryCard, { story: item, palette, onPress: onOpen }), [onOpen, palette]);
118
+ }) => /* @__PURE__ */ jsxs(View, { children: [
119
+ index > 0 ? /* @__PURE__ */ jsx(BlockDivider, { palette }) : null,
120
+ /* @__PURE__ */ jsx(StoryBlock, { stories: item, palette, onOpen })
121
+ ] }), [onOpen, palette]);
82
122
  let empty = null;
83
123
  if (loading && articles.length === 0) {
84
- empty = /* @__PURE__ */ jsx(View, { style: styles.state, children: /* @__PURE__ */ jsx(ActivityIndicator, { color: palette.primary }) });
124
+ empty = /* @__PURE__ */ jsx(DiscoverNewsSkeleton, { palette });
85
125
  } else if (error && articles.length === 0) {
86
126
  empty = /* @__PURE__ */ jsx(StateMessage, { title: "Unable to load stories", description: `Something went wrong while fetching the latest ${topicLabel} stories. Pull down to try again.`, palette });
87
127
  } else if (articles.length === 0) {
@@ -90,63 +130,72 @@ function DiscoverFeed({
90
130
  return /* @__PURE__ */ jsxs(View, { style: [styles.container, {
91
131
  backgroundColor: palette.bg
92
132
  }], children: [
93
- /* @__PURE__ */ jsx(TopicTabs, { active: topic, onChange: setTopic, palette }),
94
- /* @__PURE__ */ jsx(FlatList, { ref: listRef, data: articles, keyExtractor: (item, index) => `${getStoryId(item)}-${index}`, renderItem, contentContainerStyle: styles.listContent, ItemSeparatorComponent: Separator, ListEmptyComponent: empty, ListFooterComponent: loadingMore ? /* @__PURE__ */ jsx(ActivityIndicator, { style: styles.footerSpinner, color: palette.textMuted }) : null, onEndReached: hasMore ? loadMore : void 0, onEndReachedThreshold: 0.6, refreshControl: /* @__PURE__ */ jsx(RefreshControl, { refreshing, onRefresh, tintColor: palette.textMuted }) })
133
+ /* @__PURE__ */ jsx(DiscoverHeader, { active: topic, onChange: setTopic, palette }),
134
+ /* @__PURE__ */ jsx(FlatList, { ref: listRef, data: blocks, keyExtractor: (block, index) => `${block[0] ? getStoryId(block[0]) : "block"}-${index}`, renderItem, contentContainerStyle: styles.listContent, ListHeaderComponent: /* @__PURE__ */ jsx(View, { style: styles.sidebarBeforeStories, children: /* @__PURE__ */ jsx(DiscoverSidebar, { state: sidebar, palette }) }), ListEmptyComponent: empty, ListFooterComponent: loadingMore ? /* @__PURE__ */ jsx(ActivityIndicator, { style: styles.footerSpinner, color: palette.textMuted, accessibilityLabel: "Loading more stories" }) : null, onEndReached: hasMore ? loadMore : void 0, onEndReachedThreshold: 0.6, refreshControl: /* @__PURE__ */ jsx(RefreshControl, { refreshing, onRefresh, tintColor: palette.textMuted }) })
95
135
  ] });
96
136
  }
97
137
  const styles = StyleSheet.create({
98
138
  container: {
99
139
  flex: 1
100
140
  },
101
- tabsBar: {
102
- borderBottomWidth: StyleSheet.hairlineWidth
141
+ header: {
142
+ paddingTop: 12,
143
+ borderBottomWidth: StyleSheet.hairlineWidth,
144
+ gap: 10
145
+ },
146
+ pageTitle: {
147
+ paddingHorizontal: 16,
148
+ fontFamily: DISCOVER_SERIF,
149
+ fontSize: 28,
150
+ lineHeight: 32
103
151
  },
104
152
  tabsContent: {
105
153
  paddingHorizontal: 12,
106
- paddingVertical: 10,
107
- gap: 6
154
+ paddingBottom: 10,
155
+ gap: 4
108
156
  },
109
157
  tab: {
158
+ height: 36,
110
159
  paddingHorizontal: 14,
111
- paddingVertical: 7,
112
160
  borderRadius: 999,
113
- borderWidth: StyleSheet.hairlineWidth,
114
- borderColor: "transparent"
161
+ justifyContent: "center"
115
162
  },
116
163
  tabLabel: {
117
164
  fontSize: 14,
118
165
  fontWeight: "500"
119
166
  },
120
- tabLabelSelected: {
121
- fontWeight: "600"
122
- },
123
167
  listContent: {
124
168
  padding: 16,
125
- paddingBottom: 40,
169
+ paddingTop: 24,
170
+ paddingBottom: 64,
126
171
  flexGrow: 1
127
172
  },
128
- separator: {
129
- height: 14
173
+ block: {
174
+ gap: 16
175
+ },
176
+ divider: {
177
+ alignSelf: "center",
178
+ width: 192,
179
+ height: StyleSheet.hairlineWidth,
180
+ marginVertical: 28
181
+ },
182
+ sidebarBeforeStories: {
183
+ marginBottom: 28
130
184
  },
131
185
  footerSpinner: {
132
- paddingVertical: 20
186
+ paddingVertical: 24
133
187
  },
134
188
  state: {
135
- flex: 1,
136
- alignItems: "center",
137
- justifyContent: "center",
138
- paddingHorizontal: 28,
139
- paddingVertical: 60,
189
+ borderRadius: 16,
190
+ padding: 24,
140
191
  gap: 8
141
192
  },
142
193
  stateTitle: {
143
- fontSize: 17,
144
- fontWeight: "600",
145
- textAlign: "center"
194
+ fontSize: 20,
195
+ fontWeight: "600"
146
196
  },
147
197
  stateDescription: {
148
198
  fontSize: 14,
149
- lineHeight: 20,
150
- textAlign: "center"
199
+ lineHeight: 20
151
200
  }
152
201
  });export{DiscoverFeed};//# sourceMappingURL=DiscoverFeed.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiscoverFeed.js","sources":["../../../src/features/discover/DiscoverFeed.tsx"],"sourcesContent":["/**\n * Native Discover feed: the browser's `/discover` topic tabs over an\n * infinite list of news stories. Stories run in blocks of five like the web\n * page — a lead card, then compact rows.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n FlatList,\n Pressable,\n RefreshControl,\n ScrollView,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport { useNavigation } from '@react-navigation/native';\nimport type { IAccountNewsArticle } from 'common';\nimport { getStoryId } from './articleContent';\nimport {\n CompactStoryCard,\n LeadStoryCard,\n discoverPalette,\n openDiscoverArticle,\n type DiscoverPalette,\n} from './DiscoverStoryCards';\nimport { DISCOVER_TOPICS, useNewsArticlesInfinite } from './useDiscoverNews';\n\nconst BLOCK_SIZE = 5;\n\nfunction TopicTabs({\n active,\n onChange,\n palette,\n}: {\n active: string;\n onChange: (key: string) => void;\n palette: DiscoverPalette;\n}) {\n return (\n <View style={[styles.tabsBar, { borderBottomColor: palette.border, backgroundColor: palette.bg }]}>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.tabsContent}\n accessibilityRole=\"tablist\"\n >\n {DISCOVER_TOPICS.map((topic) => {\n const selected = topic.key === active;\n return (\n <Pressable\n key={topic.key}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected }}\n onPress={() => onChange(topic.key)}\n style={[\n styles.tab,\n selected && {\n backgroundColor: palette.primarySoft,\n borderColor: palette.primaryBorder,\n },\n ]}\n >\n <Text\n style={[\n styles.tabLabel,\n { color: selected ? palette.primary : palette.textMuted },\n selected && styles.tabLabelSelected,\n ]}\n >\n {topic.label}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n </View>\n );\n}\n\nfunction Separator() {\n return <View style={styles.separator} />;\n}\n\nfunction StateMessage({\n title,\n description,\n palette,\n}: {\n title: string;\n description: string;\n palette: DiscoverPalette;\n}) {\n return (\n <View style={styles.state}>\n <Text style={[styles.stateTitle, { color: palette.text }]}>{title}</Text>\n <Text style={[styles.stateDescription, { color: palette.textMuted }]}>{description}</Text>\n </View>\n );\n}\n\nexport function DiscoverFeed({ orgName, isDark }: { orgName: string | null; isDark: boolean }) {\n const navigation = useNavigation();\n const palette = useMemo(() => discoverPalette(isDark), [isDark]);\n const [topic, setTopic] = useState(DISCOVER_TOPICS[0].key);\n const topicLabel = DISCOVER_TOPICS.find((t) => t.key === topic)?.label ?? 'Top';\n const listRef = useRef<FlatList<IAccountNewsArticle>>(null);\n const [refreshing, setRefreshing] = useState(false);\n\n const { articles, loading, loadingMore, hasMore, error, loadMore, refetch } = useNewsArticlesInfinite({ topic });\n\n useEffect(() => {\n listRef.current?.scrollToOffset({ offset: 0, animated: false });\n }, [topic]);\n\n const onOpen = useCallback(\n (story: IAccountNewsArticle) => openDiscoverArticle(navigation, story, orgName),\n [navigation, orgName],\n );\n\n const onRefresh = useCallback(async () => {\n setRefreshing(true);\n try {\n await refetch();\n } catch {\n // The error state below covers a failed refresh.\n } finally {\n setRefreshing(false);\n }\n }, [refetch]);\n\n const renderItem = useCallback(\n ({ item, index }: { item: IAccountNewsArticle; index: number }) =>\n index % BLOCK_SIZE === 0 ? (\n <LeadStoryCard story={item} palette={palette} onPress={onOpen} />\n ) : (\n <CompactStoryCard story={item} palette={palette} onPress={onOpen} />\n ),\n [onOpen, palette],\n );\n\n let empty: React.ReactElement | null = null;\n if (loading && articles.length === 0) {\n empty = (\n <View style={styles.state}>\n <ActivityIndicator color={palette.primary} />\n </View>\n );\n } else if (error && articles.length === 0) {\n empty = (\n <StateMessage\n title=\"Unable to load stories\"\n description={`Something went wrong while fetching the latest ${topicLabel} stories. Pull down to try again.`}\n palette={palette}\n />\n );\n } else if (articles.length === 0) {\n empty = (\n <StateMessage\n title=\"No stories yet\"\n description={`We do not have any ${topicLabel} stories to show right now. Please check back shortly.`}\n palette={palette}\n />\n );\n }\n\n return (\n <View style={[styles.container, { backgroundColor: palette.bg }]}>\n <TopicTabs active={topic} onChange={setTopic} palette={palette} />\n <FlatList\n ref={listRef}\n data={articles}\n keyExtractor={(item, index) => `${getStoryId(item)}-${index}`}\n renderItem={renderItem}\n contentContainerStyle={styles.listContent}\n ItemSeparatorComponent={Separator}\n ListEmptyComponent={empty}\n ListFooterComponent={\n loadingMore ? <ActivityIndicator style={styles.footerSpinner} color={palette.textMuted} /> : null\n }\n onEndReached={hasMore ? loadMore : undefined}\n onEndReachedThreshold={0.6}\n refreshControl={\n <RefreshControl refreshing={refreshing} onRefresh={onRefresh} tintColor={palette.textMuted} />\n }\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n tabsBar: {\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n tabsContent: {\n paddingHorizontal: 12,\n paddingVertical: 10,\n gap: 6,\n },\n tab: {\n paddingHorizontal: 14,\n paddingVertical: 7,\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n borderColor: 'transparent',\n },\n tabLabel: {\n fontSize: 14,\n fontWeight: '500',\n },\n tabLabelSelected: {\n fontWeight: '600',\n },\n listContent: {\n padding: 16,\n paddingBottom: 40,\n flexGrow: 1,\n },\n separator: {\n height: 14,\n },\n footerSpinner: {\n paddingVertical: 20,\n },\n state: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 28,\n paddingVertical: 60,\n gap: 8,\n },\n stateTitle: {\n fontSize: 17,\n fontWeight: '600',\n textAlign: 'center',\n },\n stateDescription: {\n fontSize: 14,\n lineHeight: 20,\n textAlign: 'center',\n },\n});\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"DiscoverFeed.js","sources":["../../../src/features/discover/DiscoverFeed.tsx"],"sourcesContent":["/**\n * Native Discover feed: the browser's `/discover` page — the topic's name in\n * the serif over the topic pills, then an infinite list of news stories in\n * blocks of five like the web (a lead card, compact cards, and a closing\n * summary card when the block is full), under the weather and market panel\n * (the web's side column), which leads the list on a phone.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n FlatList,\n Pressable,\n RefreshControl,\n ScrollView,\n StyleSheet,\n Text,\n View,\n} from 'react-native';\nimport { useNavigation } from '@react-navigation/native';\nimport type { IAccountNewsArticle } from 'common';\nimport { getStoryId } from './articleContent';\nimport { DiscoverSidebar } from './DiscoverSidebar';\nimport { DiscoverNewsSkeleton } from './DiscoverSkeletons';\nimport {\n CompactStoryCard,\n DISCOVER_SERIF,\n SummaryStoryCard,\n discoverPalette,\n openDiscoverArticle,\n type DiscoverPalette,\n} from './DiscoverStoryCards';\nimport { DISCOVER_TOPICS, useNewsArticlesInfinite } from './useDiscoverNews';\nimport { useDiscoverSidebar } from './useDiscoverSidebar';\n\nconst BLOCK_SIZE = 5;\n\nfunction chunkStories(stories: IAccountNewsArticle[]): IAccountNewsArticle[][] {\n const blocks: IAccountNewsArticle[][] = [];\n for (let index = 0; index < stories.length; index += BLOCK_SIZE) {\n blocks.push(stories.slice(index, index + BLOCK_SIZE));\n }\n return blocks;\n}\n\nfunction DiscoverHeader({\n active,\n onChange,\n palette,\n}: {\n active: string;\n onChange: (key: string) => void;\n palette: DiscoverPalette;\n}) {\n const label = DISCOVER_TOPICS.find((topic) => topic.key === active)?.label ?? 'Top';\n return (\n <View style={[styles.header, { borderBottomColor: palette.border, backgroundColor: palette.bg }]}>\n <Text style={[styles.pageTitle, { color: palette.text }]} accessibilityRole=\"header\" numberOfLines={1}>\n {label}\n </Text>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.tabsContent}\n accessibilityRole=\"tablist\"\n accessibilityLabel=\"Discover navigation\"\n >\n {DISCOVER_TOPICS.map((topic) => {\n const selected = topic.key === active;\n return (\n <Pressable\n key={topic.key}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected }}\n onPress={() => onChange(topic.key)}\n style={[styles.tab, selected && { backgroundColor: palette.primarySoft }]}\n >\n <Text style={[styles.tabLabel, { color: selected ? palette.primary : palette.textMuted }]}>\n {topic.label}\n </Text>\n </Pressable>\n );\n })}\n </ScrollView>\n </View>\n );\n}\n\n/** One five-story block: lead, compact cards, and a closing summary card when the block is full. */\nconst StoryBlock = React.memo(function StoryBlock({\n stories,\n palette,\n onOpen,\n}: {\n stories: IAccountNewsArticle[];\n palette: DiscoverPalette;\n onOpen: (story: IAccountNewsArticle) => void;\n}) {\n const [lead, ...rest] = stories;\n const closing = stories.length === BLOCK_SIZE ? rest[rest.length - 1] : undefined;\n const compact = closing ? rest.slice(0, -1) : rest;\n if (!lead) return null;\n return (\n <View style={styles.block}>\n <SummaryStoryCard story={lead} palette={palette} onPress={onOpen} lead />\n {compact.map((story) => (\n <CompactStoryCard key={getStoryId(story)} story={story} palette={palette} onPress={onOpen} />\n ))}\n {closing ? <SummaryStoryCard story={closing} palette={palette} onPress={onOpen} /> : null}\n </View>\n );\n});\n\nfunction StateMessage({\n title,\n description,\n palette,\n}: {\n title: string;\n description: string;\n palette: DiscoverPalette;\n}) {\n return (\n <View style={[styles.state, { backgroundColor: palette.card }]}>\n <Text style={[styles.stateTitle, { color: palette.text }]}>{title}</Text>\n <Text style={[styles.stateDescription, { color: palette.textMuted }]}>{description}</Text>\n </View>\n );\n}\n\nfunction BlockDivider({ palette }: { palette: DiscoverPalette }) {\n return <View style={[styles.divider, { backgroundColor: palette.border }]} />;\n}\n\nexport function DiscoverFeed({ orgName, isDark }: { orgName: string | null; isDark: boolean }) {\n const navigation = useNavigation();\n const palette = useMemo(() => discoverPalette(isDark), [isDark]);\n const [topic, setTopic] = useState(DISCOVER_TOPICS[0].key);\n const topicLabel = DISCOVER_TOPICS.find((t) => t.key === topic)?.label ?? 'Top';\n const listRef = useRef<FlatList<IAccountNewsArticle[]>>(null);\n const [refreshing, setRefreshing] = useState(false);\n const sidebar = useDiscoverSidebar();\n\n const { articles, loading, loadingMore, hasMore, error, loadMore, refetch } = useNewsArticlesInfinite({ topic });\n const blocks = useMemo(() => chunkStories(articles), [articles]);\n\n useEffect(() => {\n listRef.current?.scrollToOffset({ offset: 0, animated: false });\n }, [topic]);\n\n const onOpen = useCallback(\n (story: IAccountNewsArticle) => openDiscoverArticle(navigation, story, orgName),\n [navigation, orgName],\n );\n\n const refetchSidebar = sidebar.refetch;\n const onRefresh = useCallback(async () => {\n setRefreshing(true);\n try {\n await Promise.all([refetch(), refetchSidebar()]);\n } catch {\n // The error state below covers a failed refresh.\n } finally {\n setRefreshing(false);\n }\n }, [refetch, refetchSidebar]);\n\n const renderItem = useCallback(\n ({ item, index }: { item: IAccountNewsArticle[]; index: number }) => (\n <View>\n {index > 0 ? <BlockDivider palette={palette} /> : null}\n <StoryBlock stories={item} palette={palette} onOpen={onOpen} />\n </View>\n ),\n [onOpen, palette],\n );\n\n let empty: React.ReactElement | null = null;\n if (loading && articles.length === 0) {\n empty = <DiscoverNewsSkeleton palette={palette} />;\n } else if (error && articles.length === 0) {\n empty = (\n <StateMessage\n title=\"Unable to load stories\"\n description={`Something went wrong while fetching the latest ${topicLabel} stories. Pull down to try again.`}\n palette={palette}\n />\n );\n } else if (articles.length === 0) {\n empty = (\n <StateMessage\n title=\"No stories yet\"\n description={`We do not have any ${topicLabel} stories to show right now. Please check back shortly.`}\n palette={palette}\n />\n );\n }\n\n return (\n <View style={[styles.container, { backgroundColor: palette.bg }]}>\n <DiscoverHeader active={topic} onChange={setTopic} palette={palette} />\n <FlatList\n ref={listRef}\n data={blocks}\n keyExtractor={(block, index) => `${block[0] ? getStoryId(block[0]) : 'block'}-${index}`}\n renderItem={renderItem}\n contentContainerStyle={styles.listContent}\n ListHeaderComponent={\n <View style={styles.sidebarBeforeStories}>\n <DiscoverSidebar state={sidebar} palette={palette} />\n </View>\n }\n ListEmptyComponent={empty}\n ListFooterComponent={\n loadingMore ? (\n <ActivityIndicator\n style={styles.footerSpinner}\n color={palette.textMuted}\n accessibilityLabel=\"Loading more stories\"\n />\n ) : null\n }\n onEndReached={hasMore ? loadMore : undefined}\n onEndReachedThreshold={0.6}\n refreshControl={\n <RefreshControl refreshing={refreshing} onRefresh={onRefresh} tintColor={palette.textMuted} />\n }\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n header: {\n paddingTop: 12,\n borderBottomWidth: StyleSheet.hairlineWidth,\n gap: 10,\n },\n pageTitle: {\n paddingHorizontal: 16,\n fontFamily: DISCOVER_SERIF,\n fontSize: 28,\n lineHeight: 32,\n },\n tabsContent: {\n paddingHorizontal: 12,\n paddingBottom: 10,\n gap: 4,\n },\n tab: {\n height: 36,\n paddingHorizontal: 14,\n borderRadius: 999,\n justifyContent: 'center',\n },\n tabLabel: {\n fontSize: 14,\n fontWeight: '500',\n },\n listContent: {\n padding: 16,\n paddingTop: 24,\n paddingBottom: 64,\n flexGrow: 1,\n },\n block: {\n gap: 16,\n },\n divider: {\n alignSelf: 'center',\n width: 192,\n height: StyleSheet.hairlineWidth,\n marginVertical: 28,\n },\n sidebarBeforeStories: {\n marginBottom: 28,\n },\n footerSpinner: {\n paddingVertical: 24,\n },\n state: {\n borderRadius: 16,\n padding: 24,\n gap: 8,\n },\n stateTitle: {\n fontSize: 20,\n fontWeight: '600',\n },\n stateDescription: {\n fontSize: 14,\n lineHeight: 20,\n },\n});\n"],"names":["React","StoryBlock","_a"],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useCallback}from'react';import {View,StyleSheet,TextInput,Pressable}from'react-native';import {Ionicons}from'@expo/vector-icons';import {useNavigation,CommonActions}from'@react-navigation/native';import {useSafeAreaInsets}from'react-native-safe-area-context';import Svg,{Defs,LinearGradient,Stop,Rect}from'react-native-svg';import {v4}from'uuid';import {resolveMobileWebUrl,getPackagerHost}from'../../bridge/resolveMobileWebUrl.js';import {config}from'../../config/env-config.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {followUpChatTitle,buildFollowUpQuery}from'./followUpQuery.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ const FOLLOW_UP_RESERVED_HEIGHT = 112;
21
+ function DiscoverFollowUp({
22
+ article,
23
+ orgName,
24
+ palette
25
+ }) {
26
+ const navigation = useNavigation();
27
+ const insets = useSafeAreaInsets();
28
+ const {
29
+ createChannel
30
+ } = useChatMutations();
31
+ const [question, setQuestion] = useState("");
32
+ const canSubmit = question.trim().length > 0;
33
+ const submit = useCallback(() => {
34
+ const trimmed = question.trim();
35
+ if (!trimmed) return;
36
+ const channelId = v4();
37
+ const webOrigin = resolveMobileWebUrl(config.CLIENT_URL, getPackagerHost());
38
+ void createChannel({
39
+ id: channelId,
40
+ title: followUpChatTitle(trimmed),
41
+ isShared: false,
42
+ sharedSlug: null,
43
+ isArchived: false,
44
+ isPinned: false,
45
+ model: null,
46
+ systemPrompt: null,
47
+ orgName: orgName != null ? orgName : void 0
48
+ }).catch((err) => {
49
+ console.error("[DiscoverFollowUp] createChannel failed:", err);
50
+ });
51
+ setQuestion("");
52
+ navigation.dispatch(CommonActions.navigate({
53
+ name: "MainStack.Chat",
54
+ params: {
55
+ channelId,
56
+ orgName: orgName != null ? orgName : void 0,
57
+ initialQuery: buildFollowUpQuery(article, trimmed, webOrigin),
58
+ initialMode: "chat",
59
+ // A question about an article is a chat, never a Shop hand-off.
60
+ shopRouteChecked: true
61
+ }
62
+ }));
63
+ }, [article, createChannel, navigation, orgName, question]);
64
+ return /* @__PURE__ */ jsxs(View, { pointerEvents: "box-none", style: [styles.dock, {
65
+ paddingBottom: Math.max(16, insets.bottom)
66
+ }], children: [
67
+ /* @__PURE__ */ jsxs(Svg, { style: StyleSheet.absoluteFill, pointerEvents: "none", children: [
68
+ /* @__PURE__ */ jsx(Defs, { children: /* @__PURE__ */ jsxs(LinearGradient, { id: "discover-follow-up-fade", x1: "0", y1: "0", x2: "0", y2: "1", children: [
69
+ /* @__PURE__ */ jsx(Stop, { offset: "0", stopColor: palette.bg, stopOpacity: 0 }),
70
+ /* @__PURE__ */ jsx(Stop, { offset: "0.45", stopColor: palette.bg, stopOpacity: 1 }),
71
+ /* @__PURE__ */ jsx(Stop, { offset: "1", stopColor: palette.bg, stopOpacity: 1 })
72
+ ] }) }),
73
+ /* @__PURE__ */ jsx(Rect, { x: "0", y: "0", width: "100%", height: "100%", fill: "url(#discover-follow-up-fade)" })
74
+ ] }),
75
+ /* @__PURE__ */ jsxs(View, { style: [styles.composer, {
76
+ backgroundColor: palette.card,
77
+ borderColor: palette.cardBorder
78
+ }], children: [
79
+ /* @__PURE__ */ jsx(TextInput, { value: question, onChangeText: setQuestion, placeholder: "Ask follow-up", placeholderTextColor: palette.textMuted, accessibilityLabel: "Ask a follow-up question about this article", multiline: true, returnKeyType: "send", submitBehavior: "submit", onSubmitEditing: submit, style: [styles.input, {
80
+ color: palette.text
81
+ }] }),
82
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: "Send follow-up", accessibilityState: {
83
+ disabled: !canSubmit
84
+ }, disabled: !canSubmit, onPress: submit, style: [styles.send, canSubmit ? {
85
+ backgroundColor: palette.primary
86
+ } : {
87
+ backgroundColor: palette.imagePlaceholder
88
+ }], children: /* @__PURE__ */ jsx(Ionicons, { name: "arrow-up", size: 18, color: canSubmit ? "#ffffff" : palette.textMuted }) })
89
+ ] })
90
+ ] });
91
+ }
92
+ const styles = StyleSheet.create({
93
+ dock: {
94
+ position: "absolute",
95
+ left: 0,
96
+ right: 0,
97
+ bottom: 0,
98
+ paddingTop: 32,
99
+ paddingHorizontal: 16
100
+ },
101
+ composer: __spreadProps(__spreadValues({
102
+ flexDirection: "row",
103
+ alignItems: "flex-end",
104
+ gap: 8,
105
+ borderRadius: 22,
106
+ borderWidth: StyleSheet.hairlineWidth,
107
+ paddingVertical: 8,
108
+ paddingLeft: 14,
109
+ paddingRight: 8
110
+ }, mobileTokens.shadow.card), {
111
+ shadowOpacity: 0.12,
112
+ shadowRadius: 18,
113
+ shadowOffset: {
114
+ width: 0,
115
+ height: 10
116
+ },
117
+ elevation: 6
118
+ }),
119
+ input: {
120
+ flex: 1,
121
+ minHeight: 40,
122
+ maxHeight: 160,
123
+ paddingTop: 10,
124
+ paddingBottom: 10,
125
+ fontSize: 15,
126
+ lineHeight: 22
127
+ },
128
+ send: {
129
+ width: 36,
130
+ height: 36,
131
+ borderRadius: 18,
132
+ alignItems: "center",
133
+ justifyContent: "center"
134
+ }
135
+ });export{DiscoverFollowUp,FOLLOW_UP_RESERVED_HEIGHT};//# sourceMappingURL=DiscoverFollowUp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscoverFollowUp.js","sources":["../../../src/features/discover/DiscoverFollowUp.tsx"],"sourcesContent":["/**\n * \"Ask follow-up\" under a Discover article — the browser's `DiscoverFollowUp`.\n * Pinned to the bottom of the reader over a fade of the page. On send it opens\n * a fresh chat seeded with the article as context and the question, the same\n * handoff Home uses: create the channel in the background, then Chat\n * auto-fires `initialQuery`.\n */\nimport React, { useCallback, useState } from 'react';\nimport { Pressable, StyleSheet, TextInput, View } from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { CommonActions, useNavigation } from '@react-navigation/native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport Svg, { Defs, LinearGradient, Rect, Stop } from 'react-native-svg';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { IAccountNewsArticle } from 'common';\nimport { getPackagerHost, resolveMobileWebUrl } from '../../bridge/resolveMobileWebUrl';\nimport { config } from '../../config/env-config';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport type { DiscoverPalette } from './DiscoverStoryCards';\nimport { buildFollowUpQuery, followUpChatTitle } from './followUpQuery';\n\n/** Room the pinned composer takes over the page, for the reader's bottom padding. */\nexport const FOLLOW_UP_RESERVED_HEIGHT = 112;\n\nexport function DiscoverFollowUp({\n article,\n orgName,\n palette,\n}: {\n article: IAccountNewsArticle;\n orgName: string | null;\n palette: DiscoverPalette;\n}) {\n const navigation = useNavigation();\n const insets = useSafeAreaInsets();\n const { createChannel } = useChatMutations();\n const [question, setQuestion] = useState('');\n const canSubmit = question.trim().length > 0;\n\n const submit = useCallback(() => {\n const trimmed = question.trim();\n if (!trimmed) return;\n\n const channelId = uuidv4();\n const webOrigin = resolveMobileWebUrl(config.CLIENT_URL, getPackagerHost());\n\n // Chat awaits the in-flight creation before it saves the first turn.\n void createChannel({\n id: channelId,\n title: followUpChatTitle(trimmed),\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: orgName ?? undefined,\n }).catch((err) => {\n console.error('[DiscoverFollowUp] createChannel failed:', err);\n });\n\n setQuestion('');\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.Chat',\n params: {\n channelId,\n orgName: orgName ?? undefined,\n initialQuery: buildFollowUpQuery(article, trimmed, webOrigin),\n initialMode: 'chat',\n // A question about an article is a chat, never a Shop hand-off.\n shopRouteChecked: true,\n },\n }),\n );\n }, [article, createChannel, navigation, orgName, question]);\n\n return (\n <View pointerEvents=\"box-none\" style={[styles.dock, { paddingBottom: Math.max(16, insets.bottom) }]}>\n {/* The page fades out behind the composer, as the web's gradient does. */}\n <Svg style={StyleSheet.absoluteFill} pointerEvents=\"none\">\n <Defs>\n <LinearGradient id=\"discover-follow-up-fade\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <Stop offset=\"0\" stopColor={palette.bg} stopOpacity={0} />\n <Stop offset=\"0.45\" stopColor={palette.bg} stopOpacity={1} />\n <Stop offset=\"1\" stopColor={palette.bg} stopOpacity={1} />\n </LinearGradient>\n </Defs>\n <Rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"url(#discover-follow-up-fade)\" />\n </Svg>\n <View style={[styles.composer, { backgroundColor: palette.card, borderColor: palette.cardBorder }]}>\n <TextInput\n value={question}\n onChangeText={setQuestion}\n placeholder=\"Ask follow-up\"\n placeholderTextColor={palette.textMuted}\n accessibilityLabel=\"Ask a follow-up question about this article\"\n multiline\n returnKeyType=\"send\"\n submitBehavior=\"submit\"\n onSubmitEditing={submit}\n style={[styles.input, { color: palette.text }]}\n />\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send follow-up\"\n accessibilityState={{ disabled: !canSubmit }}\n disabled={!canSubmit}\n onPress={submit}\n style={[\n styles.send,\n canSubmit\n ? { backgroundColor: palette.primary }\n : { backgroundColor: palette.imagePlaceholder },\n ]}\n >\n <Ionicons name=\"arrow-up\" size={18} color={canSubmit ? '#ffffff' : palette.textMuted} />\n </Pressable>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n dock: {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n paddingTop: 32,\n paddingHorizontal: 16,\n },\n composer: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 8,\n borderRadius: 22,\n borderWidth: StyleSheet.hairlineWidth,\n paddingVertical: 8,\n paddingLeft: 14,\n paddingRight: 8,\n ...mobileTokens.shadow.card,\n shadowOpacity: 0.12,\n shadowRadius: 18,\n shadowOffset: { width: 0, height: 10 },\n elevation: 6,\n },\n input: {\n flex: 1,\n minHeight: 40,\n maxHeight: 160,\n paddingTop: 10,\n paddingBottom: 10,\n fontSize: 15,\n lineHeight: 22,\n },\n send: {\n width: 36,\n height: 36,\n borderRadius: 18,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"],"names":["uuidv4"],"mappings":"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"}