@assistant-ui/react
Version:
TypeScript/React library for AI Chat
87 lines (86 loc) • 2.14 kB
JavaScript
"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