@adminide-stack/yantra-mobile 12.0.140 → 12.0.141
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/features/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/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,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useRef,useEffect,useCallback
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {useMemo,useRef,useState,useEffect,useCallback}from'react';import {ScrollView,StyleSheet,View,Text,Pressable,Platform}from'react-native';import {Image}from'expo-image';import {Ionicons}from'@expo/vector-icons';import {useNavigation}from'@react-navigation/native';import {AppKeyboardAvoidingView}from'../../components/AppKeyboardAvoidingView.js';import {AssistantMarkdown}from'../chat/AssistantMarkdown.js';import {useChatLinkOpener}from'../links/chatLinkOpener.js';import {normalizeSources,cleanArticleContent,formatPublishedAt,faviconUrl,getStoryId}from'./articleContent.js';import {FOLLOW_UP_RESERVED_HEIGHT,DiscoverFollowUp}from'./DiscoverFollowUp.js';import {DiscoverArticleSkeleton}from'./DiscoverSkeletons.js';import {discoverPalette,openDiscoverArticle,TagChip,DiscoverCard,DISCOVER_SERIF,DiscoverMoreCard}from'./DiscoverStoryCards.js';import {useNewsArticle,useNewsArticlesInfinite}from'./useDiscoverNews.js';const MAX_SOURCE_CARDS = 8;
|
|
2
2
|
const DISCOVER_MORE_COUNT = 4;
|
|
3
3
|
function SourceFavicon({
|
|
4
4
|
source,
|
|
@@ -32,12 +32,7 @@ function SourceCards({
|
|
|
32
32
|
onOpen
|
|
33
33
|
}) {
|
|
34
34
|
if (sources.length === 0) return null;
|
|
35
|
-
return /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.sourcesScroll, contentContainerStyle: styles.sourcesContent, children: sources.slice(0, MAX_SOURCE_CARDS).map((source, index) => /* @__PURE__ */ jsxs(
|
|
36
|
-
pressed
|
|
37
|
-
}) => [styles.sourceCard, {
|
|
38
|
-
backgroundColor: palette.imagePlaceholder,
|
|
39
|
-
borderColor: palette.cardBorder
|
|
40
|
-
}, pressed && styles.pressed], children: [
|
|
35
|
+
return /* @__PURE__ */ jsx(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.sourcesScroll, contentContainerStyle: styles.sourcesContent, children: sources.slice(0, MAX_SOURCE_CARDS).map((source, index) => /* @__PURE__ */ jsxs(DiscoverCard, { palette, radius: 16, onPress: source.url ? () => source.url && onOpen(source.url) : void 0, accessibilityLabel: [source.name, source.title].filter(Boolean).join(", "), innerStyle: styles.sourceCard, children: [
|
|
41
36
|
/* @__PURE__ */ jsxs(View, { style: styles.sourceHead, children: [
|
|
42
37
|
/* @__PURE__ */ jsx(SourceFavicon, { source, size: 16, palette }),
|
|
43
38
|
/* @__PURE__ */ jsx(Text, { style: [styles.sourceName, {
|
|
@@ -62,16 +57,21 @@ function DiscoverMore({
|
|
|
62
57
|
const currentId = getStoryId(article);
|
|
63
58
|
const related = articles.filter((story) => getStoryId(story) !== currentId).slice(0, DISCOVER_MORE_COUNT);
|
|
64
59
|
if (related.length === 0) return null;
|
|
60
|
+
const rows = [];
|
|
61
|
+
for (let index = 0; index < related.length; index += 2) rows.push(related.slice(index, index + 2));
|
|
65
62
|
return /* @__PURE__ */ jsxs(View, { style: [styles.more, {
|
|
66
63
|
borderTopColor: palette.border
|
|
67
64
|
}], children: [
|
|
68
65
|
/* @__PURE__ */ jsxs(View, { style: styles.moreHead, children: [
|
|
69
|
-
/* @__PURE__ */ jsx(Ionicons, { name: "sparkles-outline", size:
|
|
66
|
+
/* @__PURE__ */ jsx(Ionicons, { name: "sparkles-outline", size: 20, color: palette.primary }),
|
|
70
67
|
/* @__PURE__ */ jsx(Text, { style: [styles.moreTitle, {
|
|
71
68
|
color: palette.text
|
|
72
|
-
}], children: "Discover more" })
|
|
69
|
+
}], accessibilityRole: "header", children: "Discover more" })
|
|
73
70
|
] }),
|
|
74
|
-
/* @__PURE__ */ jsx(View, { style: styles.moreList, children:
|
|
71
|
+
/* @__PURE__ */ jsx(View, { style: styles.moreList, children: rows.map((row) => /* @__PURE__ */ jsxs(View, { style: styles.moreRow, children: [
|
|
72
|
+
row.map((story) => /* @__PURE__ */ jsx(DiscoverMoreCard, { story, palette, onPress: onOpen }, getStoryId(story))),
|
|
73
|
+
row.length === 1 ? /* @__PURE__ */ jsx(View, { style: styles.moreSpacer }) : null
|
|
74
|
+
] }, getStoryId(row[0]))) })
|
|
75
75
|
] });
|
|
76
76
|
}
|
|
77
77
|
function StateMessage({
|
|
@@ -97,6 +97,8 @@ function DiscoverArticle({
|
|
|
97
97
|
const palette = useMemo(() => discoverPalette(isDark), [isDark]);
|
|
98
98
|
const openLink = useChatLinkOpener();
|
|
99
99
|
const scrollRef = useRef(null);
|
|
100
|
+
const rootRef = useRef(null);
|
|
101
|
+
const [topOffset, setTopOffset] = useState(0);
|
|
100
102
|
const {
|
|
101
103
|
article,
|
|
102
104
|
loading,
|
|
@@ -118,79 +120,86 @@ function DiscoverArticle({
|
|
|
118
120
|
return article ? cleanArticleContent(article.content, article.title, (_a = article.summary) != null ? _a : void 0, (_b = article.imageUrl) != null ? _b : void 0) : "";
|
|
119
121
|
}, [article]);
|
|
120
122
|
if (!article) {
|
|
121
|
-
let body;
|
|
122
123
|
if (loading) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
} else {
|
|
127
|
-
body = /* @__PURE__ */ jsx(StateMessage, { title: "Article not found", description: "We could not find this news article. It may not be available yet or may have been removed.", palette });
|
|
124
|
+
return /* @__PURE__ */ jsx(ScrollView, { style: {
|
|
125
|
+
backgroundColor: palette.bg
|
|
126
|
+
}, contentContainerStyle: styles.content, children: /* @__PURE__ */ jsx(DiscoverArticleSkeleton, { palette }) });
|
|
128
127
|
}
|
|
129
128
|
return /* @__PURE__ */ jsx(View, { style: [styles.state, {
|
|
130
129
|
backgroundColor: palette.bg
|
|
131
|
-
}], children:
|
|
130
|
+
}], children: error ? /* @__PURE__ */ jsx(StateMessage, { title: "Unable to load article", description: "Something went wrong while fetching this article. Please try again in a moment.", palette }) : /* @__PURE__ */ jsx(StateMessage, { title: "Article not found", description: "We could not find this news article. It may not be available yet or may have been removed.", palette }) });
|
|
132
131
|
}
|
|
133
132
|
const publishedLabel = formatPublishedAt(article.publishedAt);
|
|
134
133
|
const sourceCountLabel = article.sourceCount === 1 ? "1 source" : `${article.sourceCount || sources.length} sources`;
|
|
135
134
|
const [leadSource] = sources;
|
|
136
|
-
return /* @__PURE__ */
|
|
135
|
+
return /* @__PURE__ */ jsx(AppKeyboardAvoidingView, { behavior: Platform.OS === "ios" ? "padding" : void 0, keyboardVerticalOffset: topOffset, style: [styles.root, {
|
|
137
136
|
backgroundColor: palette.bg
|
|
138
|
-
},
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
/* @__PURE__ */ jsx(Text, { style: [styles.
|
|
152
|
-
color: palette.
|
|
153
|
-
}],
|
|
154
|
-
|
|
155
|
-
|
|
137
|
+
}], children: /* @__PURE__ */ jsxs(View, { ref: rootRef, style: styles.root, onLayout: () => {
|
|
138
|
+
var _a;
|
|
139
|
+
return (_a = rootRef.current) == null ? void 0 : _a.measureInWindow((_x, y) => setTopOffset(Math.max(0, y)));
|
|
140
|
+
}, children: [
|
|
141
|
+
/* @__PURE__ */ jsxs(ScrollView, { ref: scrollRef, style: {
|
|
142
|
+
backgroundColor: palette.bg
|
|
143
|
+
}, contentContainerStyle: [styles.content, {
|
|
144
|
+
paddingBottom: FOLLOW_UP_RESERVED_HEIGHT + 32
|
|
145
|
+
}], keyboardShouldPersistTaps: "handled", keyboardDismissMode: "interactive", children: [
|
|
146
|
+
/* @__PURE__ */ jsx(View, { style: styles.tagRow, children: /* @__PURE__ */ jsx(TagChip, { label: article.tag, palette }) }),
|
|
147
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
148
|
+
color: palette.text
|
|
149
|
+
}], accessibilityRole: "header", children: article.title }),
|
|
150
|
+
article.summary ? /* @__PURE__ */ jsx(Text, { style: [styles.summary, {
|
|
151
|
+
color: palette.text
|
|
152
|
+
}], children: article.summary }) : null,
|
|
153
|
+
leadSource ? /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: leadSource.url ? "link" : void 0, disabled: !leadSource.url, onPress: () => leadSource.url && openLink(leadSource.url), style: [styles.leadPill, {
|
|
154
|
+
backgroundColor: palette.imagePlaceholder,
|
|
155
|
+
borderColor: palette.cardBorder
|
|
156
156
|
}], children: [
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
borderBottomColor: palette.border
|
|
163
|
-
}], children: [
|
|
164
|
-
/* @__PURE__ */ jsxs(View, { style: styles.bylineItem, children: [
|
|
165
|
-
/* @__PURE__ */ jsx(View, { style: [styles.bylineIcon, {
|
|
166
|
-
backgroundColor: palette.text
|
|
167
|
-
}], children: /* @__PURE__ */ jsx(Ionicons, { name: "layers-outline", size: 13, color: palette.bg }) }),
|
|
168
|
-
/* @__PURE__ */ jsxs(Text, { style: [styles.bylineStrong, {
|
|
157
|
+
/* @__PURE__ */ jsx(SourceFavicon, { source: leadSource, size: 14, palette }),
|
|
158
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.leadPillText, {
|
|
159
|
+
color: palette.textMuted
|
|
160
|
+
}], numberOfLines: 1, children: leadSource.name }),
|
|
161
|
+
sources.length > 1 ? /* @__PURE__ */ jsxs(Text, { style: [styles.leadPillText, {
|
|
169
162
|
color: palette.textMuted
|
|
170
163
|
}], children: [
|
|
171
|
-
"
|
|
172
|
-
|
|
173
|
-
] })
|
|
164
|
+
"+",
|
|
165
|
+
sources.length - 1
|
|
166
|
+
] }) : null
|
|
167
|
+
] }) : null,
|
|
168
|
+
/* @__PURE__ */ jsxs(View, { style: [styles.byline, {
|
|
169
|
+
borderBottomColor: palette.border
|
|
170
|
+
}], children: [
|
|
171
|
+
/* @__PURE__ */ jsxs(View, { style: styles.bylineItem, children: [
|
|
172
|
+
/* @__PURE__ */ jsx(View, { style: [styles.bylineIcon, {
|
|
173
|
+
backgroundColor: palette.primarySoft
|
|
174
|
+
}], children: /* @__PURE__ */ jsx(Ionicons, { name: "layers-outline", size: 13, color: palette.primary }) }),
|
|
175
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.bylineStrong, {
|
|
176
|
+
color: palette.textMuted
|
|
177
|
+
}], children: [
|
|
178
|
+
"Summarized from ",
|
|
179
|
+
sourceCountLabel
|
|
180
|
+
] })
|
|
181
|
+
] }),
|
|
182
|
+
publishedLabel ? /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "link", onPress: () => article.href && openLink(article.href), style: styles.bylineItem, children: [
|
|
183
|
+
/* @__PURE__ */ jsx(Ionicons, { name: "time-outline", size: 14, color: palette.textMuted }),
|
|
184
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.bylineText, {
|
|
185
|
+
color: palette.textMuted
|
|
186
|
+
}], children: publishedLabel })
|
|
187
|
+
] }) : null
|
|
174
188
|
] }),
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
189
|
+
/* @__PURE__ */ jsx(SourceCards, { sources, palette, onOpen: openLink }),
|
|
190
|
+
article.imageUrl ? /* @__PURE__ */ jsx(DiscoverCard, { palette, radius: 22, style: styles.hero, innerStyle: styles.heroInner, children: /* @__PURE__ */ jsx(Image, { source: {
|
|
191
|
+
uri: article.imageUrl
|
|
192
|
+
}, style: StyleSheet.absoluteFill, contentFit: "cover", transition: 150, accessibilityIgnoresInvertColors: true }) }) : null,
|
|
193
|
+
content ? /* @__PURE__ */ jsx(View, { style: styles.body, children: /* @__PURE__ */ jsx(AssistantMarkdown, { text: content, isDark }) }) : null,
|
|
194
|
+
/* @__PURE__ */ jsx(DiscoverMore, { article, palette, onOpen: onOpenStory })
|
|
181
195
|
] }),
|
|
182
|
-
/* @__PURE__ */ jsx(
|
|
183
|
-
|
|
184
|
-
backgroundColor: palette.imagePlaceholder,
|
|
185
|
-
borderColor: palette.cardBorder
|
|
186
|
-
}], children: /* @__PURE__ */ jsx(Image, { source: {
|
|
187
|
-
uri: article.imageUrl
|
|
188
|
-
}, style: StyleSheet.absoluteFill, contentFit: "cover", transition: 150, accessibilityIgnoresInvertColors: true }) }) : null,
|
|
189
|
-
content ? /* @__PURE__ */ jsx(View, { style: styles.body, children: /* @__PURE__ */ jsx(AssistantMarkdown, { text: content, isDark }) }) : null,
|
|
190
|
-
/* @__PURE__ */ jsx(DiscoverMore, { article, palette, onOpen: onOpenStory })
|
|
191
|
-
] });
|
|
196
|
+
/* @__PURE__ */ jsx(DiscoverFollowUp, { article, orgName, palette })
|
|
197
|
+
] }) });
|
|
192
198
|
}
|
|
193
199
|
const styles = StyleSheet.create({
|
|
200
|
+
root: {
|
|
201
|
+
flex: 1
|
|
202
|
+
},
|
|
194
203
|
content: {
|
|
195
204
|
paddingHorizontal: 18,
|
|
196
205
|
paddingTop: 18,
|
|
@@ -203,18 +212,17 @@ const styles = StyleSheet.create({
|
|
|
203
212
|
flexDirection: "row"
|
|
204
213
|
},
|
|
205
214
|
title: {
|
|
206
|
-
marginTop:
|
|
215
|
+
marginTop: 16,
|
|
207
216
|
fontFamily: DISCOVER_SERIF,
|
|
208
|
-
fontSize:
|
|
209
|
-
lineHeight:
|
|
210
|
-
fontWeight: "700",
|
|
217
|
+
fontSize: 34,
|
|
218
|
+
lineHeight: 37,
|
|
211
219
|
letterSpacing: -0.4
|
|
212
220
|
},
|
|
213
221
|
summary: {
|
|
214
|
-
marginTop:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
222
|
+
marginTop: 20,
|
|
223
|
+
fontSize: 17,
|
|
224
|
+
lineHeight: 28,
|
|
225
|
+
opacity: 0.85
|
|
218
226
|
},
|
|
219
227
|
leadPill: {
|
|
220
228
|
marginTop: 10,
|
|
@@ -267,15 +275,14 @@ const styles = StyleSheet.create({
|
|
|
267
275
|
},
|
|
268
276
|
sourcesContent: {
|
|
269
277
|
paddingHorizontal: 18,
|
|
278
|
+
paddingVertical: 6,
|
|
270
279
|
gap: 10
|
|
271
280
|
},
|
|
272
281
|
sourceCard: {
|
|
273
282
|
width: 168,
|
|
274
|
-
minHeight:
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
padding: 11,
|
|
278
|
-
gap: 7
|
|
283
|
+
minHeight: 88,
|
|
284
|
+
padding: 12,
|
|
285
|
+
gap: 8
|
|
279
286
|
},
|
|
280
287
|
sourceHead: {
|
|
281
288
|
flexDirection: "row",
|
|
@@ -297,19 +304,18 @@ const styles = StyleSheet.create({
|
|
|
297
304
|
justifyContent: "center"
|
|
298
305
|
},
|
|
299
306
|
hero: {
|
|
300
|
-
marginTop: 18
|
|
307
|
+
marginTop: 18
|
|
308
|
+
},
|
|
309
|
+
heroInner: {
|
|
301
310
|
width: "100%",
|
|
302
|
-
aspectRatio: 16 / 9
|
|
303
|
-
borderRadius: 16,
|
|
304
|
-
borderWidth: StyleSheet.hairlineWidth,
|
|
305
|
-
overflow: "hidden"
|
|
311
|
+
aspectRatio: 16 / 9
|
|
306
312
|
},
|
|
307
313
|
body: {
|
|
308
314
|
marginTop: 20
|
|
309
315
|
},
|
|
310
316
|
more: {
|
|
311
|
-
marginTop:
|
|
312
|
-
paddingTop:
|
|
317
|
+
marginTop: 40,
|
|
318
|
+
paddingTop: 28,
|
|
313
319
|
borderTopWidth: StyleSheet.hairlineWidth
|
|
314
320
|
},
|
|
315
321
|
moreHead: {
|
|
@@ -318,13 +324,20 @@ const styles = StyleSheet.create({
|
|
|
318
324
|
gap: 8
|
|
319
325
|
},
|
|
320
326
|
moreTitle: {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
327
|
+
fontFamily: DISCOVER_SERIF,
|
|
328
|
+
fontSize: 26,
|
|
329
|
+
lineHeight: 30
|
|
324
330
|
},
|
|
325
331
|
moreList: {
|
|
326
|
-
marginTop:
|
|
327
|
-
gap:
|
|
332
|
+
marginTop: 18,
|
|
333
|
+
gap: 16
|
|
334
|
+
},
|
|
335
|
+
moreRow: {
|
|
336
|
+
flexDirection: "row",
|
|
337
|
+
gap: 16
|
|
338
|
+
},
|
|
339
|
+
moreSpacer: {
|
|
340
|
+
flex: 1
|
|
328
341
|
},
|
|
329
342
|
state: {
|
|
330
343
|
flex: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscoverArticle.js","sources":["../../../src/features/discover/DiscoverArticle.tsx"],"sourcesContent":["/**\n * Native Discover reader — the browser's `DiscoverArticlePage`: tag, headline,\n * summary with a lead source pill, source cards, hero, cleaned body, and\n * \"Discover more\" from the same topic. The browser's \"Ask follow-up\" box is\n * not here yet: it hands off through the web chat session store.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { Image } from 'expo-image';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useNavigation } from '@react-navigation/native';\nimport type { IAccountNewsArticle } from 'common';\nimport { AssistantMarkdown } from '../chat/AssistantMarkdown';\nimport { useChatLinkOpener } from '../links/chatLinkOpener';\nimport {\n cleanArticleContent,\n faviconUrl,\n formatPublishedAt,\n getStoryId,\n normalizeSources,\n type NormalizedSource,\n} from './articleContent';\nimport {\n CompactStoryCard,\n DISCOVER_SERIF,\n TagChip,\n discoverPalette,\n openDiscoverArticle,\n type DiscoverPalette,\n} from './DiscoverStoryCards';\nimport { useNewsArticle, useNewsArticlesInfinite } from './useDiscoverNews';\n\nconst MAX_SOURCE_CARDS = 8;\nconst DISCOVER_MORE_COUNT = 4;\n\nfunction SourceFavicon({\n source,\n size,\n palette,\n}: {\n source: NormalizedSource;\n size: number;\n palette: DiscoverPalette;\n}) {\n const [failed, setFailed] = useState(false);\n const letter = (source.name || source.host || '?').charAt(0).toUpperCase();\n\n if (source.host && !failed) {\n return (\n <Image\n source={{ uri: faviconUrl(source.host) }}\n style={{ width: size, height: size, borderRadius: 4 }}\n contentFit=\"contain\"\n onError={() => setFailed(true)}\n />\n );\n }\n\n return (\n <View style={[styles.faviconFallback, { width: size, height: size, backgroundColor: palette.text }]}>\n <Text style={{ color: palette.bg, fontSize: Math.round(size * 0.55), fontWeight: '700' }}>{letter}</Text>\n </View>\n );\n}\n\nfunction SourceCards({\n sources,\n palette,\n onOpen,\n}: {\n sources: NormalizedSource[];\n palette: DiscoverPalette;\n onOpen: (url: string) => void;\n}) {\n if (sources.length === 0) return null;\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={styles.sourcesScroll}\n contentContainerStyle={styles.sourcesContent}\n >\n {sources.slice(0, MAX_SOURCE_CARDS).map((source, index) => (\n <Pressable\n key={`${source.name}-${index}`}\n accessibilityRole={source.url ? 'link' : undefined}\n disabled={!source.url}\n onPress={() => source.url && onOpen(source.url)}\n style={({ pressed }) => [\n styles.sourceCard,\n { backgroundColor: palette.imagePlaceholder, borderColor: palette.cardBorder },\n pressed && styles.pressed,\n ]}\n >\n <View style={styles.sourceHead}>\n <SourceFavicon source={source} size={16} palette={palette} />\n <Text style={[styles.sourceName, { color: palette.textMuted }]} numberOfLines={1}>\n {source.name}\n </Text>\n </View>\n {source.title ? (\n <Text style={[styles.sourceTitle, { color: palette.text }]} numberOfLines={2}>\n {source.title}\n </Text>\n ) : null}\n </Pressable>\n ))}\n </ScrollView>\n );\n}\n\nfunction DiscoverMore({\n article,\n palette,\n onOpen,\n}: {\n article: IAccountNewsArticle;\n palette: DiscoverPalette;\n onOpen: (story: IAccountNewsArticle) => void;\n}) {\n // Same variables as the feed's first page, so this reads the cached list.\n const { articles } = useNewsArticlesInfinite({ topic: article.topic });\n const currentId = getStoryId(article);\n const related = articles.filter((story) => getStoryId(story) !== currentId).slice(0, DISCOVER_MORE_COUNT);\n\n if (related.length === 0) return null;\n\n return (\n <View style={[styles.more, { borderTopColor: palette.border }]}>\n <View style={styles.moreHead}>\n <Ionicons name=\"sparkles-outline\" size={18} color={palette.text} />\n <Text style={[styles.moreTitle, { color: palette.text }]}>Discover more</Text>\n </View>\n <View style={styles.moreList}>\n {related.map((story) => (\n <CompactStoryCard key={getStoryId(story)} story={story} palette={palette} onPress={onOpen} />\n ))}\n </View>\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}>\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 DiscoverArticle({\n slug,\n orgName,\n isDark,\n}: {\n slug: string | null;\n orgName: string | null;\n isDark: boolean;\n}) {\n const navigation = useNavigation();\n const palette = useMemo(() => discoverPalette(isDark), [isDark]);\n const openLink = useChatLinkOpener();\n const scrollRef = useRef<ScrollView>(null);\n const { article, loading, error } = useNewsArticle({ slug });\n\n // \"Discover more\" reopens this same route with a new slug.\n useEffect(() => {\n scrollRef.current?.scrollTo({ y: 0, animated: false });\n }, [slug]);\n\n const onOpenStory = useCallback(\n (story: IAccountNewsArticle) => openDiscoverArticle(navigation, story, orgName),\n [navigation, orgName],\n );\n\n const sources = useMemo(() => (article ? normalizeSources(article.sourceItems, article.sources) : []), [article]);\n const content = useMemo(\n () =>\n article\n ? cleanArticleContent(\n article.content,\n article.title,\n article.summary ?? undefined,\n article.imageUrl ?? undefined,\n )\n : '',\n [article],\n );\n\n if (!article) {\n let body: React.ReactElement;\n if (loading) {\n body = <ActivityIndicator color={palette.primary} />;\n } else if (error) {\n body = (\n <StateMessage\n title=\"Unable to load article\"\n description=\"Something went wrong while fetching this article. Please try again in a moment.\"\n palette={palette}\n />\n );\n } else {\n body = (\n <StateMessage\n title=\"Article not found\"\n description=\"We could not find this news article. It may not be available yet or may have been removed.\"\n palette={palette}\n />\n );\n }\n return <View style={[styles.state, { backgroundColor: palette.bg }]}>{body}</View>;\n }\n\n const publishedLabel = formatPublishedAt(article.publishedAt);\n const sourceCountLabel =\n article.sourceCount === 1 ? '1 source' : `${article.sourceCount || sources.length} sources`;\n const [leadSource] = sources;\n\n return (\n <ScrollView ref={scrollRef} style={{ backgroundColor: palette.bg }} contentContainerStyle={styles.content}>\n <View style={styles.tagRow}>\n <TagChip label={article.tag} palette={palette} />\n </View>\n\n <Text style={[styles.title, { color: palette.text }]} accessibilityRole=\"header\">\n {article.title}\n </Text>\n\n {article.summary ? <Text style={[styles.summary, { color: palette.text }]}>{article.summary}</Text> : null}\n\n {leadSource ? (\n <Pressable\n accessibilityRole={leadSource.url ? 'link' : undefined}\n disabled={!leadSource.url}\n onPress={() => leadSource.url && openLink(leadSource.url)}\n style={[\n styles.leadPill,\n { backgroundColor: palette.imagePlaceholder, borderColor: palette.cardBorder },\n ]}\n >\n <SourceFavicon source={leadSource} size={14} palette={palette} />\n <Text style={[styles.leadPillText, { color: palette.textMuted }]} numberOfLines={1}>\n {leadSource.name}\n </Text>\n {sources.length > 1 ? (\n <Text style={[styles.leadPillText, { color: palette.textMuted }]}>+{sources.length - 1}</Text>\n ) : null}\n </Pressable>\n ) : null}\n\n <View style={[styles.byline, { borderBottomColor: palette.border }]}>\n <View style={styles.bylineItem}>\n <View style={[styles.bylineIcon, { backgroundColor: palette.text }]}>\n <Ionicons name=\"layers-outline\" size={13} color={palette.bg} />\n </View>\n <Text style={[styles.bylineStrong, { color: palette.textMuted }]}>\n Summarized from {sourceCountLabel}\n </Text>\n </View>\n {publishedLabel ? (\n <Pressable\n accessibilityRole=\"link\"\n onPress={() => article.href && openLink(article.href)}\n style={styles.bylineItem}\n >\n <Ionicons name=\"time-outline\" size={14} color={palette.textMuted} />\n <Text style={[styles.bylineText, { color: palette.textMuted }]}>{publishedLabel}</Text>\n </Pressable>\n ) : null}\n </View>\n\n <SourceCards sources={sources} palette={palette} onOpen={openLink} />\n\n {article.imageUrl ? (\n <View\n style={[\n styles.hero,\n { backgroundColor: palette.imagePlaceholder, borderColor: palette.cardBorder },\n ]}\n >\n <Image\n source={{ uri: article.imageUrl }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={150}\n accessibilityIgnoresInvertColors\n />\n </View>\n ) : null}\n\n {content ? (\n <View style={styles.body}>\n <AssistantMarkdown text={content} isDark={isDark} />\n </View>\n ) : null}\n\n <DiscoverMore article={article} palette={palette} onOpen={onOpenStory} />\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create({\n content: {\n paddingHorizontal: 18,\n paddingTop: 18,\n paddingBottom: 48,\n },\n pressed: {\n opacity: 0.85,\n },\n tagRow: {\n flexDirection: 'row',\n },\n title: {\n marginTop: 14,\n fontFamily: DISCOVER_SERIF,\n fontSize: 28,\n lineHeight: 34,\n fontWeight: '700',\n letterSpacing: -0.4,\n },\n summary: {\n marginTop: 14,\n fontFamily: DISCOVER_SERIF,\n fontSize: 18,\n lineHeight: 27,\n },\n leadPill: {\n marginTop: 10,\n alignSelf: 'flex-start',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 9,\n paddingVertical: 4,\n maxWidth: 240,\n },\n leadPillText: {\n fontSize: 12,\n fontWeight: '500',\n },\n byline: {\n marginTop: 18,\n paddingBottom: 14,\n borderBottomWidth: StyleSheet.hairlineWidth,\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 10,\n },\n bylineItem: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 7,\n },\n bylineIcon: {\n width: 22,\n height: 22,\n borderRadius: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n bylineStrong: {\n fontSize: 14,\n fontWeight: '600',\n },\n bylineText: {\n fontSize: 13,\n },\n sourcesScroll: {\n marginTop: 16,\n marginHorizontal: -18,\n },\n sourcesContent: {\n paddingHorizontal: 18,\n gap: 10,\n },\n sourceCard: {\n width: 168,\n minHeight: 82,\n borderRadius: 12,\n borderWidth: StyleSheet.hairlineWidth,\n padding: 11,\n gap: 7,\n },\n sourceHead: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 7,\n },\n sourceName: {\n flex: 1,\n fontSize: 12,\n fontWeight: '600',\n },\n sourceTitle: {\n fontSize: 13,\n lineHeight: 18,\n },\n faviconFallback: {\n borderRadius: 4,\n alignItems: 'center',\n justifyContent: 'center',\n },\n hero: {\n marginTop: 18,\n width: '100%',\n aspectRatio: 16 / 9,\n borderRadius: 16,\n borderWidth: StyleSheet.hairlineWidth,\n overflow: 'hidden',\n },\n body: {\n marginTop: 20,\n },\n more: {\n marginTop: 32,\n paddingTop: 22,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n moreHead: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n moreTitle: {\n fontSize: 19,\n fontWeight: '700',\n letterSpacing: -0.2,\n },\n moreList: {\n marginTop: 14,\n gap: 12,\n },\n state: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 28,\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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DiscoverArticle.js","sources":["../../../src/features/discover/DiscoverArticle.tsx"],"sourcesContent":["/**\n * Native Discover reader — the browser's `DiscoverArticlePage`: tag, headline,\n * summary with a lead source pill, source cards, hero, cleaned body,\n * \"Discover more\" from the same topic, and the pinned \"Ask follow-up\" box.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Platform, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { Image } from 'expo-image';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useNavigation } from '@react-navigation/native';\nimport type { IAccountNewsArticle } from 'common';\nimport { AppKeyboardAvoidingView } from '../../components/AppKeyboardAvoidingView';\nimport { AssistantMarkdown } from '../chat/AssistantMarkdown';\nimport { useChatLinkOpener } from '../links/chatLinkOpener';\nimport {\n cleanArticleContent,\n faviconUrl,\n formatPublishedAt,\n getStoryId,\n normalizeSources,\n type NormalizedSource,\n} from './articleContent';\nimport { DiscoverFollowUp, FOLLOW_UP_RESERVED_HEIGHT } from './DiscoverFollowUp';\nimport { DiscoverArticleSkeleton } from './DiscoverSkeletons';\nimport {\n DISCOVER_SERIF,\n DiscoverCard,\n DiscoverMoreCard,\n TagChip,\n discoverPalette,\n openDiscoverArticle,\n type DiscoverPalette,\n} from './DiscoverStoryCards';\nimport { useNewsArticle, useNewsArticlesInfinite } from './useDiscoverNews';\n\nconst MAX_SOURCE_CARDS = 8;\nconst DISCOVER_MORE_COUNT = 4;\n\nfunction SourceFavicon({\n source,\n size,\n palette,\n}: {\n source: NormalizedSource;\n size: number;\n palette: DiscoverPalette;\n}) {\n const [failed, setFailed] = useState(false);\n const letter = (source.name || source.host || '?').charAt(0).toUpperCase();\n\n if (source.host && !failed) {\n return (\n <Image\n source={{ uri: faviconUrl(source.host) }}\n style={{ width: size, height: size, borderRadius: 4 }}\n contentFit=\"contain\"\n onError={() => setFailed(true)}\n />\n );\n }\n\n return (\n <View style={[styles.faviconFallback, { width: size, height: size, backgroundColor: palette.text }]}>\n <Text style={{ color: palette.bg, fontSize: Math.round(size * 0.55), fontWeight: '700' }}>{letter}</Text>\n </View>\n );\n}\n\nfunction SourceCards({\n sources,\n palette,\n onOpen,\n}: {\n sources: NormalizedSource[];\n palette: DiscoverPalette;\n onOpen: (url: string) => void;\n}) {\n if (sources.length === 0) return null;\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n style={styles.sourcesScroll}\n contentContainerStyle={styles.sourcesContent}\n >\n {sources.slice(0, MAX_SOURCE_CARDS).map((source, index) => (\n <DiscoverCard\n key={`${source.name}-${index}`}\n palette={palette}\n radius={16}\n onPress={source.url ? () => source.url && onOpen(source.url) : undefined}\n accessibilityLabel={[source.name, source.title].filter(Boolean).join(', ')}\n innerStyle={styles.sourceCard}\n >\n <View style={styles.sourceHead}>\n <SourceFavicon source={source} size={16} palette={palette} />\n <Text style={[styles.sourceName, { color: palette.textMuted }]} numberOfLines={1}>\n {source.name}\n </Text>\n </View>\n {source.title ? (\n <Text style={[styles.sourceTitle, { color: palette.text }]} numberOfLines={2}>\n {source.title}\n </Text>\n ) : null}\n </DiscoverCard>\n ))}\n </ScrollView>\n );\n}\n\nfunction DiscoverMore({\n article,\n palette,\n onOpen,\n}: {\n article: IAccountNewsArticle;\n palette: DiscoverPalette;\n onOpen: (story: IAccountNewsArticle) => void;\n}) {\n // Same variables as the feed's first page, so this reads the cached list.\n const { articles } = useNewsArticlesInfinite({ topic: article.topic });\n const currentId = getStoryId(article);\n const related = articles.filter((story) => getStoryId(story) !== currentId).slice(0, DISCOVER_MORE_COUNT);\n\n if (related.length === 0) return null;\n\n // Two to a row, as the web grid sits on a phone.\n const rows: IAccountNewsArticle[][] = [];\n for (let index = 0; index < related.length; index += 2) rows.push(related.slice(index, index + 2));\n\n return (\n <View style={[styles.more, { borderTopColor: palette.border }]}>\n <View style={styles.moreHead}>\n <Ionicons name=\"sparkles-outline\" size={20} color={palette.primary} />\n <Text style={[styles.moreTitle, { color: palette.text }]} accessibilityRole=\"header\">\n Discover more\n </Text>\n </View>\n <View style={styles.moreList}>\n {rows.map((row) => (\n <View key={getStoryId(row[0])} style={styles.moreRow}>\n {row.map((story) => (\n <DiscoverMoreCard\n key={getStoryId(story)}\n story={story}\n palette={palette}\n onPress={onOpen}\n />\n ))}\n {row.length === 1 ? <View style={styles.moreSpacer} /> : null}\n </View>\n ))}\n </View>\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}>\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 DiscoverArticle({\n slug,\n orgName,\n isDark,\n}: {\n slug: string | null;\n orgName: string | null;\n isDark: boolean;\n}) {\n const navigation = useNavigation();\n const palette = useMemo(() => discoverPalette(isDark), [isDark]);\n const openLink = useChatLinkOpener();\n const scrollRef = useRef<ScrollView>(null);\n const rootRef = useRef<View>(null);\n // The header sits above this screen; the keyboard lift has to know how far down it starts.\n const [topOffset, setTopOffset] = useState(0);\n const { article, loading, error } = useNewsArticle({ slug });\n\n // \"Discover more\" reopens this same route with a new slug.\n useEffect(() => {\n scrollRef.current?.scrollTo({ y: 0, animated: false });\n }, [slug]);\n\n const onOpenStory = useCallback(\n (story: IAccountNewsArticle) => openDiscoverArticle(navigation, story, orgName),\n [navigation, orgName],\n );\n\n const sources = useMemo(() => (article ? normalizeSources(article.sourceItems, article.sources) : []), [article]);\n const content = useMemo(\n () =>\n article\n ? cleanArticleContent(\n article.content,\n article.title,\n article.summary ?? undefined,\n article.imageUrl ?? undefined,\n )\n : '',\n [article],\n );\n\n if (!article) {\n if (loading) {\n return (\n <ScrollView style={{ backgroundColor: palette.bg }} contentContainerStyle={styles.content}>\n <DiscoverArticleSkeleton palette={palette} />\n </ScrollView>\n );\n }\n return (\n <View style={[styles.state, { backgroundColor: palette.bg }]}>\n {error ? (\n <StateMessage\n title=\"Unable to load article\"\n description=\"Something went wrong while fetching this article. Please try again in a moment.\"\n palette={palette}\n />\n ) : (\n <StateMessage\n title=\"Article not found\"\n description=\"We could not find this news article. It may not be available yet or may have been removed.\"\n palette={palette}\n />\n )}\n </View>\n );\n }\n\n const publishedLabel = formatPublishedAt(article.publishedAt);\n const sourceCountLabel =\n article.sourceCount === 1 ? '1 source' : `${article.sourceCount || sources.length} sources`;\n const [leadSource] = sources;\n\n return (\n <AppKeyboardAvoidingView\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n keyboardVerticalOffset={topOffset}\n style={[styles.root, { backgroundColor: palette.bg }]}\n >\n <View\n ref={rootRef}\n style={styles.root}\n onLayout={() => rootRef.current?.measureInWindow((_x, y) => setTopOffset(Math.max(0, y)))}\n >\n <ScrollView\n ref={scrollRef}\n style={{ backgroundColor: palette.bg }}\n contentContainerStyle={[styles.content, { paddingBottom: FOLLOW_UP_RESERVED_HEIGHT + 32 }]}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode=\"interactive\"\n >\n <View style={styles.tagRow}>\n <TagChip label={article.tag} palette={palette} />\n </View>\n\n <Text style={[styles.title, { color: palette.text }]} accessibilityRole=\"header\">\n {article.title}\n </Text>\n\n {article.summary ? (\n <Text style={[styles.summary, { color: palette.text }]}>{article.summary}</Text>\n ) : null}\n\n {leadSource ? (\n <Pressable\n accessibilityRole={leadSource.url ? 'link' : undefined}\n disabled={!leadSource.url}\n onPress={() => leadSource.url && openLink(leadSource.url)}\n style={[\n styles.leadPill,\n { backgroundColor: palette.imagePlaceholder, borderColor: palette.cardBorder },\n ]}\n >\n <SourceFavicon source={leadSource} size={14} palette={palette} />\n <Text style={[styles.leadPillText, { color: palette.textMuted }]} numberOfLines={1}>\n {leadSource.name}\n </Text>\n {sources.length > 1 ? (\n <Text style={[styles.leadPillText, { color: palette.textMuted }]}>\n +{sources.length - 1}\n </Text>\n ) : null}\n </Pressable>\n ) : null}\n\n <View style={[styles.byline, { borderBottomColor: palette.border }]}>\n <View style={styles.bylineItem}>\n <View style={[styles.bylineIcon, { backgroundColor: palette.primarySoft }]}>\n <Ionicons name=\"layers-outline\" size={13} color={palette.primary} />\n </View>\n <Text style={[styles.bylineStrong, { color: palette.textMuted }]}>\n Summarized from {sourceCountLabel}\n </Text>\n </View>\n {publishedLabel ? (\n <Pressable\n accessibilityRole=\"link\"\n onPress={() => article.href && openLink(article.href)}\n style={styles.bylineItem}\n >\n <Ionicons name=\"time-outline\" size={14} color={palette.textMuted} />\n <Text style={[styles.bylineText, { color: palette.textMuted }]}>{publishedLabel}</Text>\n </Pressable>\n ) : null}\n </View>\n\n <SourceCards sources={sources} palette={palette} onOpen={openLink} />\n\n {article.imageUrl ? (\n <DiscoverCard palette={palette} radius={22} style={styles.hero} innerStyle={styles.heroInner}>\n <Image\n source={{ uri: article.imageUrl }}\n style={StyleSheet.absoluteFill}\n contentFit=\"cover\"\n transition={150}\n accessibilityIgnoresInvertColors\n />\n </DiscoverCard>\n ) : null}\n\n {content ? (\n <View style={styles.body}>\n <AssistantMarkdown text={content} isDark={isDark} />\n </View>\n ) : null}\n\n <DiscoverMore article={article} palette={palette} onOpen={onOpenStory} />\n </ScrollView>\n <DiscoverFollowUp article={article} orgName={orgName} palette={palette} />\n </View>\n </AppKeyboardAvoidingView>\n );\n}\n\nconst styles = StyleSheet.create({\n root: {\n flex: 1,\n },\n content: {\n paddingHorizontal: 18,\n paddingTop: 18,\n paddingBottom: 48,\n },\n pressed: {\n opacity: 0.85,\n },\n tagRow: {\n flexDirection: 'row',\n },\n title: {\n marginTop: 16,\n fontFamily: DISCOVER_SERIF,\n fontSize: 34,\n lineHeight: 37,\n letterSpacing: -0.4,\n },\n summary: {\n marginTop: 20,\n fontSize: 17,\n lineHeight: 28,\n opacity: 0.85,\n },\n leadPill: {\n marginTop: 10,\n alignSelf: 'flex-start',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n paddingHorizontal: 9,\n paddingVertical: 4,\n maxWidth: 240,\n },\n leadPillText: {\n fontSize: 12,\n fontWeight: '500',\n },\n byline: {\n marginTop: 18,\n paddingBottom: 14,\n borderBottomWidth: StyleSheet.hairlineWidth,\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 10,\n },\n bylineItem: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 7,\n },\n bylineIcon: {\n width: 22,\n height: 22,\n borderRadius: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n bylineStrong: {\n fontSize: 14,\n fontWeight: '600',\n },\n bylineText: {\n fontSize: 13,\n },\n sourcesScroll: {\n marginTop: 16,\n marginHorizontal: -18,\n },\n sourcesContent: {\n paddingHorizontal: 18,\n paddingVertical: 6,\n gap: 10,\n },\n sourceCard: {\n width: 168,\n minHeight: 88,\n padding: 12,\n gap: 8,\n },\n sourceHead: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 7,\n },\n sourceName: {\n flex: 1,\n fontSize: 12,\n fontWeight: '600',\n },\n sourceTitle: {\n fontSize: 13,\n lineHeight: 18,\n },\n faviconFallback: {\n borderRadius: 4,\n alignItems: 'center',\n justifyContent: 'center',\n },\n hero: {\n marginTop: 18,\n },\n heroInner: {\n width: '100%',\n aspectRatio: 16 / 9,\n },\n body: {\n marginTop: 20,\n },\n more: {\n marginTop: 40,\n paddingTop: 28,\n borderTopWidth: StyleSheet.hairlineWidth,\n },\n moreHead: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n },\n moreTitle: {\n fontFamily: DISCOVER_SERIF,\n fontSize: 26,\n lineHeight: 30,\n },\n moreList: {\n marginTop: 18,\n gap: 16,\n },\n moreRow: {\n flexDirection: 'row',\n gap: 16,\n },\n moreSpacer: {\n flex: 1,\n },\n state: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 28,\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":[],"mappings":"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"}
|