@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.
- package/lib/features/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/dictate/DictateExperience.js +59 -7
- package/lib/features/dictate/DictateExperience.js.map +1 -1
- package/lib/features/dictate/components/NoteView.js +227 -12
- package/lib/features/dictate/components/NoteView.js.map +1 -1
- package/lib/features/dictate/dictateClient.js +93 -23
- package/lib/features/dictate/dictateClient.js.map +1 -1
- package/lib/features/dictate/dictatePreference.js +19 -0
- package/lib/features/dictate/dictatePreference.js.map +1 -0
- package/lib/features/dictate/noteText.js +17 -2
- package/lib/features/dictate/noteText.js.map +1 -1
- package/lib/features/dictate/privacy.js +96 -0
- package/lib/features/dictate/privacy.js.map +1 -0
- package/lib/features/dictate/shownNote.js +24 -0
- package/lib/features/dictate/shownNote.js.map +1 -0
- package/lib/features/discover/DiscoverArticle.js +105 -92
- package/lib/features/discover/DiscoverArticle.js.map +1 -1
- package/lib/features/discover/DiscoverFeed.js +97 -48
- package/lib/features/discover/DiscoverFeed.js.map +1 -1
- package/lib/features/discover/DiscoverFollowUp.js +135 -0
- package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
- package/lib/features/discover/DiscoverSidebar.js +555 -0
- package/lib/features/discover/DiscoverSidebar.js.map +1 -0
- package/lib/features/discover/DiscoverSkeletons.js +123 -0
- package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
- package/lib/features/discover/DiscoverStoryCards.js +193 -87
- package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
- package/lib/features/discover/followUpQuery.js +42 -0
- package/lib/features/discover/followUpQuery.js.map +1 -0
- package/lib/features/discover/markets.js +37 -0
- package/lib/features/discover/markets.js.map +1 -0
- package/lib/features/discover/useDiscoverSidebar.js +148 -0
- package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
- package/lib/features/discover/weather.js +42 -0
- package/lib/features/discover/weather.js.map +1 -0
- package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
- package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
- package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
- package/lib/features/notion/NotionBlockSheets.js +206 -0
- package/lib/features/notion/NotionBlockSheets.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +36 -0
- package/lib/features/notion/NotionBlockView.js.map +1 -0
- package/lib/features/notion/NotionCommentsSheet.js +461 -0
- package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
- package/lib/features/notion/NotionConnectionsSheet.js +244 -0
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
- package/lib/features/notion/NotionHistorySheet.js +439 -0
- package/lib/features/notion/NotionHistorySheet.js.map +1 -0
- package/lib/features/notion/NotionMediaBlocks.js +803 -0
- package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
- package/lib/features/notion/NotionMentionSheet.js +279 -0
- package/lib/features/notion/NotionMentionSheet.js.map +1 -0
- package/lib/features/notion/NotionPageMenu.js +585 -0
- package/lib/features/notion/NotionPageMenu.js.map +1 -0
- package/lib/features/notion/NotionPageTree.js +220 -0
- package/lib/features/notion/NotionPageTree.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +1253 -152
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionShareSheet.js +606 -0
- package/lib/features/notion/NotionShareSheet.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +87 -15
- package/lib/features/notion/NotionSheets.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +492 -0
- package/lib/features/notion/NotionSidebarSections.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +257 -45
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +554 -0
- package/lib/features/notion/database/DatabaseCells.js.map +1 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseLayouts.js +461 -0
- package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseSheets.js +791 -0
- package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
- package/lib/features/notion/database/NotionDatabaseView.js +817 -0
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
- package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
- package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
- package/lib/features/notion/database/chartData.js +89 -0
- package/lib/features/notion/database/chartData.js.map +1 -0
- package/lib/features/notion/database/chartView.js +112 -0
- package/lib/features/notion/database/chartView.js.map +1 -0
- package/lib/features/notion/database/connectorButton.js +33 -0
- package/lib/features/notion/database/connectorButton.js.map +1 -0
- package/lib/features/notion/database/databaseCalc.js +208 -0
- package/lib/features/notion/database/databaseCalc.js.map +1 -0
- package/lib/features/notion/database/databaseCalendar.js +157 -0
- package/lib/features/notion/database/databaseCalendar.js.map +1 -0
- package/lib/features/notion/database/databaseCsv.js +98 -0
- package/lib/features/notion/database/databaseCsv.js.map +1 -0
- package/lib/features/notion/database/databaseCsvActions.js +58 -0
- package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
- package/lib/features/notion/database/databaseFilter.js +473 -0
- package/lib/features/notion/database/databaseFilter.js.map +1 -0
- package/lib/features/notion/database/databaseFormula.js +1072 -0
- package/lib/features/notion/database/databaseFormula.js.map +1 -0
- package/lib/features/notion/database/databaseGroup.js +151 -0
- package/lib/features/notion/database/databaseGroup.js.map +1 -0
- package/lib/features/notion/database/databaseRollup.js +58 -0
- package/lib/features/notion/database/databaseRollup.js.map +1 -0
- package/lib/features/notion/database/databaseTimeline.js +156 -0
- package/lib/features/notion/database/databaseTimeline.js.map +1 -0
- package/lib/features/notion/database/databaseView.js +1188 -0
- package/lib/features/notion/database/databaseView.js.map +1 -0
- package/lib/features/notion/database/databaseViews.js +310 -0
- package/lib/features/notion/database/databaseViews.js.map +1 -0
- package/lib/features/notion/database/relationSource.js +92 -0
- package/lib/features/notion/database/relationSource.js.map +1 -0
- package/lib/features/notion/database/uniqueId.js +17 -0
- package/lib/features/notion/database/uniqueId.js.map +1 -0
- package/lib/features/notion/database/useNotionDatabase.js +617 -0
- package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
- package/lib/features/notion/notionAgentRunStatus.js +39 -0
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
- package/lib/features/notion/notionCodeLanguages.js +112 -0
- package/lib/features/notion/notionCodeLanguages.js.map +1 -0
- package/lib/features/notion/notionComments.js +86 -0
- package/lib/features/notion/notionComments.js.map +1 -0
- package/lib/features/notion/notionConnections.js +74 -0
- package/lib/features/notion/notionConnections.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +453 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionEditorModel.js +142 -7
- package/lib/features/notion/notionEditorModel.js.map +1 -1
- package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
- package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
- package/lib/features/notion/notionMedia.js +119 -0
- package/lib/features/notion/notionMedia.js.map +1 -0
- package/lib/features/notion/notionMentionDate.js +32 -0
- package/lib/features/notion/notionMentionDate.js.map +1 -0
- package/lib/features/notion/notionMentionOptions.js +162 -0
- package/lib/features/notion/notionMentionOptions.js.map +1 -0
- package/lib/features/notion/notionNotesAgent.js +445 -0
- package/lib/features/notion/notionNotesAgent.js.map +1 -0
- package/lib/features/notion/notionPageAccess.js +168 -0
- package/lib/features/notion/notionPageAccess.js.map +1 -0
- package/lib/features/notion/notionPageActions.js +138 -0
- package/lib/features/notion/notionPageActions.js.map +1 -0
- package/lib/features/notion/notionPageHistory.js +154 -0
- package/lib/features/notion/notionPageHistory.js.map +1 -0
- package/lib/features/notion/notionPageKinds.js +200 -0
- package/lib/features/notion/notionPageKinds.js.map +1 -0
- package/lib/features/notion/notionRecents.js +48 -0
- package/lib/features/notion/notionRecents.js.map +1 -0
- package/lib/features/notion/notionRichText.js +177 -0
- package/lib/features/notion/notionRichText.js.map +1 -0
- package/lib/features/notion/notionRichTitle.js +336 -0
- package/lib/features/notion/notionRichTitle.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +272 -13
- package/lib/features/notion/useNotionWorkspace.js.map +1 -1
- package/lib/features/notion/usePageActions.js +155 -0
- package/lib/features/notion/usePageActions.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +1 -1
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
- package/lib/features/study/StudyAgentChatPane.js +1 -1
- package/lib/features/study/StudyAgentChatPane.js.map +1 -1
- package/lib/features/travel/TravelAgentChatPane.js +1 -1
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +1 -1
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +302 -0
- package/lib/features/webbuilder/codeFiles.js.map +1 -0
- package/lib/features/webbuilder/codeHighlight.js +209 -0
- package/lib/features/webbuilder/codeHighlight.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +682 -52
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +3 -3
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/stepLabels.js +68 -0
- package/lib/features/webbuilder/stepLabels.js.map +1 -0
- package/lib/hooks/useHostChatSteering.js +45 -0
- package/lib/hooks/useHostChatSteering.js.map +1 -0
- package/lib/screens/Chat/index.js +2 -12
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
- package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
- package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
- package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
- package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
- package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
- package/lib/screens/NotionPage/index.js +2 -2
- package/lib/screens/NotionPage/index.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
- package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,33 +1,60 @@
|
|
|
1
|
-
import {jsx
|
|
2
|
-
function
|
|
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
|
-
|
|
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:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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,
|
|
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
|
-
}) =>
|
|
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(
|
|
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(
|
|
94
|
-
/* @__PURE__ */ jsx(FlatList, { ref: listRef, data:
|
|
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
|
-
|
|
102
|
-
|
|
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
|
-
|
|
107
|
-
gap:
|
|
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
|
-
|
|
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
|
-
|
|
169
|
+
paddingTop: 24,
|
|
170
|
+
paddingBottom: 64,
|
|
126
171
|
flexGrow: 1
|
|
127
172
|
},
|
|
128
|
-
|
|
129
|
-
|
|
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:
|
|
186
|
+
paddingVertical: 24
|
|
133
187
|
},
|
|
134
188
|
state: {
|
|
135
|
-
|
|
136
|
-
|
|
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:
|
|
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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"}
|