51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
|
|
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;
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|