"use client"; import { SendHorizontal, SmilePlusIcon, ThumbsUp } from "lucide-react"; import { useCallback, useEffect, useRef, useState, type ChangeEvent, } from "react"; import { Button } from "~/components/ui/button"; import { AutosizeTextarea, type AutosizeTextAreaRef, } from "~/components/custom_ui/autoResizeTextArea"; import { api } from "~/utils/api"; import { ChatAttachments } from "~/components/chat/chat-attachments"; import { useMediaQuery } from "~/hooks/use-media-query"; import { useThrottledIsTypingMutation } from "~/hooks/chatHooks"; import type { Session } from "~/server/api/trpc"; import type { ChatsChatid } from "~/schemas/public/Chats"; import type { ChatUserInfo } from "~/server/services/chat.service"; import { Popover, PopoverContent, PopoverTrigger, } from "~/components/ui/popover"; import { EmojiPickerContent, EmojiPickerSearch, EmojiPicker, } from "~/components/custom_ui/emoji-picker"; import { useTranslation } from "~/providers/I18nProvider"; type ChatBottombarProps = { chatId: ChatsChatid; userData: Session; chatUserData: ChatUserInfo; }; export default function ChatBottombar({ chatId, userData, chatUserData, }: ChatBottombarProps) { const { locale } = useTranslation(); const [message, setMessage] = useState(""); const [isFocused, setIsFocused] = useState(false); const inputRef = useRef(null); const { mutate: addMutation } = api.messagesSSE.add.useMutation({}); const handleThumbsUp = useCallback(() => { addMutation({ chatId, message: "👍", sender: userData.id, }); setMessage(""); }, [chatId, addMutation, userData]); const handleSend = () => { if (message.length !== 0) { addMutation({ chatId, message: message.trim(), sender: userData.id, }); setMessage(""); if (inputRef.current) { inputRef.current.textArea.focus(); inputRef.current.textArea.style.height = "auto"; } } }; const isTypingMutation = useThrottledIsTypingMutation({ chatId, username: userData.username, }); useEffect(() => { // update isTyping state isTypingMutation(isFocused && message.trim().length > 0); }, [isFocused, message, isTypingMutation]); useEffect(() => { if (inputRef.current) { inputRef.current.textArea.focus(); } }, []); const [openEmoji, setOpenEmoji] = useState(false); const isMobile = useMediaQuery("(min-width: 426px)"); return (
{ if (e.key === "Enter") { e.preventDefault(); if (e.shiftKey) { setMessage((prev) => `${prev}\n`); } else { handleSend(); } } }} onFocus={() => setIsFocused(true)} onBlur={() => setIsFocused(false)} onChange={(e: ChangeEvent) => { setMessage(e.target.value); }} name="message" placeholder="Aa" className="bg-background flex h-14 min-h-14 w-full resize-none items-center overflow-hidden rounded-xl border pr-8 ring-0 outline-hidden hover:border-neutral-400 focus:border-neutral-600 focus:ring-0 focus-visible:ring-0 focus-visible:ring-offset-0" /> {isMobile && (
{ setMessage(message + emoji); // if (inputRef.current) { // inputRef.current.textArea.focus(); // } }} >
)}
); }