"use client"; import { Message } from "@/types/types"; import { Button } from "../ui/button"; import { Input } from "../ui/input"; import * as emoji from "emoji-picker-react"; import EmojiPicker from "emoji-picker-react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, } from "../ui/dropdown-menu"; import { ChevronLeftIcon, SendIcon, SmilePlusIcon } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { format, isToday, isYesterday } from "date-fns"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import { UserProfile } from "@/hooks/get-user"; import ProfilePicture from "../ProfilePicture"; import App, { SetState } from "@/types/app"; import { Textarea } from "../ui/textarea"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, } from "@/components/ui/context-menu"; import { ClientMessage } from "@/types/protocol"; import { AnimatePresence, motion } from "framer-motion"; function MessageContainer({ message, app, sendRequest, }: { message: Message; app: App; sendRequest: (content: ClientMessage) => void; }) { const [profile, setProfile] = useState(); const [isEditing, setIsEditing] = useState(false); const [editText, setEditText] = useState(message.contents); useEffect(() => { let mounted = true; app.getUserById(message.from).then((p) => { if (mounted) setProfile(p); }); return () => { mounted = false; }; }, [app, message.from]); return (
{/*
*/}
{profile?.display_name || message.from}

{isToday(message.timestamp * 1000) ? format(message.timestamp * 1000, "p") : isYesterday(message.timestamp * 1000) ? "Yesterday, " + format(message.timestamp * 1000, "p") : format(message.timestamp * 1000, "PP, p")}

{ if (e.key === "Escape" && isEditing) { setIsEditing(false); setEditText(message.contents); } }} > {isEditing ? ( { sendRequest({ type: "edit_message", params: { message_id: message.id, new_contents: editText, }, }); setIsEditing(false); }} /> ) : ( message.contents.split("\n\n").map((line, index) => (
{index > 0 &&
} (

), h2: ({ node, ...props }) => (

), h3: ({ node, ...props }) => (

), h4: ({ node, ...props }) => (

), h5: ({ node, ...props }) => (

), ul: ({ node, ...props }) => (
    ), ol: ({ node, ...props }) => (
      ), a: ({ node, ...props }) => ( ), }} > {line}
)) )}
Copy message { setEditText(message.contents); setIsEditing(true); }} disabled={message.from !== app.profile?.id} > Edit { sendRequest({ type: "delete_message", params: { message_id: message.id, }, }); }} disabled={message.from !== app.profile?.id} > Delete ); } function MessageInput({ text, setText, onEnter, }: { text: string; setText: SetState; onEnter: () => void; }) { const inputRef = useRef(null); useEffect(() => { inputRef.current?.focus(); }, [inputRef]); return text.includes("\n") ? (