mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 21:29:38 +02:00
61 lines
1.6 KiB
JavaScript
61 lines
1.6 KiB
JavaScript
|
import { Controller } from "@hotwired/stimulus";
|
||
|
|
||
|
export default class extends Controller {
|
||
|
static targets = ["messages", "form", "input"];
|
||
|
|
||
|
connect() {
|
||
|
this.#configureAutoScroll();
|
||
|
}
|
||
|
|
||
|
disconnect() {
|
||
|
if (this.messagesObserver) {
|
||
|
this.messagesObserver.disconnect();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
autoResize() {
|
||
|
const input = this.inputTarget;
|
||
|
const lineHeight = 20; // text-sm line-height (14px * 1.429 ≈ 20px)
|
||
|
const maxLines = 3; // 3 lines = 60px total
|
||
|
|
||
|
input.style.height = "auto";
|
||
|
input.style.height = `${Math.min(input.scrollHeight, lineHeight * maxLines)}px`;
|
||
|
input.style.overflowY =
|
||
|
input.scrollHeight > lineHeight * maxLines ? "auto" : "hidden";
|
||
|
}
|
||
|
|
||
|
submitSampleQuestion(e) {
|
||
|
this.inputTarget.value = e.target.dataset.chatQuestionParam;
|
||
|
|
||
|
setTimeout(() => {
|
||
|
this.formTarget.requestSubmit();
|
||
|
}, 200);
|
||
|
}
|
||
|
|
||
|
// Newlines require shift+enter, otherwise submit the form (same functionality as ChatGPT and others)
|
||
|
handleInputKeyDown(e) {
|
||
|
if (e.key === "Enter" && !e.shiftKey) {
|
||
|
e.preventDefault();
|
||
|
this.formTarget.requestSubmit();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#configureAutoScroll() {
|
||
|
this.messagesObserver = new MutationObserver((_mutations) => {
|
||
|
if (this.hasMessagesTarget) {
|
||
|
this.#scrollToBottom();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Listen to entire sidebar for changes, always try to scroll to the bottom
|
||
|
this.messagesObserver.observe(this.element, {
|
||
|
childList: true,
|
||
|
subtree: true,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#scrollToBottom = () => {
|
||
|
this.messagesTarget.scrollTop = this.messagesTarget.scrollHeight;
|
||
|
};
|
||
|
}
|