fix: chat message input fix
This commit is contained in:
@@ -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 />
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user