@ttt-productions/chat-core 0.6.1 → 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 -43
  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,139 +0,0 @@
1
- "use client";
2
- import * as React from "react";
3
- import { collection, getDocs, onSnapshot, orderBy, query, startAfter, limit, } from "firebase/firestore";
4
- import { useInfiniteQuery } from "@tanstack/react-query";
5
- import { toMillis } from "@ttt-productions/firebase-helpers";
6
- import { canAccessThread } from "./useChatThreadAccess.js";
7
- import { messagesColPath, newestWindowQuery } from "../firestore/queries.js";
8
- import { useOptionalChatNameResolver } from "../context/ChatNameResolverContext.js";
9
- // Safety limit to prevent memory exhaustion
10
- const MAX_PAGE_SIZE = 100;
11
- function mapMsg(doc, threadId) {
12
- const d = doc.data();
13
- const createdAt = toMillis(d.createdAt);
14
- if (!createdAt) {
15
- console.error('[useChatMessages] Message missing valid createdAt:', doc.id, d.createdAt);
16
- }
17
- // replyTo: the new shape uses senderId, not senderUsername. Tolerate older
18
- // docs that still have senderUsername — drop the name and keep what we can.
19
- const replyTo = d.replyTo
20
- ? {
21
- messageId: d.replyTo.messageId,
22
- senderId: d.replyTo.senderId ?? "",
23
- messagePreview: d.replyTo.messagePreview,
24
- }
25
- : undefined;
26
- return {
27
- messageId: doc.id,
28
- threadId,
29
- createdAt: createdAt || 0,
30
- senderId: d.senderId,
31
- text: d.text ?? "",
32
- type: d.type,
33
- attachment: d.attachment ?? undefined,
34
- replyTo,
35
- isSystemMessage: d.isSystemMessage ?? undefined,
36
- meta: d.meta,
37
- };
38
- }
39
- function dedupeAndSortAsc(all) {
40
- const m = new Map();
41
- for (const x of all)
42
- m.set(x.messageId, x);
43
- return Array.from(m.values()).sort((a, b) => a.createdAt - b.createdAt);
44
- }
45
- function messagesCol(db, chatCollectionPath, threadId, messagesSubcollection) {
46
- const path = messagesColPath(chatCollectionPath, threadId, messagesSubcollection);
47
- return collection(db, path[0], ...path.slice(1));
48
- }
49
- export function useChatMessages(config) {
50
- const { db, chatCollectionPath, messagesSubcollection = "messages", threadId, pageSize: requestedPageSize = 20, currentUserId, isAdmin, accessMode, threadAllowedUserIds, createdAtField = "createdAt", } = config;
51
- const pageSize = Math.min(requestedPageSize, MAX_PAGE_SIZE);
52
- if (requestedPageSize > MAX_PAGE_SIZE) {
53
- console.warn(`[useChatMessages] Requested pageSize ${requestedPageSize} exceeds maximum ${MAX_PAGE_SIZE}. Using ${MAX_PAGE_SIZE}.`);
54
- }
55
- const pathKey = JSON.stringify(Array.isArray(chatCollectionPath) ? chatCollectionPath : [chatCollectionPath]);
56
- const allowed = React.useMemo(() => canAccessThread({
57
- accessMode,
58
- isAdmin,
59
- currentUserId,
60
- allowedUserIds: threadAllowedUserIds,
61
- }), [accessMode, isAdmin, currentUserId, threadAllowedUserIds]);
62
- const [newest, setNewest] = React.useState({
63
- ready: false,
64
- newestDesc: [],
65
- oldestDocInWindow: null,
66
- });
67
- React.useEffect(() => {
68
- if (!allowed)
69
- return;
70
- const q = newestWindowQuery(db, chatCollectionPath, threadId, createdAtField, pageSize, messagesSubcollection);
71
- const unsub = onSnapshot(q, (snap) => {
72
- const docs = snap.docs;
73
- const mapped = docs.map((d) => mapMsg(d, threadId));
74
- setNewest({
75
- ready: true,
76
- newestDesc: mapped,
77
- oldestDocInWindow: docs[docs.length - 1] ?? null,
78
- });
79
- });
80
- return () => unsub();
81
- }, [allowed, db, pathKey, threadId, createdAtField, pageSize, messagesSubcollection]);
82
- const older = useInfiniteQuery({
83
- queryKey: ["chat-core", "older", pathKey, threadId, messagesSubcollection, pageSize],
84
- enabled: allowed && newest.ready,
85
- initialPageParam: undefined,
86
- queryFn: async ({ pageParam }) => {
87
- const baseCol = messagesCol(db, chatCollectionPath, threadId, messagesSubcollection);
88
- const cursor = pageParam ?? (newest.oldestDocInWindow ?? undefined);
89
- if (!cursor) {
90
- return {
91
- itemsDesc: [],
92
- nextCursor: undefined,
93
- };
94
- }
95
- const q = query(baseCol, orderBy(createdAtField, "desc"), startAfter(cursor), limit(pageSize));
96
- const snap = await getDocs(q);
97
- const docs = snap.docs;
98
- const itemsDesc = docs.map((d) => mapMsg(d, threadId));
99
- const nextCursor = docs.length === pageSize ? docs[docs.length - 1] : undefined;
100
- return { itemsDesc, nextCursor };
101
- },
102
- getNextPageParam: (last) => last.nextCursor,
103
- });
104
- const fetchOlder = React.useCallback(async () => {
105
- await older.fetchNextPage();
106
- }, [older.fetchNextPage]);
107
- const messages = React.useMemo(() => {
108
- if (!allowed)
109
- return [];
110
- const olderDesc = (older.data?.pages ?? []).flatMap((p) => p.itemsDesc);
111
- return dedupeAndSortAsc([...olderDesc, ...newest.newestDesc]);
112
- }, [allowed, older.data, newest.newestDesc]);
113
- // Pre-warm name cache for all visible senders (and reply-to senders).
114
- // Optional resolver: silent no-op if no provider is wrapped.
115
- const resolverCtx = useOptionalChatNameResolver();
116
- const senderIds = React.useMemo(() => {
117
- const set = new Set();
118
- for (const m of messages) {
119
- set.add(m.senderId);
120
- if (m.replyTo?.senderId)
121
- set.add(m.replyTo.senderId);
122
- }
123
- return Array.from(set);
124
- }, [messages]);
125
- React.useEffect(() => {
126
- if (resolverCtx?.prewarm && senderIds.length > 0) {
127
- resolverCtx.prewarm(senderIds);
128
- }
129
- }, [resolverCtx, senderIds]);
130
- return {
131
- allowed,
132
- isInitialLoading: allowed ? !newest.ready : false,
133
- messages,
134
- fetchOlder,
135
- hasOlder: Boolean(older.hasNextPage),
136
- isFetchingOlder: older.isFetchingNextPage,
137
- };
138
- }
139
- //# sourceMappingURL=useChatMessages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useChatMessages.js","sourceRoot":"","sources":["../../src/hooks/useChatMessages.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import type { ChatAccessMode } from "../types.js";
2
- export declare function canAccessThread(args: {
3
- accessMode: ChatAccessMode;
4
- isAdmin: boolean;
5
- currentUserId: string;
6
- allowedUserIds?: string[];
7
- }): boolean;
8
- //# sourceMappingURL=useChatThreadAccess.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useChatThreadAccess.d.ts","sourceRoot":"","sources":["../../src/hooks/useChatThreadAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,UAAU,EAAE,cAAc,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,GAAG,OAAO,CAkBV"}
@@ -1,19 +0,0 @@
1
- export function canAccessThread(args) {
2
- const { accessMode, isAdmin, currentUserId, allowedUserIds } = args;
3
- // Admin always bypasses access checks (admin moderation surfaces).
4
- if (isAdmin)
5
- return true;
6
- // Unauthenticated users never have access regardless of mode.
7
- if (!currentUserId)
8
- return false;
9
- if (accessMode === "firestore-rules") {
10
- // Defer to Firestore rules. If rules deny, onSnapshot will surface
11
- // permission-denied, but chat-core does not pre-deny.
12
- return true;
13
- }
14
- // accessMode === "explicit-allowlist"
15
- if (!allowedUserIds)
16
- return false;
17
- return allowedUserIds.includes(currentUserId);
18
- }
19
- //# sourceMappingURL=useChatThreadAccess.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useChatThreadAccess.js","sourceRoot":"","sources":["../../src/hooks/useChatThreadAccess.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,IAK/B;IACC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAEpE,mEAAmE;IACnE,IAAI,OAAO;QAAE,OAAO,IAAI,CAAC;IAEzB,8DAA8D;IAC9D,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAEjC,IAAI,UAAU,KAAK,iBAAiB,EAAE,CAAC;QACrC,mEAAmE;QACnE,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAChD,CAAC"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Visual autocomplete dropdown for the mention system.
3
- *
4
- * Pure presentation — driven entirely by `state` from `useMentionAutocomplete`.
5
- * The consumer is expected to absolutely-position this near the textarea (or
6
- * use its caret position via a wrapping container). chat-core does not
7
- * compute textarea-caret coordinates; that's the consumer's job.
8
- *
9
- * Selecting a result fires `onSelect(ref)`. Hovering / arrow-keying updates
10
- * the highlight via `onHighlight(index)`.
11
- */
12
- import type { AutocompleteState } from './use-mention-autocomplete.js';
13
- import type { MentionRef } from './types.js';
14
- export interface MentionAutocompleteProps<TKind extends string = string> {
15
- state: AutocompleteState<TKind>;
16
- onSelect: (ref: MentionRef<TKind>) => void;
17
- onHighlight?: (flatIndex: number) => void;
18
- /** Class name applied to the outer container. */
19
- className?: string;
20
- }
21
- export declare function MentionAutocomplete<TKind extends string = string>(props: MentionAutocompleteProps<TKind>): import("react/jsx-runtime").JSX.Element | null;
22
- //# sourceMappingURL=MentionAutocomplete.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MentionAutocomplete.d.ts","sourceRoot":"","sources":["../../src/mentions/MentionAutocomplete.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,wBAAwB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IACrE,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAC/D,KAAK,EAAE,wBAAwB,CAAC,KAAK,CAAC,kDAoEvC"}
@@ -1,21 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { cn } from '@ttt-productions/ui-core';
4
- export function MentionAutocomplete(props) {
5
- const { state, onSelect, onHighlight, className } = props;
6
- if (!state.open)
7
- return null;
8
- const anyResults = state.flatResults.length > 0;
9
- const anyLoading = state.groups.some((g) => g.loading);
10
- let flatIndex = 0;
11
- return (_jsxs("div", { role: "listbox", "aria-label": "Mentions", className: cn('chat-mention-autocomplete', 'rounded-md border bg-popover text-popover-foreground shadow-md', 'max-h-72 overflow-y-auto min-w-[16rem]', className), children: [!anyResults && anyLoading && (_jsx("div", { className: "px-3 py-2 text-xs text-muted-foreground", children: "Searching\u2026" })), !anyResults && !anyLoading && (_jsx("div", { className: "px-3 py-2 text-xs text-muted-foreground", children: state.showingRecent ? 'No recent mentions' : 'No matches' })), state.groups.map((group) => (_jsxs("div", { className: "chat-mention-group", children: [_jsx("div", { className: "px-3 pt-2 pb-1 text-xs font-semibold text-muted-foreground", children: state.showingRecent ? `Recent ${group.label}` : group.label }), group.loading && group.results.length === 0 && (_jsx("div", { className: "px-3 pb-2 text-xs text-muted-foreground", children: "Loading\u2026" })), _jsx("ul", { children: group.results.map((ref) => {
12
- const myIndex = flatIndex;
13
- flatIndex += 1;
14
- const highlighted = myIndex === state.highlightedIndex;
15
- return (_jsx("li", { children: _jsx("button", { type: "button", role: "option", "aria-selected": highlighted, className: cn('w-full text-left px-3 py-2 text-sm hover:bg-accent hover:text-accent-foreground', highlighted && 'bg-accent text-accent-foreground'), onMouseEnter: () => onHighlight?.(myIndex), onClick: (e) => {
16
- e.preventDefault();
17
- onSelect(ref);
18
- }, children: group.renderResult ? group.renderResult(ref) : _jsxs("span", { children: ["@", ref.displayText] }) }) }, `${ref.kind}:${ref.id}`));
19
- }) })] }, group.kind)))] }));
20
- }
21
- //# sourceMappingURL=MentionAutocomplete.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MentionAutocomplete.js","sourceRoot":"","sources":["../../src/mentions/MentionAutocomplete.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAgBb,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAU9C,MAAM,UAAU,mBAAmB,CACjC,KAAsC;IAEtC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAEvD,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,CACL,eACE,IAAI,EAAC,SAAS,gBACH,UAAU,EACrB,SAAS,EAAE,EAAE,CACX,2BAA2B,EAC3B,gEAAgE,EAChE,wCAAwC,EACxC,SAAS,CACV,aAEA,CAAC,UAAU,IAAI,UAAU,IAAI,CAC5B,cAAK,SAAS,EAAC,yCAAyC,gCAAiB,CAC1E,EACA,CAAC,UAAU,IAAI,CAAC,UAAU,IAAI,CAC7B,cAAK,SAAS,EAAC,yCAAyC,YACrD,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,YAAY,GACtD,CACP,EACA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B,eAAsB,SAAS,EAAC,oBAAoB,aAClD,cAAK,SAAS,EAAC,4DAA4D,YACxE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GACxD,EACL,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAC9C,cAAK,SAAS,EAAC,yCAAyC,8BAAe,CACxE,EACD,uBACG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;4BACzB,MAAM,OAAO,GAAG,SAAS,CAAC;4BAC1B,SAAS,IAAI,CAAC,CAAC;4BACf,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,CAAC,gBAAgB,CAAC;4BACvD,OAAO,CACL,uBACE,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,mBACE,WAAW,EAC1B,SAAS,EAAE,EAAE,CACX,iFAAiF,EACjF,WAAW,IAAI,kCAAkC,CAClD,EACD,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,EAC1C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;wCACb,CAAC,CAAC,cAAc,EAAE,CAAC;wCACnB,QAAQ,CAAC,GAAG,CAAC,CAAC;oCAChB,CAAC,YAEA,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gCAAQ,GAAG,CAAC,WAAW,IAAQ,GACxE,IAhBF,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAiB3B,CACN,CAAC;wBACJ,CAAC,CAAC,GACC,KAjCG,KAAK,CAAC,IAAI,CAkCd,CACP,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Renders message text with inline mention chips.
3
- *
4
- * Walks the parser output and renders each segment: text segments as
5
- * `<span>`, mention segments via the consumer-supplied `renderMention`
6
- * callback (or a default chip when omitted).
7
- *
8
- * Pure, no context. Safe to use inside MessageItem renderers, ReplyQuote
9
- * previews, or any other text surface that should honor mention tokens.
10
- */
11
- import type { ReactNode } from 'react';
12
- import type { MentionRef } from './types.js';
13
- export interface MessageTextProps<TKind extends string = string> {
14
- /** Raw message text containing optional `@[kind:id|displayText]` tokens. */
15
- text: string;
16
- /**
17
- * Custom mention renderer. When omitted, mentions render as a
18
- * `<span class="chat-mention-chip">@{displayText}</span>` chip — consumers
19
- * style via CSS. To make mentions clickable / linked / role-aware, supply
20
- * a renderMention.
21
- */
22
- renderMention?: (ref: MentionRef<TKind>) => ReactNode;
23
- /** Optional className applied to the wrapping `<span>`. */
24
- className?: string;
25
- }
26
- export declare function MessageText<TKind extends string = string>(props: MessageTextProps<TKind>): import("react/jsx-runtime").JSX.Element;
27
- //# sourceMappingURL=MessageText.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MessageText.d.ts","sourceRoot":"","sources":["../../src/mentions/MessageText.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IAC7D,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;IACtD,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,2CAiBxF"}
@@ -1,20 +0,0 @@
1
- 'use client';
2
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
- import { parseMentionTokens } from './parser.js';
4
- function DefaultMentionChip({ ref }) {
5
- return (_jsxs("span", { className: "chat-mention-chip", "data-mention-kind": ref.kind, "data-mention-id": ref.id, children: ["@", ref.displayText] }));
6
- }
7
- export function MessageText(props) {
8
- const { text, renderMention, className } = props;
9
- const segments = parseMentionTokens(text);
10
- return (_jsx("span", { className: className, children: segments.map((seg, i) => {
11
- if (seg.type === 'text') {
12
- return _jsx("span", { children: seg.text }, i);
13
- }
14
- if (renderMention) {
15
- return _jsx("span", { children: renderMention(seg.ref) }, i);
16
- }
17
- return _jsx(DefaultMentionChip, { ref: seg.ref }, i);
18
- }) }));
19
- }
20
- //# sourceMappingURL=MessageText.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MessageText.js","sourceRoot":"","sources":["../../src/mentions/MessageText.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAeb,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAgBjD,SAAS,kBAAkB,CAAuB,EAAE,GAAG,EAA8B;IACnF,OAAO,CACL,gBAAM,SAAS,EAAC,mBAAmB,uBAAoB,GAAG,CAAC,IAAI,qBAAmB,GAAG,CAAC,EAAE,kBACpF,GAAG,CAAC,WAAW,IACZ,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAgC,KAA8B;IACvF,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACjD,MAAM,QAAQ,GAAG,kBAAkB,CAAQ,IAAI,CAAC,CAAC;IAEjD,OAAO,CACL,eAAM,SAAS,EAAE,SAAS,YACvB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,OAAO,yBAAe,GAAG,CAAC,IAAI,IAAZ,CAAC,CAAmB,CAAC;YACzC,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,yBAAe,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAA1B,CAAC,CAAiC,CAAC;YACvD,CAAC;YACD,OAAO,KAAC,kBAAkB,IAAS,GAAG,EAAE,GAAG,CAAC,GAAG,IAAf,CAAC,CAAkB,CAAC;QACtD,CAAC,CAAC,GACG,CACR,CAAC;AACJ,CAAC"}
@@ -1,81 +0,0 @@
1
- /**
2
- * Composer-side mention autocomplete state hook.
3
- *
4
- * Detects when the user types the trigger character (default `@`) inside the
5
- * provided textarea, captures the live query (the text between the trigger
6
- * and the cursor), debounces searches across all configured providers, and
7
- * tracks the anchor positions of inserted mentions so the composer can
8
- * convert display text back to wire tokens on send.
9
- *
10
- * Returns an `AutocompleteState` value tailored for the `<MentionAutocomplete>`
11
- * UI component, plus an `insertMention` action and a `getValueWithTokens`
12
- * accessor the composer calls on send.
13
- *
14
- * Generic over `TKind` and `TContext`; chat-core inspects neither.
15
- */
16
- import { type RefObject } from 'react';
17
- import type { MentionAnchor, MentionProvider, MentionRef, RecentMentionsAdapter } from './types.js';
18
- export type AutocompleteResultGroup<TKind extends string = string> = {
19
- kind: TKind;
20
- label: string;
21
- results: MentionRef<TKind>[];
22
- /** True if `search` is in flight for this provider. */
23
- loading: boolean;
24
- /** Provider-supplied custom renderer for individual results, if any. */
25
- renderResult?: (ref: MentionRef<TKind>) => import('react').ReactNode;
26
- };
27
- export type AutocompleteState<TKind extends string = string> = {
28
- /** True iff the dropdown should be visible. */
29
- open: boolean;
30
- /** Current query text (everything after the trigger up to the cursor). */
31
- query: string;
32
- /** Results grouped by provider, in the order the consumer passed providers. */
33
- groups: AutocompleteResultGroup<TKind>[];
34
- /** When true, groups are recent picks (`getRecent`) rather than search results. */
35
- showingRecent: boolean;
36
- /** Index of the currently highlighted result, flattened across all groups. */
37
- highlightedIndex: number;
38
- /** Flat array of all results in display order. Used internally for keyboard nav. */
39
- flatResults: MentionRef<TKind>[];
40
- };
41
- export interface UseMentionAutocompleteArgs<TKind extends string, TContext> {
42
- textareaRef: RefObject<HTMLTextAreaElement | null>;
43
- /** Current textarea value (controlled). */
44
- value: string;
45
- /** Setter for the textarea value. */
46
- onChange: (next: string) => void;
47
- /** Providers in display order. Empty list disables the system entirely. */
48
- providers: MentionProvider<TKind, TContext>[];
49
- /** Consumer-controlled context passed to each provider's `search`. */
50
- context: TContext;
51
- /** Optional recent-mentions adapter. */
52
- recent?: RecentMentionsAdapter<TKind>;
53
- /** Trigger character. Defaults to `'@'`. Must be exactly one character. */
54
- trigger?: string;
55
- /**
56
- * Minimum query length to fire `search`. Below this, recent picks are shown
57
- * (if `recent` is supplied) or the dropdown stays empty. Default: 0 (search
58
- * fires immediately on trigger).
59
- */
60
- minQueryLength?: number;
61
- /** Debounce window in ms for search calls. Default: 200. */
62
- searchDebounceMs?: number;
63
- }
64
- export interface UseMentionAutocompleteResult<TKind extends string = string> {
65
- state: AutocompleteState<TKind>;
66
- /** Handle keydown from the textarea — returns true if the event was handled. */
67
- handleKeyDown: (event: import('react').KeyboardEvent<HTMLTextAreaElement>) => boolean;
68
- /** Programmatically insert a mention at the trigger position (called by the autocomplete UI). */
69
- insertMention: (ref: MentionRef<TKind>) => void;
70
- /**
71
- * Returns the current textarea value with all tracked mention anchors
72
- * substituted back to wire tokens. Call this from the composer's send path.
73
- */
74
- getValueWithTokens: () => string;
75
- /** Anchor list — exposed for tests and consumers that need the raw positions. */
76
- anchors: MentionAnchor<TKind>[];
77
- /** Close the dropdown imperatively (e.g. on send). */
78
- close: () => void;
79
- }
80
- export declare function useMentionAutocomplete<TKind extends string, TContext>(args: UseMentionAutocompleteArgs<TKind, TContext>): UseMentionAutocompleteResult<TKind>;
81
- //# sourceMappingURL=use-mention-autocomplete.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-mention-autocomplete.d.ts","sourceRoot":"","sources":["../../src/mentions/use-mention-autocomplete.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1F,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,UAAU,EACV,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,uBAAuB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,IAAI;IACnE,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7B,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,OAAO,OAAO,EAAE,SAAS,CAAC;CACtE,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7D,+CAA+C;IAC/C,IAAI,EAAE,OAAO,CAAC;IACd,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,MAAM,EAAE,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;IACzC,mFAAmF;IACnF,aAAa,EAAE,OAAO,CAAC;IACvB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,WAAW,0BAA0B,CAAC,KAAK,SAAS,MAAM,EAAE,QAAQ;IACxE,WAAW,EAAE,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACnD,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,2EAA2E;IAC3E,SAAS,EAAE,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;IAC9C,sEAAsE;IACtE,OAAO,EAAE,QAAQ,CAAC;IAClB,wCAAwC;IACxC,MAAM,CAAC,EAAE,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACtC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IACzE,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAChC,gFAAgF;IAChF,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,KAAK,OAAO,CAAC;IACtF,iGAAiG;IACjG,aAAa,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,kBAAkB,EAAE,MAAM,MAAM,CAAC;IACjC,iFAAiF;IACjF,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;IAChC,sDAAsD;IACtD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAMD,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,MAAM,EAAE,QAAQ,EACnE,IAAI,EAAE,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,GAChD,4BAA4B,CAAC,KAAK,CAAC,CAgVrC"}