Submatter/apps/web/components/ai/workspace-interaction.ts

51 lines
1.4 KiB
TypeScript
Raw Normal View History

import type { AIMode } from "./workspace-mode";
export function createComposerFocusMemory() {
const focused: Record<AIMode, boolean> = { chat: false, agents: false };
let previous: AIMode | undefined;
return {
record(mode: AIMode, isComposer: boolean) {
focused[mode] = isComposer;
},
activate(mode: AIMode, tabHasFocus: boolean) {
const changed = previous !== mode;
previous = mode;
return changed && !tabHasFocus && focused[mode];
},
};
}
interface ScrollContainer {
scrollTop: number;
scrollHeight: number;
clientHeight: number;
}
export function createChatScrollMemory() {
let savedTop = 0;
let following = true;
let wasActive = false;
return {
record(container: ScrollContainer, active: boolean) {
if (!active) return;
savedTop = container.scrollTop;
following =
container.scrollHeight - container.clientHeight - savedTop <= 48;
},
update(container: ScrollContainer, active: boolean) {
if (active) {
if (!wasActive) container.scrollTop = savedTop;
else if (following)
container.scrollTop = Math.max(
0,
container.scrollHeight - container.clientHeight,
);
savedTop = container.scrollTop;
following =
container.scrollHeight - container.clientHeight - savedTop <= 48;
}
wasActive = active;
},
};
}