@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,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState,useRef,useCallback,useEffect,useMemo}from'react';import {Keyboard,InteractionManager,View,StyleSheet,Text,Pressable,ScrollView,Platform,TextInput,ActivityIndicator}from'react-native';import {AppKeyboardAvoidingView}from'../../components/AppKeyboardAvoidingView.js';import {MaterialCommunityIcons,Feather}from'@expo/vector-icons';import {dismissKeyboard}from'../../utils/keyboardController.js';import {useSafeInsets}from'../canvas/withRemoteSafeArea.js';import {useImageAttachments}from'../attachments/useImageAttachments.js';import {ComposerAttachmentBar}from'../attachments/ComposerAttachmentBar.js';import {NativeDictationBar}from'../audio-input/NativeDictationBar.js';import {AudioRecorderPanel}from'../audio-input/AudioRecorderPanel.js';import {MicErrorBoundary}from'../audio-input/MicErrorBoundary.js';import {isNativeDictationAvailable}from'../audio-input/nativeDictation.js';import {requestMicPermission}from'../audio-input/useAudioPermission.js';import {ChatTranscript}from'../chat/ChatTranscript.js';import {createEdgeSwipe}from'./edgeSwipe.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';var __defProp = Object.defineProperty;
|
|
1
|
+
import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState,useRef,useCallback,useEffect,useMemo}from'react';import {Keyboard,InteractionManager,View,StyleSheet,Text,Pressable,ScrollView,Platform,TextInput,ActivityIndicator}from'react-native';import {AppKeyboardAvoidingView}from'../../components/AppKeyboardAvoidingView.js';import {MaterialCommunityIcons,Feather}from'@expo/vector-icons';import {dismissKeyboard}from'../../utils/keyboardController.js';import {useSafeInsets}from'../canvas/withRemoteSafeArea.js';import {useImageAttachments}from'../attachments/useImageAttachments.js';import {ComposerAttachmentBar}from'../attachments/ComposerAttachmentBar.js';import {NativeDictationBar}from'../audio-input/NativeDictationBar.js';import {AudioRecorderPanel}from'../audio-input/AudioRecorderPanel.js';import {MicErrorBoundary}from'../audio-input/MicErrorBoundary.js';import {isNativeDictationAvailable}from'../audio-input/nativeDictation.js';import {requestMicPermission}from'../audio-input/useAudioPermission.js';import {ChatTranscript}from'../chat/ChatTranscript.js';import {QueuedFollowUps}from'../chat/QueuedFollowUps.js';import {createEdgeSwipe}from'./edgeSwipe.js';import ThinkingIndicator from'../../components/ThinkingIndicator.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -27,6 +27,7 @@ function NativeAgentChat({
|
|
|
27
27
|
renderMessageExtras,
|
|
28
28
|
onClear,
|
|
29
29
|
busy = false,
|
|
30
|
+
steering,
|
|
30
31
|
streamingContent = null,
|
|
31
32
|
error = null,
|
|
32
33
|
placeholder = "Ask anything\u2026",
|
|
@@ -55,6 +56,7 @@ function NativeAgentChat({
|
|
|
55
56
|
border = "#e8ecf1",
|
|
56
57
|
card
|
|
57
58
|
}) {
|
|
59
|
+
var _a;
|
|
58
60
|
const insets = useSafeInsets();
|
|
59
61
|
const draftControlled = onDraftChange !== void 0;
|
|
60
62
|
const [internalDraft, setInternalDraft] = useState("");
|
|
@@ -81,6 +83,8 @@ ${prev}` : composerSeed);
|
|
|
81
83
|
const [voiceError, setVoiceError] = useState(null);
|
|
82
84
|
const canSend = draft.trim().length > 0 || attachments.pending.length > 0;
|
|
83
85
|
const listening = showNativeDictation || showAudioRecorder;
|
|
86
|
+
const canStop = Boolean((steering == null ? void 0 : steering.steerable) && steering.stop) && !canSend && !listening;
|
|
87
|
+
const queuedTurns = (_a = steering == null ? void 0 : steering.queued) != null ? _a : [];
|
|
84
88
|
const submit = (text, files) => {
|
|
85
89
|
const trimmed = (text != null ? text : draft).trim();
|
|
86
90
|
const pending = attachments.forSend();
|
|
@@ -200,9 +204,9 @@ ${prev}` : composerSeed);
|
|
|
200
204
|
color: muted
|
|
201
205
|
}], children: emptyBody }) : null,
|
|
202
206
|
suggestions.length > 0 ? /* @__PURE__ */ jsx(View, { style: styles.chips, children: suggestions.map((chip) => /* @__PURE__ */ jsx(Pressable, { onPress: () => {
|
|
203
|
-
var
|
|
207
|
+
var _a2;
|
|
204
208
|
dismissKeyboard();
|
|
205
|
-
submit((
|
|
209
|
+
submit((_a2 = chip.prompt) != null ? _a2 : chip.label);
|
|
206
210
|
}, style: [styles.chip, {
|
|
207
211
|
borderColor: border,
|
|
208
212
|
backgroundColor: card != null ? card : isDark ? "#1e293b" : "#fff"
|
|
@@ -222,6 +226,13 @@ ${prev}` : composerSeed);
|
|
|
222
226
|
banner ? /* @__PURE__ */ jsx(View, { style: [styles.errorBanner, {
|
|
223
227
|
backgroundColor: isDark ? "#2b1a1d" : "#fef2f2"
|
|
224
228
|
}], children: /* @__PURE__ */ jsx(Text, { style: styles.errorText, children: banner }) }) : null,
|
|
229
|
+
queuedTurns.length > 0 ? /* @__PURE__ */ jsx(QueuedFollowUps, { items: queuedTurns, onCancel: (id) => {
|
|
230
|
+
var _a2;
|
|
231
|
+
return (_a2 = steering == null ? void 0 : steering.cancelQueued) == null ? void 0 : _a2.call(steering, id);
|
|
232
|
+
}, onSendNow: () => {
|
|
233
|
+
var _a2;
|
|
234
|
+
return (_a2 = steering == null ? void 0 : steering.sendQueuedNow) == null ? void 0 : _a2.call(steering);
|
|
235
|
+
}, isDark }) : null,
|
|
225
236
|
voicePanel != null ? voicePanel : /* @__PURE__ */ jsxs(View, { style: [styles.composerCard, {
|
|
226
237
|
borderColor: border,
|
|
227
238
|
backgroundColor: card != null ? card : isDark ? "#111827" : "#fff"
|
|
@@ -237,7 +248,10 @@ ${prev}` : composerSeed);
|
|
|
237
248
|
enableVoice ? /* @__PURE__ */ jsx(Pressable, { onPress: handleMicPress, style: [styles.mic, listening && styles.micLive], accessibilityRole: "button", accessibilityLabel: listening ? "Stop listening" : "Start voice input", children: /* @__PURE__ */ jsx(Feather, { name: listening ? "square" : "mic", size: 16, color: listening ? "#b91c1c" : muted }) }) : null,
|
|
238
249
|
canSend ? /* @__PURE__ */ jsx(Pressable, { onPress: () => submit(), style: [styles.send, busy && {
|
|
239
250
|
opacity: 0.85
|
|
240
|
-
}], accessibilityRole: "button", accessibilityLabel: "Send", children: /* @__PURE__ */ jsx(Feather, { name: "send", size: 14, color: "#fff", style: styles.sendIcon }) }) :
|
|
251
|
+
}], accessibilityRole: "button", accessibilityLabel: "Send", children: /* @__PURE__ */ jsx(Feather, { name: "send", size: 14, color: "#fff", style: styles.sendIcon }) }) : canStop ? /* @__PURE__ */ jsx(Pressable, { onPress: () => {
|
|
252
|
+
var _a2;
|
|
253
|
+
return (_a2 = steering == null ? void 0 : steering.stop) == null ? void 0 : _a2.call(steering);
|
|
254
|
+
}, style: [styles.send, styles.stop], accessibilityRole: "button", accessibilityLabel: "Stop the reply", children: /* @__PURE__ */ jsx(Feather, { name: "square", size: 12, color: "#fff" }) }) : null
|
|
241
255
|
] }),
|
|
242
256
|
enableAttachments || composerAccessory ? /* @__PURE__ */ jsxs(View, { style: styles.tools, children: [
|
|
243
257
|
enableAttachments ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -393,6 +407,9 @@ const styles = StyleSheet.create({
|
|
|
393
407
|
rotate: "45deg"
|
|
394
408
|
}]
|
|
395
409
|
},
|
|
410
|
+
stop: {
|
|
411
|
+
backgroundColor: "#0f172a"
|
|
412
|
+
},
|
|
396
413
|
toolBtn: {
|
|
397
414
|
width: 36,
|
|
398
415
|
height: 36,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeAgentChat.js","sources":["../../../src/features/agent-chat/NativeAgentChat.tsx"],"sourcesContent":["/**\n * Reusable native Agent panel (header + transcript + composer).\n * Composer matches web Shopping Agent: text + mic/send on the first row,\n * image + paperclip under the field. Surface cards (`beforeComposer`) scroll\n * with the thread as the list footer.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n InteractionManager,\n Keyboard,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { AppKeyboardAvoidingView } from '../../components/AppKeyboardAvoidingView';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { dismissKeyboard } from '../../utils/keyboardController';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport type { NativeAgentChatProps } from './types';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { useImageAttachments } from '../attachments/useImageAttachments';\nimport { ComposerAttachmentBar } from '../attachments/ComposerAttachmentBar';\nimport { NativeDictationBar } from '../audio-input/NativeDictationBar';\nimport { AudioRecorderPanel } from '../audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../audio-input/MicErrorBoundary';\nimport { isNativeDictationAvailable } from '../audio-input/nativeDictation';\nimport { requestMicPermission } from '../audio-input/useAudioPermission';\nimport { ChatTranscript } from '../chat/ChatTranscript';\nimport { createEdgeSwipe } from './edgeSwipe';\nimport ThinkingIndicator from '../../components/ThinkingIndicator';\n\nexport function NativeAgentChat({\n title,\n visible,\n onClose,\n messages,\n onSend,\n renderConnectorCard,\n renderMessageExtras,\n onClear,\n busy = false,\n streamingContent = null,\n error = null,\n placeholder = 'Ask anything…',\n emptyTitle,\n emptyBody,\n suggestions = [],\n beforeComposer,\n composerAccessory,\n paneOverlay,\n headerTrailing,\n belowHeader,\n composerLead,\n draft: draftProp,\n onDraftChange,\n composerSeed,\n composerSeedKey,\n onComposerSeedConsumed,\n embedded = false,\n onSwipeLeft,\n enableVoice = true,\n enableAttachments = true,\n isDark = false,\n ink = '#0f172a',\n muted = '#64748b',\n screen = '#f8fafc',\n border = '#e8ecf1',\n card,\n}: NativeAgentChatProps) {\n const insets = useSafeInsets();\n const draftControlled = onDraftChange !== undefined;\n const [internalDraft, setInternalDraft] = useState('');\n const draft = draftControlled ? (draftProp ?? '') : internalDraft;\n const draftRef = useRef(draft);\n draftRef.current = draft;\n // Read through a ref so setDraft stays one function for the pane's life; the\n // voice callbacks that call it are memoised once.\n const onDraftChangeRef = useRef(onDraftChange);\n onDraftChangeRef.current = onDraftChange;\n const setDraft = useCallback((next: string | ((prev: string) => string)) => {\n const value = typeof next === 'function' ? next(draftRef.current) : next;\n if (onDraftChangeRef.current) onDraftChangeRef.current(value);\n else setInternalDraft(value);\n }, []);\n useEffect(() => {\n if (composerSeed == null) return;\n setDraft((prev) => (prev.trim() ? `${composerSeed}\\n\\n${prev}` : composerSeed));\n onComposerSeedConsumed?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [composerSeed, composerSeedKey]);\n const attachments = useImageAttachments();\n const [showNativeDictation, setShowNativeDictation] = useState(false);\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n\n const canSend = draft.trim().length > 0 || attachments.pending.length > 0;\n const listening = showNativeDictation || showAudioRecorder;\n\n const submit = (text?: string, files?: MessageAttachment[]) => {\n const trimmed = (text ?? draft).trim();\n const pending = files ?? attachments.forSend();\n if (!trimmed && !pending?.length) return;\n setDraft('');\n attachments.clear();\n onSend(trimmed, pending);\n };\n\n const openWhisperRecorder = useCallback(() => {\n setVoiceError(null);\n void (async () => {\n const { granted, error } = await requestMicPermission();\n if (!granted) {\n setVoiceError(error || 'Microphone is not available.');\n return;\n }\n setShowAudioRecorder(true);\n })();\n }, []);\n\n const handleMicPress = useCallback(() => {\n if (listening) {\n setShowNativeDictation(false);\n setShowAudioRecorder(false);\n return;\n }\n setVoiceError(null);\n Keyboard.dismiss();\n if (isNativeDictationAvailable()) {\n setShowNativeDictation(true);\n return;\n }\n openWhisperRecorder();\n }, [listening, openWhisperRecorder]);\n\n const pasteTranscript = useCallback(\n (text: string) => {\n const cleaned = (text ?? '').trim();\n if (!cleaned) return;\n setDraft((prev) => (prev.trim() ? `${prev.trim()} ${cleaned}` : cleaned));\n },\n [setDraft],\n );\n\n const openPicker = useCallback((fn: () => Promise<void>) => {\n Keyboard.dismiss();\n InteractionManager.runAfterInteractions(() => {\n setTimeout(() => {\n void fn();\n }, 350);\n });\n }, []);\n\n const banner = voiceError || attachments.error || error;\n\n // Swipe right from the left edge to close the pane. Claimed on the pane's root view: the\n // strip that used to sit over the left 40pt ate taps on the composer's attach buttons.\n const swipeAway = useMemo(() => {\n if (!onSwipeLeft) return null;\n return createEdgeSwipe({\n zone: { edge: 'left', width: 40 },\n claim: (g) => g.dx > 10 && Math.abs(g.dx) > Math.abs(g.dy),\n release: (g) => {\n if (g.dx >= 48 && Math.abs(g.dx) > Math.abs(g.dy) * 1.15) onSwipeLeft();\n },\n });\n }, [onSwipeLeft]);\n\n if (!visible) return null;\n\n // Dictation or the recorder takes the composer's place while it listens.\n let voicePanel: React.ReactNode = null;\n if (showNativeDictation) {\n voicePanel = (\n <MicErrorBoundary\n onCancel={() => setShowNativeDictation(false)}\n onError={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n >\n <NativeDictationBar\n isDark={isDark}\n onInterim={() => undefined}\n onTranscriptionComplete={(text) => {\n setShowNativeDictation(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowNativeDictation(false)}\n onFallback={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n />\n </MicErrorBoundary>\n );\n } else if (showAudioRecorder) {\n voicePanel = (\n <MicErrorBoundary\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n >\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={(text) => {\n setShowAudioRecorder(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n />\n </MicErrorBoundary>\n );\n }\n\n return (\n <View\n style={[StyleSheet.absoluteFill, styles.overlay, { backgroundColor: screen }]}\n pointerEvents=\"auto\"\n {...swipeAway?.panHandlers}\n >\n <AppKeyboardAvoidingView\n style={[styles.fill, { backgroundColor: screen, paddingTop: embedded ? 8 : Math.max(insets.top, 8) }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={[styles.head, { borderColor: border }]}>\n <View style={styles.headTitle}>\n <MaterialCommunityIcons name=\"creation\" size={16} color={ink} />\n <Text style={[styles.title, { color: ink }]}>{title}</Text>\n </View>\n <View style={styles.headActions}>\n {onClear && (messages.length > 0 || Boolean(streamingContent?.trim())) ? (\n <Pressable\n onPress={onClear}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear chat\"\n >\n <Feather name=\"trash-2\" size={18} color={muted} />\n </Pressable>\n ) : null}\n {headerTrailing}\n <Pressable\n onPress={onClose}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${title}`}\n >\n <MaterialCommunityIcons name=\"close\" size={22} color={muted} />\n </Pressable>\n </View>\n </View>\n {belowHeader}\n\n {messages.length === 0 && !streamingContent ? (\n <ScrollView\n style={styles.fill}\n contentContainerStyle={styles.emptyScroll}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode={Platform.OS === 'ios' ? 'interactive' : 'on-drag'}\n showsVerticalScrollIndicator={false}\n >\n <Pressable style={styles.empty} onPress={dismissKeyboard} accessible={false}>\n {emptyTitle ? <Text style={[styles.emptyTitle, { color: ink }]}>{emptyTitle}</Text> : null}\n {emptyBody ? <Text style={[styles.emptyBody, { color: muted }]}>{emptyBody}</Text> : null}\n {suggestions.length > 0 ? (\n <View style={styles.chips}>\n {suggestions.map((chip) => (\n <Pressable\n key={chip.id}\n onPress={() => {\n dismissKeyboard();\n submit(chip.prompt ?? chip.label);\n }}\n style={[\n styles.chip,\n {\n borderColor: border,\n backgroundColor: card ?? (isDark ? '#1e293b' : '#fff'),\n },\n ]}\n >\n <Text style={[styles.chipText, { color: ink }]}>{chip.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n </Pressable>\n </ScrollView>\n ) : (\n <View style={styles.fill}>\n {/* Links open through the host's ChatLinkOpenerProvider (mounted at the\n app root): it needs Apollo, the root navigator and the in-app\n browser, which must stay out of the native surface remotes. */}\n <ChatTranscript\n messages={messages}\n streamingContent={streamingContent ?? undefined}\n isDark={isDark}\n listFooter={beforeComposer}\n renderMessageActions={renderMessageExtras}\n />\n {busy && !streamingContent?.trim() ? (\n <View style={styles.thinking}>\n <ThinkingIndicator variant=\"awaiting\" color={muted} isDark={isDark} />\n </View>\n ) : null}\n </View>\n )}\n\n <View\n style={[styles.composerWrap, { borderColor: border, paddingBottom: Math.max(insets.bottom, 10) }]}\n >\n {composerLead}\n {renderConnectorCard?.(isDark)}\n {banner ? (\n <View style={[styles.errorBanner, { backgroundColor: isDark ? '#2b1a1d' : '#fef2f2' }]}>\n <Text style={styles.errorText}>{banner}</Text>\n </View>\n ) : null}\n\n {voicePanel ?? (\n <View\n style={[\n styles.composerCard,\n { borderColor: border, backgroundColor: card ?? (isDark ? '#111827' : '#fff') },\n ]}\n >\n {enableAttachments ? (\n <ComposerAttachmentBar\n attachments={attachments.pending}\n onRemove={attachments.remove}\n isDark={isDark}\n />\n ) : null}\n <View style={styles.inputRow}>\n <TextInput\n value={draft}\n onChangeText={(next) => {\n setDraft(next);\n if (voiceError) setVoiceError(null);\n }}\n placeholder={listening ? 'Listening… speak your request' : placeholder}\n placeholderTextColor={muted}\n multiline\n textAlignVertical=\"top\"\n onSubmitEditing={() => submit()}\n style={[styles.input, { color: ink }]}\n accessibilityLabel={placeholder}\n />\n {enableVoice ? (\n <Pressable\n onPress={handleMicPress}\n style={[styles.mic, listening && styles.micLive]}\n accessibilityRole=\"button\"\n accessibilityLabel={listening ? 'Stop listening' : 'Start voice input'}\n >\n <Feather\n name={listening ? 'square' : 'mic'}\n size={16}\n color={listening ? '#b91c1c' : muted}\n />\n </Pressable>\n ) : null}\n {canSend ? (\n <Pressable\n onPress={() => submit()}\n style={[styles.send, busy && { opacity: 0.85 }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n >\n <Feather name=\"send\" size={14} color=\"#fff\" style={styles.sendIcon} />\n </Pressable>\n ) : null}\n </View>\n {enableAttachments || composerAccessory ? (\n <View style={styles.tools}>\n {enableAttachments ? (\n <>\n <Pressable\n onPress={() => openPicker(attachments.pickFromLibrary)}\n onLongPress={() => openPicker(attachments.captureFromCamera)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add image or screenshot\"\n >\n {attachments.busyKind === 'library' ||\n attachments.busyKind === 'camera' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"image\" size={18} color={muted} />\n )}\n </Pressable>\n <Pressable\n onPress={() => openPicker(attachments.pickDocuments)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach files\"\n >\n {attachments.busyKind === 'documents' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"paperclip\" size={18} color={muted} />\n )}\n </Pressable>\n </>\n ) : null}\n {composerAccessory ? (\n <View style={styles.toolsAccessory}>{composerAccessory}</View>\n ) : null}\n </View>\n ) : null}\n </View>\n )}\n </View>\n </AppKeyboardAvoidingView>\n {paneOverlay}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: { zIndex: 200, elevation: 200 },\n fill: { flex: 1, overflow: 'hidden' },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headTitle: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n headActions: { flexDirection: 'row', alignItems: 'center', gap: 12 },\n title: { fontSize: 16, fontWeight: '700' },\n emptyScroll: { flexGrow: 1 },\n empty: { flexGrow: 1, gap: 10, paddingTop: 20, paddingHorizontal: 16 },\n thinking: { paddingHorizontal: 16, paddingBottom: 8 },\n emptyTitle: { fontSize: 18, fontWeight: '700', letterSpacing: -0.3 },\n emptyBody: { fontSize: 14, lineHeight: 20 },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 4 },\n chip: { borderWidth: 1, borderRadius: 999, paddingHorizontal: 12, paddingVertical: 8 },\n chipText: { fontSize: 13, fontWeight: '600' },\n composerWrap: { paddingHorizontal: 12, paddingTop: 8, gap: 8 },\n errorBanner: { borderRadius: 10, padding: 8 },\n errorText: { color: '#991b1b', fontSize: 12 },\n composerCard: {\n borderWidth: StyleSheet.hairlineWidth,\n borderRadius: 18,\n paddingHorizontal: 12,\n paddingTop: 10,\n paddingBottom: 8,\n gap: 4,\n overflow: 'visible',\n },\n inputRow: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 4,\n minHeight: 44,\n },\n input: { flex: 1, fontSize: 15, maxHeight: 120, minHeight: 40, paddingVertical: 8, paddingHorizontal: 2 },\n tools: { flexDirection: 'row', alignItems: 'center', gap: 2, paddingTop: 2, overflow: 'visible' },\n toolsAccessory: { marginLeft: 'auto', flexShrink: 1 },\n mic: {\n width: 32,\n height: 32,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n micLive: { backgroundColor: 'rgba(185,28,28,0.12)' },\n send: {\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n sendIcon: { transform: [{ rotate: '45deg' }] },\n toolBtn: {\n width: 36,\n height: 36,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"],"names":["error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NativeAgentChat.js","sources":["../../../src/features/agent-chat/NativeAgentChat.tsx"],"sourcesContent":["/**\n * Reusable native Agent panel (header + transcript + composer).\n * Composer matches web Shopping Agent: text + mic/send on the first row,\n * image + paperclip under the field. Surface cards (`beforeComposer`) scroll\n * with the thread as the list footer.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n ActivityIndicator,\n InteractionManager,\n Keyboard,\n Platform,\n Pressable,\n ScrollView,\n StyleSheet,\n Text,\n TextInput,\n View,\n} from 'react-native';\nimport { AppKeyboardAvoidingView } from '../../components/AppKeyboardAvoidingView';\nimport { Feather, MaterialCommunityIcons } from '@expo/vector-icons';\nimport { dismissKeyboard } from '../../utils/keyboardController';\nimport { useSafeInsets } from '../canvas/withRemoteSafeArea';\nimport type { NativeAgentChatProps } from './types';\nimport type { MessageAttachment } from '../../hooks/useChatStream';\nimport { useImageAttachments } from '../attachments/useImageAttachments';\nimport { ComposerAttachmentBar } from '../attachments/ComposerAttachmentBar';\nimport { NativeDictationBar } from '../audio-input/NativeDictationBar';\nimport { AudioRecorderPanel } from '../audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../audio-input/MicErrorBoundary';\nimport { isNativeDictationAvailable } from '../audio-input/nativeDictation';\nimport { requestMicPermission } from '../audio-input/useAudioPermission';\nimport { ChatTranscript } from '../chat/ChatTranscript';\nimport { QueuedFollowUps } from '../chat/QueuedFollowUps';\nimport { createEdgeSwipe } from './edgeSwipe';\nimport ThinkingIndicator from '../../components/ThinkingIndicator';\n\nexport function NativeAgentChat({\n title,\n visible,\n onClose,\n messages,\n onSend,\n renderConnectorCard,\n renderMessageExtras,\n onClear,\n busy = false,\n steering,\n streamingContent = null,\n error = null,\n placeholder = 'Ask anything…',\n emptyTitle,\n emptyBody,\n suggestions = [],\n beforeComposer,\n composerAccessory,\n paneOverlay,\n headerTrailing,\n belowHeader,\n composerLead,\n draft: draftProp,\n onDraftChange,\n composerSeed,\n composerSeedKey,\n onComposerSeedConsumed,\n embedded = false,\n onSwipeLeft,\n enableVoice = true,\n enableAttachments = true,\n isDark = false,\n ink = '#0f172a',\n muted = '#64748b',\n screen = '#f8fafc',\n border = '#e8ecf1',\n card,\n}: NativeAgentChatProps) {\n const insets = useSafeInsets();\n const draftControlled = onDraftChange !== undefined;\n const [internalDraft, setInternalDraft] = useState('');\n const draft = draftControlled ? (draftProp ?? '') : internalDraft;\n const draftRef = useRef(draft);\n draftRef.current = draft;\n // Read through a ref so setDraft stays one function for the pane's life; the\n // voice callbacks that call it are memoised once.\n const onDraftChangeRef = useRef(onDraftChange);\n onDraftChangeRef.current = onDraftChange;\n const setDraft = useCallback((next: string | ((prev: string) => string)) => {\n const value = typeof next === 'function' ? next(draftRef.current) : next;\n if (onDraftChangeRef.current) onDraftChangeRef.current(value);\n else setInternalDraft(value);\n }, []);\n useEffect(() => {\n if (composerSeed == null) return;\n setDraft((prev) => (prev.trim() ? `${composerSeed}\\n\\n${prev}` : composerSeed));\n onComposerSeedConsumed?.();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [composerSeed, composerSeedKey]);\n const attachments = useImageAttachments();\n const [showNativeDictation, setShowNativeDictation] = useState(false);\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n\n const canSend = draft.trim().length > 0 || attachments.pending.length > 0;\n const listening = showNativeDictation || showAudioRecorder;\n // Mid-reply, Send queues behind the running turn and Stop sits beside it (as in the main Chat).\n const canStop = Boolean(steering?.steerable && steering.stop) && !canSend && !listening;\n const queuedTurns = steering?.queued ?? [];\n\n const submit = (text?: string, files?: MessageAttachment[]) => {\n const trimmed = (text ?? draft).trim();\n const pending = files ?? attachments.forSend();\n if (!trimmed && !pending?.length) return;\n setDraft('');\n attachments.clear();\n onSend(trimmed, pending);\n };\n\n const openWhisperRecorder = useCallback(() => {\n setVoiceError(null);\n void (async () => {\n const { granted, error } = await requestMicPermission();\n if (!granted) {\n setVoiceError(error || 'Microphone is not available.');\n return;\n }\n setShowAudioRecorder(true);\n })();\n }, []);\n\n const handleMicPress = useCallback(() => {\n if (listening) {\n setShowNativeDictation(false);\n setShowAudioRecorder(false);\n return;\n }\n setVoiceError(null);\n Keyboard.dismiss();\n if (isNativeDictationAvailable()) {\n setShowNativeDictation(true);\n return;\n }\n openWhisperRecorder();\n }, [listening, openWhisperRecorder]);\n\n const pasteTranscript = useCallback(\n (text: string) => {\n const cleaned = (text ?? '').trim();\n if (!cleaned) return;\n setDraft((prev) => (prev.trim() ? `${prev.trim()} ${cleaned}` : cleaned));\n },\n [setDraft],\n );\n\n const openPicker = useCallback((fn: () => Promise<void>) => {\n Keyboard.dismiss();\n InteractionManager.runAfterInteractions(() => {\n setTimeout(() => {\n void fn();\n }, 350);\n });\n }, []);\n\n const banner = voiceError || attachments.error || error;\n\n // Swipe right from the left edge to close the pane. Claimed on the pane's root view: the\n // strip that used to sit over the left 40pt ate taps on the composer's attach buttons.\n const swipeAway = useMemo(() => {\n if (!onSwipeLeft) return null;\n return createEdgeSwipe({\n zone: { edge: 'left', width: 40 },\n claim: (g) => g.dx > 10 && Math.abs(g.dx) > Math.abs(g.dy),\n release: (g) => {\n if (g.dx >= 48 && Math.abs(g.dx) > Math.abs(g.dy) * 1.15) onSwipeLeft();\n },\n });\n }, [onSwipeLeft]);\n\n if (!visible) return null;\n\n // Dictation or the recorder takes the composer's place while it listens.\n let voicePanel: React.ReactNode = null;\n if (showNativeDictation) {\n voicePanel = (\n <MicErrorBoundary\n onCancel={() => setShowNativeDictation(false)}\n onError={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n >\n <NativeDictationBar\n isDark={isDark}\n onInterim={() => undefined}\n onTranscriptionComplete={(text) => {\n setShowNativeDictation(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowNativeDictation(false)}\n onFallback={() => {\n setShowNativeDictation(false);\n openWhisperRecorder();\n }}\n />\n </MicErrorBoundary>\n );\n } else if (showAudioRecorder) {\n voicePanel = (\n <MicErrorBoundary\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n >\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={(text) => {\n setShowAudioRecorder(false);\n pasteTranscript(text);\n }}\n onCancel={() => setShowAudioRecorder(false)}\n onError={(err) => {\n setShowAudioRecorder(false);\n setVoiceError(err);\n }}\n />\n </MicErrorBoundary>\n );\n }\n\n return (\n <View\n style={[StyleSheet.absoluteFill, styles.overlay, { backgroundColor: screen }]}\n pointerEvents=\"auto\"\n {...swipeAway?.panHandlers}\n >\n <AppKeyboardAvoidingView\n style={[styles.fill, { backgroundColor: screen, paddingTop: embedded ? 8 : Math.max(insets.top, 8) }]}\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n >\n <View style={[styles.head, { borderColor: border }]}>\n <View style={styles.headTitle}>\n <MaterialCommunityIcons name=\"creation\" size={16} color={ink} />\n <Text style={[styles.title, { color: ink }]}>{title}</Text>\n </View>\n <View style={styles.headActions}>\n {onClear && (messages.length > 0 || Boolean(streamingContent?.trim())) ? (\n <Pressable\n onPress={onClear}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Clear chat\"\n >\n <Feather name=\"trash-2\" size={18} color={muted} />\n </Pressable>\n ) : null}\n {headerTrailing}\n <Pressable\n onPress={onClose}\n hitSlop={10}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${title}`}\n >\n <MaterialCommunityIcons name=\"close\" size={22} color={muted} />\n </Pressable>\n </View>\n </View>\n {belowHeader}\n\n {messages.length === 0 && !streamingContent ? (\n <ScrollView\n style={styles.fill}\n contentContainerStyle={styles.emptyScroll}\n keyboardShouldPersistTaps=\"handled\"\n keyboardDismissMode={Platform.OS === 'ios' ? 'interactive' : 'on-drag'}\n showsVerticalScrollIndicator={false}\n >\n <Pressable style={styles.empty} onPress={dismissKeyboard} accessible={false}>\n {emptyTitle ? <Text style={[styles.emptyTitle, { color: ink }]}>{emptyTitle}</Text> : null}\n {emptyBody ? <Text style={[styles.emptyBody, { color: muted }]}>{emptyBody}</Text> : null}\n {suggestions.length > 0 ? (\n <View style={styles.chips}>\n {suggestions.map((chip) => (\n <Pressable\n key={chip.id}\n onPress={() => {\n dismissKeyboard();\n submit(chip.prompt ?? chip.label);\n }}\n style={[\n styles.chip,\n {\n borderColor: border,\n backgroundColor: card ?? (isDark ? '#1e293b' : '#fff'),\n },\n ]}\n >\n <Text style={[styles.chipText, { color: ink }]}>{chip.label}</Text>\n </Pressable>\n ))}\n </View>\n ) : null}\n </Pressable>\n </ScrollView>\n ) : (\n <View style={styles.fill}>\n {/* Links open through the host's ChatLinkOpenerProvider (mounted at the\n app root): it needs Apollo, the root navigator and the in-app\n browser, which must stay out of the native surface remotes. */}\n <ChatTranscript\n messages={messages}\n streamingContent={streamingContent ?? undefined}\n isDark={isDark}\n listFooter={beforeComposer}\n renderMessageActions={renderMessageExtras}\n />\n {busy && !streamingContent?.trim() ? (\n <View style={styles.thinking}>\n <ThinkingIndicator variant=\"awaiting\" color={muted} isDark={isDark} />\n </View>\n ) : null}\n </View>\n )}\n\n <View\n style={[styles.composerWrap, { borderColor: border, paddingBottom: Math.max(insets.bottom, 10) }]}\n >\n {composerLead}\n {renderConnectorCard?.(isDark)}\n {banner ? (\n <View style={[styles.errorBanner, { backgroundColor: isDark ? '#2b1a1d' : '#fef2f2' }]}>\n <Text style={styles.errorText}>{banner}</Text>\n </View>\n ) : null}\n\n {queuedTurns.length > 0 ? (\n <QueuedFollowUps\n items={queuedTurns}\n onCancel={(id) => steering?.cancelQueued?.(id)}\n onSendNow={() => steering?.sendQueuedNow?.()}\n isDark={isDark}\n />\n ) : null}\n\n {voicePanel ?? (\n <View\n style={[\n styles.composerCard,\n { borderColor: border, backgroundColor: card ?? (isDark ? '#111827' : '#fff') },\n ]}\n >\n {enableAttachments ? (\n <ComposerAttachmentBar\n attachments={attachments.pending}\n onRemove={attachments.remove}\n isDark={isDark}\n />\n ) : null}\n <View style={styles.inputRow}>\n <TextInput\n value={draft}\n onChangeText={(next) => {\n setDraft(next);\n if (voiceError) setVoiceError(null);\n }}\n placeholder={listening ? 'Listening… speak your request' : placeholder}\n placeholderTextColor={muted}\n multiline\n textAlignVertical=\"top\"\n onSubmitEditing={() => submit()}\n style={[styles.input, { color: ink }]}\n accessibilityLabel={placeholder}\n />\n {enableVoice ? (\n <Pressable\n onPress={handleMicPress}\n style={[styles.mic, listening && styles.micLive]}\n accessibilityRole=\"button\"\n accessibilityLabel={listening ? 'Stop listening' : 'Start voice input'}\n >\n <Feather\n name={listening ? 'square' : 'mic'}\n size={16}\n color={listening ? '#b91c1c' : muted}\n />\n </Pressable>\n ) : null}\n {canSend ? (\n <Pressable\n onPress={() => submit()}\n style={[styles.send, busy && { opacity: 0.85 }]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Send\"\n >\n <Feather name=\"send\" size={14} color=\"#fff\" style={styles.sendIcon} />\n </Pressable>\n ) : canStop ? (\n <Pressable\n onPress={() => steering?.stop?.()}\n style={[styles.send, styles.stop]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Stop the reply\"\n >\n <Feather name=\"square\" size={12} color=\"#fff\" />\n </Pressable>\n ) : null}\n </View>\n {enableAttachments || composerAccessory ? (\n <View style={styles.tools}>\n {enableAttachments ? (\n <>\n <Pressable\n onPress={() => openPicker(attachments.pickFromLibrary)}\n onLongPress={() => openPicker(attachments.captureFromCamera)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add image or screenshot\"\n >\n {attachments.busyKind === 'library' ||\n attachments.busyKind === 'camera' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"image\" size={18} color={muted} />\n )}\n </Pressable>\n <Pressable\n onPress={() => openPicker(attachments.pickDocuments)}\n disabled={attachments.busy}\n style={styles.toolBtn}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Attach files\"\n >\n {attachments.busyKind === 'documents' ? (\n <ActivityIndicator size=\"small\" />\n ) : (\n <Feather name=\"paperclip\" size={18} color={muted} />\n )}\n </Pressable>\n </>\n ) : null}\n {composerAccessory ? (\n <View style={styles.toolsAccessory}>{composerAccessory}</View>\n ) : null}\n </View>\n ) : null}\n </View>\n )}\n </View>\n </AppKeyboardAvoidingView>\n {paneOverlay}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: { zIndex: 200, elevation: 200 },\n fill: { flex: 1, overflow: 'hidden' },\n head: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingHorizontal: 16,\n paddingBottom: 10,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n headTitle: { flexDirection: 'row', alignItems: 'center', gap: 8 },\n headActions: { flexDirection: 'row', alignItems: 'center', gap: 12 },\n title: { fontSize: 16, fontWeight: '700' },\n emptyScroll: { flexGrow: 1 },\n empty: { flexGrow: 1, gap: 10, paddingTop: 20, paddingHorizontal: 16 },\n thinking: { paddingHorizontal: 16, paddingBottom: 8 },\n emptyTitle: { fontSize: 18, fontWeight: '700', letterSpacing: -0.3 },\n emptyBody: { fontSize: 14, lineHeight: 20 },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 4 },\n chip: { borderWidth: 1, borderRadius: 999, paddingHorizontal: 12, paddingVertical: 8 },\n chipText: { fontSize: 13, fontWeight: '600' },\n composerWrap: { paddingHorizontal: 12, paddingTop: 8, gap: 8 },\n errorBanner: { borderRadius: 10, padding: 8 },\n errorText: { color: '#991b1b', fontSize: 12 },\n composerCard: {\n borderWidth: StyleSheet.hairlineWidth,\n borderRadius: 18,\n paddingHorizontal: 12,\n paddingTop: 10,\n paddingBottom: 8,\n gap: 4,\n overflow: 'visible',\n },\n inputRow: {\n flexDirection: 'row',\n alignItems: 'flex-end',\n gap: 4,\n minHeight: 44,\n },\n input: { flex: 1, fontSize: 15, maxHeight: 120, minHeight: 40, paddingVertical: 8, paddingHorizontal: 2 },\n tools: { flexDirection: 'row', alignItems: 'center', gap: 2, paddingTop: 2, overflow: 'visible' },\n toolsAccessory: { marginLeft: 'auto', flexShrink: 1 },\n mic: {\n width: 32,\n height: 32,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n micLive: { backgroundColor: 'rgba(185,28,28,0.12)' },\n send: {\n width: 32,\n height: 32,\n borderRadius: 16,\n backgroundColor: '#ea580c',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: 2,\n },\n sendIcon: { transform: [{ rotate: '45deg' }] },\n stop: { backgroundColor: '#0f172a' },\n toolBtn: {\n width: 36,\n height: 36,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n"],"names":["error","_a"],"mappings":"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"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useMemo}from'react';import {View,StyleSheet,Text,Pressable,TextInput,Image}from'react-native';import {formatAskUserAnswers}from'./askUser.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 CATEGORY = {
|
|
21
|
+
send: {
|
|
22
|
+
label: "Sends as you",
|
|
23
|
+
glyph: "\u27A4",
|
|
24
|
+
tone: "blue"
|
|
25
|
+
},
|
|
26
|
+
spend: {
|
|
27
|
+
label: "Spends money",
|
|
28
|
+
glyph: "$",
|
|
29
|
+
tone: "amber"
|
|
30
|
+
},
|
|
31
|
+
book: {
|
|
32
|
+
label: "Books for you",
|
|
33
|
+
glyph: "\u2713",
|
|
34
|
+
tone: "blue"
|
|
35
|
+
},
|
|
36
|
+
contact: {
|
|
37
|
+
label: "Reaches someone",
|
|
38
|
+
glyph: "\u2706",
|
|
39
|
+
tone: "blue"
|
|
40
|
+
},
|
|
41
|
+
share: {
|
|
42
|
+
label: "Shares outside",
|
|
43
|
+
glyph: "\u2197",
|
|
44
|
+
tone: "blue"
|
|
45
|
+
},
|
|
46
|
+
delete: {
|
|
47
|
+
label: "Cannot be undone",
|
|
48
|
+
glyph: "\u2715",
|
|
49
|
+
tone: "red"
|
|
50
|
+
},
|
|
51
|
+
change: {
|
|
52
|
+
label: "Makes a change",
|
|
53
|
+
glyph: "\u270E",
|
|
54
|
+
tone: "neutral"
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const TONE_COLOR = {
|
|
58
|
+
neutral: {
|
|
59
|
+
light: "#6b7280",
|
|
60
|
+
dark: "#94a3b8"
|
|
61
|
+
},
|
|
62
|
+
blue: {
|
|
63
|
+
light: "#2563eb",
|
|
64
|
+
dark: "#60a5fa"
|
|
65
|
+
},
|
|
66
|
+
amber: {
|
|
67
|
+
light: "#b45309",
|
|
68
|
+
dark: "#fbbf24"
|
|
69
|
+
},
|
|
70
|
+
red: {
|
|
71
|
+
light: "#dc2626",
|
|
72
|
+
dark: "#f87171"
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const ACCENT = "#2563eb";
|
|
76
|
+
function optionRole(label) {
|
|
77
|
+
const l = label.trim().toLowerCase();
|
|
78
|
+
if (l === "allow once") return "once";
|
|
79
|
+
if (l === "allow for this chat") return "chat";
|
|
80
|
+
if (l.startsWith("always allow")) return "always";
|
|
81
|
+
if (l === "don't allow" || l === "do not allow" || l === "deny") return "deny";
|
|
82
|
+
return "other";
|
|
83
|
+
}
|
|
84
|
+
function splitTitle(title, summary) {
|
|
85
|
+
var _a;
|
|
86
|
+
const s = (_a = summary == null ? void 0 : summary.trim()) != null ? _a : "";
|
|
87
|
+
if (!s) return {
|
|
88
|
+
heading: title,
|
|
89
|
+
summary: ""
|
|
90
|
+
};
|
|
91
|
+
const capitalised = s.charAt(0).toUpperCase() + s.slice(1);
|
|
92
|
+
for (const tail of [capitalised, s]) {
|
|
93
|
+
if (title.endsWith(tail)) {
|
|
94
|
+
const head = title.slice(0, title.length - tail.length).trim();
|
|
95
|
+
if (head) return {
|
|
96
|
+
heading: head,
|
|
97
|
+
summary: capitalised
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
heading: title,
|
|
103
|
+
summary: title.includes(s) ? "" : capitalised
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function MediaPreview({
|
|
107
|
+
media
|
|
108
|
+
}) {
|
|
109
|
+
const [failed, setFailed] = useState({});
|
|
110
|
+
const shown = media.filter((m) => m.kind === "image" && !failed[m.url]).slice(0, 4);
|
|
111
|
+
if (shown.length === 0) return null;
|
|
112
|
+
const single = shown.length === 1;
|
|
113
|
+
return /* @__PURE__ */ jsx(View, { style: styles.mediaRow, children: shown.map((m) => /* @__PURE__ */ jsx(Image, { source: {
|
|
114
|
+
uri: m.url
|
|
115
|
+
}, accessibilityLabel: "Photo to post", onError: () => setFailed((f) => __spreadProps(__spreadValues({}, f), {
|
|
116
|
+
[m.url]: true
|
|
117
|
+
})), style: single ? styles.mediaSingle : styles.mediaTile }, m.url)) });
|
|
118
|
+
}
|
|
119
|
+
const ApprovalCard = memo(function ApprovalCard2({
|
|
120
|
+
question,
|
|
121
|
+
isDark = false,
|
|
122
|
+
disabled = false,
|
|
123
|
+
onAnswer
|
|
124
|
+
}) {
|
|
125
|
+
var _a;
|
|
126
|
+
const [draft, setDraft] = useState("");
|
|
127
|
+
const {
|
|
128
|
+
approval
|
|
129
|
+
} = question;
|
|
130
|
+
const category = (_a = CATEGORY[approval.category]) != null ? _a : CATEGORY.change;
|
|
131
|
+
const toneColor = TONE_COLOR[category.tone][isDark ? "dark" : "light"];
|
|
132
|
+
const categoryLabel = approval.category === "share" && approval.media && approval.media.length > 0 ? "Posts publicly" : category.label;
|
|
133
|
+
const {
|
|
134
|
+
heading,
|
|
135
|
+
summary
|
|
136
|
+
} = useMemo(() => splitTitle(question.title, approval.summary), [question.title, approval.summary]);
|
|
137
|
+
const groups = useMemo(() => {
|
|
138
|
+
var _a2;
|
|
139
|
+
const out = {
|
|
140
|
+
primary: [],
|
|
141
|
+
always: [],
|
|
142
|
+
deny: []
|
|
143
|
+
};
|
|
144
|
+
for (const o of (_a2 = question.options) != null ? _a2 : []) {
|
|
145
|
+
const role = optionRole(o.label);
|
|
146
|
+
if (role === "always") out.always.push(o);
|
|
147
|
+
else if (role === "deny") out.deny.push(o);
|
|
148
|
+
else out.primary.push(o);
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}, [question.options]);
|
|
152
|
+
const palette = {
|
|
153
|
+
card: isDark ? "#111827" : "#ffffff",
|
|
154
|
+
border: isDark ? "#1f2937" : "#e5e7eb",
|
|
155
|
+
title: isDark ? "#f1f5f9" : "#111827",
|
|
156
|
+
muted: isDark ? "#94a3b8" : "#6b7280",
|
|
157
|
+
field: isDark ? "#0b1220" : "#f9fafb"
|
|
158
|
+
};
|
|
159
|
+
const answer = (value) => {
|
|
160
|
+
const text = value.trim();
|
|
161
|
+
if (!text || disabled) return;
|
|
162
|
+
onAnswer(formatAskUserAnswers([question], {
|
|
163
|
+
[question.id]: text
|
|
164
|
+
}));
|
|
165
|
+
};
|
|
166
|
+
return /* @__PURE__ */ jsxs(View, { accessibilityRole: "summary", accessibilityLabel: `Approval: ${heading}`, style: [styles.card, {
|
|
167
|
+
backgroundColor: palette.card,
|
|
168
|
+
borderColor: palette.border
|
|
169
|
+
}], children: [
|
|
170
|
+
/* @__PURE__ */ jsxs(View, { style: styles.head, children: [
|
|
171
|
+
/* @__PURE__ */ jsx(View, { style: [styles.tile, {
|
|
172
|
+
backgroundColor: `${toneColor}1f`
|
|
173
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.glyph, {
|
|
174
|
+
color: toneColor
|
|
175
|
+
}], children: category.glyph }) }),
|
|
176
|
+
/* @__PURE__ */ jsxs(View, { style: styles.headBody, children: [
|
|
177
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.eyebrow, {
|
|
178
|
+
color: toneColor
|
|
179
|
+
}], children: categoryLabel.toUpperCase() }),
|
|
180
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
181
|
+
color: palette.title
|
|
182
|
+
}], children: heading }),
|
|
183
|
+
summary ? /* @__PURE__ */ jsx(Text, { style: [styles.summary, {
|
|
184
|
+
color: palette.muted
|
|
185
|
+
}], children: summary }) : null,
|
|
186
|
+
approval.media && approval.media.length > 0 ? /* @__PURE__ */ jsx(MediaPreview, { media: approval.media }) : null
|
|
187
|
+
] })
|
|
188
|
+
] }),
|
|
189
|
+
/* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
|
|
190
|
+
groups.primary.map((o) => {
|
|
191
|
+
const primary = optionRole(o.label) === "once";
|
|
192
|
+
return /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: o.detail ? `${o.label}. ${o.detail}` : o.label, disabled, onPress: () => answer(o.label), style: ({
|
|
193
|
+
pressed
|
|
194
|
+
}) => [styles.button, primary ? {
|
|
195
|
+
backgroundColor: ACCENT
|
|
196
|
+
} : {
|
|
197
|
+
backgroundColor: palette.card,
|
|
198
|
+
borderColor: palette.border,
|
|
199
|
+
borderWidth: 1
|
|
200
|
+
}, {
|
|
201
|
+
opacity: disabled ? 0.5 : pressed ? 0.75 : 1
|
|
202
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.buttonText, {
|
|
203
|
+
color: primary ? "#ffffff" : palette.title
|
|
204
|
+
}], children: o.label }) }, o.id);
|
|
205
|
+
}),
|
|
206
|
+
groups.deny.map((o) => /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", disabled, onPress: () => answer(o.label), style: ({
|
|
207
|
+
pressed
|
|
208
|
+
}) => [styles.button, {
|
|
209
|
+
borderColor: palette.border,
|
|
210
|
+
borderWidth: 1,
|
|
211
|
+
opacity: disabled ? 0.5 : pressed ? 0.75 : 1
|
|
212
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.buttonText, {
|
|
213
|
+
color: palette.muted,
|
|
214
|
+
fontWeight: "500"
|
|
215
|
+
}], children: o.label }) }, o.id))
|
|
216
|
+
] }),
|
|
217
|
+
groups.always.length > 0 ? /* @__PURE__ */ jsx(View, { style: styles.always, children: groups.always.map((o) => /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: o.detail ? `${o.label}. ${o.detail}` : o.label, disabled, onPress: () => answer(o.label), style: styles.alwaysBtn, children: /* @__PURE__ */ jsxs(Text, { style: [styles.alwaysText, {
|
|
218
|
+
color: palette.muted
|
|
219
|
+
}], children: [
|
|
220
|
+
"\u21BB ",
|
|
221
|
+
o.label
|
|
222
|
+
] }) }, o.id)) }) : null,
|
|
223
|
+
question.allowText !== false ? /* @__PURE__ */ jsxs(View, { style: [styles.say, {
|
|
224
|
+
borderTopColor: palette.border
|
|
225
|
+
}], children: [
|
|
226
|
+
/* @__PURE__ */ jsx(TextInput, { value: draft, onChangeText: setDraft, editable: !disabled, placeholder: "Or say what to change", placeholderTextColor: palette.muted, accessibilityLabel: "Say what to change instead", returnKeyType: "send", onSubmitEditing: () => answer(draft), style: [styles.input, {
|
|
227
|
+
color: palette.title,
|
|
228
|
+
backgroundColor: palette.field
|
|
229
|
+
}] }),
|
|
230
|
+
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: "Send", disabled: disabled || !draft.trim(), onPress: () => answer(draft), style: [styles.send, {
|
|
231
|
+
backgroundColor: draft.trim() && !disabled ? ACCENT : palette.border
|
|
232
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.sendGlyph, {
|
|
233
|
+
color: draft.trim() && !disabled ? "#ffffff" : palette.muted
|
|
234
|
+
}], children: "\u2191" }) })
|
|
235
|
+
] }) : null
|
|
236
|
+
] });
|
|
237
|
+
});
|
|
238
|
+
const styles = StyleSheet.create({
|
|
239
|
+
card: {
|
|
240
|
+
width: "100%",
|
|
241
|
+
borderWidth: 1,
|
|
242
|
+
borderRadius: 16,
|
|
243
|
+
padding: 14,
|
|
244
|
+
marginTop: 4,
|
|
245
|
+
marginBottom: 8
|
|
246
|
+
},
|
|
247
|
+
head: {
|
|
248
|
+
flexDirection: "row",
|
|
249
|
+
gap: 12
|
|
250
|
+
},
|
|
251
|
+
tile: {
|
|
252
|
+
width: 32,
|
|
253
|
+
height: 32,
|
|
254
|
+
borderRadius: 8,
|
|
255
|
+
alignItems: "center",
|
|
256
|
+
justifyContent: "center",
|
|
257
|
+
marginTop: 2
|
|
258
|
+
},
|
|
259
|
+
glyph: {
|
|
260
|
+
fontSize: 15,
|
|
261
|
+
fontWeight: "700"
|
|
262
|
+
},
|
|
263
|
+
headBody: {
|
|
264
|
+
flex: 1
|
|
265
|
+
},
|
|
266
|
+
eyebrow: {
|
|
267
|
+
fontSize: 10.5,
|
|
268
|
+
fontWeight: "600",
|
|
269
|
+
letterSpacing: 1.2
|
|
270
|
+
},
|
|
271
|
+
title: {
|
|
272
|
+
fontSize: 15.5,
|
|
273
|
+
fontWeight: "700",
|
|
274
|
+
lineHeight: 21,
|
|
275
|
+
marginTop: 2
|
|
276
|
+
},
|
|
277
|
+
summary: {
|
|
278
|
+
fontSize: 13,
|
|
279
|
+
lineHeight: 18,
|
|
280
|
+
marginTop: 4
|
|
281
|
+
},
|
|
282
|
+
mediaRow: {
|
|
283
|
+
flexDirection: "row",
|
|
284
|
+
flexWrap: "wrap",
|
|
285
|
+
gap: 6,
|
|
286
|
+
marginTop: 10
|
|
287
|
+
},
|
|
288
|
+
mediaSingle: {
|
|
289
|
+
width: 240,
|
|
290
|
+
height: 240,
|
|
291
|
+
borderRadius: 12
|
|
292
|
+
},
|
|
293
|
+
mediaTile: {
|
|
294
|
+
width: 64,
|
|
295
|
+
height: 64,
|
|
296
|
+
borderRadius: 10
|
|
297
|
+
},
|
|
298
|
+
actions: {
|
|
299
|
+
marginTop: 14,
|
|
300
|
+
gap: 8
|
|
301
|
+
},
|
|
302
|
+
button: {
|
|
303
|
+
minHeight: 44,
|
|
304
|
+
borderRadius: 12,
|
|
305
|
+
alignItems: "center",
|
|
306
|
+
justifyContent: "center",
|
|
307
|
+
paddingHorizontal: 14
|
|
308
|
+
},
|
|
309
|
+
buttonText: {
|
|
310
|
+
fontSize: 14,
|
|
311
|
+
fontWeight: "700"
|
|
312
|
+
},
|
|
313
|
+
always: {
|
|
314
|
+
marginTop: 6,
|
|
315
|
+
flexDirection: "row",
|
|
316
|
+
flexWrap: "wrap",
|
|
317
|
+
columnGap: 16
|
|
318
|
+
},
|
|
319
|
+
alwaysBtn: {
|
|
320
|
+
minHeight: 44,
|
|
321
|
+
justifyContent: "center"
|
|
322
|
+
},
|
|
323
|
+
alwaysText: {
|
|
324
|
+
fontSize: 12.5,
|
|
325
|
+
fontWeight: "500"
|
|
326
|
+
},
|
|
327
|
+
say: {
|
|
328
|
+
flexDirection: "row",
|
|
329
|
+
alignItems: "center",
|
|
330
|
+
gap: 8,
|
|
331
|
+
marginTop: 4,
|
|
332
|
+
paddingTop: 10,
|
|
333
|
+
borderTopWidth: StyleSheet.hairlineWidth
|
|
334
|
+
},
|
|
335
|
+
input: {
|
|
336
|
+
flex: 1,
|
|
337
|
+
minHeight: 44,
|
|
338
|
+
borderRadius: 12,
|
|
339
|
+
paddingHorizontal: 12,
|
|
340
|
+
fontSize: 14
|
|
341
|
+
},
|
|
342
|
+
send: {
|
|
343
|
+
width: 36,
|
|
344
|
+
height: 36,
|
|
345
|
+
borderRadius: 18,
|
|
346
|
+
alignItems: "center",
|
|
347
|
+
justifyContent: "center"
|
|
348
|
+
},
|
|
349
|
+
sendGlyph: {
|
|
350
|
+
fontSize: 16,
|
|
351
|
+
fontWeight: "700"
|
|
352
|
+
}
|
|
353
|
+
});export{ApprovalCard,splitTitle};//# sourceMappingURL=ApprovalCard.js.map
|