Improve custom field timeline and toasts

This commit is contained in:
Esdras Renan 2025-11-07 23:59:16 -03:00
parent f7aa17f229
commit a2f9d4bd1a
9 changed files with 549 additions and 101 deletions

View file

@ -20,6 +20,36 @@ function normalizeTicketStatus(status: unknown): NormalizedTicketStatus {
return normalized ?? "PENDING";
}
const DATE_ONLY_REGEX = /^\d{4}-\d{2}-\d{2}$/;
function normalizeCustomFieldDateValue(raw: unknown): string | null {
if (raw === null || raw === undefined) {
return null;
}
if (typeof raw === "string") {
const trimmed = raw.trim();
if (!trimmed) return null;
if (DATE_ONLY_REGEX.test(trimmed)) {
return trimmed;
}
const parsed = new Date(trimmed);
if (Number.isNaN(parsed.getTime())) {
return null;
}
return parsed.toISOString().slice(0, 10);
}
const date =
raw instanceof Date
? raw
: typeof raw === "number"
? new Date(raw)
: null;
if (!date || Number.isNaN(date.getTime())) {
return null;
}
return date.toISOString().slice(0, 10);
}
// Server shapes: datas como number (epoch ms) e alguns nullables
// Relaxamos email/urls no shape do servidor para evitar que payloads parciais quebrem o app.
const serverUserSchema = z.object({
@ -246,8 +276,8 @@ export function mapTicketWithDetailsFromServer(input: unknown) {
>(
(acc, [key, value]) => {
let parsedValue: unknown = value.value;
if (value.type === "date" && typeof value.value === "number") {
parsedValue = new Date(value.value);
if (value.type === "date") {
parsedValue = normalizeCustomFieldDateValue(value.value) ?? value.value;
}
acc[key] = {
label: value.label,