@portablecore/chat 0.2.6 → 0.2.7
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/dist/chat-interface-core.d.ts.map +1 -1
- package/dist/chat-interface-core.js +1 -1
- package/dist/chat-interface-core.js.map +1 -1
- package/dist/components/message-list.d.ts +3 -2
- package/dist/components/message-list.d.ts.map +1 -1
- package/dist/components/message-list.js +10 -2
- package/dist/components/message-list.js.map +1 -1
- package/dist/hooks/use-chat-scroll.d.ts +1 -12
- package/dist/hooks/use-chat-scroll.d.ts.map +1 -1
- package/dist/hooks/use-chat-scroll.js +47 -29
- package/dist/hooks/use-chat-scroll.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-interface-core.d.ts","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAa,MAAM,YAAY,CAAA;AAWhE,UAAU,sBAAsB;IAC9B,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,kBAAkB,GACnB,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"chat-interface-core.d.ts","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAa,MAAM,YAAY,CAAA;AAWhE,UAAU,sBAAsB;IAC9B,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,kBAAkB,GACnB,EAAE,sBAAsB,2CA8GxB"}
|
|
@@ -50,7 +50,7 @@ function ChatInterfaceCore({ config, markdownComponents, }) {
|
|
|
50
50
|
}
|
|
51
51
|
return ((0, jsx_runtime_1.jsx)("div", { className: `${indicatorMaxWidth} mx-auto px-4`, children: (0, jsx_runtime_1.jsx)(bouncing_dots_js_1.BouncingDots, { expertName: config.expert?.name, expertAvatarUrl: config.expert?.avatarUrl, expertEmoji: config.expert?.emoji }) }));
|
|
52
52
|
};
|
|
53
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: rootClasses, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 min-w-0", children: [(0, jsx_runtime_1.jsx)(message_list_js_1.MessageList, { messages: session.messages, streaming: session.streaming, config: config, markdownComponents: markdownComponents, scrollRef: scroll.scrollRef, messagesEndRef: scroll.messagesEndRef, spacerExpanded: scroll.spacerExpanded, spacerHeight: scroll.spacerHeight, emptyState: slots.emptyState || ((0, jsx_runtime_1.jsx)(empty_state_js_1.EmptyState, { expertName: config.expert?.name })), beforeMessageList: slots.beforeMessageList, afterMessageList: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [renderIndicator(), slots.afterMessageList] }) }), (0, jsx_runtime_1.jsx)(input_area_js_1.InputArea, { onSend: handleSend, onAbort: session.abort, streaming: session.streaming, sending: session.sending, placeholder: config.expert
|
|
53
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: rootClasses, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 min-w-0", children: [(0, jsx_runtime_1.jsx)(message_list_js_1.MessageList, { messages: session.messages, streaming: session.streaming, config: config, markdownComponents: markdownComponents, scrollRef: scroll.scrollRef, messagesEndRef: scroll.messagesEndRef, lastUserMessageRef: scroll.lastUserMessageRef, spacerExpanded: scroll.spacerExpanded, spacerHeight: scroll.spacerHeight, emptyState: slots.emptyState || ((0, jsx_runtime_1.jsx)(empty_state_js_1.EmptyState, { expertName: config.expert?.name })), beforeMessageList: slots.beforeMessageList, afterMessageList: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [renderIndicator(), slots.afterMessageList] }) }), (0, jsx_runtime_1.jsx)(input_area_js_1.InputArea, { onSend: handleSend, onAbort: session.abort, streaming: session.streaming, sending: session.sending, placeholder: config.expert
|
|
54
54
|
? `Message ${config.expert.name}...`
|
|
55
55
|
: "Send a message...", prefillText: config.prefillText, inputPrefix: slots.inputPrefix, inputSuffix: slots.inputSuffix, attachments: attachmentState.attachments, uploading: attachmentState.uploading, onAddFiles: attachmentState.addFiles, onRemoveAttachment: attachmentState.remove, hasDocumentResolver: !!config.resolvers?.documentResolver, variant: variant, classNames: config.classNames, mentionResolver: config.resolvers?.mentionResolver, skillResolver: config.resolvers?.skillResolver })] }), slots.sidePanel && ((0, jsx_runtime_1.jsx)("div", { className: "w-80 border-l border-border overflow-y-auto", children: slots.sidePanel }))] }));
|
|
56
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-interface-core.js","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAiCZ,
|
|
1
|
+
{"version":3,"file":"chat-interface-core.js","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ReactNode, type RefObject } from "react";
|
|
1
|
+
import { type ReactNode, type RefObject, type MutableRefObject } from "react";
|
|
2
2
|
import type { LiteMessage } from "@portablecore/types/chat";
|
|
3
3
|
import type { ChatInterfaceConfig } from "../types.js";
|
|
4
4
|
interface MessageListProps {
|
|
@@ -11,6 +11,7 @@ interface MessageListProps {
|
|
|
11
11
|
afterMessageList?: ReactNode;
|
|
12
12
|
scrollRef: RefObject<HTMLDivElement>;
|
|
13
13
|
messagesEndRef: RefObject<HTMLDivElement>;
|
|
14
|
+
lastUserMessageRef: MutableRefObject<HTMLDivElement | null>;
|
|
14
15
|
spacerExpanded: boolean;
|
|
15
16
|
spacerHeight: number;
|
|
16
17
|
}
|
|
@@ -22,6 +23,6 @@ interface MessageListProps {
|
|
|
22
23
|
* - "full": max-w-5xl, wider padding, extra bottom space for scroll
|
|
23
24
|
* - "compact": max-w-3xl, tighter padding
|
|
24
25
|
*/
|
|
25
|
-
export declare function MessageList({ messages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, messagesEndRef, spacerExpanded, spacerHeight, }: MessageListProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare function MessageList({ messages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, messagesEndRef, lastUserMessageRef, spacerExpanded, spacerHeight, }: MessageListProps): import("react/jsx-runtime").JSX.Element;
|
|
26
27
|
export {};
|
|
27
28
|
//# sourceMappingURL=message-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-list.d.ts","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"message-list.d.ts","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAA;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAItD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,iBAAiB,CAAC,EAAE,SAAS,CAAA;IAC7B,gBAAgB,CAAC,EAAE,SAAS,CAAA;IAC5B,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAA;IACpC,cAAc,EAAE,SAAS,CAAC,cAAc,CAAC,CAAA;IACzC,kBAAkB,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC3D,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,MAAM,EACN,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,EAAE,gBAAgB,2CA2ElB"}
|
|
@@ -14,10 +14,18 @@ const message_bubble_js_1 = require("./message-bubble.js");
|
|
|
14
14
|
* - "full": max-w-5xl, wider padding, extra bottom space for scroll
|
|
15
15
|
* - "compact": max-w-3xl, tighter padding
|
|
16
16
|
*/
|
|
17
|
-
function MessageList({ messages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, messagesEndRef, spacerExpanded, spacerHeight, }) {
|
|
17
|
+
function MessageList({ messages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, messagesEndRef, lastUserMessageRef, spacerExpanded, spacerHeight, }) {
|
|
18
18
|
const variant = config.variant || "full";
|
|
19
19
|
const isCompact = variant === "compact";
|
|
20
20
|
const renderableMessages = (0, react_1.useMemo)(() => (0, message_grouping_js_1.groupMessages)(messages), [messages]);
|
|
21
|
+
// Find the last user message ID (for attaching scroll ref)
|
|
22
|
+
const lastUserMessageId = (0, react_1.useMemo)(() => {
|
|
23
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
24
|
+
if (messages[i].role === "user")
|
|
25
|
+
return messages[i].id;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}, [messages]);
|
|
21
29
|
const isEmpty = messages.length === 0;
|
|
22
30
|
const scrollClasses = isCompact
|
|
23
31
|
? "flex-1 overflow-y-auto px-4 py-4"
|
|
@@ -26,6 +34,6 @@ function MessageList({ messages, streaming, config, markdownComponents, emptySta
|
|
|
26
34
|
? `max-w-3xl mx-auto space-y-0 ${config.classNames?.messageListInner || ""}`
|
|
27
35
|
: `max-w-5xl mx-auto px-4 sm:px-6 pt-2 pb-12 sm:pb-4 space-y-0 ${config.classNames?.messageListInner || ""}`;
|
|
28
36
|
const listClasses = config.classNames?.messageList || "";
|
|
29
|
-
return ((0, jsx_runtime_1.jsxs)("div", { ref: scrollRef, className: `${scrollClasses} ${listClasses}`, children: [beforeMessageList, isEmpty && emptyState ? ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center h-full", children: emptyState })) : ((0, jsx_runtime_1.jsxs)("div", { className: innerClasses, children: [renderableMessages.map((rm) => ((0, jsx_runtime_1.jsxs)("div", { children: [rm.showDateSeparator && rm.dateSeparatorLabel && ((0, jsx_runtime_1.jsx)("div", { className: `flex items-center justify-center ${isCompact ? "py-4" : "my-6"}`, children: (0, jsx_runtime_1.jsx)("div", { className: `px-3 py-1 rounded-full text-xs font-medium bg-slate-100 dark:bg-slate-800 text-slate-500 dark:text-slate-400 ${config.classNames?.dateSeparator || ""}`, children: rm.dateSeparatorLabel }) })), (0, jsx_runtime_1.jsx)(message_bubble_js_1.MessageBubble, { message: rm.message, isFirstInGroup: rm.isFirstInGroup, isLastInGroup: rm.isLastInGroup, config: config, markdownComponents: markdownComponents })] }, rm.message.id))), (0, jsx_runtime_1.jsx)("div", { ref: messagesEndRef }), (0, jsx_runtime_1.jsx)("div", { style: { height: spacerExpanded ? "100vh" : `${spacerHeight}px` } })] })), afterMessageList] }));
|
|
37
|
+
return ((0, jsx_runtime_1.jsxs)("div", { ref: scrollRef, className: `${scrollClasses} ${listClasses}`, children: [beforeMessageList, isEmpty && emptyState ? ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center h-full", children: emptyState })) : ((0, jsx_runtime_1.jsxs)("div", { className: innerClasses, children: [renderableMessages.map((rm) => ((0, jsx_runtime_1.jsxs)("div", { ref: rm.message.id === lastUserMessageId ? (el) => { lastUserMessageRef.current = el; } : undefined, children: [rm.showDateSeparator && rm.dateSeparatorLabel && ((0, jsx_runtime_1.jsx)("div", { className: `flex items-center justify-center ${isCompact ? "py-4" : "my-6"}`, children: (0, jsx_runtime_1.jsx)("div", { className: `px-3 py-1 rounded-full text-xs font-medium bg-slate-100 dark:bg-slate-800 text-slate-500 dark:text-slate-400 ${config.classNames?.dateSeparator || ""}`, children: rm.dateSeparatorLabel }) })), (0, jsx_runtime_1.jsx)(message_bubble_js_1.MessageBubble, { message: rm.message, isFirstInGroup: rm.isFirstInGroup, isLastInGroup: rm.isLastInGroup, config: config, markdownComponents: markdownComponents })] }, rm.message.id))), (0, jsx_runtime_1.jsx)("div", { ref: messagesEndRef }), (0, jsx_runtime_1.jsx)("div", { style: { height: spacerExpanded ? "100vh" : `${spacerHeight}px` } })] })), afterMessageList] }));
|
|
30
38
|
}
|
|
31
39
|
//# sourceMappingURL=message-list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-list.js","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;
|
|
1
|
+
{"version":3,"file":"message-list.js","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,24 +6,13 @@ interface UseChatScrollOptions {
|
|
|
6
6
|
interface UseChatScrollReturn {
|
|
7
7
|
scrollRef: React.RefObject<HTMLDivElement>;
|
|
8
8
|
messagesEndRef: React.RefObject<HTMLDivElement>;
|
|
9
|
+
lastUserMessageRef: React.MutableRefObject<HTMLDivElement | null>;
|
|
9
10
|
scrollToBottom: (behavior?: ScrollBehavior) => void;
|
|
10
11
|
isNearBottom: () => boolean;
|
|
11
12
|
spacerExpanded: boolean;
|
|
12
13
|
spacerHeight: number;
|
|
13
14
|
expandSpacer: () => void;
|
|
14
15
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Manages auto-scroll behavior and the spacer system for a chat message list.
|
|
17
|
-
*
|
|
18
|
-
* The spacer system (ported from legacy ChatInterface):
|
|
19
|
-
* - When user sends a message, the spacer expands to 100vh, then the user
|
|
20
|
-
* message is scrolled to the TOP of the viewport (not the bottom). This
|
|
21
|
-
* makes room below for the expert's response to stream in.
|
|
22
|
-
* - During streaming, auto-scroll keeps the growing response visible.
|
|
23
|
-
* - When streaming ends, the spacer shrinks to the exact height needed to
|
|
24
|
-
* keep messages in their current position ("lock" behavior).
|
|
25
|
-
* - When user scrolls up past the lock point, the spacer collapses completely.
|
|
26
|
-
*/
|
|
27
16
|
export declare function useChatScroll({ messages, streaming, }: UseChatScrollOptions): UseChatScrollReturn;
|
|
28
17
|
export {};
|
|
29
18
|
//# sourceMappingURL=use-chat-scroll.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-chat-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC1C,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC/C,kBAAkB,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACjE,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;IACnD,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GACV,EAAE,oBAAoB,GAAG,mBAAmB,CAmN5C"}
|
|
@@ -2,28 +2,31 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.useChatScroll = useChatScroll;
|
|
5
|
-
const react_1 = require("react");
|
|
6
5
|
/**
|
|
7
|
-
*
|
|
6
|
+
* useChatScroll — Scroll management + spacer system.
|
|
7
|
+
*
|
|
8
|
+
* Ported from legacy ChatInterface lines 1148-1161, 2704-2842, 2928-3168.
|
|
9
|
+
* The spacer system makes room for the expert's response by:
|
|
10
|
+
* 1. Expanding to 100vh when user sends a message
|
|
11
|
+
* 2. Scrolling the user's message to the top of the viewport
|
|
12
|
+
* 3. Locking to exact height when streaming ends
|
|
13
|
+
* 4. Collapsing when user scrolls up
|
|
8
14
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* message is scrolled to the TOP of the viewport (not the bottom). This
|
|
12
|
-
* makes room below for the expert's response to stream in.
|
|
13
|
-
* - During streaming, auto-scroll keeps the growing response visible.
|
|
14
|
-
* - When streaming ends, the spacer shrinks to the exact height needed to
|
|
15
|
-
* keep messages in their current position ("lock" behavior).
|
|
16
|
-
* - When user scrolls up past the lock point, the spacer collapses completely.
|
|
15
|
+
* Uses a lastUserMessageRef (attached by MessageList) to find the
|
|
16
|
+
* scroll target, exactly matching the legacy ref-based approach.
|
|
17
17
|
*/
|
|
18
|
+
const react_1 = require("react");
|
|
18
19
|
function useChatScroll({ messages, streaming, }) {
|
|
19
20
|
const scrollRef = (0, react_1.useRef)(null);
|
|
20
21
|
const messagesEndRef = (0, react_1.useRef)(null);
|
|
22
|
+
const lastUserMessageRef = (0, react_1.useRef)(null);
|
|
21
23
|
const wasNearBottom = (0, react_1.useRef)(true);
|
|
22
24
|
const wasStreamingRef = (0, react_1.useRef)(false);
|
|
23
25
|
const lockedScrollPosition = (0, react_1.useRef)(null);
|
|
24
26
|
const lastMessageCountRef = (0, react_1.useRef)(messages.length);
|
|
25
27
|
const lastProgrammaticScroll = (0, react_1.useRef)(0);
|
|
26
|
-
const
|
|
28
|
+
const lastUserMessageId = (0, react_1.useRef)(null);
|
|
29
|
+
const pendingScrollAction = (0, react_1.useRef)(null);
|
|
27
30
|
const [spacerExpanded, setSpacerExpanded] = (0, react_1.useState)(false);
|
|
28
31
|
const [spacerHeight, setSpacerHeight] = (0, react_1.useState)(0);
|
|
29
32
|
const isNearBottom = (0, react_1.useCallback)(() => {
|
|
@@ -44,29 +47,41 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
44
47
|
setSpacerExpanded(true);
|
|
45
48
|
setSpacerHeight(0);
|
|
46
49
|
lockedScrollPosition.current = null;
|
|
47
|
-
|
|
50
|
+
pendingScrollAction.current = "top";
|
|
48
51
|
}, []);
|
|
49
|
-
//
|
|
50
|
-
//
|
|
52
|
+
// -----------------------------------------------------------------------
|
|
53
|
+
// Scroll-on-send: when a new user message appears and we have a pending
|
|
54
|
+
// scroll action, scroll the user message to the top of the viewport.
|
|
55
|
+
// Copied from legacy lines 2932-3082.
|
|
56
|
+
// -----------------------------------------------------------------------
|
|
51
57
|
(0, react_1.useEffect)(() => {
|
|
52
|
-
if (
|
|
58
|
+
if (messages.length <= lastMessageCountRef.current) {
|
|
59
|
+
lastMessageCountRef.current = messages.length;
|
|
53
60
|
return;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
}
|
|
62
|
+
lastMessageCountRef.current = messages.length;
|
|
63
|
+
const newestMessage = messages[messages.length - 1];
|
|
64
|
+
if (newestMessage?.role !== "user")
|
|
65
|
+
return;
|
|
66
|
+
if (newestMessage.id === lastUserMessageId.current)
|
|
57
67
|
return;
|
|
68
|
+
lastUserMessageId.current = newestMessage.id;
|
|
69
|
+
const scrollAction = pendingScrollAction.current;
|
|
70
|
+
pendingScrollAction.current = null;
|
|
71
|
+
if (scrollAction !== "top")
|
|
72
|
+
return;
|
|
73
|
+
// RAF loop to wait for the ref to attach (legacy lines 3045-3076)
|
|
58
74
|
let rafId;
|
|
59
75
|
let attempts = 0;
|
|
60
76
|
const maxAttempts = 30;
|
|
61
77
|
const attemptScroll = () => {
|
|
62
78
|
attempts++;
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
if (lastUserEl) {
|
|
79
|
+
const container = scrollRef.current;
|
|
80
|
+
const userMessageEl = lastUserMessageRef.current;
|
|
81
|
+
if (container && userMessageEl) {
|
|
67
82
|
const topOffset = 16;
|
|
68
83
|
const containerRect = container.getBoundingClientRect();
|
|
69
|
-
const elementRect =
|
|
84
|
+
const elementRect = userMessageEl.getBoundingClientRect();
|
|
70
85
|
const scrollOffset = elementRect.top - containerRect.top + container.scrollTop - topOffset;
|
|
71
86
|
lastProgrammaticScroll.current = Date.now();
|
|
72
87
|
container.scrollTo({
|
|
@@ -78,7 +93,6 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
78
93
|
rafId = requestAnimationFrame(attemptScroll);
|
|
79
94
|
}
|
|
80
95
|
};
|
|
81
|
-
// Small delay to let the spacer expand in the DOM
|
|
82
96
|
const timeoutId = setTimeout(() => {
|
|
83
97
|
rafId = requestAnimationFrame(attemptScroll);
|
|
84
98
|
}, 16);
|
|
@@ -87,7 +101,7 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
87
101
|
if (rafId)
|
|
88
102
|
cancelAnimationFrame(rafId);
|
|
89
103
|
};
|
|
90
|
-
}, [
|
|
104
|
+
}, [messages]);
|
|
91
105
|
// Track scroll position for auto-scroll gating
|
|
92
106
|
(0, react_1.useEffect)(() => {
|
|
93
107
|
const el = scrollRef.current;
|
|
@@ -101,7 +115,7 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
101
115
|
el.addEventListener("scroll", onScroll, { passive: true });
|
|
102
116
|
return () => el.removeEventListener("scroll", onScroll);
|
|
103
117
|
}, [isNearBottom]);
|
|
104
|
-
// Auto-scroll on new messages (only when
|
|
118
|
+
// Auto-scroll on new messages (only when spacer is NOT expanded)
|
|
105
119
|
(0, react_1.useEffect)(() => {
|
|
106
120
|
if (spacerExpanded)
|
|
107
121
|
return;
|
|
@@ -125,7 +139,9 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
125
139
|
scrollToBottom("instant");
|
|
126
140
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
127
141
|
}, []);
|
|
128
|
-
//
|
|
142
|
+
// -----------------------------------------------------------------------
|
|
143
|
+
// Lock messages in place when streaming ends (legacy lines 3084-3122)
|
|
144
|
+
// -----------------------------------------------------------------------
|
|
129
145
|
(0, react_1.useEffect)(() => {
|
|
130
146
|
if (streaming) {
|
|
131
147
|
wasStreamingRef.current = true;
|
|
@@ -146,7 +162,8 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
146
162
|
}
|
|
147
163
|
}
|
|
148
164
|
}, [streaming, spacerExpanded]);
|
|
149
|
-
// Fallback: collapse spacer if
|
|
165
|
+
// Fallback: collapse spacer if assistant message arrives without streaming
|
|
166
|
+
// (legacy lines 3124-3146)
|
|
150
167
|
(0, react_1.useEffect)(() => {
|
|
151
168
|
const messageCount = messages.length;
|
|
152
169
|
const hadNewMessage = messageCount > lastMessageCountRef.current;
|
|
@@ -164,7 +181,7 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
164
181
|
}
|
|
165
182
|
}
|
|
166
183
|
}, [messages.length, spacerExpanded, streaming, messages]);
|
|
167
|
-
// Collapse spacer when user scrolls up past lock point
|
|
184
|
+
// Collapse spacer when user scrolls up past lock point (legacy lines 3148-3168)
|
|
168
185
|
(0, react_1.useEffect)(() => {
|
|
169
186
|
const container = scrollRef.current;
|
|
170
187
|
if (!container)
|
|
@@ -183,6 +200,7 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
183
200
|
return {
|
|
184
201
|
scrollRef,
|
|
185
202
|
messagesEndRef,
|
|
203
|
+
lastUserMessageRef,
|
|
186
204
|
scrollToBottom,
|
|
187
205
|
isNearBottom,
|
|
188
206
|
spacerExpanded,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;
|
|
1
|
+
{"version":3,"file":"use-chat-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portablecore/chat",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "Unified chat UI for Portable platforms — composable ChatInterface with extension points",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"remark-breaks": "^4.0.0",
|
|
28
28
|
"rehype-raw": "^7.0.0",
|
|
29
29
|
"rehype-highlight": "^7.0.2",
|
|
30
|
-
"@portablecore/
|
|
31
|
-
"@portablecore/
|
|
30
|
+
"@portablecore/types": "0.11.2",
|
|
31
|
+
"@portablecore/chat-runtime": "0.1.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"react": ">=18.0.0",
|