@adminide-stack/yantra-mobile 12.0.41 → 12.0.42-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/AppsMenu/AppsMenu.js +2 -2
- package/lib/components/AppsMenu/AppsMenu.js.map +1 -1
- package/lib/components/GatewayToolbarButtonMobile.js +3 -4
- package/lib/components/GatewayToolbarButtonMobile.js.map +1 -1
- package/lib/components/KeyboardComposerDock.js +27 -0
- package/lib/components/KeyboardComposerDock.js.map +1 -0
- package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js +6 -0
- package/lib/components/NavigationHeader/ChatHistoryToggleMobile.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderMoreMenu.js +67 -0
- package/lib/components/NavigationHeader/HeaderMoreMenu.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderSettingsMenu.js +132 -0
- package/lib/components/NavigationHeader/HeaderSettingsMenu.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderSheet.js +130 -0
- package/lib/components/NavigationHeader/HeaderSheet.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderSkillsButton.js +120 -0
- package/lib/components/NavigationHeader/HeaderSkillsButton.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderTasksButton.js +157 -0
- package/lib/components/NavigationHeader/HeaderTasksButton.js.map +1 -0
- package/lib/components/NavigationHeader/HeaderToolbarButton.js +68 -0
- package/lib/components/NavigationHeader/HeaderToolbarButton.js.map +1 -0
- package/lib/components/NavigationHeader/NavigationHeader.js +35 -63
- package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
- package/lib/compute.js +1 -1
- package/lib/compute.js.map +1 -1
- package/lib/contexts/GatewayContext.js +8 -1
- package/lib/contexts/GatewayContext.js.map +1 -1
- package/lib/features/chat/temporaryChatStore.js +19 -0
- package/lib/features/chat/temporaryChatStore.js.map +1 -0
- package/lib/hooks/useAgentSessionState.js +5 -0
- package/lib/hooks/useAgentSessionState.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +84 -2
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +22 -1
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +81 -11
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useKeyboardBottomOffset.js +22 -0
- package/lib/hooks/useKeyboardBottomOffset.js.map +1 -0
- package/lib/hooks/useMarketplaceTemplateGroups.js +1 -1
- package/lib/hooks/useMarketplaceTemplateGroups.js.map +1 -1
- package/lib/routes.json +1 -1
- package/lib/screens/Chat/index.js +56 -100
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatHistory/index.js +12 -1
- package/lib/screens/ChatHistory/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +58 -58
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/BuildTemplatesSection.js +12 -33
- package/lib/screens/Home/components/BuildTemplatesSection.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +16 -3
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js +7 -2
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {useState,useMemo,useCallback}from'react';import {ScrollView,StyleSheet,Text,Pressable,View}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useGatewayContext,parseActiveSkills,skillDisplayName}from'../../contexts/GatewayContext.js';import {useAgentSessionState}from'../../hooks/useAgentSessionState.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {HeaderSheet}from'./HeaderSheet.js';import {HeaderToolbarButton}from'./HeaderToolbarButton.js';const BUILTIN_SKILLS = [{
|
|
2
|
+
key: "yantra-github-search",
|
|
3
|
+
name: "GitHub Research",
|
|
4
|
+
description: "Search and summarize relevant GitHub repositories."
|
|
5
|
+
}];
|
|
6
|
+
function SkillsSheet({
|
|
7
|
+
isDark,
|
|
8
|
+
onClose
|
|
9
|
+
}) {
|
|
10
|
+
const {
|
|
11
|
+
activeSkill,
|
|
12
|
+
setActiveSkill
|
|
13
|
+
} = useGatewayContext();
|
|
14
|
+
const cdecli = useCdecliConnection();
|
|
15
|
+
const session = useAgentSessionState();
|
|
16
|
+
const activeKeys = useMemo(() => parseActiveSkills(activeSkill), [activeSkill]);
|
|
17
|
+
const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
|
|
18
|
+
const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
|
|
19
|
+
const rows = useMemo(() => {
|
|
20
|
+
const fromGateway = session.skills.map((skill) => ({
|
|
21
|
+
key: skill.skillKey,
|
|
22
|
+
name: skill.name || skillDisplayName(skill.skillKey),
|
|
23
|
+
description: skill.description || (skill.eligible ? "Available" : "Not eligible")
|
|
24
|
+
}));
|
|
25
|
+
const seen = new Set(fromGateway.map((row) => row.key));
|
|
26
|
+
const extras = BUILTIN_SKILLS.filter((row) => !seen.has(row.key));
|
|
27
|
+
return [...extras, ...fromGateway];
|
|
28
|
+
}, [session.skills]);
|
|
29
|
+
const toggle = useCallback(async (key) => {
|
|
30
|
+
const next = activeKeys.includes(key) ? activeKeys.filter((item) => item !== key) : [...activeKeys, key];
|
|
31
|
+
const csv = next.length > 0 ? next.join(",") : null;
|
|
32
|
+
setActiveSkill(csv);
|
|
33
|
+
if (csv && cdecli.cdecliSelected) {
|
|
34
|
+
try {
|
|
35
|
+
await cdecli.connectWithSkill(csv);
|
|
36
|
+
} catch (e) {
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}, [activeKeys, cdecli, setActiveSkill]);
|
|
40
|
+
return /* @__PURE__ */ jsx(HeaderSheet, { visible: true, title: "Skills", subtitle: activeKeys.length > 0 ? `${activeKeys.length} active` : "Pick a skill template for this session", isDark, onClose, children: /* @__PURE__ */ jsx(ScrollView, { contentContainerStyle: styles.list, keyboardShouldPersistTaps: "handled", children: rows.length === 0 ? /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
|
|
41
|
+
color: muted
|
|
42
|
+
}], children: "No skill templates yet. Connect Yantra to load gateway skills." }) : rows.map((row) => {
|
|
43
|
+
const selected = activeKeys.includes(row.key);
|
|
44
|
+
return /* @__PURE__ */ jsxs(Pressable, { onPress: () => {
|
|
45
|
+
void toggle(row.key);
|
|
46
|
+
}, style: ({
|
|
47
|
+
pressed
|
|
48
|
+
}) => [styles.row, selected && styles.rowActive, isDark && selected && styles.rowActiveDark, pressed && styles.pressed], children: [
|
|
49
|
+
/* @__PURE__ */ jsxs(View, { style: styles.rowBody, children: [
|
|
50
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
|
|
51
|
+
color: foreground
|
|
52
|
+
}], numberOfLines: 1, children: row.name }),
|
|
53
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.rowMeta, {
|
|
54
|
+
color: muted
|
|
55
|
+
}], numberOfLines: 2, children: row.description })
|
|
56
|
+
] }),
|
|
57
|
+
selected ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "check", size: 18, color: mobileTokens.color.primary }) : null
|
|
58
|
+
] }, row.key);
|
|
59
|
+
}) }) });
|
|
60
|
+
}
|
|
61
|
+
function HeaderSkillsButton({
|
|
62
|
+
isDark
|
|
63
|
+
}) {
|
|
64
|
+
const {
|
|
65
|
+
activeSkill
|
|
66
|
+
} = useGatewayContext();
|
|
67
|
+
const [open, setOpen] = useState(false);
|
|
68
|
+
const count = parseActiveSkills(activeSkill).length;
|
|
69
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
70
|
+
/* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "puzzle-outline", label: "Skills", badge: count, active: open || count > 0, onPress: () => setOpen(true), accessibilityLabel: "Skill templates", isDark }),
|
|
71
|
+
open ? /* @__PURE__ */ jsx(SkillsSheet, { isDark, onClose: () => setOpen(false) }) : null
|
|
72
|
+
] });
|
|
73
|
+
}
|
|
74
|
+
const styles = StyleSheet.create({
|
|
75
|
+
list: {
|
|
76
|
+
paddingHorizontal: 16,
|
|
77
|
+
paddingBottom: 12,
|
|
78
|
+
gap: 8
|
|
79
|
+
},
|
|
80
|
+
row: {
|
|
81
|
+
flexDirection: "row",
|
|
82
|
+
alignItems: "center",
|
|
83
|
+
gap: 10,
|
|
84
|
+
borderRadius: 12,
|
|
85
|
+
borderWidth: 1,
|
|
86
|
+
borderColor: "transparent",
|
|
87
|
+
paddingHorizontal: 12,
|
|
88
|
+
paddingVertical: 10,
|
|
89
|
+
backgroundColor: mobileTokens.color.surfaceMuted
|
|
90
|
+
},
|
|
91
|
+
rowActive: {
|
|
92
|
+
borderColor: mobileTokens.color.primaryBorder,
|
|
93
|
+
backgroundColor: mobileTokens.color.primarySoft
|
|
94
|
+
},
|
|
95
|
+
rowActiveDark: {
|
|
96
|
+
backgroundColor: "rgba(79,70,229,0.18)"
|
|
97
|
+
},
|
|
98
|
+
pressed: {
|
|
99
|
+
opacity: 0.7
|
|
100
|
+
},
|
|
101
|
+
rowBody: {
|
|
102
|
+
flex: 1,
|
|
103
|
+
minWidth: 0,
|
|
104
|
+
gap: 2
|
|
105
|
+
},
|
|
106
|
+
rowTitle: {
|
|
107
|
+
fontSize: 14,
|
|
108
|
+
fontWeight: "600"
|
|
109
|
+
},
|
|
110
|
+
rowMeta: {
|
|
111
|
+
fontSize: 12,
|
|
112
|
+
lineHeight: 16
|
|
113
|
+
},
|
|
114
|
+
empty: {
|
|
115
|
+
fontSize: 14,
|
|
116
|
+
lineHeight: 20,
|
|
117
|
+
paddingVertical: 20,
|
|
118
|
+
textAlign: "center"
|
|
119
|
+
}
|
|
120
|
+
});export{HeaderSkillsButton};//# sourceMappingURL=HeaderSkillsButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeaderSkillsButton.js","sources":["../../../src/components/NavigationHeader/HeaderSkillsButton.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { parseActiveSkills, skillDisplayName, useGatewayContext } from '../../contexts/GatewayContext';\nimport { useAgentSessionState } from '../../hooks/useAgentSessionState';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { HeaderSheet } from './HeaderSheet';\nimport { HeaderToolbarButton } from './HeaderToolbarButton';\n\ntype Props = {\n isDark: boolean;\n};\n\nconst BUILTIN_SKILLS = [\n {\n key: 'yantra-github-search',\n name: 'GitHub Research',\n description: 'Search and summarize relevant GitHub repositories.',\n },\n];\n\nfunction SkillsSheet({ isDark, onClose }: { isDark: boolean; onClose: () => void }) {\n const { activeSkill, setActiveSkill } = useGatewayContext();\n const cdecli = useCdecliConnection();\n const session = useAgentSessionState();\n const activeKeys = useMemo(() => parseActiveSkills(activeSkill), [activeSkill]);\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n\n const rows = useMemo(() => {\n const fromGateway = session.skills.map((skill) => ({\n key: skill.skillKey,\n name: skill.name || skillDisplayName(skill.skillKey),\n description: skill.description || (skill.eligible ? 'Available' : 'Not eligible'),\n }));\n const seen = new Set(fromGateway.map((row) => row.key));\n const extras = BUILTIN_SKILLS.filter((row) => !seen.has(row.key));\n return [...extras, ...fromGateway];\n }, [session.skills]);\n\n const toggle = useCallback(\n async (key: string) => {\n const next = activeKeys.includes(key) ? activeKeys.filter((item) => item !== key) : [...activeKeys, key];\n const csv = next.length > 0 ? next.join(',') : null;\n setActiveSkill(csv);\n if (csv && cdecli.cdecliSelected) {\n try {\n await cdecli.connectWithSkill(csv);\n } catch {\n /* connectWithSkill already records status on the connection. */\n }\n }\n },\n [activeKeys, cdecli, setActiveSkill],\n );\n\n return (\n <HeaderSheet\n visible\n title=\"Skills\"\n subtitle={activeKeys.length > 0 ? `${activeKeys.length} active` : 'Pick a skill template for this session'}\n isDark={isDark}\n onClose={onClose}\n >\n <ScrollView contentContainerStyle={styles.list} keyboardShouldPersistTaps=\"handled\">\n {rows.length === 0 ? (\n <Text style={[styles.empty, { color: muted }]}>\n No skill templates yet. Connect Yantra to load gateway skills.\n </Text>\n ) : (\n rows.map((row) => {\n const selected = activeKeys.includes(row.key);\n return (\n <Pressable\n key={row.key}\n onPress={() => {\n void toggle(row.key);\n }}\n style={({ pressed }) => [\n styles.row,\n selected && styles.rowActive,\n isDark && selected && styles.rowActiveDark,\n pressed && styles.pressed,\n ]}\n >\n <View style={styles.rowBody}>\n <Text style={[styles.rowTitle, { color: foreground }]} numberOfLines={1}>\n {row.name}\n </Text>\n <Text style={[styles.rowMeta, { color: muted }]} numberOfLines={2}>\n {row.description}\n </Text>\n </View>\n {selected ? (\n <MaterialCommunityIcons name=\"check\" size={18} color={mobileTokens.color.primary} />\n ) : null}\n </Pressable>\n );\n })\n )}\n </ScrollView>\n </HeaderSheet>\n );\n}\n\nexport function HeaderSkillsButton({ isDark }: Props) {\n const { activeSkill } = useGatewayContext();\n const [open, setOpen] = useState(false);\n const count = parseActiveSkills(activeSkill).length;\n\n return (\n <>\n <HeaderToolbarButton\n icon=\"puzzle-outline\"\n label=\"Skills\"\n badge={count}\n active={open || count > 0}\n onPress={() => setOpen(true)}\n accessibilityLabel=\"Skill templates\"\n isDark={isDark}\n />\n {open ? <SkillsSheet isDark={isDark} onClose={() => setOpen(false)} /> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n list: {\n paddingHorizontal: 16,\n paddingBottom: 12,\n gap: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: 'transparent',\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n rowActive: {\n borderColor: mobileTokens.color.primaryBorder,\n backgroundColor: mobileTokens.color.primarySoft,\n },\n rowActiveDark: {\n backgroundColor: 'rgba(79,70,229,0.18)',\n },\n pressed: {\n opacity: 0.7,\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n gap: 2,\n },\n rowTitle: {\n fontSize: 14,\n fontWeight: '600',\n },\n rowMeta: {\n fontSize: 12,\n lineHeight: 16,\n },\n empty: {\n fontSize: 14,\n lineHeight: 20,\n paddingVertical: 20,\n textAlign: 'center',\n },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {useState,useCallback}from'react';import {ScrollView,StyleSheet,Text,Pressable,View}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {MAX_CONCURRENT_TASKS}from'../../config/constants.js';import {useAgentSessionState}from'../../hooks/useAgentSessionState.js';import {agentSessionManager}from'../../services/agentSessionManager.js';import {mobileTokens}from'../../theme/mobileTokens.js';import {HeaderSheet}from'./HeaderSheet.js';import {HeaderToolbarButton}from'./HeaderToolbarButton.js';const STATUS_LABEL = {
|
|
2
|
+
idle: "Idle",
|
|
3
|
+
connecting: "Connecting",
|
|
4
|
+
running: "Running",
|
|
5
|
+
completed: "Completed",
|
|
6
|
+
failed: "Failed",
|
|
7
|
+
aborted: "Aborted"
|
|
8
|
+
};
|
|
9
|
+
function statusColor(status, isDark) {
|
|
10
|
+
if (status === "running" || status === "connecting") return isDark ? "#60a5fa" : "#2563eb";
|
|
11
|
+
if (status === "completed") return isDark ? "#4ade80" : "#16a34a";
|
|
12
|
+
if (status === "failed") return isDark ? "#f87171" : "#dc2626";
|
|
13
|
+
if (status === "aborted") return isDark ? "#fb923c" : "#ea580c";
|
|
14
|
+
return isDark ? "#94a3b8" : mobileTokens.color.textMuted;
|
|
15
|
+
}
|
|
16
|
+
function TaskRow({
|
|
17
|
+
task,
|
|
18
|
+
isActive,
|
|
19
|
+
isDark,
|
|
20
|
+
onSelect,
|
|
21
|
+
onRemove
|
|
22
|
+
}) {
|
|
23
|
+
const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
|
|
24
|
+
const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
|
|
25
|
+
const last = task.messages[task.messages.length - 1];
|
|
26
|
+
const preview = last ? last.content.length > 72 ? `${last.content.slice(0, 72)}\u2026` : last.content : "No messages yet";
|
|
27
|
+
return /* @__PURE__ */ jsxs(Pressable, { onPress: onSelect, style: ({
|
|
28
|
+
pressed
|
|
29
|
+
}) => [styles.row, isActive && styles.rowActive, isDark && isActive && styles.rowActiveDark, pressed && styles.pressed], children: [
|
|
30
|
+
/* @__PURE__ */ jsx(View, { style: [styles.dot, {
|
|
31
|
+
backgroundColor: statusColor(task.status, isDark)
|
|
32
|
+
}] }),
|
|
33
|
+
/* @__PURE__ */ jsxs(View, { style: styles.rowBody, children: [
|
|
34
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.rowTitle, {
|
|
35
|
+
color: foreground
|
|
36
|
+
}], numberOfLines: 1, children: task.title }),
|
|
37
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.rowMeta, {
|
|
38
|
+
color: muted
|
|
39
|
+
}], numberOfLines: 1, children: [
|
|
40
|
+
STATUS_LABEL[task.status],
|
|
41
|
+
" \xB7 ",
|
|
42
|
+
preview
|
|
43
|
+
] })
|
|
44
|
+
] }),
|
|
45
|
+
/* @__PURE__ */ jsx(Pressable, { onPress: onRemove, hitSlop: 8, accessibilityLabel: "Remove task", children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "close", size: 16, color: muted }) })
|
|
46
|
+
] });
|
|
47
|
+
}
|
|
48
|
+
function TasksSheet({
|
|
49
|
+
isDark,
|
|
50
|
+
onClose
|
|
51
|
+
}) {
|
|
52
|
+
const session = useAgentSessionState();
|
|
53
|
+
const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
|
|
54
|
+
const foreground = isDark ? "#e2e8f0" : mobileTokens.color.text;
|
|
55
|
+
const canCreate = session.tasks.length < MAX_CONCURRENT_TASKS;
|
|
56
|
+
const handleNew = useCallback(() => {
|
|
57
|
+
agentSessionManager.createTask({
|
|
58
|
+
title: "General Assistant"
|
|
59
|
+
});
|
|
60
|
+
}, []);
|
|
61
|
+
return /* @__PURE__ */ jsx(HeaderSheet, { visible: true, title: "Tasks", subtitle: session.gatewayConnected ? `${session.tasks.length} of ${MAX_CONCURRENT_TASKS} slots` : "Connect Yantra to keep agent sessions running", isDark, onClose, headerRight: /* @__PURE__ */ jsxs(Pressable, { onPress: handleNew, disabled: !canCreate, accessibilityLabel: "Start new task", style: ({
|
|
62
|
+
pressed
|
|
63
|
+
}) => [styles.newBtn, pressed && styles.pressed, !canCreate && styles.disabled], children: [
|
|
64
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "plus", size: 16, color: mobileTokens.color.primary }),
|
|
65
|
+
/* @__PURE__ */ jsx(Text, { style: styles.newBtnLabel, children: "New" })
|
|
66
|
+
] }), children: /* @__PURE__ */ jsxs(ScrollView, { contentContainerStyle: styles.list, keyboardShouldPersistTaps: "handled", children: [
|
|
67
|
+
session.tasks.length === 0 ? /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
|
|
68
|
+
color: muted
|
|
69
|
+
}], children: "No running tasks. Start one to keep an agent session alive alongside chat." }) : session.tasks.map((task) => /* @__PURE__ */ jsx(TaskRow, { task, isActive: session.activeTaskId === task.id, isDark, onSelect: () => agentSessionManager.setActiveTask(task.id), onRemove: () => agentSessionManager.removeTask(task.id) }, task.id)),
|
|
70
|
+
!session.gatewayConnected ? /* @__PURE__ */ jsx(Text, { style: [styles.hint, {
|
|
71
|
+
color: foreground
|
|
72
|
+
}], children: "Tasks stay on this device until Yantra is connected." }) : null
|
|
73
|
+
] }) });
|
|
74
|
+
}
|
|
75
|
+
function HeaderTasksButton({
|
|
76
|
+
isDark
|
|
77
|
+
}) {
|
|
78
|
+
const session = useAgentSessionState();
|
|
79
|
+
const [open, setOpen] = useState(false);
|
|
80
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
81
|
+
/* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "pulse", label: "Tasks", badge: session.tasks.length, active: open, onPress: () => setOpen(true), accessibilityLabel: "Tasks", isDark }),
|
|
82
|
+
open ? /* @__PURE__ */ jsx(TasksSheet, { isDark, onClose: () => setOpen(false) }) : null
|
|
83
|
+
] });
|
|
84
|
+
}
|
|
85
|
+
const styles = StyleSheet.create({
|
|
86
|
+
list: {
|
|
87
|
+
paddingHorizontal: 16,
|
|
88
|
+
paddingBottom: 12,
|
|
89
|
+
gap: 8
|
|
90
|
+
},
|
|
91
|
+
row: {
|
|
92
|
+
flexDirection: "row",
|
|
93
|
+
alignItems: "center",
|
|
94
|
+
gap: 10,
|
|
95
|
+
borderRadius: 12,
|
|
96
|
+
borderWidth: 1,
|
|
97
|
+
borderColor: "transparent",
|
|
98
|
+
paddingHorizontal: 12,
|
|
99
|
+
paddingVertical: 10,
|
|
100
|
+
backgroundColor: mobileTokens.color.surfaceMuted
|
|
101
|
+
},
|
|
102
|
+
rowActive: {
|
|
103
|
+
borderColor: mobileTokens.color.primaryBorder,
|
|
104
|
+
backgroundColor: mobileTokens.color.primarySoft
|
|
105
|
+
},
|
|
106
|
+
rowActiveDark: {
|
|
107
|
+
backgroundColor: "rgba(79,70,229,0.18)"
|
|
108
|
+
},
|
|
109
|
+
pressed: {
|
|
110
|
+
opacity: 0.7
|
|
111
|
+
},
|
|
112
|
+
disabled: {
|
|
113
|
+
opacity: 0.4
|
|
114
|
+
},
|
|
115
|
+
dot: {
|
|
116
|
+
width: 8,
|
|
117
|
+
height: 8,
|
|
118
|
+
borderRadius: 4
|
|
119
|
+
},
|
|
120
|
+
rowBody: {
|
|
121
|
+
flex: 1,
|
|
122
|
+
minWidth: 0,
|
|
123
|
+
gap: 2
|
|
124
|
+
},
|
|
125
|
+
rowTitle: {
|
|
126
|
+
fontSize: 14,
|
|
127
|
+
fontWeight: "600"
|
|
128
|
+
},
|
|
129
|
+
rowMeta: {
|
|
130
|
+
fontSize: 12
|
|
131
|
+
},
|
|
132
|
+
empty: {
|
|
133
|
+
fontSize: 14,
|
|
134
|
+
lineHeight: 20,
|
|
135
|
+
paddingVertical: 20,
|
|
136
|
+
textAlign: "center"
|
|
137
|
+
},
|
|
138
|
+
hint: {
|
|
139
|
+
fontSize: 12,
|
|
140
|
+
lineHeight: 18,
|
|
141
|
+
paddingTop: 4,
|
|
142
|
+
opacity: 0.7
|
|
143
|
+
},
|
|
144
|
+
newBtn: {
|
|
145
|
+
flexDirection: "row",
|
|
146
|
+
alignItems: "center",
|
|
147
|
+
gap: 2,
|
|
148
|
+
height: 32,
|
|
149
|
+
paddingHorizontal: 8,
|
|
150
|
+
borderRadius: 10
|
|
151
|
+
},
|
|
152
|
+
newBtnLabel: {
|
|
153
|
+
fontSize: 13,
|
|
154
|
+
fontWeight: "600",
|
|
155
|
+
color: mobileTokens.color.primary
|
|
156
|
+
}
|
|
157
|
+
});export{HeaderTasksButton};//# sourceMappingURL=HeaderTasksButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeaderTasksButton.js","sources":["../../../src/components/NavigationHeader/HeaderTasksButton.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { MAX_CONCURRENT_TASKS } from '../../config/constants';\nimport { useAgentSessionState } from '../../hooks/useAgentSessionState';\nimport { agentSessionManager, type AgentTask, type TaskStatus } from '../../services/agentSessionManager';\nimport { mobileTokens } from '../../theme/mobileTokens';\nimport { HeaderSheet } from './HeaderSheet';\nimport { HeaderToolbarButton } from './HeaderToolbarButton';\n\ntype Props = {\n isDark: boolean;\n};\n\nconst STATUS_LABEL: Record<TaskStatus, string> = {\n idle: 'Idle',\n connecting: 'Connecting',\n running: 'Running',\n completed: 'Completed',\n failed: 'Failed',\n aborted: 'Aborted',\n};\n\nfunction statusColor(status: TaskStatus, isDark: boolean): string {\n if (status === 'running' || status === 'connecting') return isDark ? '#60a5fa' : '#2563eb';\n if (status === 'completed') return isDark ? '#4ade80' : '#16a34a';\n if (status === 'failed') return isDark ? '#f87171' : '#dc2626';\n if (status === 'aborted') return isDark ? '#fb923c' : '#ea580c';\n return isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n}\n\nfunction TaskRow({\n task,\n isActive,\n isDark,\n onSelect,\n onRemove,\n}: {\n task: AgentTask;\n isActive: boolean;\n isDark: boolean;\n onSelect: () => void;\n onRemove: () => void;\n}) {\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const last = task.messages[task.messages.length - 1];\n const preview = last\n ? last.content.length > 72\n ? `${last.content.slice(0, 72)}…`\n : last.content\n : 'No messages yet';\n\n return (\n <Pressable\n onPress={onSelect}\n style={({ pressed }) => [\n styles.row,\n isActive && styles.rowActive,\n isDark && isActive && styles.rowActiveDark,\n pressed && styles.pressed,\n ]}\n >\n <View style={[styles.dot, { backgroundColor: statusColor(task.status, isDark) }]} />\n <View style={styles.rowBody}>\n <Text style={[styles.rowTitle, { color: foreground }]} numberOfLines={1}>\n {task.title}\n </Text>\n <Text style={[styles.rowMeta, { color: muted }]} numberOfLines={1}>\n {STATUS_LABEL[task.status]} · {preview}\n </Text>\n </View>\n <Pressable onPress={onRemove} hitSlop={8} accessibilityLabel=\"Remove task\">\n <MaterialCommunityIcons name=\"close\" size={16} color={muted} />\n </Pressable>\n </Pressable>\n );\n}\n\nfunction TasksSheet({ isDark, onClose }: { isDark: boolean; onClose: () => void }) {\n const session = useAgentSessionState();\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const foreground = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const canCreate = session.tasks.length < MAX_CONCURRENT_TASKS;\n\n const handleNew = useCallback(() => {\n agentSessionManager.createTask({ title: 'General Assistant' });\n }, []);\n\n return (\n <HeaderSheet\n visible\n title=\"Tasks\"\n subtitle={\n session.gatewayConnected\n ? `${session.tasks.length} of ${MAX_CONCURRENT_TASKS} slots`\n : 'Connect Yantra to keep agent sessions running'\n }\n isDark={isDark}\n onClose={onClose}\n headerRight={\n <Pressable\n onPress={handleNew}\n disabled={!canCreate}\n accessibilityLabel=\"Start new task\"\n style={({ pressed }) => [styles.newBtn, pressed && styles.pressed, !canCreate && styles.disabled]}\n >\n <MaterialCommunityIcons name=\"plus\" size={16} color={mobileTokens.color.primary} />\n <Text style={styles.newBtnLabel}>New</Text>\n </Pressable>\n }\n >\n <ScrollView contentContainerStyle={styles.list} keyboardShouldPersistTaps=\"handled\">\n {session.tasks.length === 0 ? (\n <Text style={[styles.empty, { color: muted }]}>\n No running tasks. Start one to keep an agent session alive alongside chat.\n </Text>\n ) : (\n session.tasks.map((task) => (\n <TaskRow\n key={task.id}\n task={task}\n isActive={session.activeTaskId === task.id}\n isDark={isDark}\n onSelect={() => agentSessionManager.setActiveTask(task.id)}\n onRemove={() => agentSessionManager.removeTask(task.id)}\n />\n ))\n )}\n {!session.gatewayConnected ? (\n <Text style={[styles.hint, { color: foreground }]}>\n Tasks stay on this device until Yantra is connected.\n </Text>\n ) : null}\n </ScrollView>\n </HeaderSheet>\n );\n}\n\nexport function HeaderTasksButton({ isDark }: Props) {\n const session = useAgentSessionState();\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <HeaderToolbarButton\n icon=\"pulse\"\n label=\"Tasks\"\n badge={session.tasks.length}\n active={open}\n onPress={() => setOpen(true)}\n accessibilityLabel=\"Tasks\"\n isDark={isDark}\n />\n {open ? <TasksSheet isDark={isDark} onClose={() => setOpen(false)} /> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n list: {\n paddingHorizontal: 16,\n paddingBottom: 12,\n gap: 8,\n },\n row: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n borderRadius: 12,\n borderWidth: 1,\n borderColor: 'transparent',\n paddingHorizontal: 12,\n paddingVertical: 10,\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n rowActive: {\n borderColor: mobileTokens.color.primaryBorder,\n backgroundColor: mobileTokens.color.primarySoft,\n },\n rowActiveDark: {\n backgroundColor: 'rgba(79,70,229,0.18)',\n },\n pressed: {\n opacity: 0.7,\n },\n disabled: {\n opacity: 0.4,\n },\n dot: {\n width: 8,\n height: 8,\n borderRadius: 4,\n },\n rowBody: {\n flex: 1,\n minWidth: 0,\n gap: 2,\n },\n rowTitle: {\n fontSize: 14,\n fontWeight: '600',\n },\n rowMeta: {\n fontSize: 12,\n },\n empty: {\n fontSize: 14,\n lineHeight: 20,\n paddingVertical: 20,\n textAlign: 'center',\n },\n hint: {\n fontSize: 12,\n lineHeight: 18,\n paddingTop: 4,\n opacity: 0.7,\n },\n newBtn: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 2,\n height: 32,\n paddingHorizontal: 8,\n borderRadius: 10,\n },\n newBtnLabel: {\n fontSize: 13,\n fontWeight: '600',\n color: mobileTokens.color.primary,\n },\n});\n"],"names":[],"mappings":"ikBAYA,MAAM,YAA2C,GAAA;AAAA,EAC/C,IAAM,EAAA,MAAA;AAAA,EACN,UAAY,EAAA,YAAA;AAAA,EACZ,OAAS,EAAA,SAAA;AAAA,EACT,SAAW,EAAA,WAAA;AAAA,EACX,MAAQ,EAAA,QAAA;AAAA,EACR,OAAS,EAAA;AACX,CAAA;AACA,SAAS,WAAA,CAAY,QAAoB,MAAyB,EAAA;AAChE,EAAA,IAAI,WAAW,SAAa,IAAA,MAAA,KAAW,YAAc,EAAA,OAAO,SAAS,SAAY,GAAA,SAAA;AACjF,EAAA,IAAI,MAAW,KAAA,WAAA,EAAoB,OAAA,MAAA,GAAS,SAAY,GAAA,SAAA;AACxD,EAAA,IAAI,MAAW,KAAA,QAAA,EAAiB,OAAA,MAAA,GAAS,SAAY,GAAA,SAAA;AACrD,EAAA,IAAI,MAAW,KAAA,SAAA,EAAkB,OAAA,MAAA,GAAS,SAAY,GAAA,SAAA;AACtD,EAAO,OAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,SAAA;AACjD;AACA,SAAS,OAAQ,CAAA;AAAA,EACf,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAMG,EAAA;AACD,EAAA,MAAM,UAAa,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,IAAA;AAC3D,EAAA,MAAM,KAAQ,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,SAAA;AACtD,EAAA,MAAM,OAAO,IAAK,CAAA,QAAA,CAAS,IAAK,CAAA,QAAA,CAAS,SAAS,CAAC,CAAA;AACnD,EAAA,MAAM,OAAU,GAAA,IAAA,GAAO,IAAK,CAAA,OAAA,CAAQ,SAAS,EAAK,GAAA,CAAA,EAAG,IAAK,CAAA,OAAA,CAAQ,MAAM,CAAG,EAAA,EAAE,CAAC,CAAA,MAAA,CAAA,GAAM,KAAK,OAAU,GAAA,iBAAA;AACnG,EAAA,uBAAQ,IAAA,CAAA,SAAA,EAAA,EAAU,OAAS,EAAA,QAAA,EAAU,OAAO,CAAC;AAAA,IAC3C;AAAA,GACI,KAAA,CAAC,MAAO,CAAA,GAAA,EAAK,YAAY,MAAO,CAAA,SAAA,EAAW,MAAU,IAAA,QAAA,IAAY,MAAO,CAAA,aAAA,EAAe,OAAW,IAAA,MAAA,CAAO,OAAO,CAC5G,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,GAAK,EAAA;AAAA,MAChC,eAAiB,EAAA,WAAA,CAAY,IAAK,CAAA,MAAA,EAAQ,MAAM;AAAA,KACjD,CAAG,EAAA,CAAA;AAAA,oBACK,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,QAAU,EAAA;AAAA,QACvC,KAAO,EAAA;AAAA,OACR,CAAA,EAAG,aAAe,EAAA,CAAA,EACJ,eAAK,KACV,EAAA,CAAA;AAAA,sBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA;AAAA,QACtC,KAAO,EAAA;AAAA,OACR,CAAG,EAAA,aAAA,EAAe,CACJ,EAAA,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,QAAE,QAAA;AAAA,QAAI;AAAA,OACnC,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,wBACC,SAAU,EAAA,EAAA,OAAA,EAAS,QAAU,EAAA,OAAA,EAAS,GAAG,kBAAmB,EAAA,aAAA,EACzD,QAAC,kBAAA,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,OAAQ,EAAA,IAAA,EAAM,EAAI,EAAA,KAAA,EAAO,OAAO,CACjE,EAAA;AAAA,GACJ,EAAA,CAAA;AACR;AACA,SAAS,UAAW,CAAA;AAAA,EAClB,MAAA;AAAA,EACA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,UAAU,oBAAqB,EAAA;AACrC,EAAA,MAAM,KAAQ,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,SAAA;AACtD,EAAA,MAAM,UAAa,GAAA,MAAA,GAAS,SAAY,GAAA,YAAA,CAAa,KAAM,CAAA,IAAA;AAC3D,EAAM,MAAA,SAAA,GAAY,OAAQ,CAAA,KAAA,CAAM,MAAS,GAAA,oBAAA;AACzC,EAAM,MAAA,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,mBAAA,CAAoB,UAAW,CAAA;AAAA,MAC7B,KAAO,EAAA;AAAA,KACR,CAAA;AAAA,GACH,EAAG,EAAE,CAAA;AACL,EAAA,uBAAQ,GAAA,CAAA,WAAA,EAAA,EAAY,OAAO,EAAA,IAAA,EAAC,KAAM,EAAA,OAAA,EAAQ,QAAU,EAAA,OAAA,CAAQ,gBAAmB,GAAA,CAAA,EAAG,OAAQ,CAAA,KAAA,CAAM,MAAM,CAAO,IAAA,EAAA,oBAAoB,CAAW,MAAA,CAAA,GAAA,+CAAA,EAAiD,MAAgB,EAAA,OAAA,EAAkB,WAAa,kBAAA,IAAA,CAAC,SAAU,EAAA,EAAA,OAAA,EAAS,SAAW,EAAA,QAAA,EAAU,CAAC,SAAA,EAAW,kBAAmB,EAAA,gBAAA,EAAiB,OAAO,CAAC;AAAA,IAC3U;AAAA,GACF,KAAM,CAAC,MAAA,CAAO,MAAQ,EAAA,OAAA,IAAW,MAAO,CAAA,OAAA,EAAS,CAAC,SAAA,IAAa,MAAO,CAAA,QAAQ,CAC5D,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,sBAAA,EAAA,EAAuB,MAAK,MAAO,EAAA,IAAA,EAAM,IAAI,KAAO,EAAA,YAAA,CAAa,MAAM,OAAS,EAAA,CAAA;AAAA,oBAChF,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,aAAa,QAAG,EAAA,KAAA,EAAA;AAAA,GAAA,EACxC,GACJ,QAAC,kBAAA,IAAA,CAAA,UAAA,EAAA,EAAW,uBAAuB,MAAO,CAAA,IAAA,EAAM,2BAA0B,SACrE,EAAA,QAAA,EAAA;AAAA,IAAQ,OAAA,CAAA,KAAA,CAAM,WAAW,CAAI,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,MAClE,KAAO,EAAA;AAAA,KACR,CAAA,EAAG,QAEU,EAAA,4EAAA,EAAA,CAAA,GAAU,QAAQ,KAAM,CAAA,GAAA,CAAI,CAAQ,IAAA,qBAAA,GAAA,CAAC,OAAsB,EAAA,EAAA,IAAA,EAAY,QAAU,EAAA,OAAA,CAAQ,iBAAiB,IAAK,CAAA,EAAA,EAAI,MAAgB,EAAA,QAAA,EAAU,MAAM,mBAAA,CAAoB,aAAc,CAAA,IAAA,CAAK,EAAE,CAAG,EAAA,QAAA,EAAU,MAAM,mBAAA,CAAoB,WAAW,IAAK,CAAA,EAAE,CAAnM,EAAA,EAAA,IAAA,CAAK,EAAiM,CAAE,CAAA;AAAA,IAC7P,CAAC,QAAQ,gBAAmB,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,MAChE,KAAO,EAAA;AAAA,KACR,CAAG,EAAA,QAAA,EAAA,sDAAA,EAEU,CAAU,GAAA;AAAA,GAAA,EAClB,CACJ,EAAA,CAAA;AACR;AACO,SAAS,iBAAkB,CAAA;AAAA,EAChC;AACF,CAAU,EAAA;AACR,EAAA,MAAM,UAAU,oBAAqB,EAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,uBACU,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,uBAAoB,IAAK,EAAA,OAAA,EAAQ,OAAM,OAAQ,EAAA,KAAA,EAAO,QAAQ,KAAM,CAAA,MAAA,EAAQ,MAAQ,EAAA,IAAA,EAAM,SAAS,MAAM,OAAA,CAAQ,IAAI,CAAG,EAAA,kBAAA,EAAmB,SAAQ,MAAgB,EAAA,CAAA;AAAA,IACnK,IAAA,uBAAQ,UAAW,EAAA,EAAA,MAAA,EAAgB,SAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAK,GAAA;AAAA,GAC5E,EAAA,CAAA;AACR;AACA,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,iBAAmB,EAAA,EAAA;AAAA,IACnB,aAAe,EAAA,EAAA;AAAA,IACf,GAAK,EAAA;AAAA,GACP;AAAA,EACA,GAAK,EAAA;AAAA,IACH,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,EAAA;AAAA,IACL,YAAc,EAAA,EAAA;AAAA,IACd,WAAa,EAAA,CAAA;AAAA,IACb,WAAa,EAAA,aAAA;AAAA,IACb,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,eAAA,EAAiB,aAAa,KAAM,CAAA;AAAA,GACtC;AAAA,EACA,SAAW,EAAA;AAAA,IACT,WAAA,EAAa,aAAa,KAAM,CAAA,aAAA;AAAA,IAChC,eAAA,EAAiB,aAAa,KAAM,CAAA;AAAA,GACtC;AAAA,EACA,aAAe,EAAA;AAAA,IACb,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,OAAS,EAAA;AAAA,GACX;AAAA,EACA,QAAU,EAAA;AAAA,IACR,OAAS,EAAA;AAAA,GACX;AAAA,EACA,GAAK,EAAA;AAAA,IACH,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,CAAA;AAAA,IACN,QAAU,EAAA,CAAA;AAAA,IACV,GAAK,EAAA;AAAA,GACP;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,OAAS,EAAA;AAAA,IACP,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,eAAiB,EAAA,EAAA;AAAA,IACjB,SAAW,EAAA;AAAA,GACb;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,UAAY,EAAA,CAAA;AAAA,IACZ,OAAS,EAAA;AAAA,GACX;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,MAAQ,EAAA,EAAA;AAAA,IACR,iBAAmB,EAAA,CAAA;AAAA,IACnB,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,KAAA,EAAO,aAAa,KAAM,CAAA;AAAA;AAE9B,CAAC,CAAA"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {Pressable,StyleSheet,Text,View}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {mobileTokens}from'../../theme/mobileTokens.js';function HeaderToolbarButton({
|
|
2
|
+
icon,
|
|
3
|
+
label,
|
|
4
|
+
trailingIcon,
|
|
5
|
+
active = false,
|
|
6
|
+
badge,
|
|
7
|
+
onPress,
|
|
8
|
+
accessibilityLabel,
|
|
9
|
+
isDark,
|
|
10
|
+
iconColor
|
|
11
|
+
}) {
|
|
12
|
+
const ink = isDark ? "#e2e8f0" : mobileTokens.color.text;
|
|
13
|
+
const muted = isDark ? "#94a3b8" : mobileTokens.color.textMuted;
|
|
14
|
+
const color = iconColor != null ? iconColor : active ? mobileTokens.color.primary : ink;
|
|
15
|
+
const showBadge = typeof badge === "number" && badge > 0;
|
|
16
|
+
return /* @__PURE__ */ jsxs(Pressable, { onPress, accessibilityRole: "button", accessibilityLabel, accessibilityState: {
|
|
17
|
+
selected: active
|
|
18
|
+
}, hitSlop: 4, style: ({
|
|
19
|
+
pressed
|
|
20
|
+
}) => [styles.btn, active && styles.btnActive, pressed && styles.pressed], children: [
|
|
21
|
+
/* @__PURE__ */ jsx(MaterialCommunityIcons, { name: icon, size: 18, color }),
|
|
22
|
+
label ? /* @__PURE__ */ jsx(Text, { style: [styles.label, {
|
|
23
|
+
color
|
|
24
|
+
}], numberOfLines: 1, children: label }) : null,
|
|
25
|
+
trailingIcon ? /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: trailingIcon, size: 14, color: muted }) : null,
|
|
26
|
+
showBadge ? /* @__PURE__ */ jsx(View, { style: [styles.badge, isDark ? styles.badgeDark : null], children: /* @__PURE__ */ jsx(Text, { style: [styles.badgeText, {
|
|
27
|
+
color: muted
|
|
28
|
+
}], children: badge > 9 ? "9+" : badge }) }) : null
|
|
29
|
+
] });
|
|
30
|
+
}
|
|
31
|
+
const styles = StyleSheet.create({
|
|
32
|
+
btn: {
|
|
33
|
+
flexDirection: "row",
|
|
34
|
+
alignItems: "center",
|
|
35
|
+
flexShrink: 0,
|
|
36
|
+
gap: 4,
|
|
37
|
+
height: 36,
|
|
38
|
+
paddingHorizontal: 6,
|
|
39
|
+
borderRadius: 10
|
|
40
|
+
},
|
|
41
|
+
btnActive: {
|
|
42
|
+
backgroundColor: mobileTokens.color.primarySoft
|
|
43
|
+
},
|
|
44
|
+
pressed: {
|
|
45
|
+
opacity: 0.7
|
|
46
|
+
},
|
|
47
|
+
label: {
|
|
48
|
+
fontSize: 13,
|
|
49
|
+
fontWeight: "600",
|
|
50
|
+
letterSpacing: -0.2
|
|
51
|
+
},
|
|
52
|
+
badge: {
|
|
53
|
+
minWidth: 16,
|
|
54
|
+
height: 16,
|
|
55
|
+
paddingHorizontal: 4,
|
|
56
|
+
borderRadius: 8,
|
|
57
|
+
alignItems: "center",
|
|
58
|
+
justifyContent: "center",
|
|
59
|
+
backgroundColor: mobileTokens.color.surfaceMuted
|
|
60
|
+
},
|
|
61
|
+
badgeDark: {
|
|
62
|
+
backgroundColor: "#1e293b"
|
|
63
|
+
},
|
|
64
|
+
badgeText: {
|
|
65
|
+
fontSize: 10,
|
|
66
|
+
fontWeight: "700"
|
|
67
|
+
}
|
|
68
|
+
});export{HeaderToolbarButton};//# sourceMappingURL=HeaderToolbarButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeaderToolbarButton.js","sources":["../../../src/components/NavigationHeader/HeaderToolbarButton.tsx"],"sourcesContent":["/**\n * Ghost toolbar control shared by the ChatTopBar-style mobile header.\n * Icon + optional label + optional chevron, no circular chrome.\n */\nimport React from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { mobileTokens } from '../../theme/mobileTokens';\n\nexport type HeaderToolbarButtonProps = {\n icon: React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n label?: string;\n trailingIcon?: React.ComponentProps<typeof MaterialCommunityIcons>['name'];\n active?: boolean;\n badge?: number;\n onPress: () => void;\n accessibilityLabel: string;\n isDark: boolean;\n iconColor?: string;\n};\n\nexport function HeaderToolbarButton({\n icon,\n label,\n trailingIcon,\n active = false,\n badge,\n onPress,\n accessibilityLabel,\n isDark,\n iconColor,\n}: HeaderToolbarButtonProps) {\n const ink = isDark ? '#e2e8f0' : mobileTokens.color.text;\n const muted = isDark ? '#94a3b8' : mobileTokens.color.textMuted;\n const color = iconColor ?? (active ? mobileTokens.color.primary : ink);\n const showBadge = typeof badge === 'number' && badge > 0;\n\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={accessibilityLabel}\n accessibilityState={{ selected: active }}\n hitSlop={4}\n style={({ pressed }) => [styles.btn, active && styles.btnActive, pressed && styles.pressed]}\n >\n <MaterialCommunityIcons name={icon} size={18} color={color} />\n {label ? (\n <Text style={[styles.label, { color }]} numberOfLines={1}>\n {label}\n </Text>\n ) : null}\n {trailingIcon ? <MaterialCommunityIcons name={trailingIcon} size={14} color={muted} /> : null}\n {showBadge ? (\n <View style={[styles.badge, isDark ? styles.badgeDark : null]}>\n <Text style={[styles.badgeText, { color: muted }]}>{badge > 9 ? '9+' : badge}</Text>\n </View>\n ) : null}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n btn: {\n flexDirection: 'row',\n alignItems: 'center',\n flexShrink: 0,\n gap: 4,\n height: 36,\n paddingHorizontal: 6,\n borderRadius: 10,\n },\n btnActive: {\n backgroundColor: mobileTokens.color.primarySoft,\n },\n pressed: {\n opacity: 0.7,\n },\n label: {\n fontSize: 13,\n fontWeight: '600',\n letterSpacing: -0.2,\n },\n badge: {\n minWidth: 16,\n height: 16,\n paddingHorizontal: 4,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: mobileTokens.color.surfaceMuted,\n },\n badgeDark: {\n backgroundColor: '#1e293b',\n },\n badgeText: {\n fontSize: 10,\n fontWeight: '700',\n },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -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 {AppsMenu}from'../AppsMenu/AppsMenu.js';import {
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import React,{useMemo,useCallback}from'react';import {useColorScheme,StyleSheet,View,ScrollView,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 {AppsMenu}from'../AppsMenu/AppsMenu.js';import {tryWebBuilderBack}from'../../screens/WebBuilder/webbuilderBackHandler.js';import {ChatHistoryToggleMobile}from'./ChatHistoryToggleMobile.js';import {HeaderMoreMenu}from'./HeaderMoreMenu.js';import {HeaderSkillsButton}from'./HeaderSkillsButton.js';import {HeaderTasksButton}from'./HeaderTasksButton.js';import {HeaderToolbarButton}from'./HeaderToolbarButton.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()) {
|
|
@@ -26,22 +26,18 @@ const NavigationHeader = (props) => {
|
|
|
26
26
|
showNewChat = false,
|
|
27
27
|
headerBgColor
|
|
28
28
|
} = props;
|
|
29
|
-
const
|
|
29
|
+
const showChatToolbar = showGateway || showApps;
|
|
30
30
|
const fallbackNav = useNavigation();
|
|
31
31
|
const navigation = navProp != null ? navProp : fallbackNav;
|
|
32
32
|
const colorScheme = useColorScheme();
|
|
33
33
|
const isDark = colorScheme === "dark";
|
|
34
34
|
const insets = useSafeAreaInsets();
|
|
35
35
|
const themeTitleColor = isDark ? "#f1f5f9" : "#0f172a";
|
|
36
|
-
const themeAccentColor = isDark ? "#a5b4fc" : "#4338ca";
|
|
37
|
-
const themeNewChatIconColor = isDark ? "#e5e7eb" : "#000000";
|
|
38
36
|
const optionTint = typeof (options == null ? void 0 : options.headerTintColor) === "string" ? options.headerTintColor : null;
|
|
39
37
|
const tintLooksDark = optionTint && /^(#?000(000)?|black)$/i.test(optionTint.trim());
|
|
40
38
|
const effectiveTint = optionTint && !(isDark && tintLooksDark) ? optionTint : null;
|
|
41
39
|
const titleColor = effectiveTint != null ? effectiveTint : themeTitleColor;
|
|
42
40
|
const iconColor = effectiveTint != null ? effectiveTint : themeTitleColor;
|
|
43
|
-
const accentColor = effectiveTint != null ? effectiveTint : themeAccentColor;
|
|
44
|
-
const newChatIconColor = effectiveTint != null ? effectiveTint : themeNewChatIconColor;
|
|
45
41
|
const surfaceColor = headerBgColor != null ? headerBgColor : isDark ? "#0f172a" : "#ffffff";
|
|
46
42
|
const dividerColor = isDark ? "rgba(148, 163, 184, 0.18)" : "rgba(15, 23, 42, 0.06)";
|
|
47
43
|
const titleAlignLeft = (options == null ? void 0 : options.headerTitleAlign) === "left";
|
|
@@ -101,19 +97,10 @@ const NavigationHeader = (props) => {
|
|
|
101
97
|
}) => [styles.iconButton, pressed && styles.iconButtonPressed], hitSlop: 8, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chevron-left", size: ICON_SIZE + 4, color: iconColor }) }) : showToggle ? /* @__PURE__ */ jsx(Pressable, { onPress: handleToggleDrawer, accessibilityLabel: "Open menu", accessibilityRole: "button", style: ({
|
|
102
98
|
pressed
|
|
103
99
|
}) => [styles.iconButton, pressed && styles.iconButtonPressed], hitSlop: 8, children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "menu", size: ICON_SIZE, color: iconColor }) }) : null;
|
|
104
|
-
const hideBrandTitle =
|
|
100
|
+
const hideBrandTitle = showChatToolbar && title === "Yantra";
|
|
105
101
|
const titleSlot = showTitle && !hideBrandTitle ? /* @__PURE__ */ jsx(Text, { style: [styles.title, titleAlignLeft ? styles.titleAlignLeft : styles.titleAlignCenter, {
|
|
106
102
|
color: titleColor
|
|
107
103
|
}, optionTitleStyle], numberOfLines: 1, ellipsizeMode: "tail", children: title }) : null;
|
|
108
|
-
const showRightSlot = showHistory || showNewChat;
|
|
109
|
-
const rightSlot = showRightSlot ? /* @__PURE__ */ jsxs(View, { style: styles.rightActions, children: [
|
|
110
|
-
showHistory ? /* @__PURE__ */ jsx(Pressable, { onPress: handleOpenChatHistory, style: ({
|
|
111
|
-
pressed
|
|
112
|
-
}) => [styles.actionButton, pressed && styles.actionButtonPressed], accessibilityLabel: "Chat history", accessibilityRole: "button", hitSlop: 8, children: /* @__PURE__ */ jsx(View, { style: [styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "history", size: 19, color: accentColor }) }) }) : null,
|
|
113
|
-
showNewChat ? /* @__PURE__ */ jsx(Pressable, { onPress: handleNewChat, style: ({
|
|
114
|
-
pressed
|
|
115
|
-
}) => [styles.actionButton, pressed && styles.actionButtonPressed], accessibilityLabel: "New chat", accessibilityRole: "button", hitSlop: 8, children: /* @__PURE__ */ jsx(View, { style: [styles.actionButtonInner, isDark ? styles.actionButtonInnerDark : null], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "chat-plus-outline", size: 20, color: newChatIconColor }) }) }) : null
|
|
116
|
-
] }) : null;
|
|
117
104
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
118
105
|
/* @__PURE__ */ jsx(StatusBar, { style: isDark ? "light" : "dark" }),
|
|
119
106
|
/* @__PURE__ */ jsx(SafeAreaView, { edges: ["top"], style: {
|
|
@@ -123,13 +110,17 @@ const NavigationHeader = (props) => {
|
|
|
123
110
|
borderBottomColor: dividerColor,
|
|
124
111
|
paddingTop: insets.top > 0 ? 0 : 6
|
|
125
112
|
}, (_c = options == null ? void 0 : options.headerStyle) != null ? _c : null], children: [
|
|
126
|
-
/* @__PURE__ */
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
/* @__PURE__ */ jsx(View, { style: styles.
|
|
113
|
+
/* @__PURE__ */ jsx(View, { style: styles.leftSlot, children: leftSlot }),
|
|
114
|
+
showChatToolbar ? /* @__PURE__ */ jsxs(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, style: styles.toolsScroll, contentContainerStyle: styles.toolsContent, keyboardShouldPersistTaps: "handled", children: [
|
|
115
|
+
showHistory ? /* @__PURE__ */ jsx(ChatHistoryToggleMobile, { onPress: handleOpenChatHistory, isDark }) : null,
|
|
116
|
+
/* @__PURE__ */ jsx(AppsMenu, { isDark, orgName }),
|
|
117
|
+
/* @__PURE__ */ jsx(HeaderTasksButton, { isDark }),
|
|
118
|
+
/* @__PURE__ */ jsx(HeaderSkillsButton, { isDark })
|
|
119
|
+
] }) : /* @__PURE__ */ jsx(View, { style: [styles.titleSlot, titleAlignLeft && styles.titleSlotLeft], children: titleSlot }),
|
|
120
|
+
/* @__PURE__ */ jsx(View, { style: styles.rightSlot, children: showChatToolbar ? /* @__PURE__ */ jsxs(View, { style: styles.rightActions, children: [
|
|
121
|
+
showGateway ? /* @__PURE__ */ jsx(GatewayConnector, {}) : null,
|
|
122
|
+
/* @__PURE__ */ jsx(HeaderMoreMenu, { isDark, onNewChat: showNewChat ? handleNewChat : void 0 })
|
|
123
|
+
] }) : showNewChat ? /* @__PURE__ */ jsx(HeaderToolbarButton, { icon: "chat-plus-outline", onPress: handleNewChat, accessibilityLabel: "New chat", isDark }) : null })
|
|
133
124
|
] }) })
|
|
134
125
|
] });
|
|
135
126
|
};
|
|
@@ -137,17 +128,28 @@ const styles = StyleSheet.create({
|
|
|
137
128
|
row: {
|
|
138
129
|
flexDirection: "row",
|
|
139
130
|
alignItems: "center",
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
131
|
+
paddingLeft: 4,
|
|
132
|
+
paddingRight: 6,
|
|
133
|
+
paddingVertical: 4,
|
|
134
|
+
minHeight: 48,
|
|
143
135
|
borderBottomWidth: StyleSheet.hairlineWidth,
|
|
144
136
|
overflow: "visible"
|
|
145
137
|
},
|
|
146
138
|
leftSlot: {
|
|
147
139
|
flexDirection: "row",
|
|
148
140
|
alignItems: "center",
|
|
149
|
-
flexShrink: 0
|
|
150
|
-
|
|
141
|
+
flexShrink: 0
|
|
142
|
+
},
|
|
143
|
+
toolsScroll: {
|
|
144
|
+
flex: 1,
|
|
145
|
+
minWidth: 0
|
|
146
|
+
},
|
|
147
|
+
toolsContent: {
|
|
148
|
+
flexDirection: "row",
|
|
149
|
+
alignItems: "center",
|
|
150
|
+
paddingLeft: 2,
|
|
151
|
+
paddingRight: 8,
|
|
152
|
+
gap: 2
|
|
151
153
|
},
|
|
152
154
|
titleSlot: {
|
|
153
155
|
flex: 1,
|
|
@@ -160,14 +162,15 @@ const styles = StyleSheet.create({
|
|
|
160
162
|
alignItems: "flex-start"
|
|
161
163
|
},
|
|
162
164
|
rightSlot: {
|
|
163
|
-
|
|
165
|
+
flexShrink: 0,
|
|
164
166
|
alignItems: "flex-end",
|
|
165
|
-
justifyContent: "center"
|
|
167
|
+
justifyContent: "center",
|
|
168
|
+
paddingLeft: 4
|
|
166
169
|
},
|
|
167
170
|
rightActions: {
|
|
168
171
|
flexDirection: "row",
|
|
169
172
|
alignItems: "center",
|
|
170
|
-
|
|
173
|
+
flexShrink: 0
|
|
171
174
|
},
|
|
172
175
|
title: {
|
|
173
176
|
fontSize: 17,
|
|
@@ -186,41 +189,10 @@ const styles = StyleSheet.create({
|
|
|
186
189
|
height: 36,
|
|
187
190
|
alignItems: "center",
|
|
188
191
|
justifyContent: "center",
|
|
189
|
-
borderRadius:
|
|
192
|
+
borderRadius: 10
|
|
190
193
|
},
|
|
191
194
|
iconButtonPressed: {
|
|
192
195
|
opacity: 0.6
|
|
193
|
-
},
|
|
194
|
-
actionButton: {
|
|
195
|
-
padding: 0,
|
|
196
|
-
alignItems: "center",
|
|
197
|
-
justifyContent: "center",
|
|
198
|
-
borderRadius: 22
|
|
199
|
-
},
|
|
200
|
-
actionButtonPressed: {
|
|
201
|
-
opacity: 0.6
|
|
202
|
-
},
|
|
203
|
-
actionButtonInner: {
|
|
204
|
-
width: 32,
|
|
205
|
-
height: 32,
|
|
206
|
-
borderRadius: 16,
|
|
207
|
-
alignItems: "center",
|
|
208
|
-
justifyContent: "center",
|
|
209
|
-
backgroundColor: mobileTokens.color.surface,
|
|
210
|
-
borderWidth: 1,
|
|
211
|
-
borderColor: mobileTokens.color.border,
|
|
212
|
-
shadowColor: "#0f172a",
|
|
213
|
-
shadowOpacity: 0.08,
|
|
214
|
-
shadowRadius: 5,
|
|
215
|
-
shadowOffset: {
|
|
216
|
-
width: 0,
|
|
217
|
-
height: 2
|
|
218
|
-
},
|
|
219
|
-
elevation: 2
|
|
220
|
-
},
|
|
221
|
-
actionButtonInnerDark: {
|
|
222
|
-
backgroundColor: "#0f172a",
|
|
223
|
-
borderColor: "#334155"
|
|
224
196
|
}
|
|
225
197
|
});
|
|
226
198
|
var NavigationHeader$1 = React.memo(NavigationHeader);export{NavigationHeader$1 as default};//# sourceMappingURL=NavigationHeader.js.map
|