@otl-core/forms 1.1.19 → 1.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/form-context.cjs +99 -0
  2. package/dist/form-context.cjs.map +1 -0
  3. package/dist/form-context.d.cts +55 -0
  4. package/dist/form-context.d.ts +55 -0
  5. package/dist/form-context.js +80 -0
  6. package/dist/form-context.js.map +1 -0
  7. package/dist/index.cjs +25 -943
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +6 -84
  10. package/dist/index.d.ts +6 -84
  11. package/dist/index.js +3 -939
  12. package/dist/index.js.map +1 -1
  13. package/dist/use-form-action.cjs +281 -0
  14. package/dist/use-form-action.cjs.map +1 -0
  15. package/dist/use-form-action.d.cts +12 -0
  16. package/dist/use-form-action.d.ts +12 -0
  17. package/dist/use-form-action.js +264 -0
  18. package/dist/use-form-action.js.map +1 -0
  19. package/dist/use-form-field.cjs +181 -0
  20. package/dist/use-form-field.cjs.map +1 -0
  21. package/dist/use-form-field.d.cts +19 -0
  22. package/dist/use-form-field.d.ts +19 -0
  23. package/dist/use-form-field.js +160 -0
  24. package/dist/use-form-field.js.map +1 -0
  25. package/dist/utils/page.utils.cjs +76 -0
  26. package/dist/utils/page.utils.cjs.map +1 -0
  27. package/dist/utils/page.utils.d.cts +7 -0
  28. package/dist/utils/page.utils.d.ts +7 -0
  29. package/dist/utils/page.utils.js +50 -0
  30. package/dist/utils/page.utils.js.map +1 -0
  31. package/dist/utils/rule.utils.cjs +94 -0
  32. package/dist/utils/rule.utils.cjs.map +1 -0
  33. package/dist/utils/rule.utils.d.cts +6 -0
  34. package/dist/utils/rule.utils.d.ts +6 -0
  35. package/dist/utils/rule.utils.js +69 -0
  36. package/dist/utils/rule.utils.js.map +1 -0
  37. package/dist/utils/validation.utils.cjs +391 -0
  38. package/dist/utils/validation.utils.cjs.map +1 -0
  39. package/dist/utils/validation.utils.d.cts +15 -0
  40. package/dist/utils/validation.utils.d.ts +15 -0
  41. package/dist/utils/validation.utils.js +366 -0
  42. package/dist/utils/validation.utils.js.map +1 -0
  43. package/package.json +2 -2
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/form-context.tsx","../src/utils/page.utils.ts","../src/utils/rule.utils.ts","../src/utils/validation.utils.ts","../src/use-form-action.tsx","../src/use-form-field.tsx"],"names":["useMemo","useCallback","value"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport type {\n FormAnalyticsCallback,\n FormAnalyticsSettings,\n FormDocument,\n FormPage,\n FormSettings,\n} from \"@otl-core/cms-types\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\n\ninterface FormContextValue {\n /** The actual form ID (from the form definition / PostgreSQL) */\n formId: string;\n document: FormDocument;\n settings: FormSettings;\n\n loading: boolean;\n setLoading: React.Dispatch<React.SetStateAction<boolean>>;\n\n currentPage: FormPage;\n setCurrentPage: (page: FormPage) => void;\n\n formValues: Record<string, unknown>;\n setFormValues: React.Dispatch<React.SetStateAction<Record<string, unknown>>>;\n\n errors: { [key: string]: string } | null;\n setErrors: React.Dispatch<\n React.SetStateAction<{ [key: string]: string } | null>\n >;\n globalError: string | null;\n setGlobalError: React.Dispatch<React.SetStateAction<string | null>>;\n\n analyticsSettings?: FormAnalyticsSettings;\n onAnalyticsEvent?: FormAnalyticsCallback;\n formName?: string;\n hasStarted: boolean;\n setHasStarted: React.Dispatch<React.SetStateAction<boolean>>;\n /** A/B test: which page variant the form is rendered on */\n environmentVariantId?: string;\n /** A/B test: which form variant was resolved (for multivariate forms) */\n formVariantId?: string;\n /** Locale for the form submission */\n locale?: string;\n}\n\nconst FormContext = createContext<FormContextValue | undefined>(undefined);\n\nexport function useForm(): FormContextValue {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error(\"useForm must be used within a FormProvider\");\n }\n return context;\n}\n\nexport interface FormProviderProps {\n children: React.ReactNode;\n /** The actual form ID (from the form definition / PostgreSQL) */\n formId: string;\n document: FormDocument;\n settings: FormSettings;\n analyticsSettings?: FormAnalyticsSettings;\n onAnalyticsEvent?: FormAnalyticsCallback;\n formName?: string;\n /** A/B test: which page variant the form is rendered on */\n environmentVariantId?: string;\n /** A/B test: which form variant was resolved (for multivariate forms) */\n formVariantId?: string;\n /** Locale for the form submission */\n locale?: string;\n}\n\nexport function FormProvider({\n children,\n formId,\n document,\n settings,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n environmentVariantId,\n formVariantId,\n locale,\n}: FormProviderProps) {\n const [currentPageId, setCurrentPageId] = useState<string>(\n document.pages[0]?.id ?? \"\",\n );\n const [formValues, setFormValues] = useState<Record<string, unknown>>({});\n\n const [loading, setLoading] = useState(false);\n const [errors, setErrors] = useState<{ [key: string]: string } | null>(null);\n const [globalError, setGlobalError] = useState<string | null>(null);\n const [hasStarted, setHasStarted] = useState(false);\n\n // Derive current page from document prop + stored page ID\n const currentPage = useMemo(\n () =>\n document.pages.find((p) => p.id === currentPageId) ?? document.pages[0],\n [document, currentPageId],\n );\n\n const setCurrentPage = useCallback(\n (page: FormPage) => setCurrentPageId(page.id),\n [],\n );\n\n return (\n <FormContext.Provider\n value={{\n formId,\n document,\n settings,\n\n loading,\n setLoading,\n\n currentPage,\n setCurrentPage,\n\n formValues,\n setFormValues,\n\n errors,\n setErrors,\n\n globalError,\n setGlobalError,\n\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n hasStarted,\n setHasStarted,\n environmentVariantId,\n formVariantId,\n locale,\n }}\n >\n {children}\n </FormContext.Provider>\n );\n}\n","import { BlockInstance, FormDocument, FormPage } from \"@otl-core/cms-types\";\n\nexport function getPreviousPage(\n currentPage: FormPage,\n formDocument: FormDocument,\n) {\n const index = formDocument.pages.findIndex(\n (page) => page.id === currentPage.id,\n );\n if (index === 0) {\n return null;\n }\n return formDocument.pages[index - 1];\n}\n\nexport function getNextPage(currentPage: FormPage, formDocument: FormDocument) {\n const index = formDocument.pages.findIndex(\n (page) => page.id === currentPage.id,\n );\n if (index === formDocument.pages.length - 1) {\n return null;\n }\n return formDocument.pages[index + 1];\n}\n\nexport function findBlockInDocument(\n blockId: string,\n document: FormDocument,\n): BlockInstance | null {\n for (const page of document.pages) {\n const block = findBlockRecursive(blockId, page.blocks);\n if (block) return block;\n }\n return null;\n}\n\nfunction findBlockRecursive(\n blockId: string,\n blocks: BlockInstance[],\n): BlockInstance | null {\n for (const block of blocks) {\n if (block.id === blockId) {\n return block;\n }\n\n // Check nested blocks (e.g., in form-inline-group)\n if (block.config.blocks && Array.isArray(block.config.blocks)) {\n const nestedBlocks = block.config.blocks.map(\n (b) =>\n ({\n id: b.id,\n type: b.type,\n config: b.config || {},\n }) as BlockInstance,\n );\n\n const found = findBlockRecursive(blockId, nestedBlocks);\n if (found) return found;\n }\n }\n\n return null;\n}\n","import { ConditionOperator, Rule } from \"@otl-core/cms-types\";\n\nfunction evaluateCondition(\n operator: ConditionOperator,\n fieldValue: unknown,\n ruleValue: unknown,\n): boolean {\n switch (operator) {\n case \"equals\":\n return fieldValue === ruleValue;\n case \"not_equals\":\n return fieldValue !== ruleValue;\n case \"contains\":\n return String(fieldValue || \"\").includes(String(ruleValue));\n case \"not_contains\":\n return !String(fieldValue || \"\").includes(String(ruleValue));\n case \"starts_with\":\n return String(fieldValue || \"\").startsWith(String(ruleValue));\n case \"ends_with\":\n return String(fieldValue || \"\").endsWith(String(ruleValue));\n case \"greater_than\":\n return Number(fieldValue) > Number(ruleValue);\n case \"less_than\":\n return Number(fieldValue) < Number(ruleValue);\n case \"greater_than_or_equal\":\n return Number(fieldValue) >= Number(ruleValue);\n case \"less_than_or_equal\":\n return Number(fieldValue) <= Number(ruleValue);\n case \"is_empty\":\n return (\n !fieldValue ||\n fieldValue === \"\" ||\n (Array.isArray(fieldValue) && fieldValue.length === 0)\n );\n case \"is_not_empty\":\n return (\n !!fieldValue &&\n fieldValue !== \"\" &&\n (!Array.isArray(fieldValue) || fieldValue.length > 0)\n );\n case \"is_checked\":\n return fieldValue === true;\n case \"is_not_checked\":\n return fieldValue !== true;\n case \"includes\":\n return Array.isArray(fieldValue) && fieldValue.includes(ruleValue);\n case \"not_includes\":\n return !Array.isArray(fieldValue) || !fieldValue.includes(ruleValue);\n default:\n return false;\n }\n}\n\nexport function evaluateVisibilityRules(\n rules: Rule[],\n formValues: Record<string, unknown>,\n): \"block\" | \"none\" {\n const visibilityRules = rules.filter((r) => r.type === \"visible_when\");\n\n // If no visibility rules, show by default\n if (visibilityRules.length === 0) {\n return \"block\";\n }\n\n // If any visibility rule matches, show the field\n for (const rule of visibilityRules) {\n const fieldValue = formValues[rule.field];\n if (evaluateCondition(rule.operator, fieldValue, rule.value)) {\n return \"block\";\n }\n }\n\n return \"none\";\n}\n\nexport function evaluateDisabledRules(\n rules: Rule[],\n formValues: Record<string, unknown>,\n): boolean {\n const disabledRules = rules.filter((r) => r.type === \"disabled_when\");\n\n // If no disabled rules, not disabled\n if (disabledRules.length === 0) {\n return false;\n }\n\n // If any disabled rule matches, disable the field\n for (const rule of disabledRules) {\n const fieldValue = formValues[rule.field];\n if (evaluateCondition(rule.operator, fieldValue, rule.value)) {\n return true;\n }\n }\n\n return false;\n}\n","import { BlockInstance, FormPage, FormSettings } from \"@otl-core/cms-types\";\n\nfunction isEmpty(value: unknown) {\n return value === undefined || value === null || value === \"\";\n}\n\nfunction interpolateMessage(\n template: string,\n params: Record<string, unknown>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => String(params[key] || \"\"));\n}\n\nfunction validateMinLength(value: unknown, minLength: unknown) {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n return (\n typeof value === \"string\" && value.length >= parseInt(minLength as string)\n );\n}\n\nfunction validateMaxLength(value: unknown, maxLength: unknown) {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n return (\n typeof value === \"string\" && value.length <= parseInt(maxLength as string)\n );\n}\n\nfunction validatePattern(value: unknown, pattern: unknown) {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n return typeof value === \"string\" && new RegExp(pattern as string).test(value);\n}\n\nfunction validateMinValue(value: unknown, min: unknown) {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n const numValue =\n typeof value === \"number\" ? value : parseFloat(value as string);\n const minValue = typeof min === \"number\" ? min : parseFloat(min as string);\n return !isNaN(numValue) && !isNaN(minValue) && numValue >= minValue;\n}\n\nfunction validateMaxValue(value: unknown, max: unknown) {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n const numValue =\n typeof value === \"number\" ? value : parseFloat(value as string);\n const maxValue = typeof max === \"number\" ? max : parseFloat(max as string);\n return !isNaN(numValue) && !isNaN(maxValue) && numValue <= maxValue;\n}\n\n// Type-specific validators\nfunction validateEmail(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n // RFC 5322 compliant email regex (simplified but robust)\n const emailRegex =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n return emailRegex.test(value);\n}\n\nfunction validateURL(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction validatePhoneNumber(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n // International phone number format (E.164 and common formats)\n // Allows: +1234567890, (123) 456-7890, 123-456-7890, 123.456.7890, 1234567890\n const phoneRegex =\n /^[\\+]?[(]?[0-9]{1,4}[)]?[-\\s\\.]?[(]?[0-9]{1,4}[)]?[-\\s\\.]?[0-9]{1,4}[-\\s\\.]?[0-9]{1,9}$/;\n return phoneRegex.test(value.replace(/\\s/g, \"\"));\n}\n\nfunction validateDate(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n const date = new Date(value);\n return !isNaN(date.getTime());\n}\n\nfunction validateTime(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n // HH:MM or HH:MM:SS format\n const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/;\n return timeRegex.test(value);\n}\n\nfunction validateColor(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n // Hex color (#RGB, #RRGGBB, #RRGGBBAA)\n const hexRegex = /^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/;\n return hexRegex.test(value);\n}\n\nfunction validateZipCode(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n // US ZIP code (12345 or 12345-6789)\n const usZipRegex = /^\\d{5}(-\\d{4})?$/;\n // UK postcode (basic pattern)\n const ukPostcodeRegex = /^[A-Z]{1,2}\\d{1,2}[A-Z]?\\s?\\d[A-Z]{2}$/i;\n // German postcode\n const dePostcodeRegex = /^\\d{5}$/;\n\n return (\n usZipRegex.test(value) ||\n ukPostcodeRegex.test(value) ||\n dePostcodeRegex.test(value)\n );\n}\n\nfunction validateCreditCard(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n // Remove spaces and dashes\n const cleaned = value.replace(/[\\s-]/g, \"\");\n\n // Check if it's all digits and 13-19 characters (standard credit card length)\n if (!/^\\d{13,19}$/.test(cleaned)) return false;\n\n // Luhn algorithm\n let sum = 0;\n let isEven = false;\n\n for (let i = cleaned.length - 1; i >= 0; i--) {\n let digit = parseInt(cleaned.charAt(i), 10);\n\n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n isEven = !isEven;\n }\n\n return sum % 10 === 0;\n}\n\nfunction validateIPAddress(value: unknown): boolean {\n if (isEmpty(value)) return true; // Skip if empty (handled by required)\n if (typeof value !== \"string\") return false;\n\n // IPv4\n const ipv4Regex =\n /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n // IPv6 (simplified)\n const ipv6Regex = /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/i;\n\n return ipv4Regex.test(value) || ipv6Regex.test(value);\n}\n\n// Validation error messages\nconst TYPE_ERROR_MESSAGES: Record<string, string> = {\n email: \"Please enter a valid email address\",\n url: \"Please enter a valid URL (e.g., https://example.com)\",\n tel: \"Please enter a valid phone number\",\n date: \"Please enter a valid date\",\n time: \"Please enter a valid time\",\n color: \"Please enter a valid color code (e.g., #FF0000)\",\n zipcode: \"Please enter a valid ZIP/postal code\",\n creditcard: \"Please enter a valid credit card number\",\n ip: \"Please enter a valid IP address\",\n};\n\nfunction getAllBlocksFromPage(blocks: BlockInstance[]): BlockInstance[] {\n const allBlocks: BlockInstance[] = [];\n\n for (const block of blocks) {\n allBlocks.push(block);\n\n // Check for nested blocks (e.g., form-inline-group)\n if (block.config.blocks && Array.isArray(block.config.blocks)) {\n const nestedBlocks = block.config.blocks.map(\n (b) =>\n ({\n id: b.id,\n type: b.type,\n config: b.config || {},\n }) as BlockInstance,\n );\n allBlocks.push(...getAllBlocksFromPage(nestedBlocks));\n }\n }\n\n return allBlocks;\n}\n\nexport function validatePage(\n page: FormPage,\n formValues: Record<string, unknown>,\n settings?: FormSettings,\n): true | { [key: string]: string } {\n const errors: { [key: string]: string } = {};\n const allBlocks = getAllBlocksFromPage(page.blocks);\n const errorMessages = settings?.error_messages || {};\n\n for (const block of allBlocks) {\n // Skip button blocks and non-input blocks\n if (block.type === \"form-button\" || block.type === \"form-inline-group\") {\n continue;\n }\n\n // Get the field_id (or fallback to block.id)\n const fieldId =\n typeof block.config.field_id === \"string\"\n ? block.config.field_id\n : block.id;\n\n const value = formValues[fieldId];\n const inputType =\n typeof block.config.input_type === \"string\"\n ? block.config.input_type\n : \"\";\n\n // Validate required fields (standard required)\n if (block.config.required && isEmpty(value)) {\n errors[fieldId] = errorMessages.required || \"This field is required\";\n continue; // Skip other validations if empty and required\n }\n\n // Validate checkbox required (must be checked)\n if (block.config.check_required && block.type === \"form-checkbox\") {\n const isChecked =\n value === true || (Array.isArray(value) && value.length > 0);\n if (!isChecked) {\n errors[fieldId] =\n errorMessages.check_required || \"You must check this box to continue\";\n continue;\n }\n }\n\n // Validate per-option check_required for checkbox groups\n if (block.type === \"form-checkbox\" && block.config.options) {\n const options = block.config.options as Array<{\n value: string;\n label: string;\n check_required?: boolean;\n }>;\n const checkedValues = Array.isArray(value) ? value : [];\n\n for (const option of options) {\n if (option.check_required && !checkedValues.includes(option.value)) {\n errors[fieldId] = `You must check \"${option.label}\" to continue`;\n break;\n }\n }\n\n if (errors[fieldId]) {\n continue;\n }\n }\n\n // Skip further validations if field is empty and not required\n if (isEmpty(value)) {\n continue;\n }\n\n // Type-specific validation\n switch (inputType) {\n case \"email\":\n if (!validateEmail(value)) {\n errors[fieldId] =\n errorMessages.invalid_email || \"Please enter a valid email address\";\n continue;\n }\n break;\n case \"url\":\n if (!validateURL(value)) {\n errors[fieldId] =\n errorMessages.invalid_url ||\n \"Please enter a valid URL (e.g., https://example.com)\";\n continue;\n }\n break;\n case \"tel\":\n if (!validatePhoneNumber(value)) {\n errors[fieldId] =\n errorMessages.invalid_phone || \"Please enter a valid phone number\";\n continue;\n }\n break;\n case \"date\":\n if (!validateDate(value)) {\n errors[fieldId] =\n errorMessages.invalid_date || \"Please enter a valid date\";\n continue;\n }\n break;\n case \"time\":\n if (!validateTime(value)) {\n errors[fieldId] =\n errorMessages.invalid_time || \"Please enter a valid time\";\n continue;\n }\n break;\n case \"color\":\n if (!validateColor(value)) {\n errors[fieldId] =\n errorMessages.invalid_color ||\n \"Please enter a valid color code (e.g., #FF0000)\";\n continue;\n }\n break;\n }\n\n // Custom validation type\n if (block.config.validation_type) {\n const validationType = block.config.validation_type as string;\n\n switch (validationType) {\n case \"zipcode\":\n if (!validateZipCode(value)) {\n errors[fieldId] = TYPE_ERROR_MESSAGES.zipcode;\n continue;\n }\n break;\n case \"creditcard\":\n if (!validateCreditCard(value)) {\n errors[fieldId] = TYPE_ERROR_MESSAGES.creditcard;\n continue;\n }\n break;\n case \"ip\":\n if (!validateIPAddress(value)) {\n errors[fieldId] = TYPE_ERROR_MESSAGES.ip;\n continue;\n }\n break;\n }\n }\n\n // Validate min/max length\n if (\n block.config.minLength &&\n !validateMinLength(value, block.config.minLength)\n ) {\n errors[fieldId] = errorMessages.min_length\n ? interpolateMessage(errorMessages.min_length, {\n min: block.config.minLength,\n })\n : \"This field must be at least \" +\n block.config.minLength +\n \" characters long\";\n continue;\n }\n\n if (\n block.config.maxLength &&\n !validateMaxLength(value, block.config.maxLength)\n ) {\n errors[fieldId] = errorMessages.max_length\n ? interpolateMessage(errorMessages.max_length, {\n max: block.config.maxLength,\n })\n : \"This field must be less than \" +\n block.config.maxLength +\n \" characters long\";\n continue;\n }\n\n // Validate min/max value (for number inputs)\n if (\n block.config.min !== undefined &&\n !validateMinValue(value, block.config.min)\n ) {\n errors[fieldId] = errorMessages.min_value\n ? interpolateMessage(errorMessages.min_value, { min: block.config.min })\n : \"Value must be at least \" + block.config.min;\n continue;\n }\n\n if (\n block.config.max !== undefined &&\n !validateMaxValue(value, block.config.max)\n ) {\n errors[fieldId] = errorMessages.max_value\n ? interpolateMessage(errorMessages.max_value, { max: block.config.max })\n : \"Value must be no more than \" + block.config.max;\n continue;\n }\n\n // Validate custom pattern (runs last, after type-specific validation)\n if (block.config.pattern && !validatePattern(value, block.config.pattern)) {\n const patternMessage = block.config.pattern_message\n ? block.config.pattern_message\n : \"This field has an invalid format\";\n errors[fieldId] = patternMessage as string;\n continue;\n }\n }\n\n return Object.keys(errors).length > 0 ? errors : true;\n}\n\n/**\n * Validates a single field\n * @param block The block instance to validate\n * @param value The current value of the field\n * @param settings Optional form settings for custom error messages\n * @returns Error message if validation fails, undefined if valid\n */\nexport function validateField(\n block: BlockInstance,\n value: unknown,\n settings?: FormSettings,\n): string | undefined {\n // Skip button blocks and non-input blocks\n if (block.type === \"form-button\" || block.type === \"form-inline-group\") {\n return undefined;\n }\n\n const errorMessages = settings?.error_messages || {};\n const inputType =\n typeof block.config.input_type === \"string\" ? block.config.input_type : \"\";\n\n // Validate required fields (standard required)\n if (block.config.required && isEmpty(value)) {\n return errorMessages.required || \"This field is required\";\n }\n\n // Validate checkbox required (must be checked)\n if (block.config.check_required && block.type === \"form-checkbox\") {\n const isChecked =\n value === true || (Array.isArray(value) && value.length > 0);\n if (!isChecked) {\n return (\n errorMessages.check_required || \"You must check this box to continue\"\n );\n }\n }\n\n // Validate per-option check_required for checkbox groups\n if (block.type === \"form-checkbox\" && block.config.options) {\n const options = block.config.options as Array<{\n value: string;\n label: string;\n check_required?: boolean;\n }>;\n const checkedValues = Array.isArray(value) ? value : [];\n\n for (const option of options) {\n if (option.check_required && !checkedValues.includes(option.value)) {\n return `You must check \"${option.label}\" to continue`;\n }\n }\n }\n\n // Skip further validations if field is empty and not required\n if (isEmpty(value)) {\n return undefined;\n }\n\n // Type-specific validation\n switch (inputType) {\n case \"email\":\n if (!validateEmail(value)) {\n return (\n errorMessages.invalid_email || \"Please enter a valid email address\"\n );\n }\n break;\n case \"url\":\n if (!validateURL(value)) {\n return (\n errorMessages.invalid_url ||\n \"Please enter a valid URL (e.g., https://example.com)\"\n );\n }\n break;\n case \"tel\":\n if (!validatePhoneNumber(value)) {\n return (\n errorMessages.invalid_phone || \"Please enter a valid phone number\"\n );\n }\n break;\n case \"date\":\n if (!validateDate(value)) {\n return errorMessages.invalid_date || \"Please enter a valid date\";\n }\n break;\n case \"time\":\n if (!validateTime(value)) {\n return errorMessages.invalid_time || \"Please enter a valid time\";\n }\n break;\n case \"color\":\n if (!validateColor(value)) {\n return (\n errorMessages.invalid_color ||\n \"Please enter a valid color code (e.g., #FF0000)\"\n );\n }\n break;\n }\n\n // Custom validation type\n if (block.config.validation_type) {\n const validationType = block.config.validation_type as string;\n\n switch (validationType) {\n case \"zipcode\":\n if (!validateZipCode(value)) {\n return TYPE_ERROR_MESSAGES.zipcode;\n }\n break;\n case \"creditcard\":\n if (!validateCreditCard(value)) {\n return TYPE_ERROR_MESSAGES.creditcard;\n }\n break;\n case \"ip\":\n if (!validateIPAddress(value)) {\n return TYPE_ERROR_MESSAGES.ip;\n }\n break;\n }\n }\n\n // Validate min/max length\n if (\n block.config.minLength &&\n !validateMinLength(value, block.config.minLength)\n ) {\n return errorMessages.min_length\n ? interpolateMessage(errorMessages.min_length, {\n min: block.config.minLength,\n })\n : \"This field must be at least \" +\n block.config.minLength +\n \" characters long\";\n }\n\n if (\n block.config.maxLength &&\n !validateMaxLength(value, block.config.maxLength)\n ) {\n return errorMessages.max_length\n ? interpolateMessage(errorMessages.max_length, {\n max: block.config.maxLength,\n })\n : \"This field must be less than \" +\n block.config.maxLength +\n \" characters long\";\n }\n\n // Validate min/max value (for number inputs)\n if (\n block.config.min !== undefined &&\n !validateMinValue(value, block.config.min)\n ) {\n return errorMessages.min_value\n ? interpolateMessage(errorMessages.min_value, { min: block.config.min })\n : \"Value must be at least \" + block.config.min;\n }\n\n if (\n block.config.max !== undefined &&\n !validateMaxValue(value, block.config.max)\n ) {\n return errorMessages.max_value\n ? interpolateMessage(errorMessages.max_value, { max: block.config.max })\n : \"Value must be no more than \" + block.config.max;\n }\n\n // Validate custom pattern (runs last, after type-specific validation)\n if (block.config.pattern && !validatePattern(value, block.config.pattern)) {\n const patternMessage = block.config.pattern_message\n ? block.config.pattern_message\n : \"This field has an invalid format\";\n return patternMessage as string;\n }\n\n return undefined;\n}\n","import type {\n BlockInstance,\n FormAdvancedOptions,\n FormPage,\n} from \"@otl-core/cms-types\";\nimport { useCallback, useMemo } from \"react\";\nimport { useForm } from \"./form-context\";\nimport {\n findBlockInDocument,\n getNextPage,\n getPreviousPage,\n} from \"./utils/page.utils\";\nimport {\n evaluateDisabledRules,\n evaluateVisibilityRules,\n} from \"./utils/rule.utils\";\nimport { validatePage } from \"./utils/validation.utils\";\n\ninterface FormAction {\n variant: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n size: \"sm\" | \"md\" | \"lg\";\n disabled: boolean;\n loading: boolean;\n display: \"block\" | \"none\";\n text: string;\n onClick: () => Promise<void>;\n}\n\nexport function useFormAction(id: string): FormAction | null {\n const {\n formId,\n document,\n formValues,\n setErrors,\n loading,\n currentPage,\n setCurrentPage,\n setFormValues,\n setGlobalError,\n settings,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n environmentVariantId,\n formVariantId,\n locale,\n } = useForm();\n\n const block: BlockInstance | null = useMemo(() => {\n return findBlockInDocument(id, document);\n }, [document, id]);\n\n const navigate = useCallback(\n (to: string) => {\n const currentPageValid: true | { [key: string]: string } =\n to === \"first\" || validatePage(currentPage, formValues, settings);\n\n if (currentPageValid !== true) {\n // Replace errors, don't accumulate\n setErrors(currentPageValid);\n return;\n }\n\n // Clear errors when navigation is successful\n setErrors(null);\n setGlobalError(null);\n\n let targetPage: FormPage | null = null;\n\n switch (to) {\n case \"prev\":\n const previousPage = getPreviousPage(currentPage, document);\n if (previousPage) {\n targetPage = previousPage;\n setCurrentPage(previousPage);\n } else {\n console.error(\"[ERROR] No previous page found.\");\n setGlobalError(\"Configuration Error: No previous page found.\");\n }\n break;\n case \"next\":\n const nextPage = getNextPage(currentPage, document);\n if (nextPage) {\n targetPage = nextPage;\n setCurrentPage(nextPage);\n } else {\n console.error(\"[ERROR] No next page found.\");\n setGlobalError(\"Configuration Error: No next page found.\");\n }\n break;\n case \"first\":\n targetPage = document.pages[0];\n setCurrentPage(document.pages[0]);\n break;\n case \"last\":\n targetPage = document.pages[document.pages.length - 1];\n setCurrentPage(document.pages[document.pages.length - 1]);\n break;\n default:\n targetPage =\n document.pages.find((page) => page.id === to) || document.pages[0];\n setCurrentPage(targetPage);\n break;\n }\n\n // Notify parent window of page change (for editor sync)\n if (targetPage && typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n { type: \"FORM_PAGE_CHANGED\", pageId: targetPage.id },\n window.location.origin,\n );\n }\n\n // Emit form_page_change analytics event\n if (\n targetPage &&\n analyticsSettings?.track_page_navigation &&\n onAnalyticsEvent\n ) {\n const targetIndex = document.pages.findIndex(\n (p) => p.id === targetPage.id,\n );\n onAnalyticsEvent(\"form_page_change\", {\n form_id: formId,\n form_name: formName,\n page_id: targetPage.id,\n page_index: targetIndex,\n total_pages: document.pages.length,\n });\n }\n },\n [\n currentPage,\n setCurrentPage,\n document,\n formId,\n formValues,\n settings,\n setErrors,\n setGlobalError,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n ],\n );\n\n const submit = useCallback(async () => {\n if (!block) {\n return;\n }\n\n // Collect all errors from all pages\n let allErrors: { [key: string]: string } = {};\n let hasErrors = false;\n\n for (const page of document.pages) {\n const result = validatePage(page, formValues, settings);\n if (result !== true) {\n allErrors = { ...allErrors, ...result };\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n setErrors(allErrors);\n\n // Emit form_error analytics event\n if (analyticsSettings?.track_form_error && onAnalyticsEvent) {\n onAnalyticsEvent(\"form_error\", {\n form_id: formId,\n form_name: formName,\n error_count: Object.keys(allErrors).length,\n error_fields: Object.keys(allErrors),\n });\n }\n\n return;\n }\n\n // Clear all errors on successful validation\n setErrors(null);\n setGlobalError(null);\n\n try {\n // Button-level submission_type override takes precedence over the form-level setting\n const buttonTypeOverride =\n block &&\n typeof block.config.submission_type === \"string\" &&\n block.config.submission_type\n ? block.config.submission_type\n : undefined;\n\n const submissionData = {\n form_id: formId,\n type: buttonTypeOverride ?? settings?.form_type ?? \"General\",\n locale: locale ?? \"en\",\n data: formValues,\n environment_type: \"page\",\n environment_id: formId,\n environment_path:\n typeof window !== \"undefined\" ? window.location.pathname : undefined,\n form_variant_id: formVariantId ?? \"\",\n environment_variant_id: environmentVariantId ?? \"\",\n };\n\n const response = await fetch(\"/api/submission\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(submissionData),\n });\n\n const result = await response.json();\n\n if (!response.ok || !result.success) {\n setGlobalError(\n result.message || \"Failed to submit form. Please try again.\",\n );\n return;\n }\n\n // Emit form_submit analytics event on success\n if (analyticsSettings?.track_form_submit && onAnalyticsEvent) {\n onAnalyticsEvent(\"form_submit\", {\n form_id: formId,\n form_name: formName,\n total_pages: document.pages.length,\n custom_event_name: analyticsSettings.submit_event_name,\n target_providers: analyticsSettings.target_providers,\n });\n }\n } catch (error) {\n setGlobalError(\"An error occurred while submitting the form.\");\n }\n\n return Promise.resolve();\n }, [\n block,\n document,\n formId,\n formValues,\n setErrors,\n setGlobalError,\n settings,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n locale,\n formVariantId,\n environmentVariantId,\n ]);\n\n const reset = useCallback(async () => {\n if (!block) {\n return;\n }\n setFormValues({});\n setErrors(null);\n setGlobalError(null);\n return Promise.resolve();\n }, [block, setFormValues, setErrors, setGlobalError]);\n\n const executeAction = useCallback(async () => {\n if (!block) {\n return;\n }\n\n const action = block.config.action as string;\n let to = String(block.config.navigate_to_page || \"next\");\n\n if (action === \"reset\") {\n await reset();\n to = \"first\"; // always navigate to first page after reset\n navigate(to);\n } else if (action === \"submit\") {\n await submit();\n // Only navigate if submit was successful (no errors set)\n navigate(to);\n } else if (action === \"navigate\") {\n navigate(to);\n }\n\n return Promise.resolve();\n }, [block, navigate, submit, reset]);\n\n const display: \"block\" | \"none\" = useMemo(() => {\n if (!block) {\n return \"none\";\n }\n\n const rules = (block.config.advanced_options as FormAdvancedOptions)?.rules;\n if (!rules) {\n return \"block\";\n }\n\n return evaluateVisibilityRules(rules, formValues);\n }, [block, formValues]);\n\n const disabled: boolean = useMemo(() => {\n if (!block) {\n return false;\n }\n\n if (loading) {\n return true;\n }\n\n if (typeof block.config.disabled === \"boolean\" && block.config.disabled) {\n return block.config.disabled;\n }\n\n const rules = (block.config.advanced_options as FormAdvancedOptions)?.rules;\n if (!rules) {\n return false;\n }\n\n return evaluateDisabledRules(rules, formValues);\n }, [block, formValues, loading]);\n\n if (!block) {\n return null;\n }\n\n return {\n variant:\n typeof block.config.variant === \"string\"\n ? (block.config.variant as FormAction[\"variant\"])\n : \"primary\",\n size:\n typeof block.config.size === \"string\"\n ? (block.config.size as FormAction[\"size\"])\n : \"md\",\n disabled,\n loading,\n display,\n text:\n typeof block.config.text === \"string\"\n ? block.config.text\n : typeof block.config.label === \"string\"\n ? block.config.label\n : \"\",\n onClick: executeAction,\n };\n}\n","import type { BlockInstance, FormAdvancedOptions } from \"@otl-core/cms-types\";\nimport { useCallback, useMemo } from \"react\";\nimport { useForm } from \"./form-context\";\nimport { findBlockInDocument } from \"./utils/page.utils\";\nimport {\n evaluateDisabledRules,\n evaluateVisibilityRules,\n} from \"./utils/rule.utils\";\nimport { validateField } from \"./utils/validation.utils\";\n\ninterface FormField<T> {\n name: string;\n label: string;\n type: string;\n helperText: string;\n placeholder: string | null;\n additionalSettings: Record<string, unknown>;\n\n loading: boolean;\n\n display: \"block\" | \"none\";\n required: boolean;\n disabled: boolean;\n error?: string;\n\n value: T;\n onChange: React.Dispatch<React.SetStateAction<T>>;\n onBlur: () => void;\n}\n\nexport function useFormField<T>(id: string): FormField<T> | null {\n const {\n formId,\n document,\n settings,\n loading,\n formValues,\n setFormValues,\n errors,\n setErrors,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n hasStarted,\n setHasStarted,\n } = useForm();\n\n const block: BlockInstance | null = useMemo(() => {\n return findBlockInDocument(id, document);\n }, [document, id]);\n\n const fieldId = useMemo(() => {\n if (!block) return null;\n return typeof block.config.field_id === \"string\"\n ? block.config.field_id\n : block.id;\n }, [block]);\n\n const initialValue: T | undefined = useMemo(() => {\n if (!block) {\n return undefined;\n }\n\n if (typeof block.config.initialValue === \"string\") {\n return String(block.config.initialValue) as T;\n } else if (typeof block.config.initialValue === \"number\") {\n return Number(block.config.initialValue) as T;\n } else if (typeof block.config.initialValue === \"boolean\") {\n return Boolean(block.config.initialValue) as T;\n }\n\n if (block.config.initialValue !== undefined) {\n return block.config.initialValue as T;\n }\n\n return undefined;\n }, [block]);\n\n const value = useMemo<T | undefined>(() => {\n if (!fieldId) {\n return undefined;\n }\n return (formValues[fieldId] as T) ?? initialValue;\n }, [fieldId, formValues, initialValue]);\n\n const setValue = useCallback(\n (value: T) => {\n if (!fieldId) {\n return;\n }\n setFormValues((prev) => ({ ...prev, [fieldId]: value }));\n // Clear error for this field when value changes\n setErrors((prev) => {\n if (!prev || !prev[fieldId]) return prev;\n const { [fieldId]: _, ...rest } = prev;\n return Object.keys(rest).length > 0 ? rest : null;\n });\n\n // Emit form_start on first interaction\n if (\n !hasStarted &&\n analyticsSettings?.track_form_start &&\n onAnalyticsEvent\n ) {\n setHasStarted(true);\n onAnalyticsEvent(\"form_start\", {\n form_id: formId,\n form_name: formName,\n });\n }\n },\n [\n fieldId,\n setFormValues,\n setErrors,\n hasStarted,\n setHasStarted,\n analyticsSettings,\n onAnalyticsEvent,\n formId,\n formName,\n ],\n );\n\n const handleBlur = useCallback(() => {\n // Only validate on blur if the setting is enabled\n if (!(settings.validate_on_blur ?? false) || !block || !fieldId) {\n return;\n }\n\n const currentValue = formValues[fieldId] ?? initialValue;\n const error = validateField(block, currentValue, settings);\n\n if (error) {\n setErrors((prev) => ({ ...prev, [fieldId]: error }));\n } else {\n // Clear error if validation passes\n setErrors((prev) => {\n if (!prev || !prev[fieldId]) return prev;\n const { [fieldId]: _, ...rest } = prev;\n return Object.keys(rest).length > 0 ? rest : null;\n });\n }\n }, [settings, block, fieldId, formValues, initialValue, setErrors]);\n\n const display: \"block\" | \"none\" = useMemo(() => {\n if (!block) {\n return \"none\";\n }\n\n // check logic\n const rules = (block.config.advanced_options as FormAdvancedOptions)?.rules;\n if (!rules) {\n return \"block\";\n }\n\n return evaluateVisibilityRules(rules, formValues);\n }, [block, formValues]);\n\n const disabled: boolean = useMemo(() => {\n if (!block) {\n return false;\n }\n\n if (loading) {\n return true;\n }\n\n if (typeof block.config.disabled === \"boolean\" && block.config.disabled) {\n return block.config.disabled;\n }\n\n // check logic\n const rules = (block.config.advanced_options as FormAdvancedOptions)?.rules;\n if (!rules) {\n return false;\n }\n\n return evaluateDisabledRules(rules, formValues);\n }, [block, formValues, loading]);\n\n if (!block || !fieldId) {\n return null;\n }\n\n return {\n name: fieldId,\n label: typeof block.config.label === \"string\" ? block.config.label : \"\",\n type:\n typeof block.config.input_type === \"string\"\n ? block.config.input_type\n : typeof block.config.type === \"string\"\n ? block.config.type\n : \"\",\n helperText:\n typeof block.config.help_text === \"string\"\n ? block.config.help_text\n : typeof block.config.helperText === \"string\"\n ? block.config.helperText\n : \"\",\n placeholder:\n typeof block.config.placeholder === \"string\"\n ? block.config.placeholder\n : null,\n\n additionalSettings: {\n rows:\n typeof block.config.rows === \"number\" ? block.config.rows : undefined,\n options: block.config.options || undefined,\n multiple:\n typeof block.config.multiple === \"boolean\"\n ? block.config.multiple\n : undefined,\n min: typeof block.config.min === \"number\" ? block.config.min : undefined,\n max: typeof block.config.max === \"number\" ? block.config.max : undefined,\n step:\n typeof block.config.step === \"number\" ? block.config.step : undefined,\n blocks: block.config.blocks || undefined,\n gap: block.config.gap || undefined,\n },\n\n loading,\n\n disabled,\n display,\n required:\n typeof block.config.required === \"boolean\"\n ? block.config.required\n : false,\n error: errors?.[fieldId] || errors?.[block.id] || undefined,\n\n value: value as T,\n onChange: setValue as React.Dispatch<React.SetStateAction<T>>,\n onBlur: handleBlur,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./form-context\";\nexport * from \"./use-form-action\";\nexport * from \"./use-form-field\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var use_form_action_exports = {};
21
+ __export(use_form_action_exports, {
22
+ useFormAction: () => useFormAction
23
+ });
24
+ module.exports = __toCommonJS(use_form_action_exports);
25
+ var import_react = require("react");
26
+ var import_form_context = require("./form-context");
27
+ var import_page = require("./utils/page.utils");
28
+ var import_rule = require("./utils/rule.utils");
29
+ var import_validation = require("./utils/validation.utils");
30
+ function useFormAction(id) {
31
+ const {
32
+ formId,
33
+ document,
34
+ formValues,
35
+ setErrors,
36
+ loading,
37
+ currentPage,
38
+ setCurrentPage,
39
+ setFormValues,
40
+ setGlobalError,
41
+ settings,
42
+ analyticsSettings,
43
+ onAnalyticsEvent,
44
+ formName,
45
+ environmentVariantId,
46
+ formVariantId,
47
+ locale
48
+ } = (0, import_form_context.useForm)();
49
+ const block = (0, import_react.useMemo)(() => {
50
+ return (0, import_page.findBlockInDocument)(id, document);
51
+ }, [document, id]);
52
+ const navigate = (0, import_react.useCallback)(
53
+ (to) => {
54
+ const currentPageValid = to === "first" || (0, import_validation.validatePage)(currentPage, formValues, settings);
55
+ if (currentPageValid !== true) {
56
+ setErrors(currentPageValid);
57
+ return;
58
+ }
59
+ setErrors(null);
60
+ setGlobalError(null);
61
+ let targetPage = null;
62
+ switch (to) {
63
+ case "prev":
64
+ const previousPage = (0, import_page.getPreviousPage)(currentPage, document);
65
+ if (previousPage) {
66
+ targetPage = previousPage;
67
+ setCurrentPage(previousPage);
68
+ } else {
69
+ console.error("[ERROR] No previous page found.");
70
+ setGlobalError("Configuration Error: No previous page found.");
71
+ }
72
+ break;
73
+ case "next":
74
+ const nextPage = (0, import_page.getNextPage)(currentPage, document);
75
+ if (nextPage) {
76
+ targetPage = nextPage;
77
+ setCurrentPage(nextPage);
78
+ } else {
79
+ console.error("[ERROR] No next page found.");
80
+ setGlobalError("Configuration Error: No next page found.");
81
+ }
82
+ break;
83
+ case "first":
84
+ targetPage = document.pages[0];
85
+ setCurrentPage(document.pages[0]);
86
+ break;
87
+ case "last":
88
+ targetPage = document.pages[document.pages.length - 1];
89
+ setCurrentPage(document.pages[document.pages.length - 1]);
90
+ break;
91
+ default:
92
+ targetPage = document.pages.find((page) => page.id === to) || document.pages[0];
93
+ setCurrentPage(targetPage);
94
+ break;
95
+ }
96
+ if (targetPage && typeof window !== "undefined" && window.parent) {
97
+ window.parent.postMessage(
98
+ { type: "FORM_PAGE_CHANGED", pageId: targetPage.id },
99
+ window.location.origin
100
+ );
101
+ }
102
+ if (targetPage && analyticsSettings?.track_page_navigation && onAnalyticsEvent) {
103
+ const targetIndex = document.pages.findIndex(
104
+ (p) => p.id === targetPage.id
105
+ );
106
+ onAnalyticsEvent("form_page_change", {
107
+ form_id: formId,
108
+ form_name: formName,
109
+ page_id: targetPage.id,
110
+ page_index: targetIndex,
111
+ total_pages: document.pages.length
112
+ });
113
+ }
114
+ },
115
+ [
116
+ currentPage,
117
+ setCurrentPage,
118
+ document,
119
+ formId,
120
+ formValues,
121
+ settings,
122
+ setErrors,
123
+ setGlobalError,
124
+ analyticsSettings,
125
+ onAnalyticsEvent,
126
+ formName
127
+ ]
128
+ );
129
+ const submit = (0, import_react.useCallback)(async () => {
130
+ if (!block) {
131
+ return;
132
+ }
133
+ let allErrors = {};
134
+ let hasErrors = false;
135
+ for (const page of document.pages) {
136
+ const result = (0, import_validation.validatePage)(page, formValues, settings);
137
+ if (result !== true) {
138
+ allErrors = { ...allErrors, ...result };
139
+ hasErrors = true;
140
+ }
141
+ }
142
+ if (hasErrors) {
143
+ setErrors(allErrors);
144
+ if (analyticsSettings?.track_form_error && onAnalyticsEvent) {
145
+ onAnalyticsEvent("form_error", {
146
+ form_id: formId,
147
+ form_name: formName,
148
+ error_count: Object.keys(allErrors).length,
149
+ error_fields: Object.keys(allErrors)
150
+ });
151
+ }
152
+ return;
153
+ }
154
+ setErrors(null);
155
+ setGlobalError(null);
156
+ try {
157
+ const buttonTypeOverride = block && typeof block.config.submission_type === "string" && block.config.submission_type ? block.config.submission_type : void 0;
158
+ const submissionData = {
159
+ form_id: formId,
160
+ type: buttonTypeOverride ?? settings?.form_type ?? "General",
161
+ locale: locale ?? "en",
162
+ data: formValues,
163
+ environment_type: "page",
164
+ environment_id: formId,
165
+ environment_path: typeof window !== "undefined" ? window.location.pathname : void 0,
166
+ form_variant_id: formVariantId ?? "",
167
+ environment_variant_id: environmentVariantId ?? ""
168
+ };
169
+ const response = await fetch("/api/submission", {
170
+ method: "POST",
171
+ headers: {
172
+ "Content-Type": "application/json"
173
+ },
174
+ body: JSON.stringify(submissionData)
175
+ });
176
+ const result = await response.json();
177
+ if (!response.ok || !result.success) {
178
+ setGlobalError(
179
+ result.message || "Failed to submit form. Please try again."
180
+ );
181
+ return;
182
+ }
183
+ if (analyticsSettings?.track_form_submit && onAnalyticsEvent) {
184
+ onAnalyticsEvent("form_submit", {
185
+ form_id: formId,
186
+ form_name: formName,
187
+ total_pages: document.pages.length,
188
+ custom_event_name: analyticsSettings.submit_event_name,
189
+ target_providers: analyticsSettings.target_providers
190
+ });
191
+ }
192
+ } catch (error) {
193
+ setGlobalError("An error occurred while submitting the form.");
194
+ }
195
+ return Promise.resolve();
196
+ }, [
197
+ block,
198
+ document,
199
+ formId,
200
+ formValues,
201
+ setErrors,
202
+ setGlobalError,
203
+ settings,
204
+ analyticsSettings,
205
+ onAnalyticsEvent,
206
+ formName,
207
+ locale,
208
+ formVariantId,
209
+ environmentVariantId
210
+ ]);
211
+ const reset = (0, import_react.useCallback)(async () => {
212
+ if (!block) {
213
+ return;
214
+ }
215
+ setFormValues({});
216
+ setErrors(null);
217
+ setGlobalError(null);
218
+ return Promise.resolve();
219
+ }, [block, setFormValues, setErrors, setGlobalError]);
220
+ const executeAction = (0, import_react.useCallback)(async () => {
221
+ if (!block) {
222
+ return;
223
+ }
224
+ const action = block.config.action;
225
+ let to = String(block.config.navigate_to_page || "next");
226
+ if (action === "reset") {
227
+ await reset();
228
+ to = "first";
229
+ navigate(to);
230
+ } else if (action === "submit") {
231
+ await submit();
232
+ navigate(to);
233
+ } else if (action === "navigate") {
234
+ navigate(to);
235
+ }
236
+ return Promise.resolve();
237
+ }, [block, navigate, submit, reset]);
238
+ const display = (0, import_react.useMemo)(() => {
239
+ if (!block) {
240
+ return "none";
241
+ }
242
+ const rules = block.config.advanced_options?.rules;
243
+ if (!rules) {
244
+ return "block";
245
+ }
246
+ return (0, import_rule.evaluateVisibilityRules)(rules, formValues);
247
+ }, [block, formValues]);
248
+ const disabled = (0, import_react.useMemo)(() => {
249
+ if (!block) {
250
+ return false;
251
+ }
252
+ if (loading) {
253
+ return true;
254
+ }
255
+ if (typeof block.config.disabled === "boolean" && block.config.disabled) {
256
+ return block.config.disabled;
257
+ }
258
+ const rules = block.config.advanced_options?.rules;
259
+ if (!rules) {
260
+ return false;
261
+ }
262
+ return (0, import_rule.evaluateDisabledRules)(rules, formValues);
263
+ }, [block, formValues, loading]);
264
+ if (!block) {
265
+ return null;
266
+ }
267
+ return {
268
+ variant: typeof block.config.variant === "string" ? block.config.variant : "primary",
269
+ size: typeof block.config.size === "string" ? block.config.size : "md",
270
+ disabled,
271
+ loading,
272
+ display,
273
+ text: typeof block.config.text === "string" ? block.config.text : typeof block.config.label === "string" ? block.config.label : "",
274
+ onClick: executeAction
275
+ };
276
+ }
277
+ // Annotate the CommonJS export names for ESM import in node:
278
+ 0 && (module.exports = {
279
+ useFormAction
280
+ });
281
+ //# sourceMappingURL=use-form-action.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/use-form-action.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n BlockInstance,\n FormAdvancedOptions,\n FormPage,\n} from \"@otl-core/cms-types\";\nimport { useCallback, useMemo } from \"react\";\nimport { useForm } from \"./form-context\";\nimport {\n findBlockInDocument,\n getNextPage,\n getPreviousPage,\n} from \"./utils/page.utils\";\nimport {\n evaluateDisabledRules,\n evaluateVisibilityRules,\n} from \"./utils/rule.utils\";\nimport { validatePage } from \"./utils/validation.utils\";\n\ninterface FormAction {\n variant: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n size: \"sm\" | \"md\" | \"lg\";\n disabled: boolean;\n loading: boolean;\n display: \"block\" | \"none\";\n text: string;\n onClick: () => Promise<void>;\n}\n\nexport function useFormAction(id: string): FormAction | null {\n const {\n formId,\n document,\n formValues,\n setErrors,\n loading,\n currentPage,\n setCurrentPage,\n setFormValues,\n setGlobalError,\n settings,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n environmentVariantId,\n formVariantId,\n locale,\n } = useForm();\n\n const block: BlockInstance | null = useMemo(() => {\n return findBlockInDocument(id, document);\n }, [document, id]);\n\n const navigate = useCallback(\n (to: string) => {\n const currentPageValid: true | { [key: string]: string } =\n to === \"first\" || validatePage(currentPage, formValues, settings);\n\n if (currentPageValid !== true) {\n // Replace errors, don't accumulate\n setErrors(currentPageValid);\n return;\n }\n\n // Clear errors when navigation is successful\n setErrors(null);\n setGlobalError(null);\n\n let targetPage: FormPage | null = null;\n\n switch (to) {\n case \"prev\":\n const previousPage = getPreviousPage(currentPage, document);\n if (previousPage) {\n targetPage = previousPage;\n setCurrentPage(previousPage);\n } else {\n console.error(\"[ERROR] No previous page found.\");\n setGlobalError(\"Configuration Error: No previous page found.\");\n }\n break;\n case \"next\":\n const nextPage = getNextPage(currentPage, document);\n if (nextPage) {\n targetPage = nextPage;\n setCurrentPage(nextPage);\n } else {\n console.error(\"[ERROR] No next page found.\");\n setGlobalError(\"Configuration Error: No next page found.\");\n }\n break;\n case \"first\":\n targetPage = document.pages[0];\n setCurrentPage(document.pages[0]);\n break;\n case \"last\":\n targetPage = document.pages[document.pages.length - 1];\n setCurrentPage(document.pages[document.pages.length - 1]);\n break;\n default:\n targetPage =\n document.pages.find((page) => page.id === to) || document.pages[0];\n setCurrentPage(targetPage);\n break;\n }\n\n // Notify parent window of page change (for editor sync)\n if (targetPage && typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n { type: \"FORM_PAGE_CHANGED\", pageId: targetPage.id },\n window.location.origin,\n );\n }\n\n // Emit form_page_change analytics event\n if (\n targetPage &&\n analyticsSettings?.track_page_navigation &&\n onAnalyticsEvent\n ) {\n const targetIndex = document.pages.findIndex(\n (p) => p.id === targetPage.id,\n );\n onAnalyticsEvent(\"form_page_change\", {\n form_id: formId,\n form_name: formName,\n page_id: targetPage.id,\n page_index: targetIndex,\n total_pages: document.pages.length,\n });\n }\n },\n [\n currentPage,\n setCurrentPage,\n document,\n formId,\n formValues,\n settings,\n setErrors,\n setGlobalError,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n ],\n );\n\n const submit = useCallback(async () => {\n if (!block) {\n return;\n }\n\n // Collect all errors from all pages\n let allErrors: { [key: string]: string } = {};\n let hasErrors = false;\n\n for (const page of document.pages) {\n const result = validatePage(page, formValues, settings);\n if (result !== true) {\n allErrors = { ...allErrors, ...result };\n hasErrors = true;\n }\n }\n\n if (hasErrors) {\n setErrors(allErrors);\n\n // Emit form_error analytics event\n if (analyticsSettings?.track_form_error && onAnalyticsEvent) {\n onAnalyticsEvent(\"form_error\", {\n form_id: formId,\n form_name: formName,\n error_count: Object.keys(allErrors).length,\n error_fields: Object.keys(allErrors),\n });\n }\n\n return;\n }\n\n // Clear all errors on successful validation\n setErrors(null);\n setGlobalError(null);\n\n try {\n // Button-level submission_type override takes precedence over the form-level setting\n const buttonTypeOverride =\n block &&\n typeof block.config.submission_type === \"string\" &&\n block.config.submission_type\n ? block.config.submission_type\n : undefined;\n\n const submissionData = {\n form_id: formId,\n type: buttonTypeOverride ?? settings?.form_type ?? \"General\",\n locale: locale ?? \"en\",\n data: formValues,\n environment_type: \"page\",\n environment_id: formId,\n environment_path:\n typeof window !== \"undefined\" ? window.location.pathname : undefined,\n form_variant_id: formVariantId ?? \"\",\n environment_variant_id: environmentVariantId ?? \"\",\n };\n\n const response = await fetch(\"/api/submission\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(submissionData),\n });\n\n const result = await response.json();\n\n if (!response.ok || !result.success) {\n setGlobalError(\n result.message || \"Failed to submit form. Please try again.\",\n );\n return;\n }\n\n // Emit form_submit analytics event on success\n if (analyticsSettings?.track_form_submit && onAnalyticsEvent) {\n onAnalyticsEvent(\"form_submit\", {\n form_id: formId,\n form_name: formName,\n total_pages: document.pages.length,\n custom_event_name: analyticsSettings.submit_event_name,\n target_providers: analyticsSettings.target_providers,\n });\n }\n } catch (error) {\n setGlobalError(\"An error occurred while submitting the form.\");\n }\n\n return Promise.resolve();\n }, [\n block,\n document,\n formId,\n formValues,\n setErrors,\n setGlobalError,\n settings,\n analyticsSettings,\n onAnalyticsEvent,\n formName,\n locale,\n formVariantId,\n environmentVariantId,\n ]);\n\n const reset = useCallback(async () => {\n if (!block) {\n return;\n }\n setFormValues({});\n setErrors(null);\n setGlobalError(null);\n return Promise.resolve();\n }, [block, setFormValues, setErrors, setGlobalError]);\n\n const executeAction = useCallback(async () => {\n if (!block) {\n return;\n }\n\n const action = block.config.action as string;\n let to = String(block.config.navigate_to_page || \"next\");\n\n if (action === \"reset\") {\n await reset();\n to = \"first\"; // always navigate to first page after reset\n navigate(to);\n } else if (action === \"submit\") {\n await submit();\n // Only navigate if submit was successful (no errors set)\n navigate(to);\n } else if (action === \"navigate\") {\n navigate(to);\n }\n\n return Promise.resolve();\n }, [block, navigate, submit, reset]);\n\n const display: \"block\" | \"none\" = useMemo(() => {\n if (!block) {\n return \"none\";\n }\n\n const rules = (block.config.advanced_options as FormAdvancedOptions)?.rules;\n if (!rules) {\n return \"block\";\n }\n\n return evaluateVisibilityRules(rules, formValues);\n }, [block, formValues]);\n\n const disabled: boolean = useMemo(() => {\n if (!block) {\n return false;\n }\n\n if (loading) {\n return true;\n }\n\n if (typeof block.config.disabled === \"boolean\" && block.config.disabled) {\n return block.config.disabled;\n }\n\n const rules = (block.config.advanced_options as FormAdvancedOptions)?.rules;\n if (!rules) {\n return false;\n }\n\n return evaluateDisabledRules(rules, formValues);\n }, [block, formValues, loading]);\n\n if (!block) {\n return null;\n }\n\n return {\n variant:\n typeof block.config.variant === \"string\"\n ? (block.config.variant as FormAction[\"variant\"])\n : \"primary\",\n size:\n typeof block.config.size === \"string\"\n ? (block.config.size as FormAction[\"size\"])\n : \"md\",\n disabled,\n loading,\n display,\n text:\n typeof block.config.text === \"string\"\n ? block.config.text\n : typeof block.config.label === \"string\"\n ? block.config.label\n : \"\",\n onClick: executeAction,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,12 @@
1
+ interface FormAction {
2
+ variant: "primary" | "secondary" | "outline" | "ghost";
3
+ size: "sm" | "md" | "lg";
4
+ disabled: boolean;
5
+ loading: boolean;
6
+ display: "block" | "none";
7
+ text: string;
8
+ onClick: () => Promise<void>;
9
+ }
10
+ declare function useFormAction(id: string): FormAction | null;
11
+
12
+ export { useFormAction };
@@ -0,0 +1,12 @@
1
+ interface FormAction {
2
+ variant: "primary" | "secondary" | "outline" | "ghost";
3
+ size: "sm" | "md" | "lg";
4
+ disabled: boolean;
5
+ loading: boolean;
6
+ display: "block" | "none";
7
+ text: string;
8
+ onClick: () => Promise<void>;
9
+ }
10
+ declare function useFormAction(id: string): FormAction | null;
11
+
12
+ export { useFormAction };