"use client"; "use client"; import React, { useEffect, useState } from "react"; import { useForm, Controller } from "react-hook-form"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Card } from "@/components/ui/card"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { useParams } from "next/navigation"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Avatar, AvatarImage } from "@/components/ui/avatar"; import { deleteTicket, getQuestionTicket, getTicketingDetail, getTicketingInternalDetail, getTicketingInternalDiscussion, getTicketingReply, saveTicketing, saveTicketInternalReply, saveTicketReply, saveTicketsQuestion, } from "@/service/communication/communication"; import { Icon } from "@iconify/react/dist/iconify.js"; import { list, parse } from "postcss"; import { htmlToString } from "@/utils/globals"; import { Textarea } from "@/components/ui/textarea"; import { error } from "@/lib/swal"; import { useMediaQuery } from "react-responsive"; import { DetailTicket } from "../ticketing/info-lainnya-types"; import InfoLainnyaModal from "../ticketing/info-lainnya"; import { Description } from "@radix-ui/react-toast"; import { Link, useRouter } from "@/i18n/routing"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { ChevronDownIcon } from "lucide-react"; import { getOperatorUser } from "@/service/management-user/management-user"; const taskSchema = z.object({ title: z.string().optional(), description: z.string().optional(), }); export type taskDetail = { id: number; title: string; createdAt: string; referenceNumber: string | number; createdBy: { id: number; fullname: string; }; sendTo: { id: number; fullname: string; }; status: { id: number; name: string; }; priority: { id: number; name: string; }; broadcastType: string; description: string; is_active: string; }; export type replyDetail = { id: number; comments: string; createdAt: string; user: { id: number; fullname: string; }; messageTo: { id: number; fullname: string; }; }; export type internalDetail = { id: number; message: string; createdAt: string; commentFromUserName: string; feedTitle: string; createdBy: { id: number; fullname: string; }; sendTo: { id: number; fullname: string; }; }; export default function FormQuestionsReply() { const MySwal = withReactContent(Swal); const { id } = useParams() as { id: string }; const router = useRouter(); const isMobile = useMediaQuery({ maxWidth: 768, }); const [detail, setDetail] = useState(); const [ticketReply, setTicketReply] = useState([]); const [ticketInternal, setTicketInternal] = useState( null ); const [detailTicketsQuestions, setDetailTicketsQuestions] = useState(null); const [detailTickets, setDetailTickets] = useState(null); const [replyVisible, setReplyVisible] = useState(false); const [replyMessage, setReplyMessage] = useState(""); const [selectedPriority, setSelectedPriority] = useState(""); const [selectedStatus, setSelectedStatus] = useState(""); const [openEmergencyModal, setOpenEmergencyModal] = useState(false); const [replyValue, setReplyValue] = useState(0); const [replyText, setReplyText] = useState(""); const [operatorOpt, setOperatorOpt] = useState< { id: string; label: string; value: string }[] >([]); const [selectedOperator, setSelectedOperator] = useState([]); const { control, handleSubmit, reset, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(taskSchema), }); useEffect(() => { async function initState() { setReplyValue(0); const response = await getQuestionTicket(id); setDetailTicketsQuestions(response?.data?.data || null); setTicketInternal(response?.data?.data || null); setDetail(response?.data?.data); setValue('title', response?.data?.data?.message) if (response?.data !== null) { setDetailTickets(response?.data?.data); } if (detailTickets?.emergencyIssue) { reset({ title: detailTickets?.emergencyIssue.title || "", description: detailTickets?.emergencyIssue.description || "", }); // setSelectedPriority(String(detailTickets.emergencyIssue.urgencyId)); // setSelectedStatus(String(detailTickets.statusId)); // jika ada } } initState(); getTicketReply(); }, [id, reset]); const handleReply = () => { setReplyValue((prev) => (prev === 1 ? 0 : 1)); }; const handleSendReplyData = async () => { if (!replyText.trim()) { console.warn("Balasan kosong!"); return; } try { const res = await saveTicketReply({ ticketId: id, comment: replyText, parentCommentId: detailTickets?.commentId, isFromInternal: true, }); console.log("Berhasil kirim balasan:", res?.data); setReplyText(""); setReplyValue(0); getTicketReply(); } catch (err) { console.error("Gagal kirim balasan:", err); } }; async function getTicketReply() { const res = await getTicketingReply(id); if (res?.data !== null) { setTicketReply(res?.data?.data); } } useEffect(() => { async function getOperator() { const res = await getOperatorUser(detailTickets?.typeId); if (res?.data !== null) { const rawUser = res?.data?.data; const optionArr = rawUser?.map((option: any) => ({ id: option.id, label: option.fullName, value: option.id, })); setOperatorOpt(optionArr); } } getOperator(); }, [detailTickets]); const handleSendReply = async () => { if (replyMessage.trim() === "") { MySwal.fire({ title: "Error", text: "Pesan tidak boleh kosong!", icon: "error", }); return; } const data = { ticketId: id, comment: replyMessage, }; try { const response = await saveTicketReply(data); const newReply: replyDetail = { id: response?.data?.id, comments: replyMessage, createdAt: response?.data?.createdAt, user: response?.data?.messageFrom, messageTo: response?.data?.messageTo, }; setTicketReply((prevReplies) => [newReply, ...prevReplies]); MySwal.fire({ title: "Sukses", text: "Pesan berhasil dikirim.", icon: "success", }); setReplyMessage(""); setReplyVisible(false); } catch (error) { MySwal.fire({ title: "Error", text: "Gagal mengirim balasan.", icon: "error", }); console.error("Error sending reply:", error); } }; // const onSubmit = async (data: any) => { // try { // const payload = { // id, // title: data.title, // description: data.description, // priorityId: selectedPriority, // statusId: 1, // typeId: detailTickets?.typeId, // parentCommentId: detailTickets?.feedId, // operatorTeam: selectedOperator.join(","), // }; // const response = await saveTicketsQuestion(payload); // MySwal.fire({ // title: "Sukses", // text: "Data berhasil diperbarui.", // icon: "success", // }); // getTicketReply(); // } catch (error) { // console.error("Gagal update:", error); // MySwal.fire({ // title: "Error", // text: "Terjadi kesalahan saat memperbarui.", // icon: "error", // }); // } // }; const onSubmit = async (data: any) => { try { MySwal.fire({ title: "Menyimpan...", text: "Mohon tunggu sebentar", allowOutsideClick: false, didOpen: () => { MySwal.showLoading(); }, }); const payload = { id, title: data.title, description: data.description, priorityId: selectedPriority, statusId: 1, typeId: detailTickets?.typeId, parentCommentId: detailTickets?.feedId, operatorTeam: selectedOperator.join(","), }; await saveTicketsQuestion(payload); MySwal.fire({ title: "Sukses", text: "Data berhasil diperbarui.", icon: "success", confirmButtonText: "OK", }).then(() => { router.push("/supervisor/ticketing"); }); } catch (error) { MySwal.fire({ title: "Error", text: "Terjadi kesalahan saat memperbarui.", icon: "error", }); } }; async function doDelete(id: any) { const response = await deleteTicket(id); if (response?.error) { error(response.message); return false; } success("/in/supervisor/ticketing"); } function success(redirect: string) { MySwal.fire({ title: "Sukses", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then(() => { router.push(redirect); }); } const handleDelete = (id: any) => { MySwal.fire({ title: "Hapus Data", text: "", icon: "warning", showCancelButton: true, cancelButtonColor: "#3085d6", confirmButtonColor: "#d33", confirmButtonText: "Hapus", }).then((result) => { if (result.isConfirmed) { doDelete(id); } }); }; const openEmergencyIssueDetail = () => { setOpenEmergencyModal(true); }; return (
{replyVisible && (