fix: chat message input fix

This commit is contained in:
2025-04-10 17:15:57 +04:00
parent 3b4fed80e8
commit 1199685fcd
2 changed files with 21 additions and 5 deletions

View File

@@ -3,9 +3,12 @@ import { IconCheck, IconPaperclip, IconSend2, IconX } from "@tabler/icons-react"
import { useChatContext } from "../../../../pages/ClientsPage/contexts/ChatContext.tsx"; import { useChatContext } from "../../../../pages/ClientsPage/contexts/ChatContext.tsx";
import ActionIconCopy from "../../../ActionIconCopy/ActionIconCopy.tsx"; import ActionIconCopy from "../../../ActionIconCopy/ActionIconCopy.tsx";
import SelectedFile from "../SelectedFile/SelectedFile.tsx"; import SelectedFile from "../SelectedFile/SelectedFile.tsx";
import React, { useRef } from "react";
const MessageInput = () => { const MessageInput = () => {
const formRef = useRef<HTMLFormElement>(null);
const { const {
submitMessage, submitMessage,
chat, chat,
@@ -13,14 +16,22 @@ const MessageInput = () => {
files, files,
fileDialog, fileDialog,
isMessageSending, isMessageSending,
isMessageEmpty,
} = useChatContext(); } = useChatContext();
const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (event.key === "Enter" && !event.shiftKey) {
event.preventDefault();
formRef.current?.requestSubmit();
}
};
const getFiles = files.map(file => ( const getFiles = files.map(file => (
<SelectedFile key={file.name} file={file} /> <SelectedFile key={file.name} file={file} />
)); ));
return ( return (
<form onSubmit={form.onSubmit(values => submitMessage(values))}> <form ref={formRef} onSubmit={form.onSubmit(values => submitMessage(values))}>
<Stack gap={"xs"}> <Stack gap={"xs"}>
<Divider /> <Divider />
{getFiles} {getFiles}
@@ -42,6 +53,7 @@ const MessageInput = () => {
</Tooltip> </Tooltip>
<Textarea <Textarea
{...form.getInputProps("message")} {...form.getInputProps("message")}
onKeyDown={handleKeyDown}
w={"100%"} w={"100%"}
minRows={1} minRows={1}
maxRows={4} maxRows={4}
@@ -58,7 +70,7 @@ const MessageInput = () => {
<Button <Button
variant={"default"} variant={"default"}
type="submit" type="submit"
disabled={isMessageSending} disabled={isMessageSending || isMessageEmpty}
> >
{form.values.messageId ? ( {form.values.messageId ? (
<IconCheck /> <IconCheck />

View File

@@ -29,6 +29,7 @@ type ChatContextState = {
filesHandlers: UseListStateHandlers<File>; filesHandlers: UseListStateHandlers<File>;
fileDialog: FileDialog; fileDialog: FileDialog;
isMessageSending: boolean; isMessageSending: boolean;
isMessageEmpty: boolean;
}; };
const ChatContext = createContext<ChatContextState | undefined>(undefined); const ChatContext = createContext<ChatContextState | undefined>(undefined);
@@ -56,6 +57,8 @@ const useChatContextState = () => {
}, },
}); });
const isMessageEmpty = form.values.message.trim().length === 0 && files.length === 0;
const setChatValue = (chat: ChatSchema | null) => { const setChatValue = (chat: ChatSchema | null) => {
if (chat) { if (chat) {
setFirstItemIndex(10000); setFirstItemIndex(10000);
@@ -114,7 +117,7 @@ const useChatContextState = () => {
}, [chat]); }, [chat]);
const sendMessageWithFiles = (values: MessageForm) => { const sendMessageWithFiles = (values: MessageForm) => {
if (!chat) return; if (!chat || isMessageSending) return;
setIsMessageSending(true); setIsMessageSending(true);
ChatService.sendMessagesWithFiles({ ChatService.sendMessagesWithFiles({
@@ -137,7 +140,7 @@ const useChatContextState = () => {
}; };
const sendTextMessage = (values: MessageForm) => { const sendTextMessage = (values: MessageForm) => {
if (!chat) return; if (!chat || isMessageEmpty || isMessageSending) return;
setIsMessageSending(true); setIsMessageSending(true);
ChatService.sendTextMessage({ ChatService.sendTextMessage({
@@ -160,7 +163,7 @@ const useChatContextState = () => {
}; };
const editMessage = (values: MessageForm) => { const editMessage = (values: MessageForm) => {
if (!chat) return; if (!chat || isMessageSending) return;
setIsMessageSending(true); setIsMessageSending(true);
ChatService.editMessage({ ChatService.editMessage({
@@ -207,6 +210,7 @@ const useChatContextState = () => {
filesHandlers, filesHandlers,
fileDialog, fileDialog,
isMessageSending, isMessageSending,
isMessageEmpty,
}; };
}; };