import { EmptyStateMetadata } from '../../molecules/empty-state/types'; /** * Un ítem de la cola de revisión, ya normalizado por el consumer. * * Deliberadamente pobre: id, título y unas líneas de metadata. Todo lo que sea * del dominio (el RUT del criadero, los tags de la receta, los documentos * adjuntos) va en el cuerpo proyectado, no acá — la lib no aprende qué es una * receta ni un criadero. */ export interface RequestReviewItem { /** Identidad del ítem. Es lo que viaja en la decisión. */ id: string; /** Encabezado de la card. */ title: string; /** * Líneas bajo el título (fecha de envío, identificador, estado). Texto ya * resuelto y formateado por el consumer: la lib no traduce ni formatea fechas. */ meta?: string[]; } /** Lo que emite el panel cuando el revisor decide. */ export interface RequestReviewDecision { itemId: string; approved: boolean; /** * Motivo del rechazo. Presente solo al rechazar con `requireRejectReason` * activo (el default), donde el panel garantiza que no viene vacío. */ reason?: string; } export interface RequestReviewPanelMetadata { /** La cola. Vacía + `loading: false` muestra el estado vacío. */ items: RequestReviewItem[]; /** Muestra el skeleton en vez de la lista. */ loading?: boolean; /** Filas del skeleton (default: 3). */ skeletonRows?: number; /** * Estado de error de la carga. Tiene prioridad sobre todo lo demás — un panel * que no pudo cargar no debe mostrar "no hay nada pendiente", que es una * afirmación distinta y falsa. */ errorState?: EmptyStateMetadata | null; /** Estado cuando la cola está vacía de verdad. */ emptyState?: EmptyStateMetadata; /** * Línea de conteo sobre la lista, ya compuesta por el consumer * ("3 pendientes"). Sin ella no se muestra nada. */ countLabel?: string; /** * ID del ítem con una decisión en vuelo. Ese ítem muestra su acción en * `WORKING` y el resto queda deshabilitado: dos decisiones simultáneas sobre * la misma cola es justo lo que no se quiere. */ busyItemId?: string; /** * Exigir un motivo escrito para rechazar (default: **true**). * * Es el default a propósito. Rechazar sin explicación deja al solicitante sin * saber qué corregir, y la notificación de decisión sale vacía. Ponerlo en * `false` es una decisión explícita del consumer, no un olvido. */ requireRejectReason?: boolean; /** Etiquetas. Todas opcionales — la lib trae defaults es/en. */ approveLabel?: string; rejectLabel?: string; cancelLabel?: string; confirmRejectLabel?: string; rejectReasonLabel?: string; rejectReasonPlaceholder?: string; rejectReasonHint?: string; }