@ttt-productions/chat-core 0.6.0 → 0.6.2

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.
Files changed (65) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +7 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/mentions/types.d.ts +10 -7
  6. package/dist/mentions/types.d.ts.map +1 -1
  7. package/dist/mentions/types.js +3 -0
  8. package/dist/mentions/types.js.map +1 -1
  9. package/dist/types.d.ts +18 -120
  10. package/dist/types.d.ts.map +1 -1
  11. package/dist/types.js.map +1 -1
  12. package/package.json +6 -29
  13. package/dist/context/ChatNameResolverContext.d.ts +0 -37
  14. package/dist/context/ChatNameResolverContext.d.ts.map +0 -1
  15. package/dist/context/ChatNameResolverContext.js +0 -44
  16. package/dist/context/ChatNameResolverContext.js.map +0 -1
  17. package/dist/firestore/queries.d.ts +0 -5
  18. package/dist/firestore/queries.d.ts.map +0 -1
  19. package/dist/firestore/queries.js +0 -16
  20. package/dist/firestore/queries.js.map +0 -1
  21. package/dist/hooks/useChatMessages.d.ts +0 -11
  22. package/dist/hooks/useChatMessages.d.ts.map +0 -1
  23. package/dist/hooks/useChatMessages.js +0 -139
  24. package/dist/hooks/useChatMessages.js.map +0 -1
  25. package/dist/hooks/useChatThreadAccess.d.ts +0 -8
  26. package/dist/hooks/useChatThreadAccess.d.ts.map +0 -1
  27. package/dist/hooks/useChatThreadAccess.js +0 -19
  28. package/dist/hooks/useChatThreadAccess.js.map +0 -1
  29. package/dist/mentions/MentionAutocomplete.d.ts +0 -22
  30. package/dist/mentions/MentionAutocomplete.d.ts.map +0 -1
  31. package/dist/mentions/MentionAutocomplete.js +0 -21
  32. package/dist/mentions/MentionAutocomplete.js.map +0 -1
  33. package/dist/mentions/MessageText.d.ts +0 -27
  34. package/dist/mentions/MessageText.d.ts.map +0 -1
  35. package/dist/mentions/MessageText.js +0 -20
  36. package/dist/mentions/MessageText.js.map +0 -1
  37. package/dist/mentions/use-mention-autocomplete.d.ts +0 -81
  38. package/dist/mentions/use-mention-autocomplete.d.ts.map +0 -1
  39. package/dist/mentions/use-mention-autocomplete.js +0 -323
  40. package/dist/mentions/use-mention-autocomplete.js.map +0 -1
  41. package/dist/react/index.d.ts +0 -17
  42. package/dist/react/index.d.ts.map +0 -1
  43. package/dist/react/index.js +0 -13
  44. package/dist/react/index.js.map +0 -1
  45. package/dist/ui/ChatShell.d.ts +0 -22
  46. package/dist/ui/ChatShell.d.ts.map +0 -1
  47. package/dist/ui/ChatShell.js +0 -22
  48. package/dist/ui/ChatShell.js.map +0 -1
  49. package/dist/ui/Composer.d.ts +0 -23
  50. package/dist/ui/Composer.d.ts.map +0 -1
  51. package/dist/ui/Composer.js +0 -140
  52. package/dist/ui/Composer.js.map +0 -1
  53. package/dist/ui/MessageItemDefault.d.ts +0 -11
  54. package/dist/ui/MessageItemDefault.d.ts.map +0 -1
  55. package/dist/ui/MessageItemDefault.js +0 -51
  56. package/dist/ui/MessageItemDefault.js.map +0 -1
  57. package/dist/ui/MessageList.d.ts +0 -17
  58. package/dist/ui/MessageList.d.ts.map +0 -1
  59. package/dist/ui/MessageList.js +0 -90
  60. package/dist/ui/MessageList.js.map +0 -1
  61. package/dist/ui/menus.d.ts +0 -12
  62. package/dist/ui/menus.d.ts.map +0 -1
  63. package/dist/ui/menus.js +0 -12
  64. package/dist/ui/menus.js.map +0 -1
  65. package/src/styles/chat.css +0 -153
