analytica-frontend-lib
Version:
Repositório público dos componentes utilizados nas plataformas da Analytica Ensino
555 lines (550 loc) • 28.4 kB
JavaScript
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