Improve custom field timeline and toasts
This commit is contained in:
parent
f7aa17f229
commit
a2f9d4bd1a
9 changed files with 549 additions and 101 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue