@adminide-stack/yantra-mobile 12.0.52-alpha.0 → 12.0.52-alpha.3
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/CustomDrawer.js +1 -38
- package/lib/components/CustomDrawer.js.map +1 -1
- package/lib/components/KeyboardComposerDock.js +4 -3
- package/lib/components/KeyboardComposerDock.js.map +1 -1
- package/lib/compute.js +58 -1
- package/lib/compute.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +9 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +10 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/attachments/buildGatewayMedia.js +22 -15
- package/lib/features/attachments/buildGatewayMedia.js.map +1 -1
- package/lib/features/attachments/uploadChatAttachments.js +6 -4
- package/lib/features/attachments/uploadChatAttachments.js.map +1 -1
- package/lib/features/attachments/useImageAttachments.js +63 -17
- package/lib/features/attachments/useImageAttachments.js.map +1 -1
- package/lib/features/chat/AskUserCard.js +244 -121
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/ChatTranscript.js +206 -130
- package/lib/features/chat/ChatTranscript.js.map +1 -1
- package/lib/features/chat/askUser.js +111 -15
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/streamingMarkdown.js +7 -0
- package/lib/features/chat/streamingMarkdown.js.map +1 -0
- package/lib/features/chat/transcriptGroups.js +29 -0
- package/lib/features/chat/transcriptGroups.js.map +1 -0
- package/lib/features/messaging/nativeChatRegistry.js +7 -0
- package/lib/features/messaging/nativeChatRegistry.js.map +1 -0
- package/lib/features/messaging/useChatViewer.js +32 -0
- package/lib/features/messaging/useChatViewer.js.map +1 -0
- package/lib/hooks/mintSurfaceSystemToken.js +28 -14
- package/lib/hooks/mintSurfaceSystemToken.js.map +1 -1
- package/lib/hooks/systemTokenJwt.js +75 -0
- package/lib/hooks/systemTokenJwt.js.map +1 -0
- package/lib/hooks/useCdecliAutoConnect.js +116 -138
- package/lib/hooks/useCdecliAutoConnect.js.map +1 -1
- package/lib/hooks/useChatApi.js +43 -17
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +61 -13
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/hooks/useObtainSystemToken.js +121 -36
- package/lib/hooks/useObtainSystemToken.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/routes.json +53 -0
- package/lib/screens/Chat/index.js +25 -6
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/ChatNative/index.js +69 -0
- package/lib/screens/ChatNative/index.js.map +1 -0
- package/lib/screens/Home/HomeScreen.js +21 -6
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/ChatHistoryLanding.js +46 -16
- package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
- package/lib/utils/authUserDisplay.js +37 -0
- package/lib/utils/authUserDisplay.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useMemo,
|
|
1
|
+
import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useMemo,useEffect}from'react';import {View,StyleSheet,Text,Pressable,TextInput}from'react-native';import {formatAskUserAnswers}from'./askUser.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -17,6 +17,19 @@ var __spreadValues = (a, b) => {
|
|
|
17
17
|
return a;
|
|
18
18
|
};
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __restKey = (key) => typeof key === "symbol" ? key : key + "";
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
20
33
|
const ACCENT = "#2563eb";
|
|
21
34
|
const AskUserCard = memo(function AskUserCard2({
|
|
22
35
|
payload,
|
|
@@ -25,7 +38,17 @@ const AskUserCard = memo(function AskUserCard2({
|
|
|
25
38
|
onAnswer,
|
|
26
39
|
onDismiss
|
|
27
40
|
}) {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
const questions = payload.questions;
|
|
43
|
+
const [index, setIndex] = useState(0);
|
|
28
44
|
const [answers, setAnswers] = useState({});
|
|
45
|
+
const [textDraft, setTextDraft] = useState("");
|
|
46
|
+
const inputRef = useRef(null);
|
|
47
|
+
const total = questions.length;
|
|
48
|
+
const question = questions[Math.min(index, Math.max(total - 1, 0))];
|
|
49
|
+
const isLast = index >= total - 1;
|
|
50
|
+
const allowText = (question == null ? void 0 : question.allowText) !== false;
|
|
51
|
+
const multiSelect = (question == null ? void 0 : question.multiSelect) === true;
|
|
29
52
|
const palette = useMemo(() => ({
|
|
30
53
|
card: isDark ? "#111827" : "#ffffff",
|
|
31
54
|
border: isDark ? "#1f2937" : "#e5e7eb",
|
|
@@ -33,109 +56,171 @@ const AskUserCard = memo(function AskUserCard2({
|
|
|
33
56
|
muted: isDark ? "#94a3b8" : "#6b7280",
|
|
34
57
|
optionBg: isDark ? "#0b1220" : "#f9fafb",
|
|
35
58
|
optionBorder: isDark ? "#243045" : "#e5e7eb",
|
|
36
|
-
|
|
59
|
+
chip: isDark ? "#1e293b" : "#f3f4f6",
|
|
60
|
+
chipOn: ACCENT
|
|
37
61
|
}), [isDark]);
|
|
38
|
-
const selectedLabels =
|
|
39
|
-
var
|
|
40
|
-
const raw = (
|
|
62
|
+
const selectedLabels = useMemo(() => {
|
|
63
|
+
var _a2, _b2;
|
|
64
|
+
const raw = (_b2 = answers[(_a2 = question == null ? void 0 : question.id) != null ? _a2 : ""]) != null ? _b2 : "";
|
|
41
65
|
if (!raw.trim()) return [];
|
|
42
|
-
if (!
|
|
66
|
+
if (!multiSelect) return [raw];
|
|
43
67
|
return raw.split(",").map((v) => v.trim()).filter(Boolean);
|
|
44
|
-
}, [answers]);
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const next = parts.includes(label) ? parts.filter((v) => v !== label) : [...parts, label];
|
|
57
|
-
return __spreadProps(__spreadValues({}, prev), {
|
|
58
|
-
[q.id]: next.join(", ")
|
|
59
|
-
});
|
|
68
|
+
}, [answers, question, multiSelect]);
|
|
69
|
+
const lastQuestionIdRef = useRef(null);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
var _a2;
|
|
72
|
+
const q = questions[index];
|
|
73
|
+
if (!q || lastQuestionIdRef.current === q.id) return;
|
|
74
|
+
lastQuestionIdRef.current = q.id;
|
|
75
|
+
const existing = (_a2 = answers[q.id]) != null ? _a2 : "";
|
|
76
|
+
const parts = q.multiSelect ? existing.split(",").map((v) => v.trim()) : [existing];
|
|
77
|
+
const isOptionAnswer = existing !== "" && parts.every((part) => {
|
|
78
|
+
var _a3;
|
|
79
|
+
return (_a3 = q.options) == null ? void 0 : _a3.some((o) => o.label === part);
|
|
60
80
|
});
|
|
61
|
-
|
|
62
|
-
|
|
81
|
+
setTextDraft(isOptionAnswer ? "" : existing);
|
|
82
|
+
}, [index, questions]);
|
|
83
|
+
const record = (value, advance) => {
|
|
84
|
+
if (!question) return;
|
|
63
85
|
setAnswers((prev) => __spreadProps(__spreadValues({}, prev), {
|
|
64
|
-
[
|
|
86
|
+
[question.id]: value
|
|
65
87
|
}));
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
88
|
+
if (!advance) return;
|
|
89
|
+
if (isLast) {
|
|
90
|
+
const formatted = formatAskUserAnswers(questions, __spreadProps(__spreadValues({}, answers), {
|
|
91
|
+
[question.id]: value
|
|
92
|
+
}));
|
|
93
|
+
if (formatted) onAnswer(formatted);
|
|
94
|
+
else onDismiss();
|
|
95
|
+
} else {
|
|
96
|
+
setIndex((i) => i + 1);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const chooseOption = (option) => {
|
|
100
|
+
var _a2;
|
|
101
|
+
if (!question || disabled) return;
|
|
102
|
+
if (option.other) {
|
|
103
|
+
(_a2 = inputRef.current) == null ? void 0 : _a2.focus();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (multiSelect) {
|
|
107
|
+
const next2 = selectedLabels.includes(option.label) ? selectedLabels.filter((l) => l !== option.label) : [...selectedLabels, option.label];
|
|
108
|
+
record(next2.join(", "), false);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
record(option.label, true);
|
|
112
|
+
};
|
|
113
|
+
const currentAnswer = textDraft.trim() || answers[(_a = question == null ? void 0 : question.id) != null ? _a : ""] || "";
|
|
114
|
+
const next = () => {
|
|
115
|
+
if (disabled || !currentAnswer) return;
|
|
116
|
+
record(currentAnswer, true);
|
|
117
|
+
};
|
|
118
|
+
const skip = () => {
|
|
119
|
+
var _a2;
|
|
120
|
+
if (disabled || !question) return;
|
|
121
|
+
setAnswers((prev) => {
|
|
122
|
+
var _a3;
|
|
123
|
+
const _b3 = prev, {
|
|
124
|
+
[_a3 = question.id]: _dropped
|
|
125
|
+
} = _b3, rest = __objRest(_b3, [
|
|
126
|
+
__restKey(_a3)
|
|
127
|
+
]);
|
|
128
|
+
return rest;
|
|
129
|
+
});
|
|
130
|
+
if (isLast) {
|
|
131
|
+
const _b2 = answers, {
|
|
132
|
+
[_a2 = question.id]: _dropped
|
|
133
|
+
} = _b2, rest = __objRest(_b2, [
|
|
134
|
+
__restKey(_a2)
|
|
135
|
+
]);
|
|
136
|
+
const formatted = formatAskUserAnswers(questions, rest);
|
|
137
|
+
if (formatted) onAnswer(formatted);
|
|
138
|
+
else onDismiss();
|
|
139
|
+
} else {
|
|
140
|
+
setIndex((i) => i + 1);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
if (!question) return null;
|
|
69
144
|
return /* @__PURE__ */ jsxs(View, { style: [styles.card, {
|
|
70
145
|
backgroundColor: palette.card,
|
|
71
146
|
borderColor: palette.border
|
|
72
147
|
}], children: [
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
148
|
+
/* @__PURE__ */ jsxs(View, { style: styles.header, children: [
|
|
149
|
+
/* @__PURE__ */ jsxs(Text, { style: [styles.kicker, {
|
|
150
|
+
color: palette.muted
|
|
151
|
+
}], children: [
|
|
152
|
+
"Question ",
|
|
153
|
+
index + 1,
|
|
154
|
+
" of ",
|
|
155
|
+
total
|
|
156
|
+
] }),
|
|
157
|
+
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: "Dismiss", hitSlop: 10, onPress: onDismiss, disabled, style: styles.dismiss, children: /* @__PURE__ */ jsx(Text, { style: [styles.dismissMark, {
|
|
158
|
+
color: palette.muted
|
|
159
|
+
}], children: "\xD7" }) })
|
|
160
|
+
] }),
|
|
161
|
+
question.header ? /* @__PURE__ */ jsx(Text, { style: [styles.eyebrow, {
|
|
162
|
+
color: palette.muted
|
|
163
|
+
}], children: question.header.toUpperCase() }) : null,
|
|
164
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.title, {
|
|
165
|
+
color: palette.title
|
|
166
|
+
}], children: question.title }),
|
|
167
|
+
multiSelect ? /* @__PURE__ */ jsx(Text, { style: [styles.hint, {
|
|
168
|
+
color: palette.muted
|
|
169
|
+
}], children: "Pick as many as apply." }) : null,
|
|
170
|
+
((_b = question.options) != null ? _b : []).map((o, i) => {
|
|
171
|
+
const active = selectedLabels.includes(o.label);
|
|
172
|
+
return /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityState: {
|
|
173
|
+
selected: active,
|
|
174
|
+
disabled
|
|
175
|
+
}, accessibilityLabel: o.detail ? `${o.label}. ${o.detail}` : o.label, disabled, onPress: () => chooseOption(o), style: ({
|
|
176
|
+
pressed
|
|
177
|
+
}) => [styles.option, {
|
|
178
|
+
backgroundColor: active ? `${ACCENT}14` : palette.optionBg,
|
|
179
|
+
borderColor: active ? ACCENT : palette.optionBorder,
|
|
180
|
+
opacity: pressed && !disabled ? 0.75 : 1
|
|
181
|
+
}], children: [
|
|
182
|
+
/* @__PURE__ */ jsx(View, { style: [styles.indexChip, {
|
|
183
|
+
backgroundColor: active ? ACCENT : palette.chip
|
|
184
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.indexChipText, {
|
|
185
|
+
color: active ? "#ffffff" : palette.muted
|
|
186
|
+
}], children: active && multiSelect ? "\u2713" : String(i + 1) }) }),
|
|
187
|
+
/* @__PURE__ */ jsxs(View, { style: styles.optionBody, children: [
|
|
188
|
+
/* @__PURE__ */ jsx(Text, { style: [styles.optionLabel, {
|
|
189
|
+
color: palette.title
|
|
190
|
+
}], children: o.label }),
|
|
191
|
+
o.detail ? /* @__PURE__ */ jsx(Text, { style: [styles.optionDetail, {
|
|
192
|
+
color: palette.muted
|
|
193
|
+
}], children: o.detail }) : null
|
|
194
|
+
] })
|
|
195
|
+
] }, o.id);
|
|
120
196
|
}),
|
|
197
|
+
allowText ? /* @__PURE__ */ jsx(TextInput, { ref: inputRef, value: textDraft, onChangeText: setTextDraft, editable: !disabled, placeholder: (_c = question.textPlaceholder) != null ? _c : "Type your answer", placeholderTextColor: palette.muted, returnKeyType: isLast ? "send" : "next", onSubmitEditing: next, style: [styles.input, {
|
|
198
|
+
backgroundColor: palette.optionBg,
|
|
199
|
+
borderColor: palette.optionBorder,
|
|
200
|
+
color: palette.title
|
|
201
|
+
}] }) : null,
|
|
121
202
|
/* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
|
|
122
|
-
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.skipText, {
|
|
203
|
+
index > 0 ? /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => {
|
|
204
|
+
if (question && textDraft.trim()) record(textDraft.trim(), false);
|
|
205
|
+
setIndex((i) => i - 1);
|
|
206
|
+
}, disabled, style: styles.skip, children: /* @__PURE__ */ jsx(Text, { style: [styles.skipText, {
|
|
127
207
|
color: palette.muted
|
|
128
|
-
}], children: "
|
|
129
|
-
/* @__PURE__ */ jsx(
|
|
130
|
-
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
208
|
+
}], children: "Previous" }) }) : /* @__PURE__ */ jsx(View, {}),
|
|
209
|
+
/* @__PURE__ */ jsx(View, { style: styles.dots, pointerEvents: "none", children: total > 1 ? questions.map((q, i) => /* @__PURE__ */ jsx(View, { style: [styles.dot, i === index ? styles.dotOn : {
|
|
210
|
+
backgroundColor: palette.optionBorder
|
|
211
|
+
}] }, q.id)) : null }),
|
|
212
|
+
/* @__PURE__ */ jsxs(View, { style: styles.actionRight, children: [
|
|
213
|
+
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: skip, disabled, style: styles.skip, children: /* @__PURE__ */ jsx(Text, { style: [styles.skipText, {
|
|
214
|
+
color: palette.muted
|
|
215
|
+
}], children: "Skip" }) }),
|
|
216
|
+
/* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityState: {
|
|
217
|
+
disabled: disabled || !currentAnswer
|
|
218
|
+
}, onPress: next, disabled: disabled || !currentAnswer, style: [styles.send, {
|
|
219
|
+
backgroundColor: currentAnswer && !disabled ? ACCENT : palette.optionBorder
|
|
220
|
+
}], children: /* @__PURE__ */ jsx(Text, { style: [styles.sendText, {
|
|
221
|
+
color: currentAnswer && !disabled ? "#ffffff" : palette.muted
|
|
222
|
+
}], children: isLast ? "Send" : "Next" }) })
|
|
223
|
+
] })
|
|
139
224
|
] })
|
|
140
225
|
] });
|
|
141
226
|
});
|
|
@@ -146,21 +231,42 @@ const styles = StyleSheet.create({
|
|
|
146
231
|
borderRadius: 16,
|
|
147
232
|
padding: 14,
|
|
148
233
|
marginTop: 4,
|
|
149
|
-
marginBottom:
|
|
234
|
+
marginBottom: 8
|
|
235
|
+
},
|
|
236
|
+
header: {
|
|
237
|
+
flexDirection: "row",
|
|
238
|
+
alignItems: "center",
|
|
239
|
+
justifyContent: "space-between"
|
|
150
240
|
},
|
|
151
|
-
|
|
152
|
-
|
|
241
|
+
kicker: {
|
|
242
|
+
fontSize: 10.5,
|
|
243
|
+
fontWeight: "600",
|
|
244
|
+
letterSpacing: 1.2,
|
|
245
|
+
textTransform: "uppercase"
|
|
246
|
+
},
|
|
247
|
+
dismiss: {
|
|
248
|
+
padding: 4,
|
|
249
|
+
minWidth: 32,
|
|
250
|
+
minHeight: 32,
|
|
251
|
+
alignItems: "center",
|
|
252
|
+
justifyContent: "center"
|
|
253
|
+
},
|
|
254
|
+
dismissMark: {
|
|
255
|
+
fontSize: 22,
|
|
256
|
+
lineHeight: 24,
|
|
257
|
+
fontWeight: "400"
|
|
153
258
|
},
|
|
154
259
|
eyebrow: {
|
|
155
260
|
fontSize: 11,
|
|
156
261
|
fontWeight: "600",
|
|
157
262
|
letterSpacing: 1,
|
|
158
|
-
|
|
263
|
+
marginTop: 6
|
|
159
264
|
},
|
|
160
265
|
title: {
|
|
161
|
-
fontSize: 15,
|
|
266
|
+
fontSize: 15.5,
|
|
162
267
|
fontWeight: "700",
|
|
163
268
|
lineHeight: 21,
|
|
269
|
+
marginTop: 4,
|
|
164
270
|
marginBottom: 4
|
|
165
271
|
},
|
|
166
272
|
hint: {
|
|
@@ -172,18 +278,28 @@ const styles = StyleSheet.create({
|
|
|
172
278
|
alignItems: "center",
|
|
173
279
|
borderWidth: 1,
|
|
174
280
|
borderRadius: 12,
|
|
175
|
-
paddingHorizontal:
|
|
281
|
+
paddingHorizontal: 10,
|
|
176
282
|
paddingVertical: 10,
|
|
177
283
|
marginTop: 6,
|
|
178
|
-
minHeight: 44
|
|
179
|
-
|
|
284
|
+
minHeight: 44,
|
|
285
|
+
gap: 10
|
|
286
|
+
},
|
|
287
|
+
indexChip: {
|
|
288
|
+
width: 24,
|
|
289
|
+
height: 24,
|
|
290
|
+
borderRadius: 6,
|
|
291
|
+
alignItems: "center",
|
|
292
|
+
justifyContent: "center"
|
|
293
|
+
},
|
|
294
|
+
indexChipText: {
|
|
295
|
+
fontSize: 11,
|
|
296
|
+
fontWeight: "700"
|
|
180
297
|
},
|
|
181
298
|
optionBody: {
|
|
182
|
-
flex: 1
|
|
183
|
-
paddingRight: 10
|
|
299
|
+
flex: 1
|
|
184
300
|
},
|
|
185
301
|
optionLabel: {
|
|
186
|
-
fontSize:
|
|
302
|
+
fontSize: 13.5,
|
|
187
303
|
fontWeight: "600"
|
|
188
304
|
},
|
|
189
305
|
optionDetail: {
|
|
@@ -191,47 +307,54 @@ const styles = StyleSheet.create({
|
|
|
191
307
|
marginTop: 2,
|
|
192
308
|
lineHeight: 16
|
|
193
309
|
},
|
|
194
|
-
tick: {
|
|
195
|
-
width: 22,
|
|
196
|
-
height: 22,
|
|
197
|
-
borderRadius: 11,
|
|
198
|
-
borderWidth: 1,
|
|
199
|
-
alignItems: "center",
|
|
200
|
-
justifyContent: "center"
|
|
201
|
-
},
|
|
202
|
-
tickMark: {
|
|
203
|
-
color: "#ffffff",
|
|
204
|
-
fontSize: 13,
|
|
205
|
-
fontWeight: "700",
|
|
206
|
-
lineHeight: 16
|
|
207
|
-
},
|
|
208
310
|
input: {
|
|
209
311
|
borderWidth: 1,
|
|
210
312
|
borderRadius: 12,
|
|
211
313
|
paddingHorizontal: 12,
|
|
212
314
|
paddingVertical: 10,
|
|
213
|
-
marginTop:
|
|
315
|
+
marginTop: 10,
|
|
214
316
|
fontSize: 14,
|
|
215
317
|
minHeight: 44
|
|
216
318
|
},
|
|
217
319
|
actions: {
|
|
218
320
|
flexDirection: "row",
|
|
219
321
|
alignItems: "center",
|
|
220
|
-
justifyContent: "
|
|
322
|
+
justifyContent: "space-between",
|
|
323
|
+
marginTop: 8,
|
|
221
324
|
gap: 8
|
|
222
325
|
},
|
|
326
|
+
dots: {
|
|
327
|
+
flexDirection: "row",
|
|
328
|
+
alignItems: "center",
|
|
329
|
+
gap: 5,
|
|
330
|
+
flex: 1,
|
|
331
|
+
justifyContent: "center"
|
|
332
|
+
},
|
|
333
|
+
dot: {
|
|
334
|
+
width: 6,
|
|
335
|
+
height: 6,
|
|
336
|
+
borderRadius: 3
|
|
337
|
+
},
|
|
338
|
+
dotOn: {
|
|
339
|
+
width: 16,
|
|
340
|
+
backgroundColor: ACCENT
|
|
341
|
+
},
|
|
342
|
+
actionRight: {
|
|
343
|
+
flexDirection: "row",
|
|
344
|
+
alignItems: "center"
|
|
345
|
+
},
|
|
223
346
|
skip: {
|
|
224
|
-
paddingHorizontal:
|
|
347
|
+
paddingHorizontal: 12,
|
|
225
348
|
paddingVertical: 10,
|
|
226
349
|
minHeight: 44,
|
|
227
350
|
justifyContent: "center"
|
|
228
351
|
},
|
|
229
352
|
skipText: {
|
|
230
|
-
fontSize:
|
|
353
|
+
fontSize: 13,
|
|
231
354
|
fontWeight: "600"
|
|
232
355
|
},
|
|
233
356
|
send: {
|
|
234
|
-
paddingHorizontal:
|
|
357
|
+
paddingHorizontal: 16,
|
|
235
358
|
paddingVertical: 10,
|
|
236
359
|
borderRadius: 12,
|
|
237
360
|
minHeight: 44,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AskUserCard.js","sources":["../../../src/features/chat/AskUserCard.tsx"],"sourcesContent":["/**\n * <AskUserCard> — the `[ASK_USER]` clarifying question, as a touch card.\n *\n * Deliberately NOT a port of the web card. The web pages through questions with\n * a Next/Skip footer and keyboard shortcuts; on a phone the whole card sits\n * above the keyboard, so every question is laid out in one scrollable column and\n * options are full-width rows with a 44pt minimum target. One \"Send\" commits the\n * lot, matching how the answer travels anyway: a single formatted message.\n *\n * The reply goes out through the ordinary send path (onAnswer -> sendMessage),\n * which is what releases cdecli's parked turn.\n */\nimport React, { memo, useCallback, useMemo, useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { formatAskUserAnswers, type AskUserPayload, type AskUserQuestion } from './askUser';\n\nconst ACCENT = '#2563eb';\n\nexport const AskUserCard = memo(function AskUserCard({\n payload,\n isDark = false,\n disabled = false,\n onAnswer,\n onDismiss,\n}: {\n payload: AskUserPayload;\n isDark?: boolean;\n disabled?: boolean;\n onAnswer: (formatted: string) => void;\n onDismiss: () => void;\n}) {\n // One entry per question: an option label, comma-joined labels for a\n // multi-select, or free text. Same string either way, so formatting and\n // \"has the user answered anything?\" stay trivial.\n const [answers, setAnswers] = useState<Record<string, string>>({});\n\n const palette = useMemo(\n () => ({\n card: isDark ? '#111827' : '#ffffff',\n border: isDark ? '#1f2937' : '#e5e7eb',\n title: isDark ? '#f1f5f9' : '#111827',\n muted: isDark ? '#94a3b8' : '#6b7280',\n optionBg: isDark ? '#0b1220' : '#f9fafb',\n optionBorder: isDark ? '#243045' : '#e5e7eb',\n inputBg: isDark ? '#0b1220' : '#f9fafb',\n }),\n [isDark],\n );\n\n const selectedLabels = useCallback(\n (q: AskUserQuestion): string[] => {\n const raw = answers[q.id] ?? '';\n if (!raw.trim()) return [];\n if (!q.multiSelect) return [raw];\n return raw\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n },\n [answers],\n );\n\n const toggle = useCallback(\n (q: AskUserQuestion, label: string) => {\n if (disabled) return;\n setAnswers((prev) => {\n const current = prev[q.id] ?? '';\n if (!q.multiSelect) {\n // Tapping the chosen option again clears it, so a mis-tap is\n // recoverable without a separate \"clear\" affordance.\n return { ...prev, [q.id]: current === label ? '' : label };\n }\n const parts = current\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n const next = parts.includes(label) ? parts.filter((v) => v !== label) : [...parts, label];\n return { ...prev, [q.id]: next.join(', ') };\n });\n },\n [disabled],\n );\n\n const setText = useCallback((q: AskUserQuestion, value: string) => {\n setAnswers((prev) => ({ ...prev, [q.id]: value }));\n }, []);\n\n const formatted = formatAskUserAnswers(payload.questions, answers);\n const canSend = formatted.trim().length > 0 && !disabled;\n\n return (\n <View style={[styles.card, { backgroundColor: palette.card, borderColor: palette.border }]}>\n {payload.questions.map((q) => {\n const chosen = selectedLabels(q);\n const optionLabels = new Set((q.options ?? []).map((o) => o.label));\n // Free text is whatever is not one of the offered labels, so\n // switching between an option and typing does not lose the draft.\n const textValue = chosen.every((c) => optionLabels.has(c)) ? '' : (answers[q.id] ?? '');\n return (\n <View key={q.id} style={styles.question}>\n {q.header ? (\n <Text style={[styles.eyebrow, { color: palette.muted }]}>{q.header.toUpperCase()}</Text>\n ) : null}\n <Text style={[styles.title, { color: palette.title }]}>{q.title}</Text>\n {q.multiSelect ? (\n <Text style={[styles.hint, { color: palette.muted }]}>Pick as many as apply.</Text>\n ) : null}\n\n {(q.options ?? []).map((o) => {\n const active = chosen.includes(o.label);\n return (\n <Pressable\n key={o.id}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active, disabled }}\n accessibilityLabel={o.detail ? `${o.label}. ${o.detail}` : o.label}\n disabled={disabled}\n onPress={() => toggle(q, o.label)}\n style={({ pressed }) => [\n styles.option,\n {\n backgroundColor: active ? `${ACCENT}14` : palette.optionBg,\n borderColor: active ? ACCENT : palette.optionBorder,\n opacity: pressed && !disabled ? 0.75 : 1,\n },\n ]}\n >\n <View style={styles.optionBody}>\n <Text style={[styles.optionLabel, { color: palette.title }]}>{o.label}</Text>\n {o.detail ? (\n <Text style={[styles.optionDetail, { color: palette.muted }]}>\n {o.detail}\n </Text>\n ) : null}\n </View>\n <View\n style={[\n styles.tick,\n {\n borderColor: active ? ACCENT : palette.optionBorder,\n backgroundColor: active ? ACCENT : 'transparent',\n },\n ]}\n >\n {active ? <Text style={styles.tickMark}>✓</Text> : null}\n </View>\n </Pressable>\n );\n })}\n\n {q.allowText !== false ? (\n <TextInput\n value={textValue}\n onChangeText={(v) => setText(q, v)}\n editable={!disabled}\n placeholder={q.textPlaceholder ?? 'Or type your own answer…'}\n placeholderTextColor={palette.muted}\n style={[\n styles.input,\n {\n backgroundColor: palette.inputBg,\n borderColor: palette.optionBorder,\n color: palette.title,\n },\n ]}\n />\n ) : null}\n </View>\n );\n })}\n\n <View style={styles.actions}>\n <Pressable\n accessibilityRole=\"button\"\n onPress={onDismiss}\n disabled={disabled}\n style={({ pressed }) => [styles.skip, { opacity: pressed ? 0.6 : 1 }]}\n >\n <Text style={[styles.skipText, { color: palette.muted }]}>Skip</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: !canSend }}\n onPress={() => canSend && onAnswer(formatted)}\n disabled={!canSend}\n style={({ pressed }) => [\n styles.send,\n { backgroundColor: canSend ? ACCENT : palette.optionBorder, opacity: pressed ? 0.85 : 1 },\n ]}\n >\n <Text style={[styles.sendText, { color: canSend ? '#ffffff' : palette.muted }]}>Send</Text>\n </Pressable>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n card: {\n width: '100%',\n borderWidth: 1,\n borderRadius: 16,\n padding: 14,\n marginTop: 4,\n marginBottom: 10,\n },\n question: { marginBottom: 12 },\n eyebrow: { fontSize: 11, fontWeight: '600', letterSpacing: 1, marginBottom: 4 },\n title: { fontSize: 15, fontWeight: '700', lineHeight: 21, marginBottom: 4 },\n hint: { fontSize: 12, marginBottom: 6 },\n option: {\n flexDirection: 'row',\n alignItems: 'center',\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 6,\n minHeight: 44, // iOS minimum touch target\n },\n optionBody: { flex: 1, paddingRight: 10 },\n optionLabel: { fontSize: 14, fontWeight: '600' },\n optionDetail: { fontSize: 12, marginTop: 2, lineHeight: 16 },\n tick: {\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n tickMark: { color: '#ffffff', fontSize: 13, fontWeight: '700', lineHeight: 16 },\n input: {\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 8,\n fontSize: 14,\n minHeight: 44,\n },\n actions: { flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end', gap: 8 },\n skip: { paddingHorizontal: 14, paddingVertical: 10, minHeight: 44, justifyContent: 'center' },\n skipText: { fontSize: 14, fontWeight: '600' },\n send: {\n paddingHorizontal: 20,\n paddingVertical: 10,\n borderRadius: 12,\n minHeight: 44,\n justifyContent: 'center',\n },\n sendText: { fontSize: 14, fontWeight: '700' },\n});\n"],"names":["AskUserCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AskUserCard.js","sources":["../../../src/features/chat/AskUserCard.tsx"],"sourcesContent":["/**\n * <AskUserCard> — the `[ASK_USER]` clarifying question, as a touch card.\n *\n * Phone twin of the web ResponsePromptCard: Question N of M, numbered options,\n * free-text row, Skip / Previous / Next / Send. Answers still travel as one\n * formatted `**Title:** answer` message so cdecli's parked turn is released.\n *\n * The reply goes out through the ordinary send path (onAnswer -> sendMessage),\n * which is what releases cdecli's parked turn.\n */\nimport React, { memo, useEffect, useMemo, useRef, useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { formatAskUserAnswers, type AskUserPayload } from './askUser';\n\nconst ACCENT = '#2563eb';\n\nexport const AskUserCard = memo(function AskUserCard({\n payload,\n isDark = false,\n disabled = false,\n onAnswer,\n onDismiss,\n}: {\n payload: AskUserPayload;\n isDark?: boolean;\n disabled?: boolean;\n onAnswer: (formatted: string) => void;\n onDismiss: () => void;\n}) {\n const questions = payload.questions;\n const [index, setIndex] = useState(0);\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const [textDraft, setTextDraft] = useState('');\n const inputRef = useRef<TextInput>(null);\n\n const total = questions.length;\n const question = questions[Math.min(index, Math.max(total - 1, 0))];\n const isLast = index >= total - 1;\n const allowText = question?.allowText !== false;\n const multiSelect = question?.multiSelect === true;\n\n const palette = useMemo(\n () => ({\n card: isDark ? '#111827' : '#ffffff',\n border: isDark ? '#1f2937' : '#e5e7eb',\n title: isDark ? '#f1f5f9' : '#111827',\n muted: isDark ? '#94a3b8' : '#6b7280',\n optionBg: isDark ? '#0b1220' : '#f9fafb',\n optionBorder: isDark ? '#243045' : '#e5e7eb',\n chip: isDark ? '#1e293b' : '#f3f4f6',\n chipOn: ACCENT,\n }),\n [isDark],\n );\n\n const selectedLabels = useMemo(() => {\n const raw = answers[question?.id ?? ''] ?? '';\n if (!raw.trim()) return [] as string[];\n if (!multiSelect) return [raw];\n return raw\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n }, [answers, question, multiSelect]);\n\n const lastQuestionIdRef = useRef<string | null>(null);\n useEffect(() => {\n const q = questions[index];\n if (!q || lastQuestionIdRef.current === q.id) return;\n lastQuestionIdRef.current = q.id;\n const existing = answers[q.id] ?? '';\n const parts = q.multiSelect ? existing.split(',').map((v) => v.trim()) : [existing];\n const isOptionAnswer = existing !== '' && parts.every((part) => q.options?.some((o) => o.label === part));\n setTextDraft(isOptionAnswer ? '' : existing);\n // answers omitted: re-running on every keystroke would clobber the draft.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [index, questions]);\n\n const record = (value: string, advance: boolean) => {\n if (!question) return;\n setAnswers((prev) => ({ ...prev, [question.id]: value }));\n if (!advance) return;\n if (isLast) {\n const formatted = formatAskUserAnswers(questions, { ...answers, [question.id]: value });\n if (formatted) onAnswer(formatted);\n else onDismiss();\n } else {\n setIndex((i) => i + 1);\n }\n };\n\n const chooseOption = (option: { label: string; other?: boolean }) => {\n if (!question || disabled) return;\n if (option.other) {\n inputRef.current?.focus();\n return;\n }\n if (multiSelect) {\n const next = selectedLabels.includes(option.label)\n ? selectedLabels.filter((l) => l !== option.label)\n : [...selectedLabels, option.label];\n record(next.join(', '), false);\n return;\n }\n record(option.label, true);\n };\n\n const currentAnswer = textDraft.trim() || answers[question?.id ?? ''] || '';\n\n const next = () => {\n if (disabled || !currentAnswer) return;\n record(currentAnswer, true);\n };\n\n const skip = () => {\n if (disabled || !question) return;\n setAnswers((prev) => {\n const { [question.id]: _dropped, ...rest } = prev;\n return rest;\n });\n if (isLast) {\n const { [question.id]: _dropped, ...rest } = answers;\n const formatted = formatAskUserAnswers(questions, rest);\n if (formatted) onAnswer(formatted);\n else onDismiss();\n } else {\n setIndex((i) => i + 1);\n }\n };\n\n if (!question) return null;\n\n return (\n <View style={[styles.card, { backgroundColor: palette.card, borderColor: palette.border }]}>\n <View style={styles.header}>\n <Text style={[styles.kicker, { color: palette.muted }]}>\n Question {index + 1} of {total}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n hitSlop={10}\n onPress={onDismiss}\n disabled={disabled}\n style={styles.dismiss}\n >\n <Text style={[styles.dismissMark, { color: palette.muted }]}>×</Text>\n </Pressable>\n </View>\n\n {question.header ? (\n <Text style={[styles.eyebrow, { color: palette.muted }]}>{question.header.toUpperCase()}</Text>\n ) : null}\n <Text style={[styles.title, { color: palette.title }]}>{question.title}</Text>\n {multiSelect ? <Text style={[styles.hint, { color: palette.muted }]}>Pick as many as apply.</Text> : null}\n\n {(question.options ?? []).map((o, i) => {\n const active = selectedLabels.includes(o.label);\n return (\n <Pressable\n key={o.id}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active, disabled }}\n accessibilityLabel={o.detail ? `${o.label}. ${o.detail}` : o.label}\n disabled={disabled}\n onPress={() => chooseOption(o)}\n style={({ pressed }) => [\n styles.option,\n {\n backgroundColor: active ? `${ACCENT}14` : palette.optionBg,\n borderColor: active ? ACCENT : palette.optionBorder,\n opacity: pressed && !disabled ? 0.75 : 1,\n },\n ]}\n >\n <View style={[styles.indexChip, { backgroundColor: active ? ACCENT : palette.chip }]}>\n <Text style={[styles.indexChipText, { color: active ? '#ffffff' : palette.muted }]}>\n {active && multiSelect ? '✓' : String(i + 1)}\n </Text>\n </View>\n <View style={styles.optionBody}>\n <Text style={[styles.optionLabel, { color: palette.title }]}>{o.label}</Text>\n {o.detail ? (\n <Text style={[styles.optionDetail, { color: palette.muted }]}>{o.detail}</Text>\n ) : null}\n </View>\n </Pressable>\n );\n })}\n\n {allowText ? (\n <TextInput\n ref={inputRef}\n value={textDraft}\n onChangeText={setTextDraft}\n editable={!disabled}\n placeholder={question.textPlaceholder ?? 'Type your answer'}\n placeholderTextColor={palette.muted}\n returnKeyType={isLast ? 'send' : 'next'}\n onSubmitEditing={next}\n style={[\n styles.input,\n {\n backgroundColor: palette.optionBg,\n borderColor: palette.optionBorder,\n color: palette.title,\n },\n ]}\n />\n ) : null}\n\n <View style={styles.actions}>\n {index > 0 ? (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => {\n if (question && textDraft.trim()) record(textDraft.trim(), false);\n setIndex((i) => i - 1);\n }}\n disabled={disabled}\n style={styles.skip}\n >\n <Text style={[styles.skipText, { color: palette.muted }]}>Previous</Text>\n </Pressable>\n ) : (\n <View />\n )}\n <View style={styles.dots} pointerEvents=\"none\">\n {total > 1\n ? questions.map((q, i) => (\n <View\n key={q.id}\n style={[\n styles.dot,\n i === index ? styles.dotOn : { backgroundColor: palette.optionBorder },\n ]}\n />\n ))\n : null}\n </View>\n <View style={styles.actionRight}>\n <Pressable accessibilityRole=\"button\" onPress={skip} disabled={disabled} style={styles.skip}>\n <Text style={[styles.skipText, { color: palette.muted }]}>Skip</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: disabled || !currentAnswer }}\n onPress={next}\n disabled={disabled || !currentAnswer}\n style={[\n styles.send,\n { backgroundColor: currentAnswer && !disabled ? ACCENT : palette.optionBorder },\n ]}\n >\n <Text\n style={[styles.sendText, { color: currentAnswer && !disabled ? '#ffffff' : palette.muted }]}\n >\n {isLast ? 'Send' : 'Next'}\n </Text>\n </Pressable>\n </View>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n card: {\n width: '100%',\n borderWidth: 1,\n borderRadius: 16,\n padding: 14,\n marginTop: 4,\n marginBottom: 8,\n },\n header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },\n kicker: { fontSize: 10.5, fontWeight: '600', letterSpacing: 1.2, textTransform: 'uppercase' },\n dismiss: { padding: 4, minWidth: 32, minHeight: 32, alignItems: 'center', justifyContent: 'center' },\n dismissMark: { fontSize: 22, lineHeight: 24, fontWeight: '400' },\n eyebrow: { fontSize: 11, fontWeight: '600', letterSpacing: 1, marginTop: 6 },\n title: { fontSize: 15.5, fontWeight: '700', lineHeight: 21, marginTop: 4, marginBottom: 4 },\n hint: { fontSize: 12, marginBottom: 6 },\n option: {\n flexDirection: 'row',\n alignItems: 'center',\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 10,\n paddingVertical: 10,\n marginTop: 6,\n minHeight: 44,\n gap: 10,\n },\n indexChip: {\n width: 24,\n height: 24,\n borderRadius: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n indexChipText: { fontSize: 11, fontWeight: '700' },\n optionBody: { flex: 1 },\n optionLabel: { fontSize: 13.5, fontWeight: '600' },\n optionDetail: { fontSize: 12, marginTop: 2, lineHeight: 16 },\n input: {\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 10,\n fontSize: 14,\n minHeight: 44,\n },\n actions: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 8,\n gap: 8,\n },\n dots: { flexDirection: 'row', alignItems: 'center', gap: 5, flex: 1, justifyContent: 'center' },\n dot: { width: 6, height: 6, borderRadius: 3 },\n dotOn: { width: 16, backgroundColor: ACCENT },\n actionRight: { flexDirection: 'row', alignItems: 'center' },\n skip: { paddingHorizontal: 12, paddingVertical: 10, minHeight: 44, justifyContent: 'center' },\n skipText: { fontSize: 13, fontWeight: '600' },\n send: {\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 12,\n minHeight: 44,\n justifyContent: 'center',\n },\n sendText: { fontSize: 14, fontWeight: '700' },\n});\n"],"names":["AskUserCard","_a","_b","next"],"mappings":"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"}
|