@@ -1,323 +0,0 @@
1
- 'use client';
2
- /**
3
- * Composer-side mention autocomplete state hook.
4
- *
5
- * Detects when the user types the trigger character (default `@`) inside the
6
- * provided textarea, captures the live query (the text between the trigger
7
- * and the cursor), debounces searches across all configured providers, and
8
- * tracks the anchor positions of inserted mentions so the composer can
9
- * convert display text back to wire tokens on send.
10
- *
11
- * Returns an `AutocompleteState` value tailored for the `<MentionAutocomplete>`
12
- * UI component, plus an `insertMention` action and a `getValueWithTokens`
13
- * accessor the composer calls on send.
14
- *
15
- * Generic over `TKind` and `TContext`; chat-core inspects neither.
16
- */
17
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
18
- import { formatMentionToken } from './parser.js';
19
- function isWordBoundary(ch) {
20
- return ch === undefined || /\s/.test(ch);
21
- }
22
- export function useMentionAutocomplete(args) {
23
- const { textareaRef, value, onChange, providers, context, recent, trigger = '@', minQueryLength = 0, searchDebounceMs = 200, } = args;
24
- if (trigger.length !== 1) {
25
- throw new Error(`useMentionAutocomplete: trigger must be a single character, got ${JSON.stringify(trigger)}`);
26
- }
27
- const [open, setOpen] = useState(false);
28
- const [triggerIndex, setTriggerIndex] = useState(null);
29
- const [query, setQuery] = useState('');
30
- const [groups, setGroups] = useState([]);
31
- const [showingRecent, setShowingRecent] = useState(false);
32
- const [highlightedIndex, setHighlightedIndex] = useState(0);
33
- const [anchors, setAnchors] = useState([]);
34
- // Refs for the latest values so the debounced search reads fresh.
35
- const valueRef = useRef(value);
36
- const triggerIndexRef = useRef(triggerIndex);
37
- const providersRef = useRef(providers);
38
- const contextRef = useRef(context);
39
- useEffect(() => {
40
- valueRef.current = value;
41
- triggerIndexRef.current = triggerIndex;
42
- providersRef.current = providers;
43
- contextRef.current = context;
44
- });
45
- const flatResults = useMemo(() => groups.flatMap((g) => g.results), [groups]);
46
- const close = useCallback(() => {
47
- setOpen(false);
48
- setTriggerIndex(null);
49
- setQuery('');
50
- setGroups([]);
51
- setHighlightedIndex(0);
52
- setShowingRecent(false);
53
- }, []);
54
- /**
55
- * Detect trigger state based on current value + cursor position.
56
- * Called from useEffect on value changes.
57
- */
58
- useEffect(() => {
59
- const ta = textareaRef.current;
60
- if (!ta)
61
- return;
62
- const cursor = ta.selectionStart;
63
- if (cursor === null)
64
- return;
65
- // Walk backwards from the cursor to find the trigger character, stopping
66
- // at a whitespace boundary or the start of the string.
67
- let i = cursor - 1;
68
- while (i >= 0) {
69
- const ch = value[i];
70
- if (ch === trigger) {
71
- // Trigger only counts if the character before it is whitespace or BoL.
72
- if (i === 0 || /\s/.test(value[i - 1])) {
73
- const q = value.slice(i + 1, cursor);
74
- // If the slice contains whitespace, the trigger run has been broken.
75
- if (/\s/.test(q)) {
76
- close();
77
- return;
78
- }
79
- setTriggerIndex(i);
80
- setQuery(q);
81
- setOpen(true);
82
- setHighlightedIndex(0);
83
- return;
84
- }
85
- // Inline `@` not at word boundary — not a trigger.
86
- close();
87
- return;
88
- }
89
- if (/\s/.test(ch)) {
90
- close();
91
- return;
92
- }
93
- i -= 1;
94
- }
95
- close();
96
- // We intentionally watch value AND the textarea's cursor position via the
97
- // event chain — selectionStart updates synchronously with input/key events.
98
- // eslint-disable-next-line react-hooks/exhaustive-deps
99
- }, [value, trigger]);
100
- /**
101
- * Recompute anchor offsets when the textarea value changes externally
102
- * (e.g. user deletes text). Drop anchors whose displayed text no longer
103
- * matches the underlying displayText at their range.
104
- */
105
- useEffect(() => {
106
- setAnchors((prev) => prev.filter((a) => {
107
- const expected = `${trigger}${a.ref.displayText}`;
108
- return value.slice(a.start, a.end) === expected;
109
- }));
110
- }, [value, trigger]);
111
- /**
112
- * Search: fires whenever query opens / changes. Debounced. Cancels in-flight
113
- * via AbortController.
114
- */
115
- useEffect(() => {
116
- if (!open) {
117
- setGroups([]);
118
- setShowingRecent(false);
119
- return;
120
- }
121
- let cancelled = false;
122
- const controller = new AbortController();
123
- if (query.length < minQueryLength) {
124
- // Below threshold: show recent picks if adapter supplied.
125
- if (recent) {
126
- Promise.resolve(recent.getRecent())
127
- .then((items) => {
128
- if (cancelled)
129
- return;
130
- // Group recent by kind, preserving provider order.
131
- const byKind = new Map();
132
- for (const item of items) {
133
- const arr = byKind.get(item.kind) ?? [];
134
- arr.push(item);
135
- byKind.set(item.kind, arr);
136
- }
137
- const recentGroups = providers
138
- .map((p) => ({
139
- kind: p.kind,
140
- label: p.label,
141
- results: byKind.get(p.kind) ?? [],
142
- loading: false,
143
- renderResult: p.renderResult,
144
- }))
145
- .filter((g) => g.results.length > 0);
146
- setGroups(recentGroups);
147
- setShowingRecent(true);
148
- setHighlightedIndex(0);
149
- })
150
- .catch(() => {
151
- if (!cancelled) {
152
- setGroups([]);
153
- setShowingRecent(false);
154
- }
155
- });
156
- }
157
- else {
158
- setGroups([]);
159
- setShowingRecent(false);
160
- }
161
- return () => {
162
- cancelled = true;
163
- controller.abort();
164
- };
165
- }
166
- setShowingRecent(false);
167
- // Initial: each group loading.
168
- setGroups(providers.map((p) => ({
169
- kind: p.kind,
170
- label: p.label,
171
- results: [],
172
- loading: true,
173
- renderResult: p.renderResult,
174
- })));
175
- const timer = setTimeout(() => {
176
- providers.forEach((provider, i) => {
177
- provider
178
- .search({ query, context, signal: controller.signal })
179
- .then((results) => {
180
- if (cancelled)
181
- return;
182
- setGroups((prev) => {
183
- const next = prev.slice();
184
- next[i] = { ...next[i], results, loading: false };
185
- return next;
186
- });
187
- })
188
- .catch(() => {
189
- if (cancelled)
190
- return;
191
- setGroups((prev) => {
192
- const next = prev.slice();
193
- next[i] = { ...next[i], results: [], loading: false };
194
- return next;
195
- });
196
- });
197
- });
198
- }, searchDebounceMs);
199
- return () => {
200
- cancelled = true;
201
- controller.abort();
202
- clearTimeout(timer);
203
- };
204
- // We deliberately depend on `query` + `open` only; `providers` / `context`
205
- // are read via refs to avoid re-firing on identity changes.
206
- // eslint-disable-next-line react-hooks/exhaustive-deps
207
- }, [open, query, minQueryLength, searchDebounceMs, recent]);
208
- const insertMention = useCallback((ref) => {
209
- const ti = triggerIndexRef.current;
210
- if (ti === null)
211
- return;
212
- const ta = textareaRef.current;
213
- if (!ta)
214
- return;
215
- const before = valueRef.current.slice(0, ti);
216
- // Cursor at point of insertion — current selection end captures the
217
- // typed query.
218
- const cursor = ta.selectionStart ?? ti + 1 + query.length;
219
- const after = valueRef.current.slice(cursor);
220
- const insertion = `${trigger}${ref.displayText}`;
221
- // Add a trailing space unless there is an explicit whitespace character
222
- // immediately after the insertion point (don't double-space). End-of-string
223
- // (after[0] === undefined) always adds a space so the cursor clears the
224
- // trigger run and the autocomplete doesn't re-open.
225
- const trailing = (after[0] !== undefined && isWordBoundary(after[0])) ? '' : ' ';
226
- const next = `${before}${insertion}${trailing}${after}`;
227
- const anchorStart = ti;
228
- const anchorEnd = ti + insertion.length;
229
- onChange(next);
230
- setAnchors((prev) => {
231
- // Shift any later anchors by the net change in length.
232
- const delta = insertion.length + trailing.length - (cursor - ti);
233
- const shifted = prev.map((a) => a.start >= cursor ? { ...a, start: a.start + delta, end: a.end + delta } : a);
234
- return [...shifted, { start: anchorStart, end: anchorEnd, ref }];
235
- });
236
- // Fire recent-use without awaiting.
237
- if (recent?.recordUse) {
238
- try {
239
- const result = recent.recordUse(ref);
240
- if (result && typeof result.then === 'function') {
241
- result.catch(() => undefined);
242
- }
243
- }
244
- catch {
245
- // Swallow — recent-use is best-effort.
246
- }
247
- }
248
- close();
249
- // Move cursor to just after the inserted mention (+ optional trailing space).
250
- // Defer so the controlled value flush completes first.
251
- const newCursor = anchorEnd + trailing.length;
252
- queueMicrotask(() => {
253
- const t = textareaRef.current;
254
- if (t) {
255
- t.focus();
256
- t.setSelectionRange(newCursor, newCursor);
257
- }
258
- });
259
- }, [trigger, query.length, onChange, recent, close, textareaRef]);
260
- const handleKeyDown = useCallback((event) => {
261
- if (!open)
262
- return false;
263
- if (flatResults.length === 0 && event.key !== 'Escape') {
264
- // Allow Escape to close even with no results; otherwise pass through.
265
- return false;
266
- }
267
- switch (event.key) {
268
- case 'ArrowDown':
269
- event.preventDefault();
270
- setHighlightedIndex((i) => (i + 1) % Math.max(flatResults.length, 1));
271
- return true;
272
- case 'ArrowUp':
273
- event.preventDefault();
274
- setHighlightedIndex((i) => (i - 1 + flatResults.length) % Math.max(flatResults.length, 1));
275
- return true;
276
- case 'Enter':
277
- case 'Tab': {
278
- if (flatResults.length === 0)
279
- return false;
280
- event.preventDefault();
281
- const pick = flatResults[Math.min(highlightedIndex, flatResults.length - 1)];
282
- if (pick)
283
- insertMention(pick);
284
- return true;
285
- }
286
- case 'Escape':
287
- event.preventDefault();
288
- close();
289
- return true;
290
- default:
291
- return false;
292
- }
293
- }, [open, flatResults, highlightedIndex, insertMention, close]);
294
- const getValueWithTokens = useCallback(() => {
295
- if (anchors.length === 0)
296
- return valueRef.current;
297
- // Sort anchors by start ASC, then substitute. Walk the value left → right
298
- // building the result with mention tokens swapped in at each anchor's range.
299
- const sorted = [...anchors].sort((a, b) => a.start - b.start);
300
- const v = valueRef.current;
301
- let out = '';
302
- let cursor = 0;
303
- for (const a of sorted) {
304
- if (a.start < cursor)
305
- continue; // overlapping; drop (shouldn't happen)
306
- out += v.slice(cursor, a.start);
307
- out += formatMentionToken(a.ref);
308
- cursor = a.end;
309
- }
310
- out += v.slice(cursor);
311
- return out;
312
- }, [anchors]);
313
- const state = {
314
- open,
315
- query,
316
- groups,
317
- showingRecent,
318
- highlightedIndex,
319
- flatResults,
320
- };
321
- return { state, handleKeyDown, insertMention, getValueWithTokens, anchors, close };
322
- }
323
- //# sourceMappingURL=use-mention-autocomplete.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-mention-autocomplete.js","sourceRoot":"","sources":["../../src/mentions/use-mention-autocomplete.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- export type { ChatNameResolverProviderProps } from "../context/ChatNameResolverContext.js";
2
- export { ChatNameResolverProvider, useChatNameResolver, useOptionalChatNameResolver, useResolvedSenderName } from "../context/ChatNameResolverContext.js";
3
- export type { UseChatMessagesResult } from "../hooks/useChatMessages.js";
4
- export { useChatMessages } from "../hooks/useChatMessages.js";
5
- export { canAccessThread } from "../hooks/useChatThreadAccess.js";
6
- export type { ChatShellProps } from "../ui/ChatShell.js";
7
- export { ChatShell } from "../ui/ChatShell.js";
8
- export { MessageList } from "../ui/MessageList.js";
9
- export type { ComposerProps } from "../ui/Composer.js";
10
- export { Composer } from "../ui/Composer.js";
11
- export type { MessageItemDefaultProps } from "../ui/MessageItemDefault.js";
12
- export { MessageItemDefault } from "../ui/MessageItemDefault.js";
13
- export { MessageActions, ThreadActions } from "../ui/menus.js";
14
- export { MessageText, type MessageTextProps } from "../mentions/MessageText.js";
15
- export { MentionAutocomplete, type MentionAutocompleteProps, } from "../mentions/MentionAutocomplete.js";
16
- export { useMentionAutocomplete, type UseMentionAutocompleteArgs, type UseMentionAutocompleteResult, type AutocompleteState, type AutocompleteResultGroup, } from "../mentions/use-mention-autocomplete.js";
17
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE1J,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,yCAAyC,CAAC"}
@@ -1,13 +0,0 @@
1
- "use client";
2
- export { ChatNameResolverProvider, useChatNameResolver, useOptionalChatNameResolver, useResolvedSenderName } from "../context/ChatNameResolverContext.js";
3
- export { useChatMessages } from "../hooks/useChatMessages.js";
4
- export { canAccessThread } from "../hooks/useChatThreadAccess.js";
5
- export { ChatShell } from "../ui/ChatShell.js";
6
- export { MessageList } from "../ui/MessageList.js";
7
- export { Composer } from "../ui/Composer.js";
8
- export { MessageItemDefault } from "../ui/MessageItemDefault.js";
9
- export { MessageActions, ThreadActions } from "../ui/menus.js";
10
- export { MessageText } from "../mentions/MessageText.js";
11
- export { MentionAutocomplete, } from "../mentions/MentionAutocomplete.js";
12
- export { useMentionAutocomplete, } from "../mentions/use-mention-autocomplete.js";
13
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAG1J,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAyB,MAAM,4BAA4B,CAAC;AAChF,OAAO,EACL,mBAAmB,GAEpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,sBAAsB,GAKvB,MAAM,yCAAyC,CAAC"}
@@ -1,22 +0,0 @@
1
- import * as React from "react";
2
- import type { ChatCoreConfig, ChatMessageV1, ChatAttachmentConfig, SendAttachmentFn, MessageRendererRegistry, ModerationHandlers } from "../types.js";
3
- export type ChatShellProps = {
4
- config: ChatCoreConfig;
5
- header?: React.ReactNode;
6
- onSend: (text: string, replyTo?: ChatMessageV1["replyTo"]) => Promise<void>;
7
- renderMessage?: (m: any) => React.ReactNode;
8
- messageRenderers?: MessageRendererRegistry;
9
- handlers?: ModerationHandlers;
10
- attachmentConfig?: ChatAttachmentConfig;
11
- sendAttachment?: SendAttachmentFn;
12
- composerPlaceholder?: string;
13
- autoFocus?: boolean;
14
- renderAboveMessages?: () => React.ReactNode;
15
- renderBelowMessages?: () => React.ReactNode;
16
- /** If provided, replaces the Composer entirely */
17
- renderFooter?: () => React.ReactNode;
18
- onSenderClick?: (senderId: string, displayName: string) => void;
19
- composerDisabled?: boolean;
20
- };
21
- export declare function ChatShell(props: ChatShellProps): import("react/jsx-runtime").JSX.Element;
22
- //# sourceMappingURL=ChatShell.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatShell.d.ts","sourceRoot":"","sources":["../../src/ui/ChatShell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAQrB,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,cAAc,CAAC;IAGvB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAGzB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5E,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5C,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAG9B,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,mBAAmB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAC5C,mBAAmB,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAC5C,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;IAGrC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAGhE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CA2G9C"}
@@ -1,22 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { Card, CardHeader, CardContent, CardFooter, Skeleton } from "@ttt-productions/ui-core/react";
5
- import { KeyboardAvoidingView } from "@ttt-productions/mobile-core/react";
6
- import { useChatMessages } from "../hooks/useChatMessages.js";
7
- import { MessageList } from "./MessageList.js";
8
- import { Composer } from "./Composer.js";
9
- import { ThreadActions } from "./menus.js";
10
- export function ChatShell(props) {
11
- const { config, header, onSend, renderMessage, messageRenderers, handlers, attachmentConfig, sendAttachment, composerPlaceholder, autoFocus = false, renderAboveMessages, renderBelowMessages, renderFooter, onSenderClick, composerDisabled, } = props;
12
- const { allowed, isInitialLoading, messages, fetchOlder, hasOlder, isFetchingOlder } = useChatMessages(config);
13
- const [showScrollToBottom, setShowScrollToBottom] = React.useState(false);
14
- if (!allowed) {
15
- return _jsx("div", { className: "p-4 text-sm opacity-70", children: "You don't have access to this thread." });
16
- }
17
- if (isInitialLoading) {
18
- return (_jsxs(Card, { className: "w-full", children: [_jsxs(CardHeader, { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-5 w-40" }), _jsx(Skeleton, { className: "h-3 w-56" })] }), _jsx(CardContent, { children: _jsx(Skeleton, { className: "h-[240px] w-full" }) }), _jsx(CardFooter, { children: _jsx(Skeleton, { className: "h-10 w-full" }) })] }));
19
- }
20
- return (_jsxs(Card, { className: "w-full", children: [(header || handlers) && (_jsxs(CardHeader, { className: "flex flex-row items-start justify-between gap-4 space-y-0", children: [_jsx("div", { children: header }), _jsx("div", { className: "flex flex-col items-end gap-2", children: _jsx(ThreadActions, { threadId: config.threadId, isAdmin: config.isAdmin, handlers: handlers }) })] })), renderAboveMessages && (_jsx("div", { className: "border-b", children: renderAboveMessages() })), _jsx(CardContent, { className: "p-0", children: _jsx(MessageList, { messages: messages, currentUserId: config.currentUserId, isAdmin: config.isAdmin, isFetchingOlder: isFetchingOlder, hasOlder: hasOlder, onLoadOlder: () => fetchOlder(), renderMessage: renderMessage, messageRenderers: messageRenderers, showScrollToBottom: showScrollToBottom, onScrollToBottom: () => setShowScrollToBottom(false), handlers: handlers, onSenderClick: onSenderClick }) }), renderBelowMessages && (_jsx("div", { className: "border-t", children: renderBelowMessages() })), renderFooter ? (_jsx(CardFooter, { className: "border-t", children: renderFooter() })) : (_jsx(CardFooter, { className: "border-t", children: _jsx(KeyboardAvoidingView, { padding: true, offset: 8, className: "w-full", children: _jsx(Composer, { onSend: onSend, attachmentConfig: attachmentConfig, sendAttachment: sendAttachment, disabled: composerDisabled, autoFocus: autoFocus, placeholder: composerPlaceholder, mentionConfig: config.mentionConfig }) }) }))] }));
21
- }
22
- //# sourceMappingURL=ChatShell.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatShell.js","sourceRoot":"","sources":["../../src/ui/ChatShell.tsx"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import type { ChatAttachmentConfig, ChatMessageV1, SendAttachmentFn } from "../types.js";
2
- export type ComposerProps = {
3
- /**
4
- * Text-only send. Composer calls this when there is no pending attachment.
5
- * Consumer creates the message doc. Return value is ignored.
6
- */
7
- onSend: (text: string, replyTo?: ChatMessageV1["replyTo"]) => Promise<void>;
8
- attachmentConfig?: ChatAttachmentConfig;
9
- /**
10
- * Attachment send. Composer uploads the file to Storage first, then calls
11
- * this with the resulting metadata. Consumer wires it to a backend callable
12
- * (`startUpload`) that writes the pendingMedia doc. The processor creates
13
- * the message doc after moderation succeeds.
14
- * Required for attachment functionality.
15
- */
16
- sendAttachment?: SendAttachmentFn;
17
- disabled?: boolean;
18
- autoFocus?: boolean;
19
- placeholder?: string;
20
- mentionConfig?: import('../types.js').ChatMentionConfig;
21
- };
22
- export declare function Composer(props: ComposerProps): import("react/jsx-runtime").JSX.Element;
23
- //# sourceMappingURL=Composer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../src/ui/Composer.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAkB,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwBzG,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5E,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAElC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,aAAa,EAAE,iBAAiB,CAAC;CACzD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAmM5C"}
@@ -1,140 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import * as React from "react";
4
- import { Button, Textarea } from "@ttt-productions/ui-core/react";
5
- import { cn } from "@ttt-productions/ui-core";
6
- import { ensureFileWithContentType } from "@ttt-productions/file-input";
7
- import { MediaInput } from "@ttt-productions/file-input/react";
8
- import { useGuardedUpload } from "@ttt-productions/upload-ui/react/upload";
9
- import { Loader2, X, FileText, ImageIcon, VideoIcon, MicIcon } from "lucide-react";
10
- import { useMentionAutocomplete } from "../mentions/use-mention-autocomplete.js";
11
- import { MentionAutocomplete } from "../mentions/MentionAutocomplete.js";
12
- function genId() {
13
- return `${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;
14
- }
15
- function getAttachmentType(file) {
16
- if (file.type.startsWith("image/"))
17
- return "image";
18
- if (file.type.startsWith("video/"))
19
- return "video";
20
- if (file.type.startsWith("audio/"))
21
- return "audio";
22
- return "text";
23
- }
24
- function AttachmentTypeIcon({ type }) {
25
- switch (type) {
26
- case "image": return _jsx(ImageIcon, { className: "h-4 w-4 shrink-0" });
27
- case "video": return _jsx(VideoIcon, { className: "h-4 w-4 shrink-0" });
28
- case "audio": return _jsx(MicIcon, { className: "h-4 w-4 shrink-0" });
29
- default: return _jsx(FileText, { className: "h-4 w-4 shrink-0" });
30
- }
31
- }
32
- export function Composer(props) {
33
- const { onSend, attachmentConfig, sendAttachment, disabled, autoFocus = false, placeholder = "Type a message...", } = props;
34
- const [text, setText] = React.useState("");
35
- const [pendingFile, setPendingFile] = React.useState(null);
36
- const [isSending, setIsSending] = React.useState(false);
37
- const [uploadState, setUploadState] = React.useState(null);
38
- const ref = React.useRef(null);
39
- const abortControllerRef = React.useRef(null);
40
- const guardedUpload = useGuardedUpload();
41
- const mentionApi = useMentionAutocomplete({
42
- textareaRef: ref,
43
- value: text,
44
- onChange: setText,
45
- providers: props.mentionConfig?.providers ?? [],
46
- context: props.mentionConfig?.context,
47
- recent: props.mentionConfig?.recent,
48
- trigger: props.mentionConfig?.trigger,
49
- minQueryLength: props.mentionConfig?.minQueryLength,
50
- searchDebounceMs: props.mentionConfig?.searchDebounceMs,
51
- });
52
- const attachEnabled = Boolean(attachmentConfig && sendAttachment);
53
- // focus stability: never steal focus unless explicitly enabled
54
- React.useEffect(() => {
55
- if (!autoFocus)
56
- return;
57
- ref.current?.focus();
58
- }, [autoFocus]);
59
- const handleFileSelected = React.useCallback((payload) => {
60
- if (payload.error || !payload.file) {
61
- setPendingFile(null);
62
- return;
63
- }
64
- setPendingFile(payload.file);
65
- }, []);
66
- const handleCancelUpload = React.useCallback(() => {
67
- abortControllerRef.current?.abort();
68
- }, []);
69
- const send = async () => {
70
- const v = text.trim();
71
- if (!v && !pendingFile)
72
- return;
73
- setIsSending(true);
74
- try {
75
- if (pendingFile && attachmentConfig && sendAttachment) {
76
- // Attachment path: upload first via canonical guarded upload, then register.
77
- const uuid = genId();
78
- const { uploadAdapter, userId, storage } = attachmentConfig;
79
- const storagePath = uploadAdapter.buildUploadPath({ userId, attachmentId: uuid });
80
- const extraMetadata = uploadAdapter.buildUploadMetadata?.({ userId, attachmentId: uuid }) ?? {};
81
- const fileToUpload = ensureFileWithContentType(pendingFile);
82
- const attType = getAttachmentType(fileToUpload);
83
- const controller = new AbortController();
84
- abortControllerRef.current = controller;
85
- await guardedUpload({
86
- storage,
87
- path: storagePath,
88
- file: fileToUpload,
89
- metadata: { contentType: fileToUpload.type, ...extraMetadata },
90
- uploadId: uuid,
91
- onProgress: (state) => setUploadState(state),
92
- signal: controller.signal,
93
- });
94
- await sendAttachment({
95
- text: mentionApi.getValueWithTokens(),
96
- attachment: {
97
- attachmentId: uuid,
98
- storagePath,
99
- originalFileName: fileToUpload.name,
100
- type: attType,
101
- size: fileToUpload.size,
102
- },
103
- });
104
- }
105
- else {
106
- // Text-only path.
107
- await onSend(mentionApi.getValueWithTokens());
108
- }
109
- setText("");
110
- setPendingFile(null);
111
- mentionApi.close();
112
- }
113
- catch (err) {
114
- // AbortError = user-initiated cancel via the MediaInput cancel button.
115
- // Clear local state and swallow — not a real failure.
116
- if (err instanceof Error && err.name === 'AbortError') {
117
- setPendingFile(null);
118
- return;
119
- }
120
- console.error("[Composer] Send failed:", err);
121
- setPendingFile(null);
122
- throw err;
123
- }
124
- finally {
125
- abortControllerRef.current = null;
126
- setIsSending(false);
127
- setUploadState(null);
128
- }
129
- };
130
- const isDisabled = disabled || isSending;
131
- return (_jsxs("div", { className: "chat-composer", children: [pendingFile && !isSending && (_jsxs("div", { className: "chat-composer-file-preview", children: [_jsx(AttachmentTypeIcon, { type: getAttachmentType(pendingFile) }), _jsx("span", { className: "chat-composer-file-name", children: pendingFile.name }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "h-6 w-6 shrink-0", onClick: () => setPendingFile(null), children: _jsx(X, { className: "h-3 w-3" }) })] })), props.mentionConfig && mentionApi.state.open && (_jsx("div", { className: "relative", children: _jsx("div", { className: "absolute bottom-full left-0 mb-1 z-10", children: _jsx(MentionAutocomplete, { state: mentionApi.state, onSelect: (ref) => mentionApi.insertMention(ref) }) }) })), _jsxs("div", { className: "flex items-end gap-2", children: [_jsx(Textarea, { ref: ref, value: text, onChange: (e) => setText(e.target.value), placeholder: placeholder, disabled: isDisabled, rows: 1, className: cn("min-h-[40px] resize-none"), onKeyDown: (e) => {
132
- if (mentionApi.handleKeyDown(e))
133
- return;
134
- if (e.key === "Enter" && !e.shiftKey) {
135
- e.preventDefault();
136
- send();
137
- }
138
- } }), _jsx(Button, { type: "button", variant: "default", disabled: isDisabled || (!text.trim() && !pendingFile), onClick: send, children: isSending ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : "Send" })] }), attachEnabled && attachmentConfig && (_jsx("div", { className: "mt-2", children: _jsx(MediaInput, { spec: attachmentConfig.attachmentSpec, onChange: handleFileSelected, selectedFile: pendingFile, isLoading: isSending, uploadState: uploadState, disabled: isDisabled, buttonLabel: "Attach file", onClear: () => setPendingFile(null), onCancel: handleCancelUpload, className: "w-full" }) }))] }));
139
- }
140
- //# sourceMappingURL=Composer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Composer.js","sourceRoot":"","sources":["../../src/ui/Composer.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { ChatMessageV1, ModerationHandlers } from "../types.js";
2
- export type MessageItemDefaultProps = {
3
- m: ChatMessageV1;
4
- currentUserId: string;
5
- isAdmin: boolean;
6
- handlers?: ModerationHandlers;
7
- isContinuation?: boolean;
8
- onSenderClick?: (senderId: string, displayName: string) => void;
9
- };
10
- export declare function MessageItemDefault(props: MessageItemDefaultProps): import("react/jsx-runtime").JSX.Element;
11
- //# sourceMappingURL=MessageItemDefault.d.ts.map