{"version":3,"sources":["../src/components/SendActivityModal/validation.ts"],"sourcesContent":["import { z } from 'zod';\nimport { ActivitySubtype, SendActivityFormData, StepErrors } from './types';\n\n/**\n * Error messages for validation\n */\nexport const ERROR_MESSAGES = {\n  SUBTYPE_REQUIRED:\n    'Campo obrigatório! Por favor, selecione uma opção para continuar.',\n  MODE_REQUIRED:\n    'Campo obrigatório! Por favor, selecione o modo de prova para continuar.',\n  TITLE_REQUIRED:\n    'Campo obrigatório! Por favor, preencha este campo para continuar.',\n  STUDENTS_REQUIRED:\n    'Campo obrigatório! Por favor, selecione pelo menos um aluno para continuar.',\n  START_DATE_REQUIRED:\n    'Campo obrigatório! Por favor, preencha este campo para continuar.',\n  FINAL_DATE_REQUIRED:\n    'Campo obrigatório! Por favor, preencha este campo para continuar.',\n  FINAL_DATE_INVALID: 'A data final deve ser maior ou igual à data inicial.',\n} as const;\n\n/**\n * Zod schema for activity step (Step 1)\n */\nexport const activityStepSchema = z.object({\n  subtype: z.enum(\n    [ActivitySubtype.TAREFA, ActivitySubtype.TRABALHO, ActivitySubtype.PROVA],\n    { error: () => ERROR_MESSAGES.SUBTYPE_REQUIRED }\n  ),\n  title: z\n    .string({ error: () => ERROR_MESSAGES.TITLE_REQUIRED })\n    .transform((val) => val.trim())\n    .refine((val) => val.length > 0, {\n      message: ERROR_MESSAGES.TITLE_REQUIRED,\n    }),\n  notification: z.string().optional(),\n});\n\n/**\n * Zod schema for recipient step (Step 2)\n */\nexport const recipientStepSchema = z.object({\n  students: z\n    .array(\n      z.object({\n        studentId: z.string(),\n        userInstitutionId: z.string(),\n      }),\n      {\n        error: () => ERROR_MESSAGES.STUDENTS_REQUIRED,\n      }\n    )\n    .min(1, ERROR_MESSAGES.STUDENTS_REQUIRED),\n});\n\n/**\n * Regex patterns for date and time validation\n */\nconst DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst TIME_REGEX = /^\\d{2}:\\d{2}$/;\n\n/**\n * Zod schema for deadline step (Step 3) - base validation\n */\nconst deadlineStepBaseSchema = z.object({\n  startDate: z\n    .string({\n      error: () => ERROR_MESSAGES.START_DATE_REQUIRED,\n    })\n    .min(1, ERROR_MESSAGES.START_DATE_REQUIRED)\n    .regex(DATE_REGEX, ERROR_MESSAGES.START_DATE_REQUIRED),\n  startTime: z.string().regex(TIME_REGEX).default('00:00'),\n  finalDate: z\n    .string({\n      error: () => ERROR_MESSAGES.FINAL_DATE_REQUIRED,\n    })\n    .min(1, ERROR_MESSAGES.FINAL_DATE_REQUIRED)\n    .regex(DATE_REGEX, ERROR_MESSAGES.FINAL_DATE_REQUIRED),\n  finalTime: z.string().regex(TIME_REGEX).default('23:59'),\n  canRetry: z.boolean().default(false),\n});\n\n/**\n * Zod schema for deadline step with date comparison refinement\n */\nexport const deadlineStepSchema = deadlineStepBaseSchema.refine(\n  (data) => {\n    const start = new Date(`${data.startDate}T${data.startTime}`);\n    const end = new Date(`${data.finalDate}T${data.finalTime}`);\n    return end >= start;\n  },\n  { message: ERROR_MESSAGES.FINAL_DATE_INVALID, path: ['finalDate'] }\n);\n\n/**\n * Type inference from Zod schemas\n */\nexport type ActivityStepData = z.infer<typeof activityStepSchema>;\nexport type RecipientStepData = z.infer<typeof recipientStepSchema>;\nexport type DeadlineStepData = z.infer<typeof deadlineStepSchema>;\n\n/**\n * Validates the activity step (Step 1) using Zod\n * @param data - Partial form data\n * @param options - Validation options\n * @param options.enableExamMode - When true, only validates title (exam mode has simplified form)\n * @returns StepErrors object with any validation errors\n */\nexport function validateActivityStep(\n  data: Partial<SendActivityFormData>,\n  options?: { enableExamMode?: boolean }\n): StepErrors {\n  const errors: StepErrors = {};\n\n  // In exam mode, only validate title\n  if (options?.enableExamMode) {\n    if (!data.title || data.title.trim().length === 0) {\n      errors.title = ERROR_MESSAGES.TITLE_REQUIRED;\n    }\n    return errors;\n  }\n\n  // Activity mode: full validation\n  const result = activityStepSchema.safeParse({\n    subtype: data.subtype,\n    title: data.title,\n    notification: data.notification,\n  });\n\n  if (!result.success) {\n    result.error.issues.forEach((issue) => {\n      const field = issue.path[0] as keyof StepErrors;\n      if (field === 'subtype' || field === 'title') {\n        errors[field] = issue.message;\n      }\n    });\n  }\n\n  if (\n    options?.enableExamMode &&\n    data.subtype === ActivitySubtype.PROVA &&\n    !data.mode\n  ) {\n    errors.mode = ERROR_MESSAGES.MODE_REQUIRED;\n  }\n\n  return errors;\n}\n\n/**\n * Validates the recipient step (Step 2) using Zod\n * @param data - Partial form data\n * @returns StepErrors object with any validation errors\n */\nexport function validateRecipientStep(\n  data: Partial<SendActivityFormData>\n): StepErrors {\n  const errors: StepErrors = {};\n\n  const result = recipientStepSchema.safeParse({\n    students: data.students ?? [],\n  });\n\n  if (!result.success) {\n    result.error.issues.forEach((issue) => {\n      if (issue.path[0] === 'students') {\n        errors.students = issue.message;\n      }\n    });\n  }\n\n  return errors;\n}\n\n/**\n * Validates the deadline step (Step 3) using Zod\n * @param data - Partial form data\n * @param options - Validation options\n * @param options.enableExamMode - When true, only validates startDate (exam date)\n * @returns StepErrors object with any validation errors\n */\nexport function validateDeadlineStep(\n  data: Partial<SendActivityFormData>,\n  options?: { enableExamMode?: boolean }\n): StepErrors {\n  const errors: StepErrors = {};\n\n  // In exam mode, only validate startDate (exam date)\n  if (options?.enableExamMode) {\n    if (!data.startDate) {\n      errors.startDate = ERROR_MESSAGES.START_DATE_REQUIRED;\n    }\n    return errors;\n  }\n\n  // Activity mode: full validation\n  // First validate individual fields\n  if (!data.startDate) {\n    errors.startDate = ERROR_MESSAGES.START_DATE_REQUIRED;\n  }\n\n  if (!data.finalDate) {\n    errors.finalDate = ERROR_MESSAGES.FINAL_DATE_REQUIRED;\n  }\n\n  // If both dates exist, validate with the full schema (including refinement)\n  if (data.startDate && data.finalDate) {\n    const result = deadlineStepSchema.safeParse({\n      startDate: data.startDate,\n      startTime: data.startTime ?? '00:00',\n      finalDate: data.finalDate,\n      finalTime: data.finalTime ?? '23:59',\n      canRetry: data.canRetry ?? false,\n    });\n\n    if (!result.success) {\n      result.error.issues.forEach((issue) => {\n        const field = issue.path[0] as keyof StepErrors;\n        if (field === 'startDate' || field === 'finalDate') {\n          errors[field] = issue.message;\n        }\n      });\n    }\n  }\n\n  return errors;\n}\n\n/**\n * Validates a specific step\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @param options - Validation options passed to step validators\n * @returns StepErrors object with any validation errors\n */\nexport function validateStep(\n  step: number,\n  data: Partial<SendActivityFormData>,\n  options?: { enableExamMode?: boolean }\n): StepErrors {\n  switch (step) {\n    case 1:\n      return validateActivityStep(data, options);\n    case 2:\n      return validateRecipientStep(data);\n    case 3:\n      return validateDeadlineStep(data, options);\n    default:\n      return {};\n  }\n}\n\n/**\n * Checks if a specific step is valid\n * @param step - Step number (1, 2, or 3)\n * @param data - Partial form data\n * @param options - Validation options\n * @returns true if the step is valid\n */\nexport function isStepValid(\n  step: number,\n  data: Partial<SendActivityFormData>,\n  options?: { enableExamMode?: boolean }\n): boolean {\n  const errors = validateStep(step, data, options);\n  return Object.keys(errors).length === 0;\n}\n\n/**\n * Checks if all steps are valid (form can be submitted)\n * @param data - Partial form data\n * @param options - Validation options\n * @returns true if all steps are valid\n */\nexport function isFormValid(\n  data: Partial<SendActivityFormData>,\n  options?: { enableExamMode?: boolean }\n): boolean {\n  return (\n    isStepValid(1, data, options) &&\n    isStepValid(2, data) &&\n    isStepValid(3, data, options)\n  );\n}\n"],"mappings":"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","names":[]}