feat: harden ticket creation ux and seeding

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
rever-tecnologia 2025-10-06 14:40:26 -03:00
parent be27dcfd15
commit a51783ce29
11 changed files with 338 additions and 537 deletions

View file

@ -52,8 +52,8 @@ export function PortalTicketForm() {
const [isSubmitting, setIsSubmitting] = useState(false)
const isFormValid = useMemo(() => {
return Boolean(subject.trim() && categoryId && subcategoryId)
}, [subject, categoryId, subcategoryId])
return Boolean(subject.trim() && description.trim() && categoryId && subcategoryId)
}, [subject, description, categoryId, subcategoryId])
async function handleSubmit(event: React.FormEvent) {
event.preventDefault()
@ -61,6 +61,7 @@ export function PortalTicketForm() {
const trimmedSubject = subject.trim()
const trimmedSummary = summary.trim()
const trimmedDescription = description.trim()
setIsSubmitting(true)
toast.loading("Abrindo chamado...", { id: "portal-new-ticket" })
@ -78,8 +79,8 @@ export function PortalTicketForm() {
subcategoryId: subcategoryId as Id<"ticketSubcategories">,
})
if (description.trim().length > 0) {
const htmlBody = sanitizeEditorHtml(toHtml(description.trim()))
if (trimmedDescription.length > 0) {
const htmlBody = sanitizeEditorHtml(toHtml(trimmedDescription))
await addComment({
ticketId: id as Id<"tickets">,
authorId: convexUserId as Id<"users">,
@ -108,8 +109,8 @@ export function PortalTicketForm() {
<form onSubmit={handleSubmit} className="space-y-6">
<div className="space-y-3">
<div className="space-y-1">
<label htmlFor="subject" className="text-sm font-medium text-neutral-800">
Assunto
<label htmlFor="subject" className="flex items-center gap-1 text-sm font-medium text-neutral-800">
Assunto <span className="text-red-500">*</span>
</label>
<Input
id="subject"
@ -131,14 +132,15 @@ export function PortalTicketForm() {
/>
</div>
<div className="space-y-1">
<label htmlFor="description" className="text-sm font-medium text-neutral-800">
Detalhes
<label htmlFor="description" className="flex items-center gap-1 text-sm font-medium text-neutral-800">
Detalhes <span className="text-red-500">*</span>
</label>
<Textarea
id="description"
value={description}
onChange={(event) => setDescription(event.target.value)}
placeholder="Compartilhe passos para reproduzir, mensagens de erro ou informações adicionais."
required
className="min-h-[140px] resize-y rounded-xl border border-slate-200 px-4 py-3 text-sm text-neutral-800 shadow-sm focus-visible:border-neutral-900 focus-visible:ring-neutral-900/20"
/>
</div>
@ -168,8 +170,8 @@ export function PortalTicketForm() {
onCategoryChange={setCategoryId}
onSubcategoryChange={setSubcategoryId}
layout="stacked"
categoryLabel="Categoria"
subcategoryLabel="Subcategoria"
categoryLabel="Categoria *"
subcategoryLabel="Subcategoria *"
secondaryEmptyLabel="Selecione uma categoria"
/>
</div>