UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

555 lines (550 loc) 28.4 kB
import { TicketModal, getCategoryIcon } from "./chunk-M4EZMNXT.mjs"; import { getCategoryText, getStatusBadgeAction, getStatusText, mapApiStatusToInternal, mapInternalStatusToApi } from "./chunk-VZCL555A.mjs"; import { TextArea_default } from "./chunk-LI2FS7M2.mjs"; import { Toast_default } from "./chunk-YGF3KVWG.mjs"; import { MenuContent, MenuItem, Menu_default } from "./chunk-WI3GQX74.mjs"; import { SelectContent, SelectItem, SelectTrigger, SelectValue, Select_default } from "./chunk-UU7Q5S52.mjs"; import { SkeletonRounded, SkeletonText } from "./chunk-NKVUUWCA.mjs"; import { Input_default } from "./chunk-EXVVHZOO.mjs"; import { Badge_default } from "./chunk-OEW3ST4F.mjs"; import { SelectionButton_default } from "./chunk-W46HZ2AP.mjs"; import { Button_default } from "./chunk-LAYB7IKW.mjs"; import { Text_default } from "./chunk-IMCIR6TJ.mjs"; // src/components/Support/Support.tsx import { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { KeyIcon, InfoIcon, BugIcon, CaretRightIcon } from "@phosphor-icons/react"; import dayjs from "dayjs"; // src/components/Support/schema/index.ts import { z } from "zod"; var supportSchema = z.object({ // Tipo de problema selecionado problemType: z.enum(["tecnico", "acesso", "outros"], { error: () => "Campo obrigat\xF3rio! Por favor, preencha este campo para continuar." }), // Título do problema title: z.string().min(1, "Campo obrigat\xF3rio! Por favor, preencha este campo para continuar.").min(5, "T\xEDtulo deve ter pelo menos 5 caracteres").max(100, "T\xEDtulo deve ter no m\xE1ximo 100 caracteres").trim(), // Descrição do problema description: z.string().min(1, "Campo obrigat\xF3rio! Por favor, preencha este campo para continuar.").min(10, "Descri\xE7\xE3o deve ter pelo menos 10 caracteres").max(1e3, "Descri\xE7\xE3o deve ter no m\xE1ximo 1000 caracteres").trim() }); // src/assets/img/suporthistory.png var suporthistory_default = "data:image/png;base64,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"; // src/components/Support/Support.tsx import { jsx, jsxs } from "react/jsx-runtime"; var TicketCard = ({ ticket, onTicketClick }) => /* @__PURE__ */ jsxs( "button", { type: "button", className: "flex items-center justify-between p-4 bg-background rounded-xl cursor-pointer w-full text-left hover:bg-background-50 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2", onClick: () => onTicketClick(ticket), children: [ /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: /* @__PURE__ */ jsx(Text_default, { size: "xs", weight: "bold", className: "text-text-900", children: ticket.title }) }), /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [ /* @__PURE__ */ jsx( Badge_default, { variant: "solid", className: "flex items-center gap-1", action: getStatusBadgeAction(ticket.status), children: getStatusText(ticket.status) } ), /* @__PURE__ */ jsxs(Badge_default, { variant: "solid", className: "flex items-center gap-1", action: "muted", children: [ getCategoryIcon(ticket.category, 18), getCategoryText(ticket.category) ] }), /* @__PURE__ */ jsx(CaretRightIcon, { size: 24, className: "text-text-800" }) ] }) ] }, ticket.id ); var TicketGroup = ({ date, tickets, onTicketClick }) => /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [ /* @__PURE__ */ jsx(Text_default, { size: "md", weight: "bold", className: "text-text-900", children: dayjs(date).format("DD MMM YYYY") }), /* @__PURE__ */ jsx("div", { className: "space-y-3", children: tickets.map((ticket) => /* @__PURE__ */ jsx( TicketCard, { ticket, onTicketClick }, ticket.id )) }) ] }, date); var EmptyState = ({ imageSrc }) => /* @__PURE__ */ jsxs("div", { className: "flex flex-row justify-center items-center mt-48", children: [ imageSrc && /* @__PURE__ */ jsx("img", { src: imageSrc, alt: "Imagem de suporte" }), /* @__PURE__ */ jsx(Text_default, { size: "3xl", weight: "semibold", children: "Nenhum pedido encontrado." }) ] }); var TicketSkeleton = () => /* @__PURE__ */ jsx("div", { className: "space-y-6", children: [0, 1].map((groupIndex) => /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [ /* @__PURE__ */ jsx(SkeletonText, { width: "150px", height: 20 }), /* @__PURE__ */ jsx("div", { className: "space-y-3", children: [0, 1].map((ticketIndex) => /* @__PURE__ */ jsx( SkeletonRounded, { width: "100%", height: 72, className: "p-4" }, ticketIndex )) }) ] }, groupIndex)) }); var Support = ({ apiClient, userId, emptyStateImage, title = "Suporte", onTicketCreated, onTicketClosed }) => { const [activeTab, setActiveTab] = useState("criar-pedido"); const [selectedProblem, setSelectedProblem] = useState(null); const [statusFilter, setStatusFilter] = useState("todos"); const [categoryFilter, setCategoryFilter] = useState("todos"); const [selectedTicket, setSelectedTicket] = useState( null ); const [isModalOpen, setIsModalOpen] = useState(false); const [submitError, setSubmitError] = useState(null); const [showSuccessToast, setShowSuccessToast] = useState(false); const [showCloseSuccessToast, setShowCloseSuccessToast] = useState(false); const [showCloseErrorToast, setShowCloseErrorToast] = useState(false); const [allTickets, setAllTickets] = useState([]); const [loadingTickets, setLoadingTickets] = useState(false); const [currentPage, setCurrentPage] = useState(1); const ITEMS_PER_PAGE = 10; const handlePrevPage = () => { if (currentPage > 1) { setCurrentPage(currentPage - 1); } }; const handleNextPage = () => { const totalPages2 = Math.ceil(filteredTickets.length / ITEMS_PER_PAGE); if (currentPage < totalPages2) { setCurrentPage(currentPage + 1); } }; useEffect(() => { if (activeTab === "historico") { fetchTickets(statusFilter); setCurrentPage(1); } }, [activeTab, statusFilter]); useEffect(() => { setCurrentPage(1); }, [categoryFilter]); const convertApiTicketToComponent = (apiTicket) => { return { id: apiTicket.id, title: apiTicket.subject, status: mapApiStatusToInternal(apiTicket.status), createdAt: apiTicket.createdAt, category: apiTicket.type, description: apiTicket.description }; }; const filteredTickets = allTickets.map(convertApiTicketToComponent).filter((ticket) => { const categoryMatch = categoryFilter === "todos" || ticket.category === categoryFilter; return categoryMatch; }).sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() ); const totalPages = Math.ceil(filteredTickets.length / ITEMS_PER_PAGE); const startIndex = (currentPage - 1) * ITEMS_PER_PAGE; const endIndex = startIndex + ITEMS_PER_PAGE; const paginatedTickets = filteredTickets.slice(startIndex, endIndex); const groupedTickets = paginatedTickets.reduce( (groups, ticket) => { const date = dayjs(ticket.createdAt).format("YYYY-MM-DD"); if (!groups[date]) { groups[date] = []; } groups[date].push(ticket); return groups; }, {} ); const { register, handleSubmit, setValue, reset, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(supportSchema), defaultValues: { problemType: void 0, title: "", description: "" } }); const fetchTickets = async (status) => { setLoadingTickets(true); try { const params = new URLSearchParams({ page: "1", limit: "100" // Buscar o máximo permitido pela API }); if (status && status !== "todos") { const apiStatus = mapInternalStatusToApi(status); params.append("status", apiStatus); } const response = await apiClient.get( `/support?${params.toString()}` ); setAllTickets(response.data.data.support); } catch (error) { console.error("Erro ao buscar tickets:", error); setAllTickets([]); } finally { setLoadingTickets(false); } }; const handleProblemSelection = (type) => { setSelectedProblem(type); if (type) { setValue("problemType", type, { shouldValidate: true }); } }; const onSubmit = async (data) => { setSubmitError(null); try { const requestData = { subject: data.title, description: data.description, type: data.problemType }; await apiClient.post( "/support", requestData ); setShowSuccessToast(true); setTimeout(() => setShowSuccessToast(false), 4e3); setSelectedProblem(null); reset(); setActiveTab("historico"); fetchTickets(statusFilter); onTicketCreated?.(); } catch (error) { console.error("Erro ao criar ticket de suporte:", error); setSubmitError("Erro ao criar ticket. Tente novamente."); } }; const handleTicketClick = (ticket) => { setSelectedTicket(ticket); setIsModalOpen(true); }; const handleModalClose = () => { setIsModalOpen(false); setSelectedTicket(null); }; const handleTicketClose = async (ticketId) => { try { await apiClient.patch(`/support/${ticketId}`, { status: mapInternalStatusToApi("encerrado" /* ENCERRADO */) }); setShowCloseSuccessToast(true); setTimeout(() => setShowCloseSuccessToast(false), 4e3); if (activeTab === "historico") { fetchTickets(statusFilter); } onTicketClosed?.(); } catch (error) { console.error("Erro ao encerrar ticket:", error); setShowCloseErrorToast(true); setTimeout(() => setShowCloseErrorToast(false), 4e3); } }; const problemTypes = [ { id: "tecnico" /* TECNICO */, title: "T\xE9cnico", icon: /* @__PURE__ */ jsx(BugIcon, { size: 24 }) }, { id: "acesso" /* ACESSO */, title: "Acesso", icon: /* @__PURE__ */ jsx(KeyIcon, { size: 24 }) }, { id: "outros" /* OUTROS */, title: "Outros", icon: /* @__PURE__ */ jsx(InfoIcon, { size: 24 }) } ]; const emptyImage = emptyStateImage || suporthistory_default; return /* @__PURE__ */ jsxs("div", { className: "flex flex-col w-full h-full overflow-y-auto", children: [ /* @__PURE__ */ jsx("div", { className: "flex flex-col w-full h-full", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [ /* @__PURE__ */ jsxs("div", { className: "flex w-full mb-4 flex-row items-center justify-between not-lg:gap-4 lg:gap-6", children: [ /* @__PURE__ */ jsx("h1", { className: "font-bold leading-[28px] tracking-[0.2px] text-text-950 text-xl mt-4 sm:text-2xl sm:flex-1 sm:self-end sm:mt-0", children: title }), /* @__PURE__ */ jsx("div", { className: "sm:flex-shrink-0 sm:self-end", children: /* @__PURE__ */ jsx( Menu_default, { value: activeTab, defaultValue: "criar-pedido", variant: "menu2", onValueChange: (value) => setActiveTab(value), className: "bg-transparent shadow-none px-0", children: /* @__PURE__ */ jsxs(MenuContent, { variant: "menu2", children: [ /* @__PURE__ */ jsx( MenuItem, { variant: "menu2", value: "criar-pedido", className: "whitespace-nowrap px-17 not-sm:px-5", children: "Criar Pedido" } ), /* @__PURE__ */ jsx( MenuItem, { variant: "menu2", value: "historico", className: "whitespace-nowrap px-17 not-sm:px-5", children: "Hist\xF3rico" } ) ] }) } ) }) ] }), activeTab === "criar-pedido" && /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [ /* @__PURE__ */ jsx(Text_default, { as: "h2", size: "md", weight: "bold", className: "text-text-900", children: "Selecione o tipo de problema" }), /* @__PURE__ */ jsx("div", { className: "flex flex-col sm:flex-row gap-2 sm:gap-4", children: problemTypes.map((type) => /* @__PURE__ */ jsx( SelectionButton_default, { icon: type.icon, label: type.title, selected: selectedProblem === type.id, onClick: () => handleProblemSelection(type.id), className: "w-full p-4" }, type.id )) }), errors.problemType && /* @__PURE__ */ jsx(Text_default, { size: "sm", className: "text-red-500 mt-1", children: errors.problemType.message }) ] }), selectedProblem && activeTab === "criar-pedido" && /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-4", children: [ /* @__PURE__ */ jsx("div", { className: "space-y-1", children: /* @__PURE__ */ jsx( Input_default, { size: "large", variant: "rounded", label: "T\xEDtulo", placeholder: "Digite o t\xEDtulo", ...register("title"), errorMessage: errors.title?.message } ) }), /* @__PURE__ */ jsx("div", { className: "space-y-1", children: /* @__PURE__ */ jsx( TextArea_default, { size: "large", label: "Descri\xE7\xE3o", placeholder: "Descreva o problema aqui", ...register("description"), errorMessage: errors.description?.message } ) }), /* @__PURE__ */ jsx( Button_default, { size: "large", className: "float-end mt-10", type: "submit", disabled: isSubmitting, children: isSubmitting ? "Enviando..." : "Enviar Pedido" } ), submitError && /* @__PURE__ */ jsx("div", { className: "mt-4 p-4 bg-red-100 border border-red-400 text-red-700 rounded", children: /* @__PURE__ */ jsx(Text_default, { size: "sm", className: "text-red-700", children: submitError }) }) ] }), activeTab === "historico" && /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [ /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [ /* @__PURE__ */ jsx("div", { className: "flex flex-col flex-1/2 space-y-1", children: /* @__PURE__ */ jsxs( Select_default, { label: "Status", size: "large", value: statusFilter, onValueChange: setStatusFilter, children: [ /* @__PURE__ */ jsx(SelectTrigger, { variant: "rounded", className: "", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Todos" }) }), /* @__PURE__ */ jsxs(SelectContent, { children: [ /* @__PURE__ */ jsx(SelectItem, { value: "todos", children: "Todos" }), /* @__PURE__ */ jsx(SelectItem, { value: "aberto" /* ABERTO */, children: "Aberto" }), /* @__PURE__ */ jsx(SelectItem, { value: "respondido" /* RESPONDIDO */, children: "Respondido" }), /* @__PURE__ */ jsx(SelectItem, { value: "encerrado" /* ENCERRADO */, children: "Encerrado" }) ] }) ] } ) }), /* @__PURE__ */ jsx("div", { className: "flex flex-col flex-1/2 space-y-1", children: /* @__PURE__ */ jsxs( Select_default, { label: "Tipo", size: "large", value: categoryFilter, onValueChange: setCategoryFilter, children: [ /* @__PURE__ */ jsx(SelectTrigger, { variant: "rounded", className: "", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Todos" }) }), /* @__PURE__ */ jsxs(SelectContent, { children: [ /* @__PURE__ */ jsx(SelectItem, { value: "todos", children: "Todos" }), /* @__PURE__ */ jsxs(SelectItem, { value: "tecnico" /* TECNICO */, children: [ /* @__PURE__ */ jsx(BugIcon, { size: 16 }), " T\xE9cnico" ] }), /* @__PURE__ */ jsxs(SelectItem, { value: "acesso" /* ACESSO */, children: [ /* @__PURE__ */ jsx(KeyIcon, { size: 16 }), " Acesso" ] }), /* @__PURE__ */ jsxs(SelectItem, { value: "outros" /* OUTROS */, children: [ /* @__PURE__ */ jsx(InfoIcon, { size: 16 }), " Outros" ] }) ] }) ] } ) }) ] }), (() => { if (loadingTickets) { return /* @__PURE__ */ jsx(TicketSkeleton, {}); } if (Object.keys(groupedTickets).length === 0) { return /* @__PURE__ */ jsx(EmptyState, { imageSrc: emptyImage }); } return /* @__PURE__ */ jsx("div", { className: "space-y-6", children: Object.entries(groupedTickets).sort( ([a], [b]) => new Date(b).getTime() - new Date(a).getTime() ).map(([date, tickets]) => /* @__PURE__ */ jsx( TicketGroup, { date, tickets, onTicketClick: handleTicketClick }, date )) }); })(), !loadingTickets && totalPages > 1 && /* @__PURE__ */ jsxs("div", { className: "flex justify-center items-center gap-4 mt-6", children: [ /* @__PURE__ */ jsx( Button_default, { variant: "outline", size: "small", onClick: handlePrevPage, disabled: currentPage === 1, children: "Anterior" } ), /* @__PURE__ */ jsxs(Text_default, { size: "sm", className: "text-text-600", children: [ "P\xE1gina ", currentPage, " de ", totalPages ] }), /* @__PURE__ */ jsx( Button_default, { variant: "outline", size: "small", onClick: handleNextPage, disabled: currentPage === totalPages, children: "Pr\xF3xima" } ) ] }) ] }) ] }) }), selectedTicket && /* @__PURE__ */ jsx( TicketModal, { ticket: selectedTicket, isOpen: isModalOpen, onClose: handleModalClose, onTicketClose: handleTicketClose, apiClient, userId } ), showSuccessToast && /* @__PURE__ */ jsx("div", { className: "fixed top-4 left-1/2 transform -translate-x-1/2 z-50", children: /* @__PURE__ */ jsx( Toast_default, { title: "Pedido enviado!", description: "Agora voc\xEA pode acompanhar o andamento do seu pedido.", variant: "solid", onClose: () => setShowSuccessToast(false) } ) }), showCloseSuccessToast && /* @__PURE__ */ jsx("div", { className: "fixed top-4 left-1/2 transform -translate-x-1/2 z-50", children: /* @__PURE__ */ jsx( Toast_default, { title: "Pedido encerrado!", description: "", variant: "solid", onClose: () => setShowCloseSuccessToast(false) } ) }), showCloseErrorToast && /* @__PURE__ */ jsx("div", { className: "fixed top-4 left-1/2 transform -translate-x-1/2 z-50", children: /* @__PURE__ */ jsx( Toast_default, { title: "Erro ao encerrar pedido", description: "N\xE3o foi poss\xEDvel encerrar o pedido. Tente novamente.", variant: "solid", action: "warning", onClose: () => setShowCloseErrorToast(false) } ) }) ] }); }; var Support_default = Support; export { supportSchema, Support_default }; //# sourceMappingURL=chunk-IIBASRKG.mjs.map