@adminide-stack/yantra-mobile 12.0.28-alpha.74 → 12.0.28-alpha.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,6 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import React,{useRef,useState,useMemo,useEffect,useCallback}from'react';import {useWindowDimensions,useColorScheme,Platform,Keyboard,TouchableWithoutFeedback,View,StyleSheet,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {getDefaultLeftItems,getDefaultRightItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {v4}from'uuid';import {ContributionSchemaId}from'common';import {useGetContextDataQuery,useGetPageSettingsQuery}from'common/graphql';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {requestMicPermission}from'../../features/audio-input/useAudioPermission.js';import {mobileTokens}from'../../theme/mobileTokens.js';var __defProp = Object.defineProperty;
1
+ import {jsx,jsxs}from'react/jsx-runtime';import React,{useRef,useState,useEffect,useCallback,useMemo}from'react';import {useWindowDimensions,useColorScheme,Platform,Keyboard,TouchableWithoutFeedback,View,StyleSheet,Pressable}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {getDefaultLeftItems,getDefaultRightItems,Box,Text,InputToolBar}from'@admin-layout/gluestack-ui-mobile';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {useNavigation,useRoute,CommonActions}from'@react-navigation/native';import {useDispatch,useSelector}from'react-redux';import {v4}from'uuid';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {syncMobileOrgRouteContext}from'../../utils/syncMobileOrgRouteContext.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {AudioRecorderPanel}from'../../features/audio-input/AudioRecorderPanel.js';import {MicErrorBoundary}from'../../features/audio-input/MicErrorBoundary.js';import {requestMicPermission}from'../../features/audio-input/useAudioPermission.js';import {mobileTokens}from'../../theme/mobileTokens.js';var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
2
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
6
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -14,43 +16,10 @@ var __spreadValues = (a, b) => {
14
16
  }
15
17
  return a;
16
18
  };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
17
20
  function buildChannelTitle(mode, channelId) {
18
21
  return mode === "deep-search" ? `deep-search-${channelId}` : `chat-channel-${channelId}`;
19
22
  }
20
- function organizationFromSettingsValue(settings) {
21
- if (settings == null) return null;
22
- if (typeof settings === "string") {
23
- try {
24
- const parsed = JSON.parse(settings);
25
- const o = parsed == null ? void 0 : parsed.organization;
26
- return typeof o === "string" && o.trim() ? o.trim() : null;
27
- } catch (e) {
28
- return null;
29
- }
30
- }
31
- if (typeof settings === "object" && settings !== null && "organization" in settings) {
32
- const o = settings.organization;
33
- return typeof o === "string" && o.trim() ? o.trim() : null;
34
- }
35
- return null;
36
- }
37
- function projectFromSettingsValue(settings) {
38
- if (settings == null) return null;
39
- if (typeof settings === "string") {
40
- try {
41
- const parsed = JSON.parse(settings);
42
- const p = parsed == null ? void 0 : parsed.project;
43
- return typeof p === "string" && p.trim() ? p.trim() : null;
44
- } catch (e) {
45
- return null;
46
- }
47
- }
48
- if (typeof settings === "object" && settings !== null && "project" in settings) {
49
- const p = settings.project;
50
- return typeof p === "string" && p.trim() ? p.trim() : null;
51
- }
52
- return null;
53
- }
54
23
  const EmptyStateSection = React.memo(function EmptyStateSection2({
55
24
  isDark,
56
25
  secondaryTextColor,
@@ -105,7 +74,7 @@ function HomeScreenContent({
105
74
  isLoading: isLoadingProp = false,
106
75
  disabled = false
107
76
  }) {
108
- var _a, _b, _c, _d, _e;
77
+ var _a, _b, _c;
109
78
  const {
110
79
  width: screenWidth
111
80
  } = useWindowDimensions();
@@ -113,7 +82,12 @@ function HomeScreenContent({
113
82
  const isDark = colorScheme === "dark";
114
83
  const navigation = useNavigation();
115
84
  const route = useRoute();
85
+ const dispatch = useDispatch();
116
86
  const hasRehydratedOrgRef = useRef(false);
87
+ const mobileRoutePath = useSelector((state) => {
88
+ var _a2, _b2, _c2;
89
+ return (_c2 = (_b2 = (_a2 = state.router) == null ? void 0 : _a2.location) == null ? void 0 : _b2.currentRoute) == null ? void 0 : _c2.path;
90
+ });
117
91
  const [value, setValue] = useState("");
118
92
  const [activeMode, setActiveMode] = useState(initialMode);
119
93
  const [showAudioRecorder, setShowAudioRecorder] = useState(false);
@@ -123,37 +97,14 @@ function HomeScreenContent({
123
97
  } = useChatMutations();
124
98
  const {
125
99
  orgName: resolvedOrgName,
126
- projectId
100
+ projectId,
101
+ accountUserId,
102
+ loading: prerequisitesLoading,
103
+ orgLoading
127
104
  } = usePrerequisiteIds();
128
- const {
129
- data: contextData
130
- } = useGetContextDataQuery();
131
- const cdecodeUri = (_a = contextData == null ? void 0 : contextData.getContextData) == null ? void 0 : _a.cdecodeUri;
132
- const {
133
- data: pageSettingsData
134
- } = useGetPageSettingsQuery({
135
- variables: {
136
- resourceUri: cdecodeUri,
137
- options: {
138
- schemaId: ContributionSchemaId.Configuration,
139
- configKey: "account.default",
140
- includeMarketplace: true
141
- }
142
- },
143
- skip: !cdecodeUri,
144
- fetchPolicy: "cache-first"
145
- });
146
- const fallbackOrgNameFromSettings = useMemo(() => {
147
- var _a2;
148
- return organizationFromSettingsValue((_a2 = pageSettingsData == null ? void 0 : pageSettingsData.pageSettings) == null ? void 0 : _a2.settings);
149
- }, [pageSettingsData]);
150
- const fallbackProjectIdFromSettings = useMemo(() => {
151
- var _a2;
152
- return projectFromSettingsValue((_a2 = pageSettingsData == null ? void 0 : pageSettingsData.pageSettings) == null ? void 0 : _a2.settings);
153
- }, [pageSettingsData]);
154
- const routeOrgName = ((_c = (_b = route == null ? void 0 : route.params) == null ? void 0 : _b.orgName) != null ? _c : "").trim() || null;
155
- const effectiveOrgName = resolvedOrgName || fallbackOrgNameFromSettings || routeOrgName || null;
156
- const effectiveProjectId = projectId || fallbackProjectIdFromSettings || null;
105
+ const routeOrgName = ((_b = (_a = route == null ? void 0 : route.params) == null ? void 0 : _a.orgName) != null ? _b : "").trim() || null;
106
+ const effectiveOrgName = resolvedOrgName || routeOrgName || null;
107
+ const effectiveProjectId = projectId || null;
157
108
  const trimmedQuery = value.trim();
158
109
  const hasQuery = trimmedQuery.length > 0;
159
110
  const canSubmit = hasQuery && Boolean(routeOrgName || effectiveOrgName);
@@ -249,26 +200,28 @@ function HomeScreenContent({
249
200
  const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));
250
201
  useEffect(() => {
251
202
  var _a2, _b2, _c2;
252
- const currentOrgName = ((_b2 = (_a2 = route == null ? void 0 : route.params) == null ? void 0 : _a2.orgName) == null ? void 0 : _b2.trim()) || "";
253
- if (!effectiveOrgName || currentOrgName === effectiveOrgName) return;
254
- (_c2 = navigation.setParams) == null ? void 0 : _c2.call(navigation, {
255
- orgName: effectiveOrgName
256
- });
257
- }, [navigation, (_d = route == null ? void 0 : route.params) == null ? void 0 : _d.orgName, effectiveOrgName]);
258
- useEffect(() => {
259
- var _a2, _b2, _c2;
260
- const currentOrgName = ((_b2 = (_a2 = route == null ? void 0 : route.params) == null ? void 0 : _a2.orgName) == null ? void 0 : _b2.trim()) || "";
261
- if (hasRehydratedOrgRef.current || currentOrgName || !effectiveOrgName) return;
203
+ const currentRouteOrgName = ((_b2 = (_a2 = route == null ? void 0 : route.params) == null ? void 0 : _a2.orgName) == null ? void 0 : _b2.trim()) || "";
204
+ if (currentRouteOrgName) {
205
+ hasRehydratedOrgRef.current = true;
206
+ return;
207
+ }
208
+ const orgToApply = resolvedOrgName;
209
+ if (!orgToApply || hasRehydratedOrgRef.current || orgLoading) {
210
+ return;
211
+ }
262
212
  hasRehydratedOrgRef.current = true;
263
- (_c2 = navigation.getParent()) == null ? void 0 : _c2.dispatch(CommonActions.navigate("MainStack", {
264
- screen: "MainStack.Layout.Home",
265
- params: {
266
- orgName: effectiveOrgName
267
- },
268
- merge: true,
269
- key: Date.now().toString()
213
+ syncMobileOrgRouteContext(dispatch, orgToApply, {
214
+ userId: accountUserId,
215
+ routePath: mobileRoutePath
216
+ });
217
+ navigation.dispatch(CommonActions.navigate({
218
+ name: (_c2 = route == null ? void 0 : route.name) != null ? _c2 : "MainStack.Layout.Home",
219
+ params: __spreadProps(__spreadValues({}, (route == null ? void 0 : route.params) || {}), {
220
+ orgName: orgToApply
221
+ }),
222
+ merge: true
270
223
  }));
271
- }, [navigation, (_e = route == null ? void 0 : route.params) == null ? void 0 : _e.orgName, effectiveOrgName]);
224
+ }, [dispatch, navigation, route == null ? void 0 : route.name, route == null ? void 0 : route.params, (_c = route == null ? void 0 : route.params) == null ? void 0 : _c.orgName, resolvedOrgName, accountUserId, mobileRoutePath, orgLoading]);
272
225
  const handleValueChange = useCallback((e) => {
273
226
  setValue(e.nativeEvent.text);
274
227
  }, []);
@@ -1 +1 @@
1
- {"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Keyboard,\n Platform,\n Pressable,\n StyleSheet,\n TouchableWithoutFeedback,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useNavigation, useRoute, CommonActions } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ContributionSchemaId } from 'common';\nimport { useGetContextDataQuery, useGetPageSettingsQuery } from 'common/graphql';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { AudioRecorderPanel } from '../../features/audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../../features/audio-input/MicErrorBoundary';\nimport { requestMicPermission } from '../../features/audio-input/useAudioPermission';\nimport type { ModeSubmission, RoutingMode } from './types';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\n/**\n * Build the channel `title` we persist on creation. This is the server-side mode\n * signal (web parity: `useYantraComposerChannelSubmit`): the backend inspects the\n * title prefix to route deep-search requests differently from plain chat. The\n * UI never displays this raw string — `buildSessionFromChannel` filters\n * `chat-channel-…` / `deep-search-…` titles out of the history label cascade\n * and derives the visible label from the user's first message instead.\n *\n * Previously we used the user's prompt directly as the title for friendlier\n * history rows, but that silently disabled the server's mode detection — every\n * \"deep-search\" submission landed as a plain chat. Restored to the web scheme.\n */\nfunction buildChannelTitle(mode: RoutingMode, channelId: string): string {\n return mode === 'deep-search' ? `deep-search-${channelId}` : `chat-channel-${channelId}`;\n}\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\nfunction organizationFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { organization?: string };\n const o = parsed?.organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'organization' in settings) {\n const o = (settings as { organization?: unknown }).organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n }\n return null;\n}\n\nfunction projectFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { project?: string };\n const p = parsed?.project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'project' in settings) {\n const p = (settings as { project?: unknown }).project;\n return typeof p === 'string' && p.trim() ? p.trim() : null;\n }\n return null;\n}\n\ninterface EmptyStateSectionProps {\n isDark: boolean;\n secondaryTextColor: string;\n primaryTextColor: string;\n activeMode: RoutingMode;\n onModeSwitch: (mode: RoutingMode) => void;\n}\n\nconst EmptyStateSection = React.memo(function EmptyStateSection({\n isDark,\n secondaryTextColor,\n primaryTextColor,\n activeMode,\n onModeSwitch,\n}: EmptyStateSectionProps) {\n return (\n <Box flex={1} width=\"100%\">\n <View style={styles.emptyCenterTitleWrap}>\n <Text style={[styles.emptyEyebrow, { color: secondaryTextColor }]}>Choose your mode</Text>\n <View\n style={[\n styles.emptyModePillRow,\n {\n backgroundColor: isDark ? 'rgba(30, 41, 59, 0.9)' : '#eef2ff',\n borderColor: isDark ? 'rgba(148, 163, 184, 0.26)' : 'rgba(67, 56, 202, 0.15)',\n },\n ]}\n >\n <Pressable\n onPress={() => onModeSwitch('chat')}\n style={[\n styles.emptyModePill,\n activeMode === 'chat' && styles.emptyModePillActive,\n activeMode === 'chat' && { backgroundColor: isDark ? '#312e81' : '#4338ca' },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Switch to chat mode\"\n >\n <MaterialCommunityIcons\n name=\"magnify\"\n size={14}\n color={activeMode === 'chat' ? '#ffffff' : secondaryTextColor}\n />\n <Text\n style={[\n styles.emptyModePillLabel,\n { color: activeMode === 'chat' ? '#ffffff' : secondaryTextColor },\n ]}\n >\n Chat\n </Text>\n </Pressable>\n <Pressable\n onPress={() => onModeSwitch('deep-search')}\n style={[\n styles.emptyModePill,\n activeMode === 'deep-search' && styles.emptyModePillActive,\n activeMode === 'deep-search' && { backgroundColor: isDark ? '#312e81' : '#4338ca' },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Switch to deep-search mode\"\n >\n <MaterialCommunityIcons\n name=\"lightning-bolt-outline\"\n size={14}\n color={activeMode === 'deep-search' ? '#ffffff' : secondaryTextColor}\n />\n <Text\n style={[\n styles.emptyModePillLabel,\n { color: activeMode === 'deep-search' ? '#ffffff' : secondaryTextColor },\n ]}\n >\n Deep Search\n </Text>\n </Pressable>\n {/**\n * Build mode — third pill rendered as a peer of Chat and\n * Deep Search so the segmented control matches the web\n * composer's `search · zap · lightbulb` axis. Inert for\n * now: tapping logs to the console and intentionally does\n * NOT call `onModeSwitch`, so the indigo active fill never\n * lands on Build until the underlying workflow flow exists\n * (matches the same inert treatment the lightbulb gets in\n * the composer toolbar). When `'workflow'` joins\n * `RoutingMode`, swap the press handler to\n * `onModeSwitch('workflow')` and add the `activeMode`\n * styles in the same shape as the two above.\n */}\n <Pressable\n onPress={() => {\n // eslint-disable-next-line no-console\n console.log('build mode');\n }}\n style={styles.emptyModePill}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Build mode (preview)\"\n >\n <MaterialCommunityIcons name=\"lightbulb-outline\" size={14} color={secondaryTextColor} />\n <Text style={[styles.emptyModePillLabel, { color: secondaryTextColor }]}>Build</Text>\n </Pressable>\n </View>\n <Text style={[styles.emptyCenterTitle, { color: primaryTextColor }]}>How do you want to start?</Text>\n <Text style={[styles.emptySubtitle, { color: secondaryTextColor }]}>\n Use Chat for quick help, Deep Search for source-backed answers, or Build to assemble workflows.\n </Text>\n </View>\n </Box>\n );\n});\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const hasRehydratedOrgRef = useRef(false);\n\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n /**\n * `showAudioRecorder` swaps the InputToolBar for the inline voice recorder\n * panel — same pattern as the web composer\n * (`YantraSearchComposer.tsx`'s `showAudioRecorder` branch).\n */\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n\n const { createChannel } = useChatMutations();\n const { orgName: resolvedOrgName, projectId } = usePrerequisiteIds();\n const { data: contextData } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n const { data: pageSettingsData } = useGetPageSettingsQuery({\n variables: {\n resourceUri: cdecodeUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n },\n skip: !cdecodeUri,\n fetchPolicy: 'cache-first',\n });\n const fallbackOrgNameFromSettings = useMemo(\n () => organizationFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const fallbackProjectIdFromSettings = useMemo(\n () => projectFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n const routeOrgName = ((route?.params?.orgName as string | undefined) ?? '').trim() || null;\n const effectiveOrgName = resolvedOrgName || fallbackOrgNameFromSettings || routeOrgName || null;\n const effectiveProjectId = projectId || fallbackProjectIdFromSettings || null;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery && Boolean(routeOrgName || effectiveOrgName);\n const isLoading = isLoadingProp;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = !effectiveOrgName\n ? 'Initializing workspace...'\n : isResearchMode\n ? 'Research anything...'\n : 'Ask anything...';\n\n const insets = useSafeAreaInsets();\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n\n useEffect(() => {\n if (Platform.OS === 'ios') {\n const frameSub = Keyboard.addListener('keyboardWillChangeFrame', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const showSub = Keyboard.addListener('keyboardWillShow', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const hideSub = Keyboard.addListener('keyboardWillHide', () => setKeyboardHeight(0));\n return () => {\n frameSub.remove();\n showSub.remove();\n hideSub.remove();\n };\n }\n const showSub = Keyboard.addListener('keyboardDidShow', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const hideSub = Keyboard.addListener('keyboardDidHide', () => setKeyboardHeight(0));\n return () => {\n showSub.remove();\n hideSub.remove();\n };\n }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n /**\n * Mirrors the web `useYantraComposerChannelSubmit`: on submit we generate a client-side\n * channel id, fire-and-forget the createChannel mutation, then navigate immediately to\n * the Chat screen with the user's prompt. The Chat screen mounts, awaits the in-flight\n * creation just before saveMessages, and starts streaming the assistant response.\n */\n const navigateToChat = useCallback(\n (channelId: string, query: string, mode: RoutingMode, attachments?: ModeSubmission['attachments']) => {\n const params: Record<string, unknown> = {\n channelId,\n orgName: effectiveOrgName ?? routeOrgName ?? undefined,\n initialQuery: query,\n initialMode: mode,\n };\n if (attachments && attachments.length > 0) {\n params.initialAttachments = attachments;\n }\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.Chat',\n params,\n }),\n );\n },\n [navigation, effectiveOrgName, routeOrgName],\n );\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n\n if (!effectiveOrgName || !effectiveProjectId) {\n console.warn('[HomeScreen] orgName/projectId not ready — skipping submit.');\n return;\n }\n\n const requestedChannelId = uuidv4();\n /**\n * Title is the server's mode signal (`deep-search-…` vs `chat-channel-…`).\n * It's NOT the history label — the history list derives that from the\n * first user message via `buildSessionFromChannel`.\n */\n const title = buildChannelTitle(activeMode, requestedChannelId);\n\n const queryToForward = trimmedQuery;\n const attachmentsToForward = attachments;\n setValue('');\n\n void createChannel({\n id: requestedChannelId,\n title,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrgName,\n projectId: effectiveProjectId,\n } as any).catch((err) => {\n console.error('[HomeScreen] createChannel failed:', err);\n });\n\n navigateToChat(requestedChannelId, queryToForward, activeMode, attachmentsToForward);\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n onSubmitProp,\n effectiveOrgName,\n effectiveProjectId,\n createChannel,\n navigateToChat,\n ],\n );\n\n const surfaceColor = isDark ? '#0f172a' : mobileTokens.color.surface;\n const primaryTextColor = isDark ? '#e5e7eb' : mobileTokens.color.text;\n const secondaryTextColor = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (!effectiveOrgName || currentOrgName === effectiveOrgName) return;\n navigation.setParams?.({ orgName: effectiveOrgName });\n }, [navigation, route?.params?.orgName, effectiveOrgName]);\n\n useEffect(() => {\n const currentOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (hasRehydratedOrgRef.current || currentOrgName || !effectiveOrgName) return;\n\n hasRehydratedOrgRef.current = true;\n navigation.getParent()?.dispatch(\n CommonActions.navigate('MainStack', {\n screen: 'MainStack.Layout.Home',\n params: { orgName: effectiveOrgName },\n merge: true,\n key: Date.now().toString(),\n }),\n );\n }, [navigation, route?.params?.orgName, effectiveOrgName]);\n\n const handleValueChange = useCallback((e: any) => {\n setValue(e.nativeEvent.text);\n }, []);\n\n /**\n * Mic affordance — web parity (`handleMicClick` in `YantraSearchComposer.tsx`).\n *\n * Only opens the recorder when the input is empty: if the user already has\n * a draft, the same button must act as Send (the `MicSendButton` in\n * `InputToolBar.tsx` already swaps its glyph from mic→send based on\n * `hasContent`, so this branch only fires when the icon is visibly a mic).\n *\n * Requests expo-audio recording permission on tap (docs flow) so native\n * `record()` sees a granted permission before the panel mounts.\n */\n const handleMicPress = useCallback(() => {\n if (hasQuery) return;\n setVoiceError(null);\n Keyboard.dismiss();\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 }, [hasQuery]);\n\n const handleTranscriptionComplete = useCallback((text: string) => {\n const cleaned = (text ?? '').trim();\n setShowAudioRecorder(false);\n if (!cleaned) return;\n /*\n * Append on top of any existing draft (web `setQuery((prev) => …)`).\n * Single-space separator keeps the transcript readable when the user\n * dictates multiple times before sending.\n */\n setValue((prev) => (prev.trim().length > 0 ? `${prev.trim()} ${cleaned}` : cleaned));\n }, []);\n\n const handleRecorderCancel = useCallback(() => {\n setShowAudioRecorder(false);\n }, []);\n\n const handleRecorderError = useCallback((error: string) => {\n /*\n * Surface the failure to the user but don't trap them in the recorder —\n * `AudioRecorderPanel` already calls `onCancel` after an error, so we\n * just record the message here for the (lightweight) banner below.\n */\n setVoiceError(error);\n }, []);\n\n const leftItems = useMemo(\n () =>\n getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: {\n onClick: () => {\n // eslint-disable-next-line no-console\n console.log('build mode');\n },\n },\n }),\n [activeMode, handleModeSwitch],\n );\n\n const rightItems = useMemo(\n () =>\n getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { enabled: false },\n image: { enabled: false },\n attach: { enabled: false },\n }),\n [],\n );\n\n const inputConfig = useMemo(\n () => ({\n value,\n onChange: handleValueChange,\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }),\n [value, handleValueChange, inputPlaceholder, isLoading, disabled],\n );\n\n const micSendButton = useMemo(\n () => ({\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: handleMicPress,\n disabled: isLoading || disabled,\n isLoading,\n }),\n [canSubmit, handleSubmit, handleMicPress, isLoading, disabled],\n );\n\n return (\n <SafeAreaView edges={['left', 'right', 'bottom']} style={{ flex: 1, backgroundColor: surfaceColor }}>\n <TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>\n <Box flex={1} width=\"100%\" position=\"relative\">\n <EmptyStateSection\n isDark={isDark}\n secondaryTextColor={secondaryTextColor}\n primaryTextColor={primaryTextColor}\n activeMode={activeMode}\n onModeSwitch={handleModeSwitch}\n />\n <View\n style={[\n styles.bottomComposerWrap,\n {\n bottom: Math.max(0, keyboardHeight - insets.bottom),\n paddingBottom: Math.max(insets.bottom - 6, 2),\n },\n ]}\n >\n <View style={[styles.bottomComposerInner, { width: contentMaxWidth }]}>\n {voiceError ? (\n <View\n style={[\n styles.voiceErrorBanner,\n {\n backgroundColor: isDark ? '#2b1a1d' : '#fef2f2',\n borderColor: isDark ? '#7f1d1d' : '#fecaca',\n },\n ]}\n >\n <Text style={[styles.voiceErrorText, { color: isDark ? '#fecaca' : '#991b1b' }]}>\n {voiceError}\n </Text>\n </View>\n ) : null}\n {showAudioRecorder ? (\n /*\n * Render-time JS errors thrown by `useAudioRecorder`\n * (e.g. expo-audio native module missing, recorder\n * constructor throws in a release build) are caught\n * by the boundary and converted into a soft cancel\n * via the same handlers the panel itself uses on\n * runtime errors. Without this, a throw during the\n * panel's render phase kills the JS thread in\n * release / TestFlight.\n */\n <MicErrorBoundary onCancel={handleRecorderCancel} onError={handleRecorderError}>\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={handleTranscriptionComplete}\n onCancel={handleRecorderCancel}\n onError={handleRecorderError}\n />\n </MicErrorBoundary>\n ) : (\n <InputToolBar\n inputConfig={inputConfig}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={micSendButton}\n />\n )}\n </View>\n </View>\n </Box>\n </TouchableWithoutFeedback>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n emptyCenterTitleWrap: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'flex-start',\n paddingHorizontal: 24,\n paddingTop: 88,\n paddingBottom: 52,\n maxWidth: 520,\n alignSelf: 'center',\n },\n emptyEyebrow: {\n fontSize: 12,\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n marginBottom: 10,\n },\n emptyCenterTitle: {\n marginTop: 2,\n fontSize: 30,\n fontWeight: '700',\n textAlign: 'center',\n letterSpacing: -0.5,\n },\n emptySubtitle: {\n marginTop: 12,\n fontSize: 14,\n lineHeight: 22,\n textAlign: 'center',\n paddingHorizontal: 16,\n maxWidth: 360,\n },\n bottomComposerWrap: {\n position: 'absolute',\n width: '100%',\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'flex-end',\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: -2 },\n backgroundColor: 'transparent',\n elevation: 6,\n },\n bottomComposerInner: {\n paddingHorizontal: 14,\n paddingTop: 10,\n paddingBottom: 4,\n },\n voiceErrorBanner: {\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 10,\n borderWidth: 1,\n },\n voiceErrorText: {\n fontSize: 12,\n fontWeight: '500',\n },\n emptyModePillRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginBottom: 22,\n borderRadius: 16,\n padding: 6,\n borderWidth: 1,\n shadowColor: '#312e81',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 3 },\n elevation: 3,\n },\n emptyModePill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 11,\n },\n emptyModePillActive: {\n shadowColor: '#312e81',\n shadowOpacity: 0.18,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n emptyModePillLabel: {\n fontSize: 12,\n fontWeight: '600',\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["EmptyStateSection","_a","_b","showSub","hideSub","uuidv4","_c"],"mappings":"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"}
1
+ {"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Keyboard,\n Platform,\n Pressable,\n StyleSheet,\n TouchableWithoutFeedback,\n View,\n useColorScheme,\n useWindowDimensions,\n} from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useNavigation, useRoute, CommonActions } from '@react-navigation/native';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { v4 as uuidv4 } from 'uuid';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { syncMobileOrgRouteContext } from '../../utils/syncMobileOrgRouteContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { AudioRecorderPanel } from '../../features/audio-input/AudioRecorderPanel';\nimport { MicErrorBoundary } from '../../features/audio-input/MicErrorBoundary';\nimport { requestMicPermission } from '../../features/audio-input/useAudioPermission';\nimport type { ModeSubmission, RoutingMode } from './types';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\n/**\n * Build the channel `title` we persist on creation. This is the server-side mode\n * signal (web parity: `useYantraComposerChannelSubmit`): the backend inspects the\n * title prefix to route deep-search requests differently from plain chat. The\n * UI never displays this raw string — `buildSessionFromChannel` filters\n * `chat-channel-…` / `deep-search-…` titles out of the history label cascade\n * and derives the visible label from the user's first message instead.\n *\n * Previously we used the user's prompt directly as the title for friendlier\n * history rows, but that silently disabled the server's mode detection — every\n * \"deep-search\" submission landed as a plain chat. Restored to the web scheme.\n */\nfunction buildChannelTitle(mode: RoutingMode, channelId: string): string {\n return mode === 'deep-search' ? `deep-search-${channelId}` : `chat-channel-${channelId}`;\n}\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\ninterface EmptyStateSectionProps {\n isDark: boolean;\n secondaryTextColor: string;\n primaryTextColor: string;\n activeMode: RoutingMode;\n onModeSwitch: (mode: RoutingMode) => void;\n}\n\nconst EmptyStateSection = React.memo(function EmptyStateSection({\n isDark,\n secondaryTextColor,\n primaryTextColor,\n activeMode,\n onModeSwitch,\n}: EmptyStateSectionProps) {\n return (\n <Box flex={1} width=\"100%\">\n <View style={styles.emptyCenterTitleWrap}>\n <Text style={[styles.emptyEyebrow, { color: secondaryTextColor }]}>Choose your mode</Text>\n <View\n style={[\n styles.emptyModePillRow,\n {\n backgroundColor: isDark ? 'rgba(30, 41, 59, 0.9)' : '#eef2ff',\n borderColor: isDark ? 'rgba(148, 163, 184, 0.26)' : 'rgba(67, 56, 202, 0.15)',\n },\n ]}\n >\n <Pressable\n onPress={() => onModeSwitch('chat')}\n style={[\n styles.emptyModePill,\n activeMode === 'chat' && styles.emptyModePillActive,\n activeMode === 'chat' && { backgroundColor: isDark ? '#312e81' : '#4338ca' },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Switch to chat mode\"\n >\n <MaterialCommunityIcons\n name=\"magnify\"\n size={14}\n color={activeMode === 'chat' ? '#ffffff' : secondaryTextColor}\n />\n <Text\n style={[\n styles.emptyModePillLabel,\n { color: activeMode === 'chat' ? '#ffffff' : secondaryTextColor },\n ]}\n >\n Chat\n </Text>\n </Pressable>\n <Pressable\n onPress={() => onModeSwitch('deep-search')}\n style={[\n styles.emptyModePill,\n activeMode === 'deep-search' && styles.emptyModePillActive,\n activeMode === 'deep-search' && { backgroundColor: isDark ? '#312e81' : '#4338ca' },\n ]}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Switch to deep-search mode\"\n >\n <MaterialCommunityIcons\n name=\"lightning-bolt-outline\"\n size={14}\n color={activeMode === 'deep-search' ? '#ffffff' : secondaryTextColor}\n />\n <Text\n style={[\n styles.emptyModePillLabel,\n { color: activeMode === 'deep-search' ? '#ffffff' : secondaryTextColor },\n ]}\n >\n Deep Search\n </Text>\n </Pressable>\n {/**\n * Build mode — third pill rendered as a peer of Chat and\n * Deep Search so the segmented control matches the web\n * composer's `search · zap · lightbulb` axis. Inert for\n * now: tapping logs to the console and intentionally does\n * NOT call `onModeSwitch`, so the indigo active fill never\n * lands on Build until the underlying workflow flow exists\n * (matches the same inert treatment the lightbulb gets in\n * the composer toolbar). When `'workflow'` joins\n * `RoutingMode`, swap the press handler to\n * `onModeSwitch('workflow')` and add the `activeMode`\n * styles in the same shape as the two above.\n */}\n <Pressable\n onPress={() => {\n // eslint-disable-next-line no-console\n console.log('build mode');\n }}\n style={styles.emptyModePill}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Build mode (preview)\"\n >\n <MaterialCommunityIcons name=\"lightbulb-outline\" size={14} color={secondaryTextColor} />\n <Text style={[styles.emptyModePillLabel, { color: secondaryTextColor }]}>Build</Text>\n </Pressable>\n </View>\n <Text style={[styles.emptyCenterTitle, { color: primaryTextColor }]}>How do you want to start?</Text>\n <Text style={[styles.emptySubtitle, { color: secondaryTextColor }]}>\n Use Chat for quick help, Deep Search for source-backed answers, or Build to assemble workflows.\n </Text>\n </View>\n </Box>\n );\n});\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const { width: screenWidth } = useWindowDimensions();\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const dispatch = useDispatch();\n const hasRehydratedOrgRef = useRef(false);\n const mobileRoutePath = useSelector(\n (state: { router?: { location?: { currentRoute?: { path?: string } } } }) =>\n state.router?.location?.currentRoute?.path,\n );\n\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n /**\n * `showAudioRecorder` swaps the InputToolBar for the inline voice recorder\n * panel — same pattern as the web composer\n * (`YantraSearchComposer.tsx`'s `showAudioRecorder` branch).\n */\n const [showAudioRecorder, setShowAudioRecorder] = useState(false);\n const [voiceError, setVoiceError] = useState<string | null>(null);\n\n const { createChannel } = useChatMutations();\n const {\n orgName: resolvedOrgName,\n projectId,\n accountUserId,\n loading: prerequisitesLoading,\n orgLoading,\n } = usePrerequisiteIds();\n const routeOrgName = ((route?.params?.orgName as string | undefined) ?? '').trim() || null;\n const effectiveOrgName = resolvedOrgName || routeOrgName || null;\n const effectiveProjectId = projectId || null;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery && Boolean(routeOrgName || effectiveOrgName);\n const isLoading = isLoadingProp;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = !effectiveOrgName\n ? 'Initializing workspace...'\n : isResearchMode\n ? 'Research anything...'\n : 'Ask anything...';\n\n const insets = useSafeAreaInsets();\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n\n useEffect(() => {\n if (Platform.OS === 'ios') {\n const frameSub = Keyboard.addListener('keyboardWillChangeFrame', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const showSub = Keyboard.addListener('keyboardWillShow', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const hideSub = Keyboard.addListener('keyboardWillHide', () => setKeyboardHeight(0));\n return () => {\n frameSub.remove();\n showSub.remove();\n hideSub.remove();\n };\n }\n const showSub = Keyboard.addListener('keyboardDidShow', (event) =>\n setKeyboardHeight(event.endCoordinates?.height ?? 0),\n );\n const hideSub = Keyboard.addListener('keyboardDidHide', () => setKeyboardHeight(0));\n return () => {\n showSub.remove();\n hideSub.remove();\n };\n }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n /**\n * Mirrors the web `useYantraComposerChannelSubmit`: on submit we generate a client-side\n * channel id, fire-and-forget the createChannel mutation, then navigate immediately to\n * the Chat screen with the user's prompt. The Chat screen mounts, awaits the in-flight\n * creation just before saveMessages, and starts streaming the assistant response.\n */\n const navigateToChat = useCallback(\n (channelId: string, query: string, mode: RoutingMode, attachments?: ModeSubmission['attachments']) => {\n const params: Record<string, unknown> = {\n channelId,\n orgName: effectiveOrgName ?? routeOrgName ?? undefined,\n initialQuery: query,\n initialMode: mode,\n };\n if (attachments && attachments.length > 0) {\n params.initialAttachments = attachments;\n }\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.Chat',\n params,\n }),\n );\n },\n [navigation, effectiveOrgName, routeOrgName],\n );\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n if (onSubmitProp) {\n onSubmitProp(submission);\n }\n\n if (!effectiveOrgName || !effectiveProjectId) {\n console.warn('[HomeScreen] orgName/projectId not ready — skipping submit.');\n return;\n }\n\n const requestedChannelId = uuidv4();\n /**\n * Title is the server's mode signal (`deep-search-…` vs `chat-channel-…`).\n * It's NOT the history label — the history list derives that from the\n * first user message via `buildSessionFromChannel`.\n */\n const title = buildChannelTitle(activeMode, requestedChannelId);\n\n const queryToForward = trimmedQuery;\n const attachmentsToForward = attachments;\n setValue('');\n\n void createChannel({\n id: requestedChannelId,\n title,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrgName,\n projectId: effectiveProjectId,\n } as any).catch((err) => {\n console.error('[HomeScreen] createChannel failed:', err);\n });\n\n navigateToChat(requestedChannelId, queryToForward, activeMode, attachmentsToForward);\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n onSubmitProp,\n effectiveOrgName,\n effectiveProjectId,\n createChannel,\n navigateToChat,\n ],\n );\n\n const surfaceColor = isDark ? '#0f172a' : mobileTokens.color.surface;\n const primaryTextColor = isDark ? '#e5e7eb' : mobileTokens.color.text;\n const secondaryTextColor = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const contentMaxWidth = Math.min(720, Math.max(360, screenWidth - 24));\n\n /**\n * After verify-user, Home mounts with empty `route.params.orgName`. Settings load via\n * `usePrerequisiteIds` (single useSettings). Merge-navigate does not re-fire LOCATION_CHANGE\n * on the same path; sync params + LOCATION_CHANGE + orgChangeAction like refresh does.\n */\n useEffect(() => {\n const currentRouteOrgName = (route?.params?.orgName as string | undefined)?.trim() || '';\n if (currentRouteOrgName) {\n hasRehydratedOrgRef.current = true;\n return;\n }\n const orgToApply = resolvedOrgName;\n if (!orgToApply || hasRehydratedOrgRef.current || orgLoading) {\n return;\n }\n\n hasRehydratedOrgRef.current = true;\n syncMobileOrgRouteContext(dispatch, orgToApply, {\n userId: accountUserId,\n routePath: mobileRoutePath,\n });\n navigation.dispatch(\n CommonActions.navigate({\n name: route?.name ?? 'MainStack.Layout.Home',\n params: { ...(route?.params || {}), orgName: orgToApply },\n merge: true,\n }),\n );\n }, [\n dispatch,\n navigation,\n route?.name,\n route?.params,\n route?.params?.orgName,\n resolvedOrgName,\n accountUserId,\n mobileRoutePath,\n orgLoading,\n ]);\n\n const handleValueChange = useCallback((e: any) => {\n setValue(e.nativeEvent.text);\n }, []);\n\n /**\n * Mic affordance — web parity (`handleMicClick` in `YantraSearchComposer.tsx`).\n *\n * Only opens the recorder when the input is empty: if the user already has\n * a draft, the same button must act as Send (the `MicSendButton` in\n * `InputToolBar.tsx` already swaps its glyph from mic→send based on\n * `hasContent`, so this branch only fires when the icon is visibly a mic).\n *\n * Requests expo-audio recording permission on tap (docs flow) so native\n * `record()` sees a granted permission before the panel mounts.\n */\n const handleMicPress = useCallback(() => {\n if (hasQuery) return;\n setVoiceError(null);\n Keyboard.dismiss();\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 }, [hasQuery]);\n\n const handleTranscriptionComplete = useCallback((text: string) => {\n const cleaned = (text ?? '').trim();\n setShowAudioRecorder(false);\n if (!cleaned) return;\n /*\n * Append on top of any existing draft (web `setQuery((prev) => …)`).\n * Single-space separator keeps the transcript readable when the user\n * dictates multiple times before sending.\n */\n setValue((prev) => (prev.trim().length > 0 ? `${prev.trim()} ${cleaned}` : cleaned));\n }, []);\n\n const handleRecorderCancel = useCallback(() => {\n setShowAudioRecorder(false);\n }, []);\n\n const handleRecorderError = useCallback((error: string) => {\n /*\n * Surface the failure to the user but don't trap them in the recorder —\n * `AudioRecorderPanel` already calls `onCancel` after an error, so we\n * just record the message here for the (lightweight) banner below.\n */\n setVoiceError(error);\n }, []);\n\n const leftItems = useMemo(\n () =>\n getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: {\n onClick: () => {\n // eslint-disable-next-line no-console\n console.log('build mode');\n },\n },\n }),\n [activeMode, handleModeSwitch],\n );\n\n const rightItems = useMemo(\n () =>\n getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { enabled: false },\n image: { enabled: false },\n attach: { enabled: false },\n }),\n [],\n );\n\n const inputConfig = useMemo(\n () => ({\n value,\n onChange: handleValueChange,\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }),\n [value, handleValueChange, inputPlaceholder, isLoading, disabled],\n );\n\n const micSendButton = useMemo(\n () => ({\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: handleMicPress,\n disabled: isLoading || disabled,\n isLoading,\n }),\n [canSubmit, handleSubmit, handleMicPress, isLoading, disabled],\n );\n\n return (\n <SafeAreaView edges={['left', 'right', 'bottom']} style={{ flex: 1, backgroundColor: surfaceColor }}>\n <TouchableWithoutFeedback onPress={Keyboard.dismiss} accessible={false}>\n <Box flex={1} width=\"100%\" position=\"relative\">\n <EmptyStateSection\n isDark={isDark}\n secondaryTextColor={secondaryTextColor}\n primaryTextColor={primaryTextColor}\n activeMode={activeMode}\n onModeSwitch={handleModeSwitch}\n />\n <View\n style={[\n styles.bottomComposerWrap,\n {\n bottom: Math.max(0, keyboardHeight - insets.bottom),\n paddingBottom: Math.max(insets.bottom - 6, 2),\n },\n ]}\n >\n <View style={[styles.bottomComposerInner, { width: contentMaxWidth }]}>\n {voiceError ? (\n <View\n style={[\n styles.voiceErrorBanner,\n {\n backgroundColor: isDark ? '#2b1a1d' : '#fef2f2',\n borderColor: isDark ? '#7f1d1d' : '#fecaca',\n },\n ]}\n >\n <Text style={[styles.voiceErrorText, { color: isDark ? '#fecaca' : '#991b1b' }]}>\n {voiceError}\n </Text>\n </View>\n ) : null}\n {showAudioRecorder ? (\n /*\n * Render-time JS errors thrown by `useAudioRecorder`\n * (e.g. expo-audio native module missing, recorder\n * constructor throws in a release build) are caught\n * by the boundary and converted into a soft cancel\n * via the same handlers the panel itself uses on\n * runtime errors. Without this, a throw during the\n * panel's render phase kills the JS thread in\n * release / TestFlight.\n */\n <MicErrorBoundary onCancel={handleRecorderCancel} onError={handleRecorderError}>\n <AudioRecorderPanel\n isDark={isDark}\n onTranscriptionComplete={handleTranscriptionComplete}\n onCancel={handleRecorderCancel}\n onError={handleRecorderError}\n />\n </MicErrorBoundary>\n ) : (\n <InputToolBar\n inputConfig={inputConfig}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={micSendButton}\n />\n )}\n </View>\n </View>\n </Box>\n </TouchableWithoutFeedback>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n emptyCenterTitleWrap: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'flex-start',\n paddingHorizontal: 24,\n paddingTop: 88,\n paddingBottom: 52,\n maxWidth: 520,\n alignSelf: 'center',\n },\n emptyEyebrow: {\n fontSize: 12,\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n marginBottom: 10,\n },\n emptyCenterTitle: {\n marginTop: 2,\n fontSize: 30,\n fontWeight: '700',\n textAlign: 'center',\n letterSpacing: -0.5,\n },\n emptySubtitle: {\n marginTop: 12,\n fontSize: 14,\n lineHeight: 22,\n textAlign: 'center',\n paddingHorizontal: 16,\n maxWidth: 360,\n },\n bottomComposerWrap: {\n position: 'absolute',\n width: '100%',\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'flex-end',\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: -2 },\n backgroundColor: 'transparent',\n elevation: 6,\n },\n bottomComposerInner: {\n paddingHorizontal: 14,\n paddingTop: 10,\n paddingBottom: 4,\n },\n voiceErrorBanner: {\n marginBottom: 8,\n paddingHorizontal: 12,\n paddingVertical: 8,\n borderRadius: 10,\n borderWidth: 1,\n },\n voiceErrorText: {\n fontSize: 12,\n fontWeight: '500',\n },\n emptyModePillRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginBottom: 22,\n borderRadius: 16,\n padding: 6,\n borderWidth: 1,\n shadowColor: '#312e81',\n shadowOpacity: 0.08,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 3 },\n elevation: 3,\n },\n emptyModePill: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n paddingHorizontal: 12,\n paddingVertical: 7,\n borderRadius: 11,\n },\n emptyModePillActive: {\n shadowColor: '#312e81',\n shadowOpacity: 0.18,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n emptyModePillLabel: {\n fontSize: 12,\n fontWeight: '600',\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["EmptyStateSection","_a","_b","_c","showSub","hideSub","uuidv4"],"mappings":"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"}
@@ -1,51 +1,15 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {useMemo,useRef,useEffect}from'react';import {View}from'react-native';import {useNavigation,useRoute}from'@react-navigation/native';import {navigationRef}from'@common-stack/client-react';import {ContributionSchemaId}from'common';import {useGetContextDataQuery,useGetPageSettingsQuery}from'common/graphql';import {Text}from'@admin-layout/gluestack-ui-mobile';import {YantraBrandLoader}from'../../components/YantraBrandLoader.js';import {mobileTokens}from'../../theme/mobileTokens.js';function organizationFromSettingsValue(settings) {
2
- if (settings == null) return null;
3
- if (typeof settings === "string") {
4
- try {
5
- const parsed = JSON.parse(settings);
6
- const o = parsed == null ? void 0 : parsed.organization;
7
- return typeof o === "string" && o.trim() ? o.trim() : null;
8
- } catch (e) {
9
- return null;
10
- }
11
- }
12
- if (typeof settings === "object" && settings !== null && "organization" in settings) {
13
- const o = settings.organization;
14
- return typeof o === "string" && o.trim() ? o.trim() : null;
15
- }
16
- return null;
17
- }
18
- function NewChat() {
19
- var _a, _b, _c;
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useRef,useEffect}from'react';import {View}from'react-native';import {useNavigation,useRoute}from'@react-navigation/native';import {navigationRef}from'@common-stack/client-react';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {Text}from'@admin-layout/gluestack-ui-mobile';import {YantraBrandLoader}from'../../components/YantraBrandLoader.js';import {mobileTokens}from'../../theme/mobileTokens.js';function NewChat() {
2
+ var _a, _b;
20
3
  const navigation = useNavigation();
21
4
  const route = useRoute();
22
5
  const {
23
- data: contextData
24
- } = useGetContextDataQuery();
25
- const cdecodeUri = (_a = contextData == null ? void 0 : contextData.getContextData) == null ? void 0 : _a.cdecodeUri;
26
- const {
27
- data: pageSettingsData,
28
- loading: pageSettingsLoading
29
- } = useGetPageSettingsQuery({
30
- variables: {
31
- resourceUri: cdecodeUri,
32
- options: {
33
- schemaId: ContributionSchemaId.Configuration,
34
- configKey: "account.default",
35
- includeMarketplace: true
36
- }
37
- },
38
- skip: !cdecodeUri,
39
- fetchPolicy: "cache-first"
40
- });
41
- const settingsOrgName = useMemo(() => {
42
- var _a2;
43
- return organizationFromSettingsValue((_a2 = pageSettingsData == null ? void 0 : pageSettingsData.pageSettings) == null ? void 0 : _a2.settings);
44
- }, [pageSettingsData]);
45
- const routeOrgName = ((_c = (_b = route == null ? void 0 : route.params) == null ? void 0 : _b.orgName) == null ? void 0 : _c.trim()) || null;
46
- const resolvedOrgName = settingsOrgName || routeOrgName || null;
6
+ orgName: prerequisiteOrgName,
7
+ orgLoading
8
+ } = usePrerequisiteIds();
9
+ const routeOrgName = ((_b = (_a = route == null ? void 0 : route.params) == null ? void 0 : _a.orgName) == null ? void 0 : _b.trim()) || null;
10
+ const resolvedOrgName = prerequisiteOrgName || routeOrgName || null;
47
11
  const hasNavigatedRef = useRef(false);
48
- const waitingForOrg = !routeOrgName && (!cdecodeUri || pageSettingsLoading || !settingsOrgName);
12
+ const waitingForOrg = !routeOrgName && (orgLoading || !resolvedOrgName);
49
13
  useEffect(() => {
50
14
  if (hasNavigatedRef.current || waitingForOrg) return;
51
15
  const go = (org) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/screens/NewChat/index.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from 'react';\nimport { View } from 'react-native';\nimport { useNavigation, useRoute } from '@react-navigation/native';\nimport { navigationRef } from '@common-stack/client-react';\nimport { ContributionSchemaId } from 'common';\nimport { useGetContextDataQuery, useGetPageSettingsQuery } from 'common/graphql';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { YantraBrandLoader } from '../../components/YantraBrandLoader';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\n/** `pageSettings.settings` may be object or JSON string. */\nfunction organizationFromSettingsValue(settings: unknown): string | null {\n if (settings == null) return null;\n if (typeof settings === 'string') {\n try {\n const parsed = JSON.parse(settings) as { organization?: string };\n const o = parsed?.organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n } catch {\n return null;\n }\n }\n if (typeof settings === 'object' && settings !== null && 'organization' in settings) {\n const o = (settings as { organization?: unknown }).organization;\n return typeof o === 'string' && o.trim() ? o.trim() : null;\n }\n return null;\n}\n\nexport default function NewChat() {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const { data: contextData } = useGetContextDataQuery();\n const cdecodeUri = contextData?.getContextData?.cdecodeUri;\n\n const { data: pageSettingsData, loading: pageSettingsLoading } = useGetPageSettingsQuery({\n variables: {\n resourceUri: cdecodeUri as never,\n options: {\n schemaId: ContributionSchemaId.Configuration,\n configKey: 'account.default',\n includeMarketplace: true,\n },\n },\n skip: !cdecodeUri,\n fetchPolicy: 'cache-first',\n });\n\n const settingsOrgName = useMemo(\n () => organizationFromSettingsValue(pageSettingsData?.pageSettings?.settings),\n [pageSettingsData],\n );\n\n const routeOrgName = (route?.params?.orgName as string | undefined)?.trim() || null;\n const resolvedOrgName = settingsOrgName || routeOrgName || null;\n const hasNavigatedRef = useRef(false);\n const waitingForOrg = !routeOrgName && (!cdecodeUri || pageSettingsLoading || !settingsOrgName);\n\n useEffect(() => {\n if (hasNavigatedRef.current || waitingForOrg) return;\n\n const go = (org?: string | null) => {\n if (hasNavigatedRef.current) return;\n const params = org ? { orgName: org } : undefined;\n if (navigationRef.isReady()) {\n navigationRef.navigate(\n 'MainStack' as never,\n {\n screen: 'MainStack.Layout.Home',\n params,\n } as never,\n );\n hasNavigatedRef.current = true;\n return;\n }\n navigation.navigate('MainStack.Layout.Home', params);\n hasNavigatedRef.current = true;\n };\n\n // Navigate only when orgName is available so backend context URI is correct.\n go(resolvedOrgName);\n }, [resolvedOrgName, waitingForOrg, navigation]);\n\n return (\n <View\n style={{\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.bg,\n gap: 10,\n }}\n >\n <YantraBrandLoader />\n <Text color={mobileTokens.color.textMuted} fontSize=\"$sm\">\n Preparing your workspace...\n </Text>\n </View>\n );\n}\n"],"names":["_a"],"mappings":"mhBAWA,SAAS,8BAA8B,QAAkC,EAAA;AACvE,EAAI,IAAA,QAAA,IAAY,MAAa,OAAA,IAAA;AAC7B,EAAI,IAAA,OAAO,aAAa,QAAU,EAAA;AAChC,IAAI,IAAA;AACF,MAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,QAAQ,CAAA;AAGlC,MAAA,MAAM,IAAI,MAAQ,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,YAAA;AAClB,MAAO,OAAA,OAAO,MAAM,QAAY,IAAA,CAAA,CAAE,MAAS,GAAA,CAAA,CAAE,MAAS,GAAA,IAAA;AAAA,KAChD,CAAA,OAAA,CAAA,EAAA;AACN,MAAO,OAAA,IAAA;AAAA;AACT;AAEF,EAAA,IAAI,OAAO,QAAa,KAAA,QAAA,IAAY,QAAa,KAAA,IAAA,IAAQ,kBAAkB,QAAU,EAAA;AACnF,IAAA,MAAM,IAAK,QAER,CAAA,YAAA;AACH,IAAO,OAAA,OAAO,MAAM,QAAY,IAAA,CAAA,CAAE,MAAS,GAAA,CAAA,CAAE,MAAS,GAAA,IAAA;AAAA;AAExD,EAAO,OAAA,IAAA;AACT;AACA,SAAwB,OAAU,GAAA;AAhClC,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiCE,EAAA,MAAM,aAAa,aAAmB,EAAA;AACtC,EAAA,MAAM,QAAQ,QAAc,EAAA;AAC5B,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA;AAAA,MACJ,sBAAuB,EAAA;AAC3B,EAAM,MAAA,UAAA,GAAA,CAAa,EAAa,GAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAA,cAAA,KAAb,IAA6B,GAAA,MAAA,GAAA,EAAA,CAAA,UAAA;AAChD,EAAM,MAAA;AAAA,IACJ,IAAM,EAAA,gBAAA;AAAA,IACN,OAAS,EAAA;AAAA,MACP,uBAAwB,CAAA;AAAA,IAC1B,SAAW,EAAA;AAAA,MACT,WAAa,EAAA,UAAA;AAAA,MACb,OAAS,EAAA;AAAA,QACP,UAAU,oBAAqB,CAAA,aAAA;AAAA,QAC/B,SAAW,EAAA,iBAAA;AAAA,QACX,kBAAoB,EAAA;AAAA;AACtB,KACF;AAAA,IACA,MAAM,CAAC,UAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACd,CAAA;AACD,EAAM,MAAA,eAAA,GAAkB,QAAQ,MAAG;AAtDrC,IAAAA,IAAAA,GAAAA;AAsDwC,IAAA,OAAA,6BAAA,CAAA,CAA8BA,GAAA,GAAA,gBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,gBAAA,CAAkB,YAAlB,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAgC,QAAQ,CAAA;AAAA,GAAG,EAAA,CAAC,gBAAgB,CAAC,CAAA;AACjI,EAAA,MAAM,iBAAgB,EAAO,GAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,MAAA,KAAP,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,KAAf,mBAA+C,IAAU,EAAA,KAAA,IAAA;AAC/E,EAAM,MAAA,eAAA,GAAkB,mBAAmB,YAAgB,IAAA,IAAA;AAC3D,EAAM,MAAA,eAAA,GAAkB,OAAO,KAAK,CAAA;AACpC,EAAA,MAAM,gBAAgB,CAAC,YAAA,KAAiB,CAAC,UAAA,IAAc,uBAAuB,CAAC,eAAA,CAAA;AAC/E,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,eAAA,CAAgB,WAAW,aAAe,EAAA;AAC9C,IAAM,MAAA,EAAA,GAAK,CAAC,GAAwB,KAAA;AAClC,MAAA,IAAI,gBAAgB,OAAS,EAAA;AAC7B,MAAA,MAAM,SAAS,GAAM,GAAA;AAAA,QACnB,OAAS,EAAA;AAAA,OACP,GAAA,MAAA;AACJ,MAAI,IAAA,aAAA,CAAc,SAAW,EAAA;AAC3B,QAAA,aAAA,CAAc,SAAS,WAAsB,EAAA;AAAA,UAC3C,MAAQ,EAAA,uBAAA;AAAA,UACR;AAAA,SACQ,CAAA;AACV,QAAA,eAAA,CAAgB,OAAU,GAAA,IAAA;AAC1B,QAAA;AAAA;AAEF,MAAW,UAAA,CAAA,QAAA,CAAS,yBAAyB,MAAM,CAAA;AACnD,MAAA,eAAA,CAAgB,OAAU,GAAA,IAAA;AAAA,KAC5B;AAGA,IAAA,EAAA,CAAG,eAAe,CAAA;AAAA,GACjB,EAAA,CAAC,eAAiB,EAAA,aAAA,EAAe,UAAU,CAAC,CAAA;AAC/C,EAAO,uBAAA,IAAA,CAAC,QAAK,KAAO,EAAA;AAAA,IAClB,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAA,EAAiB,aAAa,KAAM,CAAA,EAAA;AAAA,IACpC,GAAK,EAAA;AAAA,GAEG,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,CAAA;AAAA,oBACnB,GAAA,CAAC,QAAK,KAAO,EAAA,YAAA,CAAa,MAAM,SAAW,EAAA,QAAA,EAAS,OAAM,QAE1D,EAAA,6BAAA,EAAA;AAAA,GACJ,EAAA,CAAA;AACR"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/screens/NewChat/index.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport { View } from 'react-native';\nimport { useNavigation, useRoute } from '@react-navigation/native';\nimport { navigationRef } from '@common-stack/client-react';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { YantraBrandLoader } from '../../components/YantraBrandLoader';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\nexport default function NewChat() {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n const { orgName: prerequisiteOrgName, orgLoading } = usePrerequisiteIds();\n\n const routeOrgName = (route?.params?.orgName as string | undefined)?.trim() || null;\n const resolvedOrgName = prerequisiteOrgName || routeOrgName || null;\n const hasNavigatedRef = useRef(false);\n const waitingForOrg = !routeOrgName && (orgLoading || !resolvedOrgName);\n\n useEffect(() => {\n if (hasNavigatedRef.current || waitingForOrg) return;\n\n const go = (org?: string | null) => {\n if (hasNavigatedRef.current) return;\n const params = org ? { orgName: org } : undefined;\n if (navigationRef.isReady()) {\n navigationRef.navigate(\n 'MainStack' as never,\n {\n screen: 'MainStack.Layout.Home',\n params,\n } as never,\n );\n hasNavigatedRef.current = true;\n return;\n }\n navigation.navigate('MainStack.Layout.Home', params);\n hasNavigatedRef.current = true;\n };\n\n // Navigate only when orgName is available so backend context URI is correct.\n go(resolvedOrgName);\n }, [resolvedOrgName, waitingForOrg, navigation]);\n\n return (\n <View\n style={{\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.bg,\n gap: 10,\n }}\n >\n <YantraBrandLoader />\n <Text color={mobileTokens.color.textMuted} fontSize=\"$sm\">\n Preparing your workspace...\n </Text>\n </View>\n );\n}\n"],"names":[],"mappings":"wdAQA,SAAwB,OAAU,GAAA;AARlC,EAAA,IAAA,EAAA,EAAA,EAAA;AASE,EAAA,MAAM,aAAa,aAAmB,EAAA;AACtC,EAAA,MAAM,QAAQ,QAAc,EAAA;AAC5B,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,mBAAA;AAAA,IACT;AAAA,MACE,kBAAmB,EAAA;AACvB,EAAA,MAAM,iBAAgB,EAAO,GAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA,MAAA,KAAP,IAAe,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,KAAf,mBAA+C,IAAU,EAAA,KAAA,IAAA;AAC/E,EAAM,MAAA,eAAA,GAAkB,uBAAuB,YAAgB,IAAA,IAAA;AAC/D,EAAM,MAAA,eAAA,GAAkB,OAAO,KAAK,CAAA;AACpC,EAAA,MAAM,aAAgB,GAAA,CAAC,YAAiB,KAAA,UAAA,IAAc,CAAC,eAAA,CAAA;AACvD,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,eAAA,CAAgB,WAAW,aAAe,EAAA;AAC9C,IAAM,MAAA,EAAA,GAAK,CAAC,GAAwB,KAAA;AAClC,MAAA,IAAI,gBAAgB,OAAS,EAAA;AAC7B,MAAA,MAAM,SAAS,GAAM,GAAA;AAAA,QACnB,OAAS,EAAA;AAAA,OACP,GAAA,MAAA;AACJ,MAAI,IAAA,aAAA,CAAc,SAAW,EAAA;AAC3B,QAAA,aAAA,CAAc,SAAS,WAAsB,EAAA;AAAA,UAC3C,MAAQ,EAAA,uBAAA;AAAA,UACR;AAAA,SACQ,CAAA;AACV,QAAA,eAAA,CAAgB,OAAU,GAAA,IAAA;AAC1B,QAAA;AAAA;AAEF,MAAW,UAAA,CAAA,QAAA,CAAS,yBAAyB,MAAM,CAAA;AACnD,MAAA,eAAA,CAAgB,OAAU,GAAA,IAAA;AAAA,KAC5B;AAGA,IAAA,EAAA,CAAG,eAAe,CAAA;AAAA,GACjB,EAAA,CAAC,eAAiB,EAAA,aAAA,EAAe,UAAU,CAAC,CAAA;AAC/C,EAAO,uBAAA,IAAA,CAAC,QAAK,KAAO,EAAA;AAAA,IAClB,IAAM,EAAA,CAAA;AAAA,IACN,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,IAChB,eAAA,EAAiB,aAAa,KAAM,CAAA,EAAA;AAAA,IACpC,GAAK,EAAA;AAAA,GAEG,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,iBAAkB,EAAA,EAAA,CAAA;AAAA,oBACnB,GAAA,CAAC,QAAK,KAAO,EAAA,YAAA,CAAa,MAAM,SAAW,EAAA,QAAA,EAAS,OAAM,QAE1D,EAAA,6BAAA,EAAA;AAAA,GACJ,EAAA,CAAA;AACR"}
@@ -0,0 +1,69 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ const FALLBACK_SETTINGS_URI = {
18
+ scheme: "cdecode",
19
+ authority: "default",
20
+ path: "/",
21
+ fragment: "settings"
22
+ };
23
+ function toUriInput(value) {
24
+ const uri = value;
25
+ if (uri && typeof uri.scheme === "string" && typeof uri.path === "string") {
26
+ return {
27
+ scheme: uri.scheme,
28
+ authority: typeof uri.authority === "string" ? uri.authority : "default",
29
+ path: uri.path || "/",
30
+ fragment: typeof uri.fragment === "string" ? uri.fragment : "settings"
31
+ };
32
+ }
33
+ if (uri && typeof uri.external === "string") {
34
+ try {
35
+ const parsed = new URL(uri.external);
36
+ return {
37
+ scheme: parsed.protocol.replace(":", "") || "cdecode",
38
+ authority: parsed.hostname || "default",
39
+ path: parsed.pathname || "/",
40
+ fragment: parsed.hash ? parsed.hash.replace("#", "") : "settings"
41
+ };
42
+ } catch (e) {
43
+ return __spreadValues({}, FALLBACK_SETTINGS_URI);
44
+ }
45
+ }
46
+ return __spreadValues({}, FALLBACK_SETTINGS_URI);
47
+ }
48
+ function isUnhydratedCdecodeUri(value) {
49
+ if (value == null) return true;
50
+ if (typeof value !== "object") return false;
51
+ const uri = value;
52
+ if (typeof uri.scheme === "string" && typeof uri.path === "string") {
53
+ return false;
54
+ }
55
+ if (typeof uri.external === "string" && uri.external.trim().length > 0) {
56
+ return false;
57
+ }
58
+ return Object.keys(uri).length === 0;
59
+ }
60
+ function settingsUriForOrg(orgName) {
61
+ const slug = orgName.trim();
62
+ const path = slug ? `/${slug}/` : "/";
63
+ return {
64
+ scheme: "cdecode",
65
+ authority: "default",
66
+ path,
67
+ fragment: "settings"
68
+ };
69
+ }export{FALLBACK_SETTINGS_URI,isUnhydratedCdecodeUri,settingsUriForOrg,toUriInput};//# sourceMappingURL=cdecodeUri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdecodeUri.js","sources":["../../src/utils/cdecodeUri.ts"],"sourcesContent":["/** Helpers for Apollo `URIInput` / mobile `cdecodeUri` from `getContextData`. */\n\nexport type UriLike = {\n scheme?: unknown;\n authority?: unknown;\n path?: unknown;\n fragment?: unknown;\n external?: unknown;\n};\n\nexport const FALLBACK_SETTINGS_URI = {\n scheme: 'cdecode',\n authority: 'default',\n path: '/',\n fragment: 'settings',\n} as const;\n\nexport function toUriInput(value: unknown): { scheme: string; authority: string; path: string; fragment: string } {\n const uri = value as UriLike | undefined;\n if (uri && typeof uri.scheme === 'string' && typeof uri.path === 'string') {\n return {\n scheme: uri.scheme,\n authority: typeof uri.authority === 'string' ? uri.authority : 'default',\n path: uri.path || '/',\n fragment: typeof uri.fragment === 'string' ? uri.fragment : 'settings',\n };\n }\n\n if (uri && typeof uri.external === 'string') {\n try {\n const parsed = new URL(uri.external);\n return {\n scheme: parsed.protocol.replace(':', '') || 'cdecode',\n authority: parsed.hostname || 'default',\n path: parsed.pathname || '/',\n fragment: parsed.hash ? parsed.hash.replace('#', '') : 'settings',\n };\n } catch {\n return { ...FALLBACK_SETTINGS_URI };\n }\n }\n\n return { ...FALLBACK_SETTINGS_URI };\n}\n\n/** Apollo returns `{}` before org context is hydrated — must not pass to `pageSettings`. */\nexport function isUnhydratedCdecodeUri(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value !== 'object') return false;\n const uri = value as UriLike;\n if (typeof uri.scheme === 'string' && typeof uri.path === 'string') {\n return false;\n }\n if (typeof uri.external === 'string' && uri.external.trim().length > 0) {\n return false;\n }\n return Object.keys(uri).length === 0;\n}\n\nexport function settingsUriForOrg(orgName: string): typeof FALLBACK_SETTINGS_URI {\n const slug = orgName.trim();\n const path = slug ? `/${slug}/` : '/';\n return {\n scheme: 'cdecode',\n authority: 'default',\n path,\n fragment: 'settings',\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AASO,MAAM,qBAAwB,GAAA;AAAA,EACnC,MAAQ,EAAA,SAAA;AAAA,EACR,SAAW,EAAA,SAAA;AAAA,EACX,IAAM,EAAA,GAAA;AAAA,EACN,QAAU,EAAA;AACZ;AACO,SAAS,WAAW,KAKzB,EAAA;AACA,EAAA,MAAM,GAAM,GAAA,KAAA;AACZ,EAAI,IAAA,GAAA,IAAO,OAAO,GAAI,CAAA,MAAA,KAAW,YAAY,OAAO,GAAA,CAAI,SAAS,QAAU,EAAA;AACzE,IAAO,OAAA;AAAA,MACL,QAAQ,GAAI,CAAA,MAAA;AAAA,MACZ,WAAW,OAAO,GAAA,CAAI,SAAc,KAAA,QAAA,GAAW,IAAI,SAAY,GAAA,SAAA;AAAA,MAC/D,IAAA,EAAM,IAAI,IAAQ,IAAA,GAAA;AAAA,MAClB,UAAU,OAAO,GAAA,CAAI,QAAa,KAAA,QAAA,GAAW,IAAI,QAAW,GAAA;AAAA,KAC9D;AAAA;AAEF,EAAA,IAAI,GAAO,IAAA,OAAO,GAAI,CAAA,QAAA,KAAa,QAAU,EAAA;AAC3C,IAAI,IAAA;AACF,MAAA,MAAM,MAAS,GAAA,IAAI,GAAI,CAAA,GAAA,CAAI,QAAQ,CAAA;AACnC,MAAO,OAAA;AAAA,QACL,QAAQ,MAAO,CAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAK,IAAA,SAAA;AAAA,QAC5C,SAAA,EAAW,OAAO,QAAY,IAAA,SAAA;AAAA,QAC9B,IAAA,EAAM,OAAO,QAAY,IAAA,GAAA;AAAA,QACzB,QAAA,EAAU,OAAO,IAAO,GAAA,MAAA,CAAO,KAAK,OAAQ,CAAA,GAAA,EAAK,EAAE,CAAI,GAAA;AAAA,OACzD;AAAA,KACM,CAAA,OAAA,CAAA,EAAA;AACN,MAAA,OAAO,cACF,CAAA,EAAA,EAAA,qBAAA,CAAA;AAAA;AAEP;AAEF,EAAA,OAAO,cACF,CAAA,EAAA,EAAA,qBAAA,CAAA;AAEP;AAGO,SAAS,uBAAuB,KAAyB,EAAA;AAC9D,EAAI,IAAA,KAAA,IAAS,MAAa,OAAA,IAAA;AAC1B,EAAI,IAAA,OAAO,KAAU,KAAA,QAAA,EAAiB,OAAA,KAAA;AACtC,EAAA,MAAM,GAAM,GAAA,KAAA;AACZ,EAAA,IAAI,OAAO,GAAI,CAAA,MAAA,KAAW,YAAY,OAAO,GAAA,CAAI,SAAS,QAAU,EAAA;AAClE,IAAO,OAAA,KAAA;AAAA;AAET,EAAI,IAAA,OAAO,IAAI,QAAa,KAAA,QAAA,IAAY,IAAI,QAAS,CAAA,IAAA,EAAO,CAAA,MAAA,GAAS,CAAG,EAAA;AACtE,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,GAAG,CAAA,CAAE,MAAW,KAAA,CAAA;AACrC;AACO,SAAS,kBAAkB,OAA+C,EAAA;AAC/E,EAAM,MAAA,IAAA,GAAO,QAAQ,IAAK,EAAA;AAC1B,EAAA,MAAM,IAAO,GAAA,IAAA,GAAO,CAAI,CAAA,EAAA,IAAI,CAAM,CAAA,CAAA,GAAA,GAAA;AAClC,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA,SAAA;AAAA,IACR,SAAW,EAAA,SAAA;AAAA,IACX,IAAA;AAAA,IACA,QAAU,EAAA;AAAA,GACZ;AACF"}
@@ -0,0 +1,61 @@
1
+ import {navigationRef}from'@common-stack/client-react';import {LOCATION_CHANGE}from'@common-stack/remix-router-redux';import {orgChangeAction}from'@adminide-stack/platform-client/lib/redux/actions/org-action.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 DEFAULT_HOME_ROUTE_PATH = "/:orgName/main_drawer/home";
21
+ function syncMobileOrgRouteContext(dispatch, orgName, options) {
22
+ const trimmed = orgName.trim();
23
+ if (!trimmed) {
24
+ return;
25
+ }
26
+ const routePath = (options == null ? void 0 : options.routePath) || DEFAULT_HOME_ROUTE_PATH;
27
+ const current = navigationRef.isReady() ? navigationRef.getCurrentRoute() : null;
28
+ const params = __spreadProps(__spreadValues({}, (current == null ? void 0 : current.params) || {}), {
29
+ orgName: trimmed
30
+ });
31
+ if (navigationRef.isReady()) {
32
+ navigationRef.setParams(params);
33
+ }
34
+ dispatch({
35
+ type: LOCATION_CHANGE,
36
+ payload: {
37
+ currentRoute: {
38
+ path: routePath,
39
+ params: __spreadProps(__spreadValues({}, params), {
40
+ resourceParams: {
41
+ organization: trimmed,
42
+ fragment: "settings",
43
+ path: `/${trimmed}/`,
44
+ orgName: trimmed
45
+ }
46
+ })
47
+ },
48
+ previousRoute: {
49
+ path: routePath,
50
+ params: {
51
+ orgName: ""
52
+ }
53
+ }
54
+ }
55
+ });
56
+ dispatch(orgChangeAction(__spreadValues({
57
+ orgName: trimmed
58
+ }, (options == null ? void 0 : options.userId) ? {
59
+ userId: options.userId
60
+ } : {})));
61
+ }export{syncMobileOrgRouteContext};//# sourceMappingURL=syncMobileOrgRouteContext.js.map