import type { ISelectOption } from '@tnsu/ui-kit'; /** Вид обращения. Union вместо строк, чтобы опечатку поймал компилятор. */ export type AppealKind = 'complaint' | 'suggestion' | 'other'; /** Данные формы обращения. Одна плоская структура — один источник истины. */ export interface IFeedbackData { company: string; /** true — автор не указывает себя и не получит ответ. */ isAnonymous: boolean; fullName: string; position: string; wantsFeedback: boolean; kind: AppealKind; /** Заполняется только при kind === 'other'. */ kindOther: string; situation: string; suggestion: string; } // Порядок как в исходной форме: «Предложение» первым — совпадает с дефолтным // значением ниже (EMPTY_FEEDBACK.kind), так что выбор пользователя. export const KIND_OPTIONS: ISelectOption[] = [ { value: 'suggestion', label: 'Предложение' }, { value: 'complaint', label: 'Обращение' }, { value: 'other', label: 'Другое' } ]; /** Показывать поле или нет, и если показывать — обязательно ли оно. */ export interface IAppealFieldConfig { visible: boolean; required: boolean; } /** Настройка текстовых полей для выбранного вида обращения. */ export interface IAppealFieldsConfig { situation: IAppealFieldConfig; suggestion: IAppealFieldConfig; } /** * Состав полей зависит от вида обращения: * обращение — обязательно описание, а предложение — на желание автора; * предложение — только само предложение, «ситуации» ещё нет; * другое — свободное описание, без предложения. * Одно правило на форму и на валидацию, чтобы они не разошлись. */ export function getAppealFieldsConfig(kind: AppealKind): IAppealFieldsConfig { switch (kind) { case 'complaint': return { situation: { visible: true, required: true }, suggestion: { visible: true, required: false } }; case 'suggestion': return { situation: { visible: false, required: false }, suggestion: { visible: true, required: true } }; case 'other': return { situation: { visible: true, required: true }, suggestion: { visible: false, required: false } }; } } export const EMPTY_FEEDBACK: IFeedbackData = { company: '', isAnonymous: false, fullName: '', position: '', wantsFeedback: false, kind: 'suggestion', kindOther: '', situation: '', suggestion: '' }; /** Ключи полей, по которым показываем ошибку валидации. */ export type FeedbackErrors = Partial>;