@adminide-stack/yantra-mobile 12.0.38 → 12.0.39-alpha.1
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/components/NavigationHeader/NavigationHeader.js +6 -2
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/features/templates/buildTemplateCards.js +150 -0
- package/lib/features/templates/buildTemplateCards.js.map +1 -0
- package/lib/features/templates/buildTemplateCards.ts +203 -0
- package/lib/features/templates/index.ts +1 -0
- package/lib/hooks/useMarketplaceTemplateCards.js +32 -0
- package/lib/hooks/useMarketplaceTemplateCards.js.map +1 -0
- package/lib/hooks/useMarketplaceTemplateGroups.js +32 -0
- package/lib/hooks/useMarketplaceTemplateGroups.js.map +1 -0
- package/lib/screens/Home/HomeScreen.js +126 -20
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/BuildTemplatesSection.js +156 -0
- package/lib/screens/Home/components/BuildTemplatesSection.js.map +1 -0
- package/lib/screens/WebBuilder/WebViewWithNavigation.js +4 -1
- package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
- package/lib/screens/WebBuilder/index.js +88 -19
- package/lib/screens/WebBuilder/index.js.map +1 -1
- package/lib/screens/WebBuilder/webbuilderBackHandler.js +11 -0
- package/lib/screens/WebBuilder/webbuilderBackHandler.js.map +1 -0
- package/lib/utils/cdecodeUri.js +11 -1
- package/lib/utils/cdecodeUri.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import React,{useMemo,useCallback}from'react';import {useColorScheme,StyleSheet,View,Pressable}from'react-native';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {StatusBar}from'expo-status-bar';import {useNavigation,CommonActions,DrawerActions}from'@react-navigation/native';import {getHeaderTitle}from'@react-navigation/elements';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import GatewayConnector from'../GatewayConnector/GatewayConnector.js';import {mobileTokens}from'../../theme/mobileTokens.js';const ICON_SIZE = 22;
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import React,{useMemo,useCallback}from'react';import {useColorScheme,StyleSheet,View,Pressable}from'react-native';import {useSafeAreaInsets,SafeAreaView}from'react-native-safe-area-context';import {StatusBar}from'expo-status-bar';import {useNavigation,CommonActions,DrawerActions}from'@react-navigation/native';import {getHeaderTitle}from'@react-navigation/elements';import {MaterialCommunityIcons}from'@expo/vector-icons';import {Text}from'@admin-layout/gluestack-ui-mobile';import GatewayConnector from'../GatewayConnector/GatewayConnector.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {tryWebBuilderBack}from'../../screens/WebBuilder/webbuilderBackHandler.js';const ICON_SIZE = 22;
|
|
2
2
|
function resolveTitle(options, route) {
|
|
3
3
|
var _a, _b;
|
|
4
4
|
if (typeof (options == null ? void 0 : options.title) === "string" && options.title.trim()) {
|
|
@@ -52,6 +52,10 @@ const NavigationHeader = (props) => {
|
|
|
52
52
|
}, [(_b = route == null ? void 0 : route.params) == null ? void 0 : _b.orgName]);
|
|
53
53
|
const handleBack = useCallback(() => {
|
|
54
54
|
var _a2, _b2;
|
|
55
|
+
const routeName = typeof (route == null ? void 0 : route.name) === "string" ? route.name : "";
|
|
56
|
+
if (/webbuilder/i.test(routeName) && tryWebBuilderBack()) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
55
59
|
if ((_a2 = navigation == null ? void 0 : navigation.canGoBack) == null ? void 0 : _a2.call(navigation)) {
|
|
56
60
|
navigation.goBack();
|
|
57
61
|
return;
|
|
@@ -62,7 +66,7 @@ const NavigationHeader = (props) => {
|
|
|
62
66
|
orgName
|
|
63
67
|
} : void 0
|
|
64
68
|
}));
|
|
65
|
-
}, [navigation, orgName]);
|
|
69
|
+
}, [navigation, orgName, route == null ? void 0 : route.name]);
|
|
66
70
|
const handleToggleDrawer = useCallback(() => {
|
|
67
71
|
var _a2;
|
|
68
72
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavigationHeader.js","sources":["../../../src/components/NavigationHeader/NavigationHeader.tsx"],"sourcesContent":["/**\n * Universal navigation header for the Yantra mobile app.\n *\n * Wired via `customHeader` in `compute.ts`, so the React Navigation runtime\n * passes us TWO sets of props on every render:\n *\n * 1. The standard navigator props — `navigation`, `route`, `options`, `back`,\n * `layout`. We read EVERYTHING visual out of `options` (set by `props.options`\n * in compute.ts):\n * • `options.title` / `options.headerTitle` — visible title text\n * • `options.headerTitleAlign` — `'left' | 'center'`\n * • `options.headerTitleStyle` — text style overrides (fontWeight, etc.)\n * • `options.headerTintColor` — title + icon tint (light-mode default)\n * • `options.headerStyle` — outer header view style overrides\n *\n * 2. The static `customHeader.props` from compute.ts — the layout flags\n * describing what the header should render for this route:\n * • `showTitle, showToggle, showBack, showFilter, isSearchBack`\n * • `showGateway, showHistory, showNewChat` (`showGateway` is intended for Home only)\n * • `headerBgColor`\n *\n * Screens never touch the header — no `setOptions`, no slot registration.\n * If a route needs a different header configuration, change its\n * `customHeader.props` / `props.options` in `compute.ts`.\n */\nimport React, { useCallback, useMemo } from 'react';\nimport { Pressable, StyleSheet, View, useColorScheme } from 'react-native';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { StatusBar } from 'expo-status-bar';\nimport { CommonActions, DrawerActions, useNavigation } from '@react-navigation/native';\nimport { getHeaderTitle } from '@react-navigation/elements';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { GatewayConnector } from '../GatewayConnector';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\ninterface NavigationHeaderProps {\n /** React Navigation header props (typed loose because they vary per navigator). */\n navigation?: any;\n route?: any;\n options?: any;\n /** Set by the native-stack navigator when there's a previous screen on the stack. */\n back?: { title?: string };\n\n showTitle?: boolean;\n showToggle?: boolean;\n showBack?: boolean;\n showFilter?: boolean;\n isSearchBack?: boolean;\n showGateway?: boolean;\n showHistory?: boolean;\n showNewChat?: boolean;\n headerBgColor?: string;\n}\n\nconst ICON_SIZE = 22;\n\nfunction resolveTitle(options: any, route: any): string {\n if (typeof options?.title === 'string' && options.title.trim()) {\n return options.title.trim();\n }\n if (typeof options?.headerTitle === 'string' && options.headerTitle.trim()) {\n return options.headerTitle.trim();\n }\n const fallback = getHeaderTitle?.(options ?? {}, route?.name ?? 'Yantra');\n return typeof fallback === 'string' && fallback.trim() ? fallback : 'Yantra';\n}\n\nconst NavigationHeader: React.FC<NavigationHeaderProps> = (props) => {\n const {\n navigation: navProp,\n route,\n options,\n back,\n showTitle = true,\n showToggle = false,\n showBack = false,\n showGateway = false,\n showHistory = false,\n showNewChat = false,\n headerBgColor,\n } = props;\n\n const fallbackNav = useNavigation<any>();\n const navigation = navProp ?? fallbackNav;\n\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const insets = useSafeAreaInsets();\n\n /* ── Theme + options-driven colours / styles ─────────────────────────── */\n const themeTitleColor = isDark ? '#f1f5f9' : '#0f172a';\n const themeAccentColor = isDark ? '#a5b4fc' : '#4338ca';\n const themeNewChatIconColor = isDark ? '#e5e7eb' : '#000000';\n\n /**\n * Honour `options.headerTintColor` (set in `compute.ts` → `props.options`).\n * In dark mode we ignore a hard \"black\" tint so the title stays legible —\n * but any non-black tint is respected in both modes.\n */\n const optionTint = typeof options?.headerTintColor === 'string' ? options.headerTintColor : null;\n const tintLooksDark = optionTint && /^(#?000(000)?|black)$/i.test(optionTint.trim());\n const effectiveTint = optionTint && !(isDark && tintLooksDark) ? optionTint : null;\n\n const titleColor = effectiveTint ?? themeTitleColor;\n const iconColor = effectiveTint ?? themeTitleColor;\n const accentColor = effectiveTint ?? themeAccentColor;\n const newChatIconColor = effectiveTint ?? themeNewChatIconColor;\n\n const surfaceColor = headerBgColor ?? (isDark ? '#0f172a' : '#ffffff');\n const dividerColor = isDark ? 'rgba(148, 163, 184, 0.18)' : 'rgba(15, 23, 42, 0.06)';\n\n const titleAlignLeft = options?.headerTitleAlign === 'left';\n const title = useMemo(() => resolveTitle(options, route), [options, route]);\n const optionTitleStyle = options?.headerTitleStyle ?? null;\n\n /** Org slug used by header navigation actions; falls back to route params. */\n const orgName = useMemo(() => {\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [route?.params?.orgName]);\n\n /* ── Action handlers ─────────────────────────────────────────────────── */\n const handleBack = useCallback(() => {\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return;\n }\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName]);\n\n const handleToggleDrawer = useCallback(() => {\n try {\n navigation?.dispatch?.(DrawerActions.openDrawer());\n } catch {\n /* Current navigator may not be a drawer — ignore. */\n }\n }, [navigation]);\n\n const handleOpenChatHistory = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.ChatHistory',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName]);\n\n const handleNewChat = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n merge: true,\n }),\n );\n }, [navigation, orgName]);\n\n /* ── Slot composition (left → title → right) ─────────────────────────── */\n const wantsBack = Boolean(back) || showBack;\n\n const leftSlot = wantsBack ? (\n <Pressable\n onPress={handleBack}\n accessibilityLabel=\"Go back\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={ICON_SIZE + 4} color={iconColor} />\n </Pressable>\n ) : showToggle ? (\n <Pressable\n onPress={handleToggleDrawer}\n accessibilityLabel=\"Open menu\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"menu\" size={ICON_SIZE} color={iconColor} />\n </Pressable>\n ) : null;\n\n const titleSlot = showTitle ? (\n <Text\n style={[\n styles.title,\n titleAlignLeft ? styles.titleAlignLeft : styles.titleAlignCenter,\n { color: titleColor },\n optionTitleStyle,\n ]}\n numberOfLines={1}\n ellipsizeMode=\"tail\"\n >\n {title}\n </Text>\n ) : null;\n\n const showRightSlot = showGateway || showHistory || showNewChat;\n const rightSlot = showRightSlot ? (\n <View style={styles.rightActions}>\n {showGateway ? <GatewayConnector /> : null}\n {showHistory ? (\n <Pressable\n onPress={handleOpenChatHistory}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"Chat history\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"history\" size={19} color={accentColor} />\n </View>\n </Pressable>\n ) : null}\n {showNewChat ? (\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"New chat\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={20} color={newChatIconColor} />\n </View>\n </Pressable>\n ) : null}\n </View>\n ) : null;\n\n return (\n <>\n <StatusBar style={isDark ? 'light' : 'dark'} />\n <SafeAreaView edges={['top']} style={{ backgroundColor: surfaceColor }}>\n <View\n style={[\n styles.row,\n {\n backgroundColor: surfaceColor,\n borderBottomColor: dividerColor,\n paddingTop: insets.top > 0 ? 0 : 6,\n },\n options?.headerStyle ?? null,\n ]}\n >\n <View style={styles.leftSlot}>{leftSlot}</View>\n <View style={[styles.titleSlot, titleAlignLeft && styles.titleSlotLeft]}>{titleSlot}</View>\n <View style={styles.rightSlot}>{rightSlot}</View>\n </View>\n </SafeAreaView>\n </>\n );\n};\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 10,\n minHeight: 52,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n leftSlot: {\n minWidth: 40,\n alignItems: 'flex-start',\n justifyContent: 'center',\n },\n titleSlot: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 8,\n minWidth: 0,\n },\n titleSlotLeft: {\n alignItems: 'flex-start',\n },\n rightSlot: {\n minWidth: 40,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n rightActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n title: {\n fontSize: 17,\n fontWeight: '700',\n letterSpacing: -0.2,\n width: '100%',\n },\n titleAlignCenter: {\n textAlign: 'center',\n },\n titleAlignLeft: {\n textAlign: 'left',\n },\n iconButton: {\n width: 36,\n height: 36,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 18,\n },\n iconButtonPressed: {\n opacity: 0.6,\n },\n actionButton: {\n padding: 0,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 22,\n },\n actionButtonPressed: {\n opacity: 0.6,\n },\n actionButtonInner: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 5,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n actionButtonInnerDark: {\n backgroundColor: '#0f172a',\n borderColor: '#334155',\n },\n});\n\nexport default React.memo(NavigationHeader);\n"],"names":["_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NavigationHeader.js","sources":["../../../src/components/NavigationHeader/NavigationHeader.tsx"],"sourcesContent":["/**\n * Universal navigation header for the Yantra mobile app.\n *\n * Wired via `customHeader` in `compute.ts`, so the React Navigation runtime\n * passes us TWO sets of props on every render:\n *\n * 1. The standard navigator props — `navigation`, `route`, `options`, `back`,\n * `layout`. We read EVERYTHING visual out of `options` (set by `props.options`\n * in compute.ts):\n * • `options.title` / `options.headerTitle` — visible title text\n * • `options.headerTitleAlign` — `'left' | 'center'`\n * • `options.headerTitleStyle` — text style overrides (fontWeight, etc.)\n * • `options.headerTintColor` — title + icon tint (light-mode default)\n * • `options.headerStyle` — outer header view style overrides\n *\n * 2. The static `customHeader.props` from compute.ts — the layout flags\n * describing what the header should render for this route:\n * • `showTitle, showToggle, showBack, showFilter, isSearchBack`\n * • `showGateway, showHistory, showNewChat` (`showGateway` is intended for Home only)\n * • `headerBgColor`\n *\n * Screens never touch the header — no `setOptions`, no slot registration.\n * If a route needs a different header configuration, change its\n * `customHeader.props` / `props.options` in `compute.ts`.\n */\nimport React, { useCallback, useMemo } from 'react';\nimport { Pressable, StyleSheet, View, useColorScheme } from 'react-native';\nimport { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { StatusBar } from 'expo-status-bar';\nimport { CommonActions, DrawerActions, useNavigation } from '@react-navigation/native';\nimport { getHeaderTitle } from '@react-navigation/elements';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Text } from '@admin-layout/gluestack-ui-mobile';\nimport { GatewayConnector } from '../GatewayConnector';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { tryWebBuilderBack } from '../../screens/WebBuilder/webbuilderBackHandler';\n\ninterface NavigationHeaderProps {\n /** React Navigation header props (typed loose because they vary per navigator). */\n navigation?: any;\n route?: any;\n options?: any;\n /** Set by the native-stack navigator when there's a previous screen on the stack. */\n back?: { title?: string };\n\n showTitle?: boolean;\n showToggle?: boolean;\n showBack?: boolean;\n showFilter?: boolean;\n isSearchBack?: boolean;\n showGateway?: boolean;\n showHistory?: boolean;\n showNewChat?: boolean;\n headerBgColor?: string;\n}\n\nconst ICON_SIZE = 22;\n\nfunction resolveTitle(options: any, route: any): string {\n if (typeof options?.title === 'string' && options.title.trim()) {\n return options.title.trim();\n }\n if (typeof options?.headerTitle === 'string' && options.headerTitle.trim()) {\n return options.headerTitle.trim();\n }\n const fallback = getHeaderTitle?.(options ?? {}, route?.name ?? 'Yantra');\n return typeof fallback === 'string' && fallback.trim() ? fallback : 'Yantra';\n}\n\nconst NavigationHeader: React.FC<NavigationHeaderProps> = (props) => {\n const {\n navigation: navProp,\n route,\n options,\n back,\n showTitle = true,\n showToggle = false,\n showBack = false,\n showGateway = false,\n showHistory = false,\n showNewChat = false,\n headerBgColor,\n } = props;\n\n const fallbackNav = useNavigation<any>();\n const navigation = navProp ?? fallbackNav;\n\n const colorScheme = useColorScheme();\n const isDark = colorScheme === 'dark';\n const insets = useSafeAreaInsets();\n\n /* ── Theme + options-driven colours / styles ─────────────────────────── */\n const themeTitleColor = isDark ? '#f1f5f9' : '#0f172a';\n const themeAccentColor = isDark ? '#a5b4fc' : '#4338ca';\n const themeNewChatIconColor = isDark ? '#e5e7eb' : '#000000';\n\n /**\n * Honour `options.headerTintColor` (set in `compute.ts` → `props.options`).\n * In dark mode we ignore a hard \"black\" tint so the title stays legible —\n * but any non-black tint is respected in both modes.\n */\n const optionTint = typeof options?.headerTintColor === 'string' ? options.headerTintColor : null;\n const tintLooksDark = optionTint && /^(#?000(000)?|black)$/i.test(optionTint.trim());\n const effectiveTint = optionTint && !(isDark && tintLooksDark) ? optionTint : null;\n\n const titleColor = effectiveTint ?? themeTitleColor;\n const iconColor = effectiveTint ?? themeTitleColor;\n const accentColor = effectiveTint ?? themeAccentColor;\n const newChatIconColor = effectiveTint ?? themeNewChatIconColor;\n\n const surfaceColor = headerBgColor ?? (isDark ? '#0f172a' : '#ffffff');\n const dividerColor = isDark ? 'rgba(148, 163, 184, 0.18)' : 'rgba(15, 23, 42, 0.06)';\n\n const titleAlignLeft = options?.headerTitleAlign === 'left';\n const title = useMemo(() => resolveTitle(options, route), [options, route]);\n const optionTitleStyle = options?.headerTitleStyle ?? null;\n\n /** Org slug used by header navigation actions; falls back to route params. */\n const orgName = useMemo(() => {\n const raw = (route?.params?.orgName as string | undefined) ?? '';\n return typeof raw === 'string' && raw.trim() ? raw.trim() : null;\n }, [route?.params?.orgName]);\n\n /* ── Action handlers ─────────────────────────────────────────────────── */\n const handleBack = useCallback(() => {\n // WebBuilder: prefer WebView history / in-surface preview dismiss so we\n // don't drop users onto Home while a live preview tab is open.\n const routeName = typeof route?.name === 'string' ? route.name : '';\n if (/webbuilder/i.test(routeName) && tryWebBuilderBack()) {\n return;\n }\n if (navigation?.canGoBack?.()) {\n navigation.goBack();\n return;\n }\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName, route?.name]);\n\n const handleToggleDrawer = useCallback(() => {\n try {\n navigation?.dispatch?.(DrawerActions.openDrawer());\n } catch {\n /* Current navigator may not be a drawer — ignore. */\n }\n }, [navigation]);\n\n const handleOpenChatHistory = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.ChatHistory',\n params: orgName ? { orgName } : undefined,\n }),\n );\n }, [navigation, orgName]);\n\n const handleNewChat = useCallback(() => {\n navigation?.dispatch?.(\n CommonActions.navigate({\n name: 'MainStack.Layout.Home',\n params: orgName ? { orgName } : undefined,\n merge: true,\n }),\n );\n }, [navigation, orgName]);\n\n /* ── Slot composition (left → title → right) ─────────────────────────── */\n const wantsBack = Boolean(back) || showBack;\n\n const leftSlot = wantsBack ? (\n <Pressable\n onPress={handleBack}\n accessibilityLabel=\"Go back\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"chevron-left\" size={ICON_SIZE + 4} color={iconColor} />\n </Pressable>\n ) : showToggle ? (\n <Pressable\n onPress={handleToggleDrawer}\n accessibilityLabel=\"Open menu\"\n accessibilityRole=\"button\"\n style={({ pressed }) => [styles.iconButton, pressed && styles.iconButtonPressed]}\n hitSlop={8}\n >\n <MaterialCommunityIcons name=\"menu\" size={ICON_SIZE} color={iconColor} />\n </Pressable>\n ) : null;\n\n const titleSlot = showTitle ? (\n <Text\n style={[\n styles.title,\n titleAlignLeft ? styles.titleAlignLeft : styles.titleAlignCenter,\n { color: titleColor },\n optionTitleStyle,\n ]}\n numberOfLines={1}\n ellipsizeMode=\"tail\"\n >\n {title}\n </Text>\n ) : null;\n\n const showRightSlot = showGateway || showHistory || showNewChat;\n const rightSlot = showRightSlot ? (\n <View style={styles.rightActions}>\n {showGateway ? <GatewayConnector /> : null}\n {showHistory ? (\n <Pressable\n onPress={handleOpenChatHistory}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"Chat history\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"history\" size={19} color={accentColor} />\n </View>\n </Pressable>\n ) : null}\n {showNewChat ? (\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.actionButton, pressed && styles.actionButtonPressed]}\n accessibilityLabel=\"New chat\"\n accessibilityRole=\"button\"\n hitSlop={8}\n >\n <View style={[styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null]}>\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={20} color={newChatIconColor} />\n </View>\n </Pressable>\n ) : null}\n </View>\n ) : null;\n\n return (\n <>\n <StatusBar style={isDark ? 'light' : 'dark'} />\n <SafeAreaView edges={['top']} style={{ backgroundColor: surfaceColor }}>\n <View\n style={[\n styles.row,\n {\n backgroundColor: surfaceColor,\n borderBottomColor: dividerColor,\n paddingTop: insets.top > 0 ? 0 : 6,\n },\n options?.headerStyle ?? null,\n ]}\n >\n <View style={styles.leftSlot}>{leftSlot}</View>\n <View style={[styles.titleSlot, titleAlignLeft && styles.titleSlotLeft]}>{titleSlot}</View>\n <View style={styles.rightSlot}>{rightSlot}</View>\n </View>\n </SafeAreaView>\n </>\n );\n};\n\nconst styles = StyleSheet.create({\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 12,\n paddingVertical: 10,\n minHeight: 52,\n borderBottomWidth: StyleSheet.hairlineWidth,\n },\n leftSlot: {\n minWidth: 40,\n alignItems: 'flex-start',\n justifyContent: 'center',\n },\n titleSlot: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 8,\n minWidth: 0,\n },\n titleSlotLeft: {\n alignItems: 'flex-start',\n },\n rightSlot: {\n minWidth: 40,\n alignItems: 'flex-end',\n justifyContent: 'center',\n },\n rightActions: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 6,\n },\n title: {\n fontSize: 17,\n fontWeight: '700',\n letterSpacing: -0.2,\n width: '100%',\n },\n titleAlignCenter: {\n textAlign: 'center',\n },\n titleAlignLeft: {\n textAlign: 'left',\n },\n iconButton: {\n width: 36,\n height: 36,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 18,\n },\n iconButtonPressed: {\n opacity: 0.6,\n },\n actionButton: {\n padding: 0,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 22,\n },\n actionButtonPressed: {\n opacity: 0.6,\n },\n actionButtonInner: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surface,\n borderWidth: 1,\n borderColor: mobileTokens.color.border,\n shadowColor: '#0f172a',\n shadowOpacity: 0.08,\n shadowRadius: 5,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n actionButtonInnerDark: {\n backgroundColor: '#0f172a',\n borderColor: '#334155',\n },\n});\n\nexport default React.memo(NavigationHeader);\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
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
|
+
var __objRest = (source, exclude) => {
|
|
18
|
+
var target = {};
|
|
19
|
+
for (var prop in source)
|
|
20
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
21
|
+
target[prop] = source[prop];
|
|
22
|
+
if (source != null && __getOwnPropSymbols)
|
|
23
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
24
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
}
|
|
27
|
+
return target;
|
|
28
|
+
};
|
|
29
|
+
function toNonEmptyString(value) {
|
|
30
|
+
return typeof value === "string" ? value.trim() : "";
|
|
31
|
+
}
|
|
32
|
+
function isSettingsEntryDisabled(value) {
|
|
33
|
+
return value.enabled === false || value.enabled === "false" || value.enable === false || value.enable === "false";
|
|
34
|
+
}
|
|
35
|
+
function humanizeGroupKey(key) {
|
|
36
|
+
const spaced = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").trim();
|
|
37
|
+
if (!spaced) return key;
|
|
38
|
+
return spaced.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
39
|
+
}
|
|
40
|
+
function humanizeFormKey(key) {
|
|
41
|
+
return humanizeGroupKey(key);
|
|
42
|
+
}
|
|
43
|
+
function unwrapSettingsPayload(payload) {
|
|
44
|
+
const wrapper = payload;
|
|
45
|
+
if (!wrapper || typeof wrapper !== "object") return null;
|
|
46
|
+
if (wrapper.settings && typeof wrapper.settings === "object") {
|
|
47
|
+
return wrapper.settings;
|
|
48
|
+
}
|
|
49
|
+
return wrapper;
|
|
50
|
+
}
|
|
51
|
+
function normalizeMarketplaceTemplatesPayload(payload) {
|
|
52
|
+
var _a;
|
|
53
|
+
const grafted = (_a = payload == null ? void 0 : payload.marketplace) == null ? void 0 : _a.templates;
|
|
54
|
+
if (!grafted || typeof grafted !== "object") return payload;
|
|
55
|
+
const _b = payload, {
|
|
56
|
+
marketplace: _marketplace,
|
|
57
|
+
aisearch: _aisearch,
|
|
58
|
+
credential: _credential,
|
|
59
|
+
appSettings: _appSettings
|
|
60
|
+
} = _b, leanGroups = __objRest(_b, [
|
|
61
|
+
"marketplace",
|
|
62
|
+
"aisearch",
|
|
63
|
+
"credential",
|
|
64
|
+
"appSettings"
|
|
65
|
+
]);
|
|
66
|
+
return __spreadValues(__spreadValues({}, leanGroups), grafted);
|
|
67
|
+
}
|
|
68
|
+
function extractMarketplaceTemplateGroups(payload) {
|
|
69
|
+
const raw = unwrapSettingsPayload(payload);
|
|
70
|
+
if (!raw) return [];
|
|
71
|
+
const groupsMap = normalizeMarketplaceTemplatesPayload(raw);
|
|
72
|
+
const groups = [];
|
|
73
|
+
Object.entries(groupsMap).forEach(([groupKey, groupValue]) => {
|
|
74
|
+
if (!groupValue || typeof groupValue !== "object") return;
|
|
75
|
+
if (groupKey === "designSystems") return;
|
|
76
|
+
groups.push({
|
|
77
|
+
id: groupKey,
|
|
78
|
+
label: humanizeGroupKey(groupKey),
|
|
79
|
+
description: toNonEmptyString(groupValue.description) || void 0,
|
|
80
|
+
category: "Assistant"
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
return groups.sort((a, b) => a.label.localeCompare(b.label));
|
|
84
|
+
}
|
|
85
|
+
function resolveSettingsUrl(form, parentGroup, key) {
|
|
86
|
+
const direct = toNonEmptyString(form[key]);
|
|
87
|
+
if (direct) return direct;
|
|
88
|
+
const inherited = parentGroup ? toNonEmptyString(parentGroup[key]) : "";
|
|
89
|
+
return inherited || void 0;
|
|
90
|
+
}
|
|
91
|
+
function resolveCoverImageUrl(form, parentGroup) {
|
|
92
|
+
return toNonEmptyString(form.coverImageUrl) || toNonEmptyString(form.previewImageUrl) || toNonEmptyString(parentGroup == null ? void 0 : parentGroup.coverImageUrl) || void 0;
|
|
93
|
+
}
|
|
94
|
+
function formHasOwnPreviewableUrl(form) {
|
|
95
|
+
return Boolean(toNonEmptyString(form.previewUrl) || toNonEmptyString(form.deployUrl));
|
|
96
|
+
}
|
|
97
|
+
function resolveSnapshotId(form, group) {
|
|
98
|
+
return toNonEmptyString(form.snapshotId) || toNonEmptyString(form.sourceSnapshotId) || (group ? toNonEmptyString(group.snapshotId) : "") || void 0;
|
|
99
|
+
}
|
|
100
|
+
function resolveStackHint(form, group) {
|
|
101
|
+
return toNonEmptyString(form.templateName) || toNonEmptyString(form.projectType) || (group ? toNonEmptyString(group.templateName) : "") || void 0;
|
|
102
|
+
}
|
|
103
|
+
function extractGroupTemplateCards(payload) {
|
|
104
|
+
var _a, _b;
|
|
105
|
+
const groupObj = unwrapSettingsPayload(payload);
|
|
106
|
+
if (!groupObj) return [];
|
|
107
|
+
const raw = [];
|
|
108
|
+
Object.entries(groupObj).forEach(([templateKey, templateGroup]) => {
|
|
109
|
+
if (!templateGroup || typeof templateGroup !== "object") return;
|
|
110
|
+
const group = templateGroup;
|
|
111
|
+
if (isSettingsEntryDisabled(group)) return;
|
|
112
|
+
const {
|
|
113
|
+
forms
|
|
114
|
+
} = group;
|
|
115
|
+
if (!forms || typeof forms !== "object") return;
|
|
116
|
+
Object.entries(forms).forEach(([formKey, formRaw]) => {
|
|
117
|
+
if (!formRaw || typeof formRaw !== "object") return;
|
|
118
|
+
const form = formRaw;
|
|
119
|
+
if (isSettingsEntryDisabled(form)) return;
|
|
120
|
+
if (!formHasOwnPreviewableUrl(form) && !resolveSnapshotId(form, group)) return;
|
|
121
|
+
const formTemplateId = toNonEmptyString(form.formTemplateId);
|
|
122
|
+
const ownTitle = toNonEmptyString(form.title);
|
|
123
|
+
const title = ownTitle || humanizeFormKey(formKey) || "Untitled";
|
|
124
|
+
const id = formTemplateId || formKey;
|
|
125
|
+
raw.push({
|
|
126
|
+
id,
|
|
127
|
+
title,
|
|
128
|
+
description: toNonEmptyString(form.description) || "Yantra starter template",
|
|
129
|
+
category: toNonEmptyString(form.category) || void 0,
|
|
130
|
+
coverImageUrl: resolveCoverImageUrl(form, group),
|
|
131
|
+
previewUrl: resolveSettingsUrl(form, group, "previewUrl"),
|
|
132
|
+
deployUrl: resolveSettingsUrl(form, group, "deployUrl"),
|
|
133
|
+
chatPrompt: toNonEmptyString(form.chatPrompt) || void 0,
|
|
134
|
+
snapshotId: resolveSnapshotId(form, group),
|
|
135
|
+
templateKey,
|
|
136
|
+
templateName: resolveStackHint(form, group),
|
|
137
|
+
formTemplateId: formTemplateId || void 0
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
const bestByUrl = /* @__PURE__ */ new Map();
|
|
142
|
+
for (const card of raw) {
|
|
143
|
+
const key = (card.previewUrl || card.deployUrl || card.snapshotId || card.id).toLowerCase();
|
|
144
|
+
const existing = bestByUrl.get(key);
|
|
145
|
+
if (!existing || card.title && card.title.length > ((_b = (_a = existing.title) == null ? void 0 : _a.length) != null ? _b : 0)) {
|
|
146
|
+
bestByUrl.set(key, card);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return [...bestByUrl.values()].sort((a, b) => a.title.localeCompare(b.title));
|
|
150
|
+
}export{extractGroupTemplateCards,extractMarketplaceTemplateGroups,normalizeMarketplaceTemplatesPayload,unwrapSettingsPayload};//# sourceMappingURL=buildTemplateCards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildTemplateCards.js","sources":["../../../src/features/templates/buildTemplateCards.ts"],"sourcesContent":["/**\n * Marketplace template helpers for mobile Build mode.\n * Mirrors browser `codeAssistantDefaultTemplates` / webbuilder `listCodeAssistantTemplates`\n * without pulling in browser-only marketplace packages.\n */\n\nexport type MarketplaceTemplateGroup = {\n id: string;\n label: string;\n description?: string;\n category: string;\n};\n\nexport type BuildTemplateCard = {\n id: string;\n title: string;\n description: string;\n category?: string;\n coverImageUrl?: string;\n previewUrl?: string;\n deployUrl?: string;\n chatPrompt?: string;\n snapshotId?: string;\n templateKey?: string;\n /** Stack hint (`vite-react` | `nextjs` | …) when present on the form/group. */\n templateName?: string;\n formTemplateId?: string;\n};\n\nfunction toNonEmptyString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction isSettingsEntryDisabled(value: Record<string, unknown>): boolean {\n return value.enabled === false || value.enabled === 'false' || value.enable === false || value.enable === 'false';\n}\n\nfunction humanizeGroupKey(key: string): string {\n const spaced = key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim();\n if (!spaced) return key;\n return spaced.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction humanizeFormKey(key: string): string {\n return humanizeGroupKey(key);\n}\n\n/** Unwrap immediate-mode `{ settings, keysPage, keys }` payloads to the settings map. */\nexport function unwrapSettingsPayload(payload: unknown): Record<string, unknown> | null {\n const wrapper = payload as Record<string, unknown> | undefined;\n if (!wrapper || typeof wrapper !== 'object') return null;\n if (wrapper.settings && typeof wrapper.settings === 'object') {\n return wrapper.settings as Record<string, unknown>;\n }\n return wrapper;\n}\n\n/**\n * Lift grafted `marketplace.templates` over lean route payloads (browser parity).\n */\nexport function normalizeMarketplaceTemplatesPayload(payload: Record<string, unknown>): Record<string, unknown> {\n const grafted = (payload as { marketplace?: { templates?: unknown } })?.marketplace?.templates;\n if (!grafted || typeof grafted !== 'object') return payload;\n const {\n marketplace: _marketplace,\n aisearch: _aisearch,\n credential: _credential,\n appSettings: _appSettings,\n ...leanGroups\n } = payload;\n return { ...leanGroups, ...(grafted as Record<string, unknown>) };\n}\n\nexport function extractMarketplaceTemplateGroups(payload: unknown): MarketplaceTemplateGroup[] {\n const raw = unwrapSettingsPayload(payload);\n if (!raw) return [];\n const groupsMap = normalizeMarketplaceTemplatesPayload(raw);\n const groups: MarketplaceTemplateGroup[] = [];\n\n Object.entries(groupsMap).forEach(([groupKey, groupValue]) => {\n if (!groupValue || typeof groupValue !== 'object') return;\n if (groupKey === 'designSystems') return;\n groups.push({\n id: groupKey,\n label: humanizeGroupKey(groupKey),\n description: toNonEmptyString((groupValue as Record<string, unknown>).description) || undefined,\n category: 'Assistant',\n });\n });\n\n return groups.sort((a, b) => a.label.localeCompare(b.label));\n}\n\nfunction resolveSettingsUrl(\n form: Record<string, unknown>,\n parentGroup: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const direct = toNonEmptyString(form[key]);\n if (direct) return direct;\n const inherited = parentGroup ? toNonEmptyString(parentGroup[key]) : '';\n return inherited || undefined;\n}\n\nfunction resolveCoverImageUrl(\n form: Record<string, unknown>,\n parentGroup?: Record<string, unknown>,\n): string | undefined {\n return (\n toNonEmptyString(form.coverImageUrl) ||\n toNonEmptyString(form.previewImageUrl) ||\n toNonEmptyString(parentGroup?.coverImageUrl) ||\n undefined\n );\n}\n\nfunction formHasOwnPreviewableUrl(form: Record<string, unknown>): boolean {\n return Boolean(toNonEmptyString(form.previewUrl) || toNonEmptyString(form.deployUrl));\n}\n\nfunction resolveSnapshotId(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {\n return (\n toNonEmptyString(form.snapshotId) ||\n toNonEmptyString(form.sourceSnapshotId) ||\n (group ? toNonEmptyString(group.snapshotId) : '') ||\n undefined\n );\n}\n\nfunction resolveStackHint(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {\n return (\n toNonEmptyString(form.templateName) ||\n toNonEmptyString(form.projectType) ||\n (group ? toNonEmptyString(group.templateName) : '') ||\n undefined\n );\n}\n\n/**\n * Map `marketplace.templates.<group>` → remixable cards (preview/deploy URL required).\n */\nexport function extractGroupTemplateCards(payload: unknown): BuildTemplateCard[] {\n const groupObj = unwrapSettingsPayload(payload);\n if (!groupObj) return [];\n\n const raw: BuildTemplateCard[] = [];\n\n Object.entries(groupObj).forEach(([templateKey, templateGroup]) => {\n if (!templateGroup || typeof templateGroup !== 'object') return;\n const group = templateGroup as Record<string, unknown>;\n if (isSettingsEntryDisabled(group)) return;\n\n const { forms } = group;\n if (!forms || typeof forms !== 'object') return;\n\n Object.entries(forms as Record<string, unknown>).forEach(([formKey, formRaw]) => {\n if (!formRaw || typeof formRaw !== 'object') return;\n const form = formRaw as Record<string, unknown>;\n if (isSettingsEntryDisabled(form)) return;\n if (!formHasOwnPreviewableUrl(form) && !resolveSnapshotId(form, group)) return;\n\n const formTemplateId = toNonEmptyString(form.formTemplateId);\n const ownTitle = toNonEmptyString(form.title);\n const title = ownTitle || humanizeFormKey(formKey) || 'Untitled';\n const id = formTemplateId || formKey;\n\n raw.push({\n id,\n title,\n description: toNonEmptyString(form.description) || 'Yantra starter template',\n category: toNonEmptyString(form.category) || undefined,\n coverImageUrl: resolveCoverImageUrl(form, group),\n previewUrl: resolveSettingsUrl(form, group, 'previewUrl'),\n deployUrl: resolveSettingsUrl(form, group, 'deployUrl'),\n chatPrompt: toNonEmptyString(form.chatPrompt) || undefined,\n snapshotId: resolveSnapshotId(form, group),\n templateKey,\n templateName: resolveStackHint(form, group),\n formTemplateId: formTemplateId || undefined,\n });\n });\n });\n\n // Dedupe by preview/deploy URL — titled card wins.\n const bestByUrl = new Map<string, BuildTemplateCard>();\n for (const card of raw) {\n const key = (card.previewUrl || card.deployUrl || card.snapshotId || card.id).toLowerCase();\n const existing = bestByUrl.get(key);\n if (!existing || (card.title && card.title.length > (existing.title?.length ?? 0))) {\n bestByUrl.set(key, card);\n }\n }\n\n return [...bestByUrl.values()].sort((a, b) => a.title.localeCompare(b.title));\n}\n\nexport function defaultCloneTemplateDescription(templateDetailTitle: string): string {\n const title = templateDetailTitle.trim() || 'Template';\n return `Create project based on ${title} template`;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace template helpers for mobile Build mode.
|
|
3
|
+
* Mirrors browser `codeAssistantDefaultTemplates` / webbuilder `listCodeAssistantTemplates`
|
|
4
|
+
* without pulling in browser-only marketplace packages.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export type MarketplaceTemplateGroup = {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
category: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type BuildTemplateCard = {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
category?: string;
|
|
19
|
+
coverImageUrl?: string;
|
|
20
|
+
previewUrl?: string;
|
|
21
|
+
deployUrl?: string;
|
|
22
|
+
chatPrompt?: string;
|
|
23
|
+
snapshotId?: string;
|
|
24
|
+
templateKey?: string;
|
|
25
|
+
/** Stack hint (`vite-react` | `nextjs` | …) when present on the form/group. */
|
|
26
|
+
templateName?: string;
|
|
27
|
+
formTemplateId?: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
function toNonEmptyString(value: unknown): string {
|
|
31
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function isSettingsEntryDisabled(value: Record<string, unknown>): boolean {
|
|
35
|
+
return value.enabled === false || value.enabled === 'false' || value.enable === false || value.enable === 'false';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function humanizeGroupKey(key: string): string {
|
|
39
|
+
const spaced = key
|
|
40
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
41
|
+
.replace(/[_-]+/g, ' ')
|
|
42
|
+
.trim();
|
|
43
|
+
if (!spaced) return key;
|
|
44
|
+
return spaced.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function humanizeFormKey(key: string): string {
|
|
48
|
+
return humanizeGroupKey(key);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Unwrap immediate-mode `{ settings, keysPage, keys }` payloads to the settings map. */
|
|
52
|
+
export function unwrapSettingsPayload(payload: unknown): Record<string, unknown> | null {
|
|
53
|
+
const wrapper = payload as Record<string, unknown> | undefined;
|
|
54
|
+
if (!wrapper || typeof wrapper !== 'object') return null;
|
|
55
|
+
if (wrapper.settings && typeof wrapper.settings === 'object') {
|
|
56
|
+
return wrapper.settings as Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
return wrapper;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Lift grafted `marketplace.templates` over lean route payloads (browser parity).
|
|
63
|
+
*/
|
|
64
|
+
export function normalizeMarketplaceTemplatesPayload(payload: Record<string, unknown>): Record<string, unknown> {
|
|
65
|
+
const grafted = (payload as { marketplace?: { templates?: unknown } })?.marketplace?.templates;
|
|
66
|
+
if (!grafted || typeof grafted !== 'object') return payload;
|
|
67
|
+
const {
|
|
68
|
+
marketplace: _marketplace,
|
|
69
|
+
aisearch: _aisearch,
|
|
70
|
+
credential: _credential,
|
|
71
|
+
appSettings: _appSettings,
|
|
72
|
+
...leanGroups
|
|
73
|
+
} = payload;
|
|
74
|
+
return { ...leanGroups, ...(grafted as Record<string, unknown>) };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function extractMarketplaceTemplateGroups(payload: unknown): MarketplaceTemplateGroup[] {
|
|
78
|
+
const raw = unwrapSettingsPayload(payload);
|
|
79
|
+
if (!raw) return [];
|
|
80
|
+
const groupsMap = normalizeMarketplaceTemplatesPayload(raw);
|
|
81
|
+
const groups: MarketplaceTemplateGroup[] = [];
|
|
82
|
+
|
|
83
|
+
Object.entries(groupsMap).forEach(([groupKey, groupValue]) => {
|
|
84
|
+
if (!groupValue || typeof groupValue !== 'object') return;
|
|
85
|
+
if (groupKey === 'designSystems') return;
|
|
86
|
+
groups.push({
|
|
87
|
+
id: groupKey,
|
|
88
|
+
label: humanizeGroupKey(groupKey),
|
|
89
|
+
description: toNonEmptyString((groupValue as Record<string, unknown>).description) || undefined,
|
|
90
|
+
category: 'Assistant',
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
return groups.sort((a, b) => a.label.localeCompare(b.label));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function resolveSettingsUrl(
|
|
98
|
+
form: Record<string, unknown>,
|
|
99
|
+
parentGroup: Record<string, unknown> | undefined,
|
|
100
|
+
key: string,
|
|
101
|
+
): string | undefined {
|
|
102
|
+
const direct = toNonEmptyString(form[key]);
|
|
103
|
+
if (direct) return direct;
|
|
104
|
+
const inherited = parentGroup ? toNonEmptyString(parentGroup[key]) : '';
|
|
105
|
+
return inherited || undefined;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function resolveCoverImageUrl(
|
|
109
|
+
form: Record<string, unknown>,
|
|
110
|
+
parentGroup?: Record<string, unknown>,
|
|
111
|
+
): string | undefined {
|
|
112
|
+
return (
|
|
113
|
+
toNonEmptyString(form.coverImageUrl) ||
|
|
114
|
+
toNonEmptyString(form.previewImageUrl) ||
|
|
115
|
+
toNonEmptyString(parentGroup?.coverImageUrl) ||
|
|
116
|
+
undefined
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function formHasOwnPreviewableUrl(form: Record<string, unknown>): boolean {
|
|
121
|
+
return Boolean(toNonEmptyString(form.previewUrl) || toNonEmptyString(form.deployUrl));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function resolveSnapshotId(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {
|
|
125
|
+
return (
|
|
126
|
+
toNonEmptyString(form.snapshotId) ||
|
|
127
|
+
toNonEmptyString(form.sourceSnapshotId) ||
|
|
128
|
+
(group ? toNonEmptyString(group.snapshotId) : '') ||
|
|
129
|
+
undefined
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function resolveStackHint(form: Record<string, unknown>, group?: Record<string, unknown>): string | undefined {
|
|
134
|
+
return (
|
|
135
|
+
toNonEmptyString(form.templateName) ||
|
|
136
|
+
toNonEmptyString(form.projectType) ||
|
|
137
|
+
(group ? toNonEmptyString(group.templateName) : '') ||
|
|
138
|
+
undefined
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Map `marketplace.templates.<group>` → remixable cards (preview/deploy URL required).
|
|
144
|
+
*/
|
|
145
|
+
export function extractGroupTemplateCards(payload: unknown): BuildTemplateCard[] {
|
|
146
|
+
const groupObj = unwrapSettingsPayload(payload);
|
|
147
|
+
if (!groupObj) return [];
|
|
148
|
+
|
|
149
|
+
const raw: BuildTemplateCard[] = [];
|
|
150
|
+
|
|
151
|
+
Object.entries(groupObj).forEach(([templateKey, templateGroup]) => {
|
|
152
|
+
if (!templateGroup || typeof templateGroup !== 'object') return;
|
|
153
|
+
const group = templateGroup as Record<string, unknown>;
|
|
154
|
+
if (isSettingsEntryDisabled(group)) return;
|
|
155
|
+
|
|
156
|
+
const { forms } = group;
|
|
157
|
+
if (!forms || typeof forms !== 'object') return;
|
|
158
|
+
|
|
159
|
+
Object.entries(forms as Record<string, unknown>).forEach(([formKey, formRaw]) => {
|
|
160
|
+
if (!formRaw || typeof formRaw !== 'object') return;
|
|
161
|
+
const form = formRaw as Record<string, unknown>;
|
|
162
|
+
if (isSettingsEntryDisabled(form)) return;
|
|
163
|
+
if (!formHasOwnPreviewableUrl(form) && !resolveSnapshotId(form, group)) return;
|
|
164
|
+
|
|
165
|
+
const formTemplateId = toNonEmptyString(form.formTemplateId);
|
|
166
|
+
const ownTitle = toNonEmptyString(form.title);
|
|
167
|
+
const title = ownTitle || humanizeFormKey(formKey) || 'Untitled';
|
|
168
|
+
const id = formTemplateId || formKey;
|
|
169
|
+
|
|
170
|
+
raw.push({
|
|
171
|
+
id,
|
|
172
|
+
title,
|
|
173
|
+
description: toNonEmptyString(form.description) || 'Yantra starter template',
|
|
174
|
+
category: toNonEmptyString(form.category) || undefined,
|
|
175
|
+
coverImageUrl: resolveCoverImageUrl(form, group),
|
|
176
|
+
previewUrl: resolveSettingsUrl(form, group, 'previewUrl'),
|
|
177
|
+
deployUrl: resolveSettingsUrl(form, group, 'deployUrl'),
|
|
178
|
+
chatPrompt: toNonEmptyString(form.chatPrompt) || undefined,
|
|
179
|
+
snapshotId: resolveSnapshotId(form, group),
|
|
180
|
+
templateKey,
|
|
181
|
+
templateName: resolveStackHint(form, group),
|
|
182
|
+
formTemplateId: formTemplateId || undefined,
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// Dedupe by preview/deploy URL — titled card wins.
|
|
188
|
+
const bestByUrl = new Map<string, BuildTemplateCard>();
|
|
189
|
+
for (const card of raw) {
|
|
190
|
+
const key = (card.previewUrl || card.deployUrl || card.snapshotId || card.id).toLowerCase();
|
|
191
|
+
const existing = bestByUrl.get(key);
|
|
192
|
+
if (!existing || (card.title && card.title.length > (existing.title?.length ?? 0))) {
|
|
193
|
+
bestByUrl.set(key, card);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return [...bestByUrl.values()].sort((a, b) => a.title.localeCompare(b.title));
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function defaultCloneTemplateDescription(templateDetailTitle: string): string {
|
|
201
|
+
const title = templateDetailTitle.trim() || 'Template';
|
|
202
|
+
return `Create project based on ${title} template`;
|
|
203
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './buildTemplateCards';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {useSettings}from'@adminide-stack/platform-client';import {ConfigurationTarget,ContributionSchemaId}from'common';import {useMemo}from'react';import {extractGroupTemplateCards}from'../features/templates/buildTemplateCards.js';import {settingsUriForOrg}from'../utils/cdecodeUri.js';function useMarketplaceTemplateCards({
|
|
2
|
+
group = "",
|
|
3
|
+
orgName,
|
|
4
|
+
enabled = true
|
|
5
|
+
}) {
|
|
6
|
+
const selectedGroup = (group != null ? group : "").trim();
|
|
7
|
+
const slug = (orgName != null ? orgName : "").trim();
|
|
8
|
+
const canFetch = enabled && Boolean(selectedGroup) && Boolean(slug);
|
|
9
|
+
const resourceUri = useMemo(() => canFetch ? settingsUriForOrg(slug) : void 0, [canFetch, slug]);
|
|
10
|
+
const {
|
|
11
|
+
data,
|
|
12
|
+
settings,
|
|
13
|
+
loading,
|
|
14
|
+
error
|
|
15
|
+
} = useSettings({
|
|
16
|
+
resourceUri,
|
|
17
|
+
skip: !canFetch || !resourceUri,
|
|
18
|
+
options: {
|
|
19
|
+
schemaId: ContributionSchemaId.UiLayout,
|
|
20
|
+
configKey: `marketplace.templates.${selectedGroup}`,
|
|
21
|
+
includeMarketplace: true,
|
|
22
|
+
target: ConfigurationTarget.ORGANIZATION
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const payload = data != null ? data : settings;
|
|
26
|
+
const cards = useMemo(() => canFetch ? extractGroupTemplateCards(payload) : [], [canFetch, payload]);
|
|
27
|
+
return {
|
|
28
|
+
cards,
|
|
29
|
+
loading: canFetch ? loading : false,
|
|
30
|
+
error: canFetch ? error : void 0
|
|
31
|
+
};
|
|
32
|
+
}export{useMarketplaceTemplateCards};//# sourceMappingURL=useMarketplaceTemplateCards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMarketplaceTemplateCards.js","sources":["../../src/hooks/useMarketplaceTemplateCards.ts"],"sourcesContent":["import { useSettings } from '@adminide-stack/platform-client';\nimport { ConfigurationTarget, ContributionSchemaId } from 'common';\nimport { useMemo } from 'react';\nimport { extractGroupTemplateCards, type BuildTemplateCard } from '../features/templates/buildTemplateCards';\nimport { settingsUriForOrg, type SettingsUriInput } from '../utils/cdecodeUri';\n\nexport type UseMarketplaceTemplateCardsOptions = {\n /** Selected marketplace group key (e.g. `codeAssistant`). */\n group?: string | null;\n orgName?: string | null;\n enabled?: boolean;\n};\n\nexport type UseMarketplaceTemplateCardsReturn = {\n cards: BuildTemplateCard[];\n loading: boolean;\n error: unknown;\n};\n\n/**\n * Cards under `marketplace.templates.<group>` for Build mode — browser\n * `useDefaultFormTemplateCards` parity (includes `snapshotId` for webbuilder remix).\n */\nexport function useMarketplaceTemplateCards({\n group = '',\n orgName,\n enabled = true,\n}: UseMarketplaceTemplateCardsOptions): UseMarketplaceTemplateCardsReturn {\n const selectedGroup = (group ?? '').trim();\n const slug = (orgName ?? '').trim();\n const canFetch = enabled && Boolean(selectedGroup) && Boolean(slug);\n\n const resourceUri: SettingsUriInput | undefined = useMemo(\n () => (canFetch ? settingsUriForOrg(slug) : undefined),\n [canFetch, slug],\n );\n\n const { data, settings, loading, error } = useSettings({\n resourceUri: resourceUri as never,\n skip: !canFetch || !resourceUri,\n options: {\n schemaId: ContributionSchemaId.UiLayout,\n configKey: `marketplace.templates.${selectedGroup}`,\n includeMarketplace: true,\n target: ConfigurationTarget.ORGANIZATION,\n },\n });\n\n // See useMarketplaceTemplateGroups — prefer scoped `data`, fall back to raw settings subtree.\n const payload = data ?? settings;\n\n const cards = useMemo(() => (canFetch ? extractGroupTemplateCards(payload) : []), [canFetch, payload]);\n\n return {\n cards,\n loading: canFetch ? loading : false,\n error: canFetch ? error : undefined,\n };\n}\n"],"names":[],"mappings":"+RAqBO,SAAS,2BAA4B,CAAA;AAAA,EAC1C,KAAQ,GAAA,EAAA;AAAA,EACR,OAAA;AAAA,EACA,OAAU,GAAA;AACZ,CAA0E,EAAA;AACxE,EAAM,MAAA,aAAA,GAAA,CAAiB,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,EAAA,EAAI,IAAK,EAAA;AACzC,EAAM,MAAA,IAAA,GAAA,CAAQ,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,EAAA,EAAI,IAAK,EAAA;AAClC,EAAA,MAAM,WAAW,OAAW,IAAA,OAAA,CAAQ,aAAa,CAAA,IAAK,QAAQ,IAAI,CAAA;AAClE,EAAM,MAAA,WAAA,GAA4C,OAAQ,CAAA,MAAM,QAAW,GAAA,iBAAA,CAAkB,IAAI,CAAA,GAAI,MAAW,EAAA,CAAC,QAAU,EAAA,IAAI,CAAC,CAAA;AAChI,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,MACE,WAAY,CAAA;AAAA,IACd,WAAA;AAAA,IACA,IAAA,EAAM,CAAC,QAAA,IAAY,CAAC,WAAA;AAAA,IACpB,OAAS,EAAA;AAAA,MACP,UAAU,oBAAqB,CAAA,QAAA;AAAA,MAC/B,SAAA,EAAW,yBAAyB,aAAa,CAAA,CAAA;AAAA,MACjD,kBAAoB,EAAA,IAAA;AAAA,MACpB,QAAQ,mBAAoB,CAAA;AAAA;AAC9B,GACD,CAAA;AAGD,EAAA,MAAM,UAAU,IAAQ,IAAA,IAAA,GAAA,IAAA,GAAA,QAAA;AACxB,EAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,yBAA0B,CAAA,OAAO,CAAI,GAAA,EAAI,EAAA,CAAC,QAAU,EAAA,OAAO,CAAC,CAAA;AACnG,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,OAAA,EAAS,WAAW,OAAU,GAAA,KAAA;AAAA,IAC9B,KAAA,EAAO,WAAW,KAAQ,GAAA;AAAA,GAC5B;AACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {useSettings}from'@adminide-stack/platform-client';import {ConfigurationTarget,ContributionSchemaId}from'common';import {useMemo}from'react';import {extractMarketplaceTemplateGroups}from'../features/templates/buildTemplateCards.js';import {settingsUriForOrg}from'../utils/cdecodeUri.js';function useMarketplaceTemplateGroups({
|
|
2
|
+
orgName,
|
|
3
|
+
enabled = true
|
|
4
|
+
}) {
|
|
5
|
+
const slug = (orgName != null ? orgName : "").trim();
|
|
6
|
+
const canFetch = enabled && Boolean(slug);
|
|
7
|
+
const resourceUri = useMemo(() => canFetch ? settingsUriForOrg(slug) : void 0, [canFetch, slug]);
|
|
8
|
+
const {
|
|
9
|
+
data,
|
|
10
|
+
settings,
|
|
11
|
+
loading,
|
|
12
|
+
error
|
|
13
|
+
} = useSettings({
|
|
14
|
+
resourceUri,
|
|
15
|
+
skip: !canFetch || !resourceUri,
|
|
16
|
+
options: {
|
|
17
|
+
schemaId: ContributionSchemaId.UiLayout,
|
|
18
|
+
configKey: "marketplace.templates",
|
|
19
|
+
includeMarketplace: true,
|
|
20
|
+
// Group keys only — values collapse to `{}` (browser modal lists by key).
|
|
21
|
+
depth: 1,
|
|
22
|
+
target: ConfigurationTarget.ORGANIZATION
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const payload = data != null ? data : settings;
|
|
26
|
+
const groups = useMemo(() => canFetch ? extractMarketplaceTemplateGroups(payload) : [], [canFetch, payload]);
|
|
27
|
+
return {
|
|
28
|
+
groups,
|
|
29
|
+
loading: canFetch ? loading : false,
|
|
30
|
+
error: canFetch ? error : void 0
|
|
31
|
+
};
|
|
32
|
+
}export{useMarketplaceTemplateGroups};//# sourceMappingURL=useMarketplaceTemplateGroups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMarketplaceTemplateGroups.js","sources":["../../src/hooks/useMarketplaceTemplateGroups.ts"],"sourcesContent":["import { useSettings } from '@adminide-stack/platform-client';\nimport { ConfigurationTarget, ContributionSchemaId } from 'common';\nimport { useMemo } from 'react';\nimport {\n extractMarketplaceTemplateGroups,\n type MarketplaceTemplateGroup,\n} from '../features/templates/buildTemplateCards';\nimport { settingsUriForOrg, type SettingsUriInput } from '../utils/cdecodeUri';\n\nexport type UseMarketplaceTemplateGroupsOptions = {\n orgName?: string | null;\n enabled?: boolean;\n};\n\nexport type UseMarketplaceTemplateGroupsReturn = {\n groups: MarketplaceTemplateGroup[];\n loading: boolean;\n error: unknown;\n};\n\n/**\n * Lists marketplace template groups (`codeAssistant`, `mediaAssistant`, …)\n * for the Build-mode template picker — browser `useTemplates` parity.\n */\nexport function useMarketplaceTemplateGroups({\n orgName,\n enabled = true,\n}: UseMarketplaceTemplateGroupsOptions): UseMarketplaceTemplateGroupsReturn {\n const slug = (orgName ?? '').trim();\n const canFetch = enabled && Boolean(slug);\n const resourceUri: SettingsUriInput | undefined = useMemo(\n () => (canFetch ? settingsUriForOrg(slug) : undefined),\n [canFetch, slug],\n );\n\n const { data, settings, loading, error } = useSettings({\n resourceUri: resourceUri as never,\n skip: !canFetch || !resourceUri,\n options: {\n schemaId: ContributionSchemaId.UiLayout,\n configKey: 'marketplace.templates',\n includeMarketplace: true,\n // Group keys only — values collapse to `{}` (browser modal lists by key).\n depth: 1,\n target: ConfigurationTarget.ORGANIZATION,\n },\n });\n\n // `useSettings` does lodash get(settings, configKey). When pageSettings already returns the\n // configKey subtree as `settings` (depth comment: `{ codeAssistant: {} }`), that get is\n // undefined — fall back to the raw settings payload.\n const payload = data ?? settings;\n\n const groups = useMemo(() => (canFetch ? extractMarketplaceTemplateGroups(payload) : []), [canFetch, payload]);\n\n return {\n groups,\n loading: canFetch ? loading : false,\n error: canFetch ? error : undefined,\n };\n}\n"],"names":[],"mappings":"sSAmBO,SAAS,4BAA6B,CAAA;AAAA,EAC3C,OAAA;AAAA,EACA,OAAU,GAAA;AACZ,CAA4E,EAAA;AAC1E,EAAM,MAAA,IAAA,GAAA,CAAQ,OAAW,IAAA,IAAA,GAAA,OAAA,GAAA,EAAA,EAAI,IAAK,EAAA;AAClC,EAAM,MAAA,QAAA,GAAW,OAAW,IAAA,OAAA,CAAQ,IAAI,CAAA;AACxC,EAAM,MAAA,WAAA,GAA4C,OAAQ,CAAA,MAAM,QAAW,GAAA,iBAAA,CAAkB,IAAI,CAAA,GAAI,MAAW,EAAA,CAAC,QAAU,EAAA,IAAI,CAAC,CAAA;AAChI,EAAM,MAAA;AAAA,IACJ,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,MACE,WAAY,CAAA;AAAA,IACd,WAAA;AAAA,IACA,IAAA,EAAM,CAAC,QAAA,IAAY,CAAC,WAAA;AAAA,IACpB,OAAS,EAAA;AAAA,MACP,UAAU,oBAAqB,CAAA,QAAA;AAAA,MAC/B,SAAW,EAAA,uBAAA;AAAA,MACX,kBAAoB,EAAA,IAAA;AAAA;AAAA,MAEpB,KAAO,EAAA,CAAA;AAAA,MACP,QAAQ,mBAAoB,CAAA;AAAA;AAC9B,GACD,CAAA;AAKD,EAAA,MAAM,UAAU,IAAQ,IAAA,IAAA,GAAA,IAAA,GAAA,QAAA;AACxB,EAAA,MAAM,MAAS,GAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,gCAAiC,CAAA,OAAO,CAAI,GAAA,EAAI,EAAA,CAAC,QAAU,EAAA,OAAO,CAAC,CAAA;AAC3G,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,OAAA,EAAS,WAAW,OAAU,GAAA,KAAA;AAAA,IAC9B,KAAA,EAAO,WAAW,KAAQ,GAAA;AAAA,GAC5B;AACF"}
|