UNPKG

@assistant-ui/react

Version:

TypeScript/React library for AI Chat

87 lines (86 loc) 2.14 kB
"use client"; // src/context/stores/ThreadViewport.tsx import { create } from "zustand"; var createSizeRegistry = (onChange) => { const entries = /* @__PURE__ */ new Map(); const recalculate = () => { let total = 0; for (const height of entries.values()) { total += height; } onChange(total); }; return { register: () => { const id = /* @__PURE__ */ Symbol(); entries.set(id, 0); return { setHeight: (height) => { if (entries.get(id) !== height) { entries.set(id, height); recalculate(); } }, unregister: () => { entries.delete(id); recalculate(); } }; } }; }; var makeThreadViewportStore = (options = {}) => { const scrollToBottomListeners = /* @__PURE__ */ new Set(); const viewportRegistry = createSizeRegistry((total) => { store.setState({ height: { ...store.getState().height, viewport: total } }); }); const insetRegistry = createSizeRegistry((total) => { store.setState({ height: { ...store.getState().height, inset: total } }); }); const userMessageRegistry = createSizeRegistry((total) => { store.setState({ height: { ...store.getState().height, userMessage: total } }); }); const store = create(() => ({ isAtBottom: true, scrollToBottom: ({ behavior = "auto" } = {}) => { for (const listener of scrollToBottomListeners) { listener({ behavior }); } }, onScrollToBottom: (callback) => { scrollToBottomListeners.add(callback); return () => { scrollToBottomListeners.delete(callback); }; }, turnAnchor: options.turnAnchor ?? "bottom", height: { viewport: 0, inset: 0, userMessage: 0 }, registerViewport: viewportRegistry.register, registerContentInset: insetRegistry.register, registerUserMessageHeight: userMessageRegistry.register })); return store; }; export { makeThreadViewportStore }; //# sourceMappingURL=ThreadViewport.js.map