ui phase 10

This commit is contained in:
hamid
2026-07-19 17:13:32 +03:30
parent b638e25a0e
commit b4b8c9ea79
48 changed files with 1643 additions and 290 deletions
@@ -33,6 +33,7 @@ interface TicketSummaryWire {
createdAt: string;
lastMessageAt: string | null;
unreadCount: number;
// REQ-059 gap (extends REQ-028) — not yet on the wire; mapped as absent below until delivered.
}
/** Wire `TicketMessageDto`. `isInternal` is present on the DTO but is `false` in the user view (server-stripped). */
@@ -72,6 +73,9 @@ function mapSummary(w: TicketSummaryWire): TicketSummary {
// REQ-028 (delivered): the inbox unread badge + last-activity sort now come off the wire.
lastMessageAt: w.lastMessageAt,
unreadCount: w.unreadCount,
// REQ-059 gap — the wire summary has neither field yet; the card degrades gracefully (§3.1).
lastMessagePreview: null,
lastAuthorRole: null,
};
}
@@ -215,6 +219,9 @@ export const ticketsClientApi: TicketsApi = {
}),
),
// No wire aggregate yet (REQ-059) — the chrome badge (§3.1) renders only when a signal exists.
getUnreadTotal: async (): Promise<number | null> => null,
// ── Admin lens (b15). Global queue + admin thread (internal INCLUDED) + staff message post. ──
listAdminTickets: async (
filters: AdminTicketFilters,