"use client"; import React, { useState, useEffect } from "react"; import { Box, Button, Group, Image, Paper, ScrollArea, SimpleGrid, Stack, Text, Tooltip, Modal, } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import dynamic from "next/dynamic"; import { MainColor } from "@/app_modules/_global/color"; import { listStiker } from "@/app_modules/_global/lib/stiker"; // Dynamic import ReactQuill dengan SSR disabled const ReactQuill = dynamic( async () => { const { default: RQ } = await import("react-quill"); // Tidak perlu import CSS dengan import statement return function comp({ forwardedRef, ...props }: any) { return ; }; }, { ssr: false, loading: () =>

Loading Editor...

} ); type ChatItem = { content: string; // HTML content including text and stickers }; export default function Page() { const [editorContent, setEditorContent] = useState(""); const [chat, setChat] = useState([]); const [opened, { open, close }] = useDisclosure(false); const quillRef = React.useRef(null); const [quillLoaded, setQuillLoaded] = useState(false); // Load CSS on client-side only useEffect(() => { // Add Quill CSS via tag const link = document.createElement("link"); link.href = "https://cdn.quilljs.com/1.3.6/quill.snow.css"; link.rel = "stylesheet"; document.head.appendChild(link); // Add custom style for stickers inside Quill editor const style = document.createElement("style"); style.textContent = ` .ql-editor img { max-width: 100px !important; max-height: 100px !important; } .chat-content img { max-width: 70px !important; max-height: 70px !important; } `; document.head.appendChild(style); setQuillLoaded(true); return () => { // Clean up when component unmounts document.head.removeChild(link); document.head.removeChild(style); }; }, []); // Custom toolbar options for ReactQuill const modules = { toolbar: [ [{ header: [1, 2, false] }], ["bold", "italic", "underline", "strike", "blockquote"], [{ list: "ordered" }, { list: "bullet" }], ["link", "image"], ["clean"], ], }; const formats = [ "header", "bold", "italic", "underline", "strike", "blockquote", "list", "bullet", "link", "image", ]; const insertSticker = (stickerUrl: string) => { if (!quillRef.current) return; const quill = quillRef.current.getEditor(); const range = quill.getSelection(true); // Custom image insertion with size // Use custom blot or HTML string with size attributes const stickerHtml = `sticker`; // Insert HTML at cursor position quill.clipboard.dangerouslyPasteHTML(range.index, stickerHtml); // Move cursor after inserted sticker quill.setSelection(range.index + 1, 0); // Focus back on editor quill.focus(); // Close sticker modal close(); }; // Function to send message const sendMessage = () => { if (editorContent.trim() !== "") { setChat((prev) => [...prev, { content: editorContent }]); setEditorContent(""); // Clear after sending } }; return ( {chat.map((item, index) => (
))} Chat Preview Data:
              {JSON.stringify(chat, null, 2)}
            
{quillLoaded && ( )} {/* Sticker Modal */} {listStiker.map((item) => ( {item.name} insertSticker(item.url)} /> ))} ); }