import { EntityRef, FieldSchemaDef, RequestTypeConfig, RequestVisibility } from '../../../services/requests/types'; /** * Tipos de pregunta que ofrece una encuesta. * * El corte no es estético: **todo tipo que esta lista ofrezca, `val-survey-response` * tiene que saber renderizarlo**, o la encuesta se guarda bien y se responde mal * (un rating dibujado como caja de texto). Ampliar acá obliga a ampliar el * renderer en la misma entrega. * * Los seis primeros son de respuesta cerrada — `closedAnswerTypes` en * `backend/go/services/request/aggregate.go` los cuenta por valor en el * dashboard. Los seis últimos son abiertos: el dashboard lista sus respuestas. * * `FILE`/`ATTACHMENT` quedan deliberadamente fuera: una encuesta es pública y * anónima por default, y aceptar subidas ahí es superficie de abuso sin un caso * de uso que lo pida. * * `CHECK` también quedó fuera, por otro motivo: para quien responde era la misma * pregunta que `TOGGLE`. Dos formas de escribir "sí o no" no le daban una opción * a quien arma la encuesta, le daban una duda. El renderer y la agregación * siguen entendiendo `CHECK` — una encuesta vieja que lo tenga se responde y se * cuenta igual. */ export declare const SURVEY_QUESTION_TYPES: string[]; /** * @deprecated Quedó de la v1 del builder (ADR-092 Fase 2), cuando una pregunta * era solo label + uno de dos tipos. Hoy una pregunta es un `EditableFieldDef` * completo — ver `val-field-schema-editor`. No se usa en ningún lado; se * conserva un ciclo para no romper un import perdido. */ export interface SurveyQuestionRow { id: string; label: string; type: 'TEXTAREA' | 'EMOJI_RATING'; required: boolean; } export interface SurveyBuilderMetadata { /** Si se pasa, edita ese tipo existente; si no, crea uno nuevo. */ typeId?: string; /** Prefijo del `Type` del RequestTypeConfig — el componente arma `":"`. */ typePrefix?: string; entityRef?: EntityRef; /** Default 'PUBLIC' — el caso más común: link enviado a gente sin cuenta. */ visibility?: RequestVisibility; /** Default true. */ allowAnonymous?: boolean; /** Acota el catálogo de `SURVEY_QUESTION_TYPES` si una app quiere ofrecer menos. */ questionTypes?: string[]; /** * Si el builder guarda por su cuenta contra `/v2/request-types`. * * Default `true` por compatibilidad, pero **una app con endpoint propio debe * pasar `false`** y guardar ella: el endpoint de la vertical es el que valida * la entidad dueña, evita que dos encuestas de distinto evento colisionen en * el mismo `typeId`, y autoriza con SU permiso. Con `false`, `save()` valida * y emite `draft` sin tocar la red. */ persist?: boolean; /** * Siembra el builder con una encuesta que ya existe, sin ir a buscarla. * * Va de la mano de `persist: false`: la app que tiene endpoint propio ya * recibió la encuesta en su listado, así que pedirla de nuevo por el endpoint * genérico sería una lectura de más — y encima por una vía que exige * `apps:manage`. Con `typeId` el builder carga Y guarda solo; con `initial` * solo se llena. */ initial?: SurveyDraftEvent; } export interface SurveyBuilderSaveEvent { typeConfig: RequestTypeConfig; } /** * Lo que se escribió, sin persistir. * * Existe porque **el builder no siempre debe guardar por su cuenta**. Cuando la * app tiene su propio endpoint de dominio (el de bingo valida el evento, acota * el `typeId` para que dos eventos no colisionen y autoriza con el permiso de * la vertical en vez de `apps:manage`), guardar desde acá se salta todo eso. * * Los tres campos son exactamente los de `CreateEventSurveyRequest` en * `services/bingo/survey.go` — no es casualidad: es el contrato que la app * necesita reenviar. */ export interface SurveyDraftEvent { label: string; subtitle: string; questions: FieldSchemaDef[]; }