"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, getTicketingDetail, getTicketingInternalDetail, getTicketingInternalDiscussion, getTicketingReply, saveTicketing, saveTicketInternalReply, saveTicketReply, } from "@/service/communication/communication"; import { Icon } from "@iconify/react/dist/iconify.js"; import { list } from "postcss"; import { htmlToString } from "@/utils/globals"; import { Textarea } from "@/components/ui/textarea"; import { error } from "@/lib/swal"; import { useRouter } from "next/navigation"; import { getOperatorUser } from "@/service/management-user/management-user"; import { DetailTicket } from "./info-lainnya-types"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { ChevronDownIcon } from "lucide-react"; import { Description } from "@radix-ui/react-toast"; const taskSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), description: z.string().min(2, { message: "Narasi Penugasan harus lebih dari 2 karakter.", }), }); 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; createdBy: { id: number; fullname: string; }; sendTo: { id: number; fullname: string; }; }; export default function FormUpdateTicketing() { const MySwal = withReactContent(Swal); const { id } = useParams() as { id: string }; const router = useRouter(); const [detail, setDetail] = useState(); const [ticketReply, setTicketReply] = useState([]); const [ticketInternal, setTicketInternal] = useState( null ); const [detailTickets, setDetailTickets] = useState(null); const [replyValue, setReplyValue] = useState(0); const [replyText, setReplyText] = useState(""); const [operatorOpt, setOperatorOpt] = useState< { id: string; label: string; value: string }[] >([]); const [selectedOperator, setSelectedOperator] = useState([]); const [replyVisible, setReplyVisible] = useState(false); const [replyMessage, setReplyMessage] = useState(""); const [selectedPriority, setSelectedPriority] = useState(""); const [selectedStatus, setSelectedStatus] = useState(""); const { control, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(taskSchema), defaultValues: { title: "", description: "", priority: "", status: "", }, }); useEffect(() => { async function initState() { setReplyValue(0); const response = await getTicketingDetail(id); setTicketInternal(response?.data?.data || null); setDetail(response?.data?.data); if (response?.data?.data) { const detailData = response.data.data; setValue("title", detailData.title || ""); setValue("description", detailData.description || ""); setSelectedPriority(detailData.priority?.name || ""); setSelectedStatus(detailData.status?.name || ""); } if (response?.data !== null) { setDetailTickets(response?.data?.data); } } initState(); getTicketReply(); }, [id]); 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.toString(), })); setOperatorOpt(optionArr); if (detailTickets?.assignedTeams) { const assigned = detailTickets.assignedTeams .split(":") .filter((id: string) => id); setSelectedOperator(assigned); } } } getOperator(); }, [detailTickets]); async function getTicketReply() { const res = await getTicketingReply(id); if (res?.data !== null) { setTicketReply(res?.data?.data); } } const handleReply = () => { setReplyVisible((prev) => !prev); }; const handleSendReply = async () => { if (replyMessage.trim() === "") { MySwal.fire({ title: "Error", text: "Pesan tidak boleh kosong!", icon: "error", }); return; } const data = { ticketId: id, message: 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); } }; 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); } }); }; async function save(data: any) { const reqData: any = { title: data.title, description: data.description, priority: data.priority, status: data.status, operatorTeam: selectedOperator.join(","), }; if (id) { reqData.id = id; } const response = await saveTicketing(reqData); if (response?.error) { MySwal.fire({ title: "Error", text: response.message, icon: "error", }); return false; } MySwal.fire({ title: "Sukses", icon: "success", confirmButtonText: "OK", }).then(() => { router.push(`/in/supervisor/ticketing`); }); } return (
{/* */}
{replyVisible && (