@algodomain/smart-forms 0.1.1 → 0.1.2
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.
- package/dist/{chunk-LRMJP5OJ.cjs → chunk-4H5U5IHH.cjs} +45 -41
- package/dist/chunk-4H5U5IHH.cjs.map +1 -0
- package/dist/{chunk-EE6VZXWC.js → chunk-5LRBJEZW.js} +45 -41
- package/dist/chunk-5LRBJEZW.js.map +1 -0
- package/dist/{chunk-Y3H6MI5D.cjs → chunk-CJ55WKPC.cjs} +79 -79
- package/dist/{chunk-Y3H6MI5D.cjs.map → chunk-CJ55WKPC.cjs.map} +1 -1
- package/dist/{chunk-5A5WAAED.js → chunk-KDPN4CHW.js} +3 -3
- package/dist/{chunk-5A5WAAED.js.map → chunk-KDPN4CHW.js.map} +1 -1
- package/dist/fields.cjs +108 -108
- package/dist/fields.js +4 -4
- package/dist/index.cjs +26 -26
- package/dist/index.js +4 -4
- package/dist/opinionated.cjs +18 -18
- package/dist/opinionated.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-EE6VZXWC.js.map +0 -1
- package/dist/chunk-LRMJP5OJ.cjs.map +0 -1
|
@@ -245,46 +245,40 @@ var SmartFormProvider = ({
|
|
|
245
245
|
});
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
const result = await response.json();
|
|
254
|
-
if (config.onSuccess) {
|
|
255
|
-
config.onSuccess(result);
|
|
248
|
+
let responseBody;
|
|
249
|
+
try {
|
|
250
|
+
responseBody = await response.json();
|
|
251
|
+
} catch {
|
|
252
|
+
responseBody = await response.text();
|
|
256
253
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
254
|
+
const responseData = {
|
|
255
|
+
status: response.status,
|
|
256
|
+
statusText: response.statusText,
|
|
257
|
+
body: responseBody
|
|
258
|
+
};
|
|
259
|
+
if (response.status >= 200 && response.status < 300) {
|
|
260
|
+
if (config.onSuccess) {
|
|
261
|
+
config.onSuccess(responseData);
|
|
262
|
+
}
|
|
263
|
+
for (const hook of submitHooksRef.current.values()) {
|
|
264
|
+
try {
|
|
265
|
+
await hook();
|
|
266
|
+
} catch (hookError) {
|
|
267
|
+
console.error("Submit hook error:", hookError);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
} else {
|
|
271
|
+
if (config.onError) {
|
|
272
|
+
config.onError(responseData);
|
|
262
273
|
}
|
|
263
274
|
}
|
|
264
275
|
} catch (error) {
|
|
265
276
|
if (config.onError) {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
if (error.message === "Failed to fetch" || error.message?.includes("Failed to fetch")) {
|
|
272
|
-
userFriendlyMessage = "This service is temporarily unavailable. Please try again after some time.";
|
|
273
|
-
} else if (error.message?.includes("Network Error")) {
|
|
274
|
-
userFriendlyMessage = "Network error occurred. Please check your connection and try again.";
|
|
275
|
-
} else if (error.message?.includes("timeout")) {
|
|
276
|
-
userFriendlyMessage = "Request timed out. Please try again.";
|
|
277
|
-
} else if (error.message?.includes("CORS")) {
|
|
278
|
-
userFriendlyMessage = "Connection error. Please contact support if this persists.";
|
|
279
|
-
} else if (error.message && error.message !== "An error occurred") {
|
|
280
|
-
userFriendlyMessage = error.message;
|
|
281
|
-
}
|
|
282
|
-
errorData = {
|
|
283
|
-
message: userFriendlyMessage,
|
|
284
|
-
details: []
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
config.onError(errorData);
|
|
277
|
+
config.onError({
|
|
278
|
+
status: 0,
|
|
279
|
+
statusText: "Network Error",
|
|
280
|
+
body: error.message || "An error occurred"
|
|
281
|
+
});
|
|
288
282
|
}
|
|
289
283
|
console.error("Form submission error:", error);
|
|
290
284
|
} finally {
|
|
@@ -373,11 +367,21 @@ var SmartFormProvider = ({
|
|
|
373
367
|
});
|
|
374
368
|
}
|
|
375
369
|
}
|
|
376
|
-
|
|
377
|
-
|
|
370
|
+
let responseBody;
|
|
371
|
+
try {
|
|
372
|
+
responseBody = await response.json();
|
|
373
|
+
} catch {
|
|
374
|
+
responseBody = await response.text();
|
|
375
|
+
}
|
|
376
|
+
if (response.status >= 200 && response.status < 300) {
|
|
377
|
+
console.log("Draft saved successfully:", responseBody);
|
|
378
|
+
} else {
|
|
379
|
+
console.error("Draft save failed:", {
|
|
380
|
+
status: response.status,
|
|
381
|
+
statusText: response.statusText,
|
|
382
|
+
body: responseBody
|
|
383
|
+
});
|
|
378
384
|
}
|
|
379
|
-
const result = await response.json();
|
|
380
|
-
console.log("Draft saved successfully:", result);
|
|
381
385
|
} catch (error) {
|
|
382
386
|
console.error("Draft save error:", error);
|
|
383
387
|
} finally {
|
|
@@ -662,5 +666,5 @@ exports.cn = cn;
|
|
|
662
666
|
exports.useFieldDetection = useFieldDetection;
|
|
663
667
|
exports.useFormField = useFormField;
|
|
664
668
|
exports.useSmartForm = useSmartForm;
|
|
665
|
-
//# sourceMappingURL=chunk-
|
|
666
|
-
//# sourceMappingURL=chunk-
|
|
669
|
+
//# sourceMappingURL=chunk-4H5U5IHH.cjs.map
|
|
670
|
+
//# sourceMappingURL=chunk-4H5U5IHH.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/SmartFormProvider.tsx","../src/FieldDetectionHook.tsx","../src/lib/utils.ts","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/label.tsx","../src/components/ui/tooltip.tsx","../src/smart-fields/SmartInput.tsx"],"names":["createContext","useCallback","useState","useRef","z","useContext","twMerge","clsx","jsx","LabelPrimitive","TooltipPrimitive","jsxs","useEffect","EyeOffIcon","EyeIcon","InfoIcon"],"mappings":"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","file":"chunk-4H5U5IHH.cjs","sourcesContent":["import React, { createContext, useContext, useState, useRef, useCallback, type ReactNode } from 'react';\nimport { z } from 'zod';\n\n// =============================================================================\n// FORM PROVIDER TYPES\n// =============================================================================\n\n/**\n * Authentication configuration for SmartForm\n * \n * @interface AuthenticationConfig\n * @property {boolean} enable - Enable authentication (sends Bearer token in Authorization header)\n * @property {string} [refreshTokenEndpoint] - Optional endpoint for token refresh when accessToken expires\n * @property {string} [accessTokenKey] - localStorage key for access token (default: 'accessToken')\n * @property {string} [refreshTokenKey] - localStorage key for refresh token (default: 'refreshToken')\n * \n * @example\n * ```typescript\n * // Basic authentication without token refresh\n * authentication={{ enable: true }}\n * \n * // Authentication with token refresh\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\"\n * }}\n * \n * // Custom token keys\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\",\n * accessTokenKey: \"myAccessToken\",\n * refreshTokenKey: \"myRefreshToken\"\n * }}\n * ```\n */\nexport interface AuthenticationConfig {\n enable: boolean;\n refreshTokenEndpoint?: string; // Optional endpoint for token refresh when accessToken expires\n accessTokenKey?: string; // localStorage key for access token (default: 'accessToken')\n refreshTokenKey?: string; // localStorage key for refresh token (default: 'refreshToken')\n}\n\nexport interface FormConfig {\n showProgressBar?: any;\n api?: string;\n method?: 'POST' | 'PUT' | 'PATCH'; // HTTP method for form submission\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n saveDraftApi?: string;\n onSuccess?: (data: any) => void;\n onError?: (error: any) => void;\n transformData?: (data: any) => any; // Transform data before submission\n className?: string;\n title?: string;\n subTitle?: string; // Optional subtitle displayed under the title\n storageKey?: string; // Key for localStorage persistence\n enableLocalStorage?: boolean; // Enable/disable localStorage\n logFormData?: boolean; // Enable/disable console logging of form data\n showReset?: boolean; // Show reset button regardless of localStorage setting\n showTabNumbers?: boolean; // Show tab numbers in tab headers\n authentication?: AuthenticationConfig; // Authentication configuration\n includeQueryParams?: boolean; // Include URL query parameters in form submission (default: false)\n queryParamsToInclude?: string[]; // Optional array of specific query param names to include\n}\n\nexport interface FormContextType {\n formData: any;\n errors: any;\n isLoading: boolean;\n isDraftSaving: boolean;\n updateField: (field: string, value: any) => void;\n validateField: (field: string, value: any) => boolean;\n validateFields: (fields: string[]) => boolean;\n submitForm: () => Promise<void>;\n validateFormAndGetResult: () => boolean;\n saveDraft: () => Promise<void>;\n resetForm: () => void;\n fieldRefs: React.MutableRefObject<any>;\n registerValidation: (field: string, validation: any) => void;\n validationRegistry: any;\n config: FormConfig;\n setErrors: (errors: any) => void;\n registerSubmitHook: (key: string, hook: () => Promise<void>) => void;\n unregisterSubmitHook: (key: string) => void;\n}\n\n// =============================================================================\n// FORM CONTEXT\n// =============================================================================\n\nconst FormContext = createContext<FormContextType | null>(null);\n\n// =============================================================================\n// FORM PROVIDER COMPONENT\n// =============================================================================\n\nexport interface SmartFormProviderProps {\n children: ReactNode;\n config: FormConfig;\n initialData?: any;\n}\n\nexport const SmartFormProvider: React.FC<SmartFormProviderProps> = ({\n children,\n config,\n initialData = {}\n}) => {\n // Helper function to extract query parameters from URL\n const getQueryParams = useCallback((allowedParams?: string[]): Record<string, any> => {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, any> = {};\n \n if (allowedParams && allowedParams.length > 0) {\n // Only include specified params\n allowedParams.forEach(key => {\n const value = params.get(key);\n if (value !== null) {\n result[key] = value;\n }\n });\n } else {\n // Include all params\n params.forEach((value, key) => {\n result[key] = value;\n });\n }\n \n return result;\n }, []);\n\n // Helper functions for localStorage\n const getStorageKey = () => {\n return config.storageKey || 'smart-form-data';\n };\n\n const loadFromStorage = () => {\n if (!config.enableLocalStorage) return initialData;\n\n try {\n const stored = localStorage.getItem(getStorageKey());\n if (stored) {\n const parsedStored = JSON.parse(stored);\n // Merge stored data with initialData\n // For each field: use stored value if it's not empty/null, otherwise use initialData value\n const merged = { ...initialData };\n Object.keys(parsedStored).forEach((key) => {\n const storedValue = parsedStored[key];\n // Only use stored value if it's not null, undefined, or empty string\n if (storedValue !== null && storedValue !== undefined && storedValue !== '') {\n merged[key] = storedValue;\n }\n });\n return merged;\n }\n return initialData;\n } catch (error) {\n console.warn('Failed to load form data from localStorage:', error);\n return initialData;\n }\n };\n\n const saveToStorage = (data: any) => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.setItem(getStorageKey(), JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to save form data to localStorage:', error);\n }\n };\n\n const clearStorage = () => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.removeItem(getStorageKey());\n } catch (error) {\n console.warn('Failed to clear form data from localStorage:', error);\n }\n };\n\n const [formData, setFormData] = useState(loadFromStorage);\n const [errors, setErrors] = useState<any>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isDraftSaving, setIsDraftSaving] = useState(false);\n const [validationRegistry, setValidationRegistry] = useState<any>({});\n const fieldRefs = useRef<any>({});\n const submitHooksRef = useRef<Map<string, () => Promise<void>>>(new Map());\n\n // Update form field\n const updateField = useCallback((field: string, value: any) => {\n setFormData((prev: any) => {\n const newData = {\n ...prev,\n [field]: value\n };\n // Save to localStorage after state update\n setTimeout(() => saveToStorage(newData), 0);\n return newData;\n });\n\n // Clear error when user starts typing\n if (errors[field]) {\n setErrors((prev: any) => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n }, [errors, config.enableLocalStorage, saveToStorage]);\n\n // Validate single field\n const validateField = useCallback((field: string, value: any) => {\n const validation = validationRegistry[field];\n if (!validation) return true;\n\n try {\n validation.parse(value);\n return true;\n } catch (error) {\n if (error instanceof z.ZodError) {\n setErrors((prev: any) => ({\n ...prev,\n [field]: error.issues[0]?.message || `Invalid ${field}`\n }));\n return false;\n }\n return false;\n }\n }, [validationRegistry]);\n\n // Register validation for a field\n const registerValidation = useCallback((field: string, validation: any) => {\n setValidationRegistry((prev: any) => ({\n ...prev,\n [field]: validation\n }));\n }, []);\n\n // Validate all fields\n const validateAllFields = useCallback(() => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const [field, validation] of Object.entries(validationRegistry)) {\n if (validation && typeof (validation as any).parse === 'function') {\n try {\n (validation as any).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n setErrors(allErrors);\n return isValid;\n }, [formData, validationRegistry]);\n\n // Validate specific fields (for tab validation)\n const validateFields = useCallback((fields: string[]) => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const field of fields) {\n const validation = validationRegistry[field];\n if (validation) {\n try {\n validation.parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n // Only update errors for the fields being validated\n setErrors((prev: any) => ({\n ...prev,\n ...allErrors\n }));\n\n return isValid;\n }, [formData, validationRegistry]);\n\n // Submit form\n const submitForm = useCallback(async () => {\n if (!validateAllFields()) {\n return;\n }\n\n if (!config.api) {\n console.warn('No API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSubmit = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSubmit = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('📤 Submitting form data:', dataToSubmit);\n console.log('🎯 API endpoint:', config.api);\n }\n\n // Build a JSON-safe payload: replace File(s) with filename(s), Dates with ISO\n const toJsonSafe = (val: any): any => {\n if (val instanceof File) return val.name;\n if (val instanceof Date) return val.toISOString();\n if (Array.isArray(val)) {\n return val.map((item) => (item instanceof File ? item.name : toJsonSafe(item)));\n }\n if (val && typeof val === 'object') {\n // shallow map object values\n const out: any = {};\n for (const [k, v] of Object.entries(val)) out[k] = toJsonSafe(v);\n return out;\n }\n return val;\n };\n\n let jsonPayload = toJsonSafe(dataToSubmit);\n \n // Apply transformation if provided\n if (config.transformData) {\n jsonPayload = config.transformData(jsonPayload);\n }\n\n setIsLoading(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: config.method || 'POST',\n headers,\n body: JSON.stringify(jsonPayload),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.api, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.api, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n // Parse response body (JSON or text)\n let responseBody;\n try {\n responseBody = await response.json();\n } catch {\n responseBody = await response.text();\n }\n\n const responseData = {\n status: response.status,\n statusText: response.statusText,\n body: responseBody\n };\n\n // Check if response is successful (2xx status codes)\n if (response.status >= 200 && response.status < 300) {\n if (config.onSuccess) {\n config.onSuccess(responseData);\n }\n\n // After successful submit, run any registered submit hooks (e.g., file uploads)\n for (const hook of submitHooksRef.current.values()) {\n try {\n // eslint-disable-next-line no-await-in-loop\n await hook();\n } catch (hookError) {\n console.error('Submit hook error:', hookError);\n }\n }\n } else {\n // Handle error response\n if (config.onError) {\n config.onError(responseData);\n }\n }\n } catch (error: any) {\n // Handle network errors or other fetch failures\n if (config.onError) {\n config.onError({\n status: 0,\n statusText: 'Network Error',\n body: error.message || 'An error occurred'\n });\n }\n console.error('Form submission error:', error);\n } finally {\n setIsLoading(false);\n }\n }, [formData, config, validateAllFields, getQueryParams]);\n\n // Validate form and return validation result\n const validateFormAndGetResult = useCallback(() => {\n return validateAllFields();\n }, [validateAllFields]);\n\n /**\n * Helper function to refresh access token\n * This function handles token refresh internally and is reusable across projects\n * \n * @param authConfig - The authentication configuration object\n * @returns Promise<string | null> - New access token or null if refresh failed\n */\n const refreshAccessToken = useCallback(async (authConfig: AuthenticationConfig): Promise<string | null> => {\n const { refreshTokenEndpoint, accessTokenKey = 'accessToken', refreshTokenKey = 'refreshToken' } = authConfig;\n \n if (!refreshTokenEndpoint) {\n throw new Error('Refresh token endpoint not provided');\n }\n \n try {\n const refreshToken = localStorage.getItem(refreshTokenKey);\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n const response = await fetch(refreshTokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Token refresh failed: ${response.status}`);\n }\n\n const result = await response.json();\n // Support different response formats: { data: { accessToken } } or { accessToken }\n const newAccessToken = result.data?.accessToken || result.accessToken;\n \n if (newAccessToken) {\n localStorage.setItem(accessTokenKey, newAccessToken);\n return newAccessToken;\n }\n \n throw new Error('No access token in refresh response');\n } catch (error) {\n console.error('Token refresh failed:', error);\n // Clear tokens on refresh failure to prevent infinite retry loops\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n return null;\n }\n }, []);\n\n // Save draft\n const saveDraft = useCallback(async () => {\n if (!config.saveDraftApi) {\n console.warn('No save draft API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSave = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSave = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('💾 Saving draft data:', dataToSave);\n console.log('🎯 Draft API endpoint:', config.saveDraftApi);\n }\n\n setIsDraftSaving(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(dataToSave),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.saveDraftApi, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.saveDraftApi, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n // Parse response body (JSON or text)\n let responseBody;\n try {\n responseBody = await response.json();\n } catch {\n responseBody = await response.text();\n }\n\n // Check if response is successful (2xx status codes)\n if (response.status >= 200 && response.status < 300) {\n console.log('Draft saved successfully:', responseBody);\n } else {\n console.error('Draft save failed:', {\n status: response.status,\n statusText: response.statusText,\n body: responseBody\n });\n }\n } catch (error) {\n console.error('Draft save error:', error);\n } finally {\n setIsDraftSaving(false);\n }\n }, [formData, config, getQueryParams]);\n\n // Reset form and clear localStorage\n const resetForm = useCallback(() => {\n setFormData(initialData);\n setErrors({});\n clearStorage();\n }, [initialData, config.enableLocalStorage, clearStorage]);\n\n const contextValue: FormContextType = {\n formData,\n errors,\n isLoading,\n isDraftSaving,\n updateField,\n validateField,\n validateFields,\n submitForm,\n validateFormAndGetResult,\n saveDraft,\n resetForm,\n fieldRefs,\n registerValidation,\n validationRegistry,\n config,\n setErrors,\n registerSubmitHook: (key: string, hook: () => Promise<void>) => {\n submitHooksRef.current.set(key, hook);\n },\n unregisterSubmitHook: (key: string) => {\n submitHooksRef.current.delete(key);\n }\n };\n\n return (\n <FormContext.Provider value={contextValue}>\n {children}\n </FormContext.Provider>\n );\n};\n\n// =============================================================================\n// FORM HOOKS\n// =============================================================================\n\nexport const useSmartForm = () => {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error('useSmartForm must be used within a SmartFormProvider');\n }\n return context;\n};\n\nexport const useFormField = (field: string) => {\n const { formData, errors, updateField, fieldRefs, registerValidation } = useSmartForm();\n\n return {\n value: formData[field],\n error: errors[field],\n onChange: (value: any) => updateField(field, value),\n fieldRef: (el: any) => fieldRefs.current[field] = el,\n registerValidation\n };\n};\n","import { createContext, useContext } from 'react';\n\nexport interface FieldDetectionContextType {\n registerField: (fieldName: string) => void;\n}\n\nexport const FieldDetectionContext = createContext<FieldDetectionContextType | null>(null);\n\nexport const useFieldDetection = () => {\n const context = useContext(FieldDetectionContext);\n return context; // Return null if not in context (for backward compatibility)\n};\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useFormField } from '../SmartFormProvider';\nimport { useFieldDetection } from '../FieldDetectionHook';\nimport { Input } from '../components/ui/input';\nimport { Textarea } from '../components/ui/textarea';\nimport { Label } from '../components/ui/label';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../components/ui/tooltip';\nimport { EyeIcon, EyeOffIcon, InfoIcon } from 'lucide-react';\n\n// =============================================================================\n// SMART FORM INPUT TYPES\n// =============================================================================\n\nexport interface SmartInputProps {\n field: string;\n label?: string;\n type?: 'text' | 'email' | 'password' | 'tel' | 'number' | 'textarea';\n placeholder?: string;\n validation?: any; // Zod schema\n className?: string;\n required?: boolean;\n defaultValue?: any; // Default value for the field\n info?: string; // Info text to show on hover of info icon\n subLabel?: string; // Additional label text shown below the main label\n}\n\n// =============================================================================\n// SMART FORM INPUT COMPONENT\n// =============================================================================\n\nexport const SmartInput: React.FC<SmartInputProps> = ({\n field,\n label,\n type = 'text',\n placeholder,\n validation,\n className = '',\n required = false,\n defaultValue,\n info,\n subLabel\n}) => {\n const { value, error, onChange, fieldRef, registerValidation } = useFormField(field);\n const fieldDetection = useFieldDetection();\n const hasRegistered = useRef(false);\n const hasSetDefault = useRef(false);\n const [showPassword, setShowPassword] = useState(false);\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n // Register validation for this field\n useEffect(() => {\n if (validation && !hasRegistered.current) {\n hasRegistered.current = true;\n registerValidation(field, validation);\n }\n }, [validation, field, registerValidation]);\n\n // Auto-register field if in field detection context\n useEffect(() => {\n if (fieldDetection?.registerField) {\n fieldDetection.registerField(field);\n }\n }, [field, fieldDetection]);\n\n // Set default value if provided and field is empty\n useEffect(() => {\n if (defaultValue !== undefined && !hasSetDefault.current && (value === undefined || value === null || value === '')) {\n onChange(defaultValue);\n hasSetDefault.current = true;\n }\n }, [defaultValue, value, onChange]);\n\n // Generate placeholder text\n const getPlaceholder = () => {\n if (placeholder) return placeholder;\n if (!label) return `Enter ${field}`;\n if (type === 'email') return `Enter ${label.toLowerCase()}`;\n if (type === 'tel') return `Enter ${label.toLowerCase()}`;\n return `Enter ${label.toLowerCase()}`;\n };\n\n const renderInput = () => {\n switch (type) {\n case 'textarea':\n return (\n <Textarea\n ref={fieldRef}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n rows={4}\n data-field={field}\n />\n );\n\n case 'password':\n return (\n <div className=\"relative\">\n <Input\n ref={fieldRef}\n type={showPassword ? \"text\" : \"password\"}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full pr-10 ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n <button \n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 p-1 hover:bg-gray-100 rounded transition-colors\"\n >\n {showPassword ? (\n <EyeOffIcon className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <EyeIcon className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </button>\n </div>\n );\n\n default:\n return (\n <Input\n ref={fieldRef}\n type={type}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n );\n }\n };\n\n return (\n <div className={`flex-1 min-w-0 ${className}`}>\n {label && (\n <div className=\"mb-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label className=\"text-sm font-medium text-foreground\">\n {label} {required && <span className=\"text-destructive\">*</span>}\n </Label>\n {info && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <InfoIcon className=\"h-4 w-4 text-muted-foreground cursor-pointer mr-2\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs\">{info}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n {subLabel && (\n <p className=\"text-xs text-muted-foreground mt-1\">{subLabel}</p>\n )}\n </div>\n )}\n {renderInput()}\n {error && (\n <p className=\"text-destructive text-sm mt-1\">{error}</p>\n )}\n </div>\n );\n};"]}
|
|
@@ -222,46 +222,40 @@ var SmartFormProvider = ({
|
|
|
222
222
|
});
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
const result = await response.json();
|
|
231
|
-
if (config.onSuccess) {
|
|
232
|
-
config.onSuccess(result);
|
|
225
|
+
let responseBody;
|
|
226
|
+
try {
|
|
227
|
+
responseBody = await response.json();
|
|
228
|
+
} catch {
|
|
229
|
+
responseBody = await response.text();
|
|
233
230
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
231
|
+
const responseData = {
|
|
232
|
+
status: response.status,
|
|
233
|
+
statusText: response.statusText,
|
|
234
|
+
body: responseBody
|
|
235
|
+
};
|
|
236
|
+
if (response.status >= 200 && response.status < 300) {
|
|
237
|
+
if (config.onSuccess) {
|
|
238
|
+
config.onSuccess(responseData);
|
|
239
|
+
}
|
|
240
|
+
for (const hook of submitHooksRef.current.values()) {
|
|
241
|
+
try {
|
|
242
|
+
await hook();
|
|
243
|
+
} catch (hookError) {
|
|
244
|
+
console.error("Submit hook error:", hookError);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
} else {
|
|
248
|
+
if (config.onError) {
|
|
249
|
+
config.onError(responseData);
|
|
239
250
|
}
|
|
240
251
|
}
|
|
241
252
|
} catch (error) {
|
|
242
253
|
if (config.onError) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
if (error.message === "Failed to fetch" || error.message?.includes("Failed to fetch")) {
|
|
249
|
-
userFriendlyMessage = "This service is temporarily unavailable. Please try again after some time.";
|
|
250
|
-
} else if (error.message?.includes("Network Error")) {
|
|
251
|
-
userFriendlyMessage = "Network error occurred. Please check your connection and try again.";
|
|
252
|
-
} else if (error.message?.includes("timeout")) {
|
|
253
|
-
userFriendlyMessage = "Request timed out. Please try again.";
|
|
254
|
-
} else if (error.message?.includes("CORS")) {
|
|
255
|
-
userFriendlyMessage = "Connection error. Please contact support if this persists.";
|
|
256
|
-
} else if (error.message && error.message !== "An error occurred") {
|
|
257
|
-
userFriendlyMessage = error.message;
|
|
258
|
-
}
|
|
259
|
-
errorData = {
|
|
260
|
-
message: userFriendlyMessage,
|
|
261
|
-
details: []
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
config.onError(errorData);
|
|
254
|
+
config.onError({
|
|
255
|
+
status: 0,
|
|
256
|
+
statusText: "Network Error",
|
|
257
|
+
body: error.message || "An error occurred"
|
|
258
|
+
});
|
|
265
259
|
}
|
|
266
260
|
console.error("Form submission error:", error);
|
|
267
261
|
} finally {
|
|
@@ -350,11 +344,21 @@ var SmartFormProvider = ({
|
|
|
350
344
|
});
|
|
351
345
|
}
|
|
352
346
|
}
|
|
353
|
-
|
|
354
|
-
|
|
347
|
+
let responseBody;
|
|
348
|
+
try {
|
|
349
|
+
responseBody = await response.json();
|
|
350
|
+
} catch {
|
|
351
|
+
responseBody = await response.text();
|
|
352
|
+
}
|
|
353
|
+
if (response.status >= 200 && response.status < 300) {
|
|
354
|
+
console.log("Draft saved successfully:", responseBody);
|
|
355
|
+
} else {
|
|
356
|
+
console.error("Draft save failed:", {
|
|
357
|
+
status: response.status,
|
|
358
|
+
statusText: response.statusText,
|
|
359
|
+
body: responseBody
|
|
360
|
+
});
|
|
355
361
|
}
|
|
356
|
-
const result = await response.json();
|
|
357
|
-
console.log("Draft saved successfully:", result);
|
|
358
362
|
} catch (error) {
|
|
359
363
|
console.error("Draft save error:", error);
|
|
360
364
|
} finally {
|
|
@@ -627,5 +631,5 @@ var SmartInput = ({
|
|
|
627
631
|
};
|
|
628
632
|
|
|
629
633
|
export { FieldDetectionContext, Input, Label, SmartFormProvider, SmartInput, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, cn, useFieldDetection, useFormField, useSmartForm };
|
|
630
|
-
//# sourceMappingURL=chunk-
|
|
631
|
-
//# sourceMappingURL=chunk-
|
|
634
|
+
//# sourceMappingURL=chunk-5LRBJEZW.js.map
|
|
635
|
+
//# sourceMappingURL=chunk-5LRBJEZW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/SmartFormProvider.tsx","../src/FieldDetectionHook.tsx","../src/lib/utils.ts","../src/components/ui/input.tsx","../src/components/ui/textarea.tsx","../src/components/ui/label.tsx","../src/components/ui/tooltip.tsx","../src/smart-fields/SmartInput.tsx"],"names":["createContext","useContext","jsx","useRef","useState","jsxs"],"mappings":";;;;;;;;;AA4FA,IAAM,WAAA,GAAc,cAAsC,IAAI,CAAA;AAYvD,IAAM,oBAAsD,CAAC;AAAA,EAClE,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAc;AAChB,CAAA,KAAM;AAEJ,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,aAAA,KAAkD;AACpF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,SAA8B,EAAC;AAErC,IAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAE7C,MAAA,aAAA,CAAc,QAAQ,CAAA,GAAA,KAAO;AAC3B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC5B,QAAA,IAAI,UAAU,IAAA,EAAM;AAClB,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,QAChB;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7B,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,OAAO,OAAO,UAAA,IAAc,iBAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,CAAC,MAAA,CAAO,kBAAA,EAAoB,OAAO,WAAA;AAEvC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,aAAA,EAAe,CAAA;AACnD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAGtC,QAAA,MAAM,MAAA,GAAS,EAAE,GAAG,WAAA,EAAY;AAChC,QAAA,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACzC,UAAA,MAAM,WAAA,GAAc,aAAa,GAAG,CAAA;AAEpC,UAAA,IAAI,WAAA,KAAgB,IAAA,IAAQ,WAAA,KAAgB,KAAA,CAAA,IAAa,gBAAgB,EAAA,EAAI;AAC3E,YAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,UAChB;AAAA,QACF,CAAC,CAAA;AACD,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAO,WAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,KAAK,CAAA;AACjE,MAAA,OAAO,WAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAAc;AACnC,IAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAEhC,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,QAAQ,aAAA,EAAc,EAAG,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,KAAK,CAAA;AAAA,IACjE;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAEhC,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,UAAA,CAAW,eAAe,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,KAAK,CAAA;AAAA,IACpE;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,eAAe,CAAA;AACxD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,CAAc,EAAE,CAAA;AAC5C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,QAAA,CAAc,EAAE,CAAA;AACpE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAY,EAAE,CAAA;AAChC,EAAA,MAAM,cAAA,GAAiB,MAAA,iBAAyC,IAAI,GAAA,EAAK,CAAA;AAGzE,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,KAAA,EAAe,KAAA,KAAe;AAC7D,IAAA,WAAA,CAAY,CAAC,IAAA,KAAc;AACzB,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,GAAG,IAAA;AAAA,QACH,CAAC,KAAK,GAAG;AAAA,OACX;AAEA,MAAA,UAAA,CAAW,MAAM,aAAA,CAAc,OAAO,CAAA,EAAG,CAAC,CAAA;AAC1C,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AACjB,MAAA,SAAA,CAAU,CAAC,IAAA,KAAc;AACvB,QAAA,MAAM,SAAA,GAAY,EAAE,GAAG,IAAA,EAAK;AAC5B,QAAA,OAAO,UAAU,KAAK,CAAA;AACtB,QAAA,OAAO,SAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,MAAA,CAAO,kBAAA,EAAoB,aAAa,CAAC,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,KAAA,EAAe,KAAA,KAAe;AAC/D,IAAA,MAAM,UAAA,GAAa,mBAAmB,KAAK,CAAA;AAC3C,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,IAAA,IAAI;AACF,MAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,EAAE,QAAA,EAAU;AAC/B,QAAA,SAAA,CAAU,CAAC,IAAA,MAAe;AAAA,UACxB,GAAG,IAAA;AAAA,UACH,CAAC,KAAK,GAAG,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG,OAAA,IAAW,CAAA,QAAA,EAAW,KAAK,CAAA;AAAA,SACvD,CAAE,CAAA;AACF,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,CAAC,KAAA,EAAe,UAAA,KAAoB;AACzE,IAAA,qBAAA,CAAsB,CAAC,IAAA,MAAe;AAAA,MACpC,GAAG,IAAA;AAAA,MACH,CAAC,KAAK,GAAG;AAAA,KACX,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,MAAM,YAAiB,EAAC;AACxB,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AACpE,MAAA,IAAI,UAAA,IAAc,OAAQ,UAAA,CAAmB,KAAA,KAAU,UAAA,EAAY;AACjE,QAAA,IAAI;AACF,UAAC,UAAA,CAAmB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,QAC3C,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,KAAA,YAAiB,EAAE,QAAA,EAAU;AAC/B,YAAA,SAAA,CAAU,KAAK,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,WAAW,KAAK,CAAA,CAAA;AAC/D,YAAA,OAAA,GAAU,KAAA;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,kBAAkB,CAAC,CAAA;AAGjC,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,CAAC,MAAA,KAAqB;AACvD,IAAA,MAAM,YAAiB,EAAC;AACxB,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,UAAA,GAAa,mBAAmB,KAAK,CAAA;AAC3C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAI;AACF,UAAA,UAAA,CAAW,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,QAClC,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,KAAA,YAAiB,EAAE,QAAA,EAAU;AAC/B,YAAA,SAAA,CAAU,KAAK,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,WAAW,KAAK,CAAA,CAAA;AAC/D,YAAA,OAAA,GAAU,KAAA;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,SAAA,CAAU,CAAC,IAAA,MAAe;AAAA,MACxB,GAAG,IAAA;AAAA,MACH,GAAG;AAAA,KACL,CAAE,CAAA;AAEF,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,kBAAkB,CAAC,CAAA;AAGjC,EAAA,MAAM,UAAA,GAAa,YAAY,YAAY;AACzC,IAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,GAAA,EAAK;AACf,MAAA,OAAA,CAAQ,KAAK,0BAA0B,CAAA;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,GAAe,QAAA;AACnB,IAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,oBAAoB,CAAA;AAE9D,MAAA,YAAA,GAAe,EAAE,GAAG,WAAA,EAAa,GAAG,QAAA,EAAS;AAAA,IAC/C;AAGA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,mCAA4B,YAAY,CAAA;AACpD,MAAA,OAAA,CAAQ,GAAA,CAAI,yBAAA,EAAoB,MAAA,CAAO,GAAG,CAAA;AAAA,IAC5C;AAGA,IAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAkB;AACpC,MAAA,IAAI,GAAA,YAAe,IAAA,EAAM,OAAO,GAAA,CAAI,IAAA;AACpC,MAAA,IAAI,GAAA,YAAe,IAAA,EAAM,OAAO,GAAA,CAAI,WAAA,EAAY;AAChD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,QAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAU,IAAA,YAAgB,OAAO,IAAA,CAAK,IAAA,GAAO,UAAA,CAAW,IAAI,CAAE,CAAA;AAAA,MAChF;AACA,MAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAElC,QAAA,MAAM,MAAW,EAAC;AAClB,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AAC/D,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAI,WAAA,GAAc,WAAW,YAAY,CAAA;AAGzC,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,WAAA,GAAc,MAAA,CAAO,cAAc,WAAW,CAAA;AAAA,IAChD;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,cAAA,EAAgB;AAAA,OAClB;AAGA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAQ;AACjC,QAAA,MAAM,EAAE,cAAA,GAAiB,aAAA,EAAc,GAAI,MAAA,CAAO,cAAA;AAClD,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,cAAc,CAAA;AACjD,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,KAAK,CAAA,CAAA;AAAA,QACzC;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAA4B;AAAA,QAChC,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,QACzB,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,OAClC;AAGA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAQ;AACjC,QAAA,YAAA,CAAa,WAAA,GAAc,SAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,KAAK,YAAY,CAAA;AAGnD,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,IAAO,MAAA,CAAO,gBAAgB,MAAA,IAAU,MAAA,CAAO,eAAe,oBAAA,EAAsB;AAC1G,QAAA,MAAM,cAAA,GAAiB,MAAM,kBAAA,CAAmB,MAAA,CAAO,cAAc,CAAA;AAErE,QAAA,IAAI,cAAA,EAAgB;AAElB,UAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,cAAc,CAAA,CAAA;AAChD,UAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK;AAAA,YACjC,GAAG,YAAA;AAAA,YACH;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC;AAEA,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,IAAA,EAAM;AAAA,OACR;AAGA,MAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,MAAA,CAAO,UAAU,YAAY,CAAA;AAAA,QAC/B;AAGA,QAAA,KAAA,MAAW,IAAA,IAAQ,cAAA,CAAe,OAAA,CAAQ,MAAA,EAAO,EAAG;AAClD,UAAA,IAAI;AAEF,YAAA,MAAM,IAAA,EAAK;AAAA,UACb,SAAS,SAAA,EAAW;AAClB,YAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,SAAS,CAAA;AAAA,UAC/C;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,MAAA,CAAO,QAAQ,YAAY,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAY;AAEnB,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,UACb,MAAA,EAAQ,CAAA;AAAA,UACR,UAAA,EAAY,eAAA;AAAA,UACZ,IAAA,EAAM,MAAM,OAAA,IAAW;AAAA,SACxB,CAAA;AAAA,MACH;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAAA,IAC/C,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,MAAA,EAAQ,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAGxD,EAAA,MAAM,wBAAA,GAA2B,YAAY,MAAM;AACjD,IAAA,OAAO,iBAAA,EAAkB;AAAA,EAC3B,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAStB,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,OAAO,UAAA,KAA6D;AACzG,IAAA,MAAM,EAAE,oBAAA,EAAsB,cAAA,GAAiB,aAAA,EAAe,eAAA,GAAkB,gBAAe,GAAI,UAAA;AAEnG,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,eAAe,CAAA;AACzD,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC9C;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,oBAAA,EAAsB;AAAA,QACjD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,cAAc;AAAA,OACtC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC5D;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,EAAM,WAAA,IAAe,MAAA,CAAO,WAAA;AAE1D,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,YAAA,CAAa,OAAA,CAAQ,gBAAgB,cAAc,CAAA;AACnD,QAAA,OAAO,cAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAE5C,MAAA,YAAA,CAAa,WAAW,cAAc,CAAA;AACtC,MAAA,YAAA,CAAa,WAAW,eAAe,CAAA;AACvC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,SAAA,GAAY,YAAY,YAAY;AACxC,IAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,MAAA,OAAA,CAAQ,KAAK,qCAAqC,CAAA;AAClD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,GAAa,QAAA;AACjB,IAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,oBAAoB,CAAA;AAE9D,MAAA,UAAA,GAAa,EAAE,GAAG,WAAA,EAAa,GAAG,QAAA,EAAS;AAAA,IAC7C;AAGA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,gCAAyB,UAAU,CAAA;AAC/C,MAAA,OAAA,CAAQ,GAAA,CAAI,+BAAA,EAA0B,MAAA,CAAO,YAAY,CAAA;AAAA,IAC3D;AAEA,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,cAAA,EAAgB;AAAA,OAClB;AAGA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAQ;AACjC,QAAA,MAAM,EAAE,cAAA,GAAiB,aAAA,EAAc,GAAI,MAAA,CAAO,cAAA;AAClD,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,cAAc,CAAA;AACjD,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,KAAK,CAAA,CAAA;AAAA,QACzC;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAA4B;AAAA,QAChC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,UAAU;AAAA,OACjC;AAGA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAQ;AACjC,QAAA,YAAA,CAAa,WAAA,GAAc,SAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,cAAc,YAAY,CAAA;AAG5D,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,IAAO,MAAA,CAAO,gBAAgB,MAAA,IAAU,MAAA,CAAO,eAAe,oBAAA,EAAsB;AAC1G,QAAA,MAAM,cAAA,GAAiB,MAAM,kBAAA,CAAmB,MAAA,CAAO,cAAc,CAAA;AAErE,QAAA,IAAI,cAAA,EAAgB;AAElB,UAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,cAAc,CAAA,CAAA;AAChD,UAAA,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,YAAA,EAAc;AAAA,YAC1C,GAAG,YAAA;AAAA,YACH;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC,CAAA,CAAA,MAAQ;AACN,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC;AAGA,MAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,QAAA,OAAA,CAAQ,GAAA,CAAI,6BAA6B,YAAY,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,oBAAA,EAAsB;AAAA,UAClC,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AAAA,IAC1C,CAAA,SAAE;AACA,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAA,EAAQ,cAAc,CAAC,CAAA;AAGrC,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,IAAA,WAAA,CAAY,WAAW,CAAA;AACvB,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,YAAA,EAAa;AAAA,EACf,GAAG,CAAC,WAAA,EAAa,MAAA,CAAO,kBAAA,EAAoB,YAAY,CAAC,CAAA;AAEzD,EAAA,MAAM,YAAA,GAAgC;AAAA,IACpC,QAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,wBAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAA,EAAoB,CAAC,GAAA,EAAa,IAAA,KAA8B;AAC9D,MAAA,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,oBAAA,EAAsB,CAAC,GAAA,KAAgB;AACrC,MAAA,cAAA,CAAe,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,IACnC;AAAA,GACF;AAEA,EAAA,2BACG,WAAA,CAAY,QAAA,EAAZ,EAAqB,KAAA,EAAO,cAC1B,QAAA,EACH,CAAA;AAEJ;AAMO,IAAM,eAAe,MAAM;AAChC,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,OAAA;AACT;AAEO,IAAM,YAAA,GAAe,CAAC,KAAA,KAAkB;AAC7C,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,aAAa,SAAA,EAAW,kBAAA,KAAuB,YAAA,EAAa;AAEtF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,IACrB,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,IACnB,QAAA,EAAU,CAAC,KAAA,KAAe,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,IAClD,UAAU,CAAC,EAAA,KAAY,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA;AAAA,IAClD;AAAA,GACF;AACF;AC1nBO,IAAM,qBAAA,GAAwBA,cAAgD,IAAI;AAElF,IAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,OAAA,GAAUC,WAAW,qBAAqB,CAAA;AAChD,EAAA,OAAO,OAAA;AACT;ACRO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,SAAS,MAAM,EAAE,SAAA,EAAW,IAAA,EAAM,GAAG,OAAM,EAAkC;AAC3E,EAAA,uBACEC,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,4bAAA;AAAA,QACA,+EAAA;AAAA,QACA,wGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;ACdA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqC;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qcAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;ACVA,SAAS,KAAA,CAAM;AAAA,EACb,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqD;AACnD,EAAA,uBACEA,GAAAA;AAAA,IAAgB,cAAA,CAAA,IAAA;AAAA,IAAf;AAAA,MACC,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;ACdA,SAAS,eAAA,CAAgB;AAAA,EACvB,aAAA,GAAgB,CAAA;AAAA,EAChB,GAAG;AACL,CAAA,EAA2D;AACzD,EAAA,uBACEA,GAAAA;AAAA,IAAkB,gBAAA,CAAA,QAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,aAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,OAAA,CAAQ;AAAA,EACf,GAAG;AACL,CAAA,EAAuD;AACrD,EAAA,uBACEA,GAAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAkB,gBAAA,CAAA,IAAA,EAAjB,EAAsB,WAAA,EAAU,SAAA,EAAW,GAAG,KAAA,EAAO,CAAA,EACxD,CAAA;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBAAOA,GAAAA,CAAkB,gBAAA,CAAA,OAAA,EAAjB,EAAyB,WAAA,EAAU,iBAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AAC1E;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,SAAA;AAAA,EACA,UAAA,GAAa,CAAA;AAAA,EACb,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0D;AACxD,EAAA,uBACEA,GAAAA,CAAkB,gBAAA,CAAA,MAAA,EAAjB,EACC,QAAA,kBAAA,IAAA;AAAA,IAAkB,gBAAA,CAAA,OAAA;AAAA,IAAjB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,UAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,maAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDA,GAAAA,CAAkB,gBAAA,CAAA,KAAA,EAAjB,EAAuB,WAAU,oGAAA,EAAqG;AAAA;AAAA;AAAA,GACzI,EACF,CAAA;AAEJ;AC1BO,IAAM,aAAwC,CAAC;AAAA,EACpD,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,OAAO,KAAA,EAAO,QAAA,EAAU,UAAU,kBAAA,EAAmB,GAAI,aAAa,KAAK,CAAA;AACnF,EAAA,MAAM,iBAAiB,iBAAA,EAAkB;AACzC,EAAA,MAAM,aAAA,GAAgBC,OAAO,KAAK,CAAA;AAClC,EAAA,MAAM,aAAA,GAAgBA,OAAO,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,SAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,2BAA2B,MAAM;AACrC,IAAA,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,EAC/B,CAAA;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAA,IAAc,CAAC,aAAA,CAAc,OAAA,EAAS;AACxC,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,MAAA,kBAAA,CAAmB,OAAO,UAAU,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,KAAA,EAAO,kBAAkB,CAAC,CAAA;AAG1C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,cAAA,CAAe,cAAc,KAAK,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,cAAc,CAAC,CAAA;AAG1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,CAAC,aAAA,CAAc,OAAA,KAAY,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,EAAA,CAAA,EAAK;AACnH,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,KAAA,EAAO,QAAQ,CAAC,CAAA;AAGlC,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,aAAa,OAAO,WAAA;AACxB,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA;AACjC,IAAA,IAAI,SAAS,OAAA,EAAS,OAAO,CAAA,MAAA,EAAS,KAAA,CAAM,aAAa,CAAA,CAAA;AACzD,IAAA,IAAI,SAAS,KAAA,EAAO,OAAO,CAAA,MAAA,EAAS,KAAA,CAAM,aAAa,CAAA,CAAA;AACvD,IAAA,OAAO,CAAA,MAAA,EAAS,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,UAAA;AACH,QAAA,uBACEF,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,OAAO,KAAA,IAAS,EAAA;AAAA,YAChB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,WAAW,CAAA,OAAA,EAAU,KAAA,GAAQ,oBAAA,GAAuB,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,YACnE,aAAa,cAAA,EAAe;AAAA,YAC5B,IAAA,EAAM,CAAA;AAAA,YACN,YAAA,EAAY;AAAA;AAAA,SACd;AAAA,MAGJ,KAAK,UAAA;AACH,QAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAAH,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAM,eAAe,MAAA,GAAS,UAAA;AAAA,cAC9B,OAAO,KAAA,IAAS,EAAA;AAAA,cAChB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxC,WAAW,CAAA,aAAA,EAAgB,KAAA,GAAQ,oBAAA,GAAuB,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,cACzE,aAAa,cAAA,EAAe;AAAA,cAC5B,YAAA,EAAY;AAAA;AAAA,WACd;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,wBAAA;AAAA,cACT,SAAA,EAAU,2FAAA;AAAA,cAET,QAAA,EAAA,YAAA,mBACCA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,+BAAA,EAAgC,CAAA,mBAEtDA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,+BAAA,EAAgC;AAAA;AAAA;AAEvD,SAAA,EACF,CAAA;AAAA,MAGJ;AACE,QAAA,uBACEA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,IAAA;AAAA,YACA,OAAO,KAAA,IAAS,EAAA;AAAA,YAChB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,WAAW,CAAA,OAAA,EAAU,KAAA,GAAQ,oBAAA,GAAuB,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,YACnE,aAAa,cAAA,EAAe;AAAA,YAC5B,YAAA,EAAY;AAAA;AAAA,SACd;AAAA;AAEN,EACF,CAAA;AAEA,EAAA,uBACEG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,EACxC,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,qCAAA,EACd,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM,GAAA;AAAA,UAAE,4BAAYH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,GAAA,EAAC;AAAA,SAAA,EAC3D,CAAA;AAAA,QACC,wBACCA,GAAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAAG,KAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,kBAAe,OAAA,EAAO,IAAA,EACrB,0BAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,mDAAA,EAAoD,CAAA,EAC1E,CAAA;AAAA,0BACAA,IAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,UAAA,EAAY,QAAA,EAAA,IAAA,EAAK,CAAA,EAChC;AAAA,SAAA,EACF,CAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,MACC,4BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAsC,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EAEhE,CAAA;AAAA,IAED,WAAA,EAAY;AAAA,IACZ,yBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAExD,CAAA;AAEJ","file":"chunk-5LRBJEZW.js","sourcesContent":["import React, { createContext, useContext, useState, useRef, useCallback, type ReactNode } from 'react';\nimport { z } from 'zod';\n\n// =============================================================================\n// FORM PROVIDER TYPES\n// =============================================================================\n\n/**\n * Authentication configuration for SmartForm\n * \n * @interface AuthenticationConfig\n * @property {boolean} enable - Enable authentication (sends Bearer token in Authorization header)\n * @property {string} [refreshTokenEndpoint] - Optional endpoint for token refresh when accessToken expires\n * @property {string} [accessTokenKey] - localStorage key for access token (default: 'accessToken')\n * @property {string} [refreshTokenKey] - localStorage key for refresh token (default: 'refreshToken')\n * \n * @example\n * ```typescript\n * // Basic authentication without token refresh\n * authentication={{ enable: true }}\n * \n * // Authentication with token refresh\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\"\n * }}\n * \n * // Custom token keys\n * authentication={{\n * enable: true,\n * refreshTokenEndpoint: \"/api/auth/refresh\",\n * accessTokenKey: \"myAccessToken\",\n * refreshTokenKey: \"myRefreshToken\"\n * }}\n * ```\n */\nexport interface AuthenticationConfig {\n enable: boolean;\n refreshTokenEndpoint?: string; // Optional endpoint for token refresh when accessToken expires\n accessTokenKey?: string; // localStorage key for access token (default: 'accessToken')\n refreshTokenKey?: string; // localStorage key for refresh token (default: 'refreshToken')\n}\n\nexport interface FormConfig {\n showProgressBar?: any;\n api?: string;\n method?: 'POST' | 'PUT' | 'PATCH'; // HTTP method for form submission\n submitButtonText?: string;\n submitButtonIcon?: ReactNode;\n allowSaveDraft?: boolean;\n saveDraftApi?: string;\n onSuccess?: (data: any) => void;\n onError?: (error: any) => void;\n transformData?: (data: any) => any; // Transform data before submission\n className?: string;\n title?: string;\n subTitle?: string; // Optional subtitle displayed under the title\n storageKey?: string; // Key for localStorage persistence\n enableLocalStorage?: boolean; // Enable/disable localStorage\n logFormData?: boolean; // Enable/disable console logging of form data\n showReset?: boolean; // Show reset button regardless of localStorage setting\n showTabNumbers?: boolean; // Show tab numbers in tab headers\n authentication?: AuthenticationConfig; // Authentication configuration\n includeQueryParams?: boolean; // Include URL query parameters in form submission (default: false)\n queryParamsToInclude?: string[]; // Optional array of specific query param names to include\n}\n\nexport interface FormContextType {\n formData: any;\n errors: any;\n isLoading: boolean;\n isDraftSaving: boolean;\n updateField: (field: string, value: any) => void;\n validateField: (field: string, value: any) => boolean;\n validateFields: (fields: string[]) => boolean;\n submitForm: () => Promise<void>;\n validateFormAndGetResult: () => boolean;\n saveDraft: () => Promise<void>;\n resetForm: () => void;\n fieldRefs: React.MutableRefObject<any>;\n registerValidation: (field: string, validation: any) => void;\n validationRegistry: any;\n config: FormConfig;\n setErrors: (errors: any) => void;\n registerSubmitHook: (key: string, hook: () => Promise<void>) => void;\n unregisterSubmitHook: (key: string) => void;\n}\n\n// =============================================================================\n// FORM CONTEXT\n// =============================================================================\n\nconst FormContext = createContext<FormContextType | null>(null);\n\n// =============================================================================\n// FORM PROVIDER COMPONENT\n// =============================================================================\n\nexport interface SmartFormProviderProps {\n children: ReactNode;\n config: FormConfig;\n initialData?: any;\n}\n\nexport const SmartFormProvider: React.FC<SmartFormProviderProps> = ({\n children,\n config,\n initialData = {}\n}) => {\n // Helper function to extract query parameters from URL\n const getQueryParams = useCallback((allowedParams?: string[]): Record<string, any> => {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, any> = {};\n \n if (allowedParams && allowedParams.length > 0) {\n // Only include specified params\n allowedParams.forEach(key => {\n const value = params.get(key);\n if (value !== null) {\n result[key] = value;\n }\n });\n } else {\n // Include all params\n params.forEach((value, key) => {\n result[key] = value;\n });\n }\n \n return result;\n }, []);\n\n // Helper functions for localStorage\n const getStorageKey = () => {\n return config.storageKey || 'smart-form-data';\n };\n\n const loadFromStorage = () => {\n if (!config.enableLocalStorage) return initialData;\n\n try {\n const stored = localStorage.getItem(getStorageKey());\n if (stored) {\n const parsedStored = JSON.parse(stored);\n // Merge stored data with initialData\n // For each field: use stored value if it's not empty/null, otherwise use initialData value\n const merged = { ...initialData };\n Object.keys(parsedStored).forEach((key) => {\n const storedValue = parsedStored[key];\n // Only use stored value if it's not null, undefined, or empty string\n if (storedValue !== null && storedValue !== undefined && storedValue !== '') {\n merged[key] = storedValue;\n }\n });\n return merged;\n }\n return initialData;\n } catch (error) {\n console.warn('Failed to load form data from localStorage:', error);\n return initialData;\n }\n };\n\n const saveToStorage = (data: any) => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.setItem(getStorageKey(), JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to save form data to localStorage:', error);\n }\n };\n\n const clearStorage = () => {\n if (!config.enableLocalStorage) return;\n\n try {\n localStorage.removeItem(getStorageKey());\n } catch (error) {\n console.warn('Failed to clear form data from localStorage:', error);\n }\n };\n\n const [formData, setFormData] = useState(loadFromStorage);\n const [errors, setErrors] = useState<any>({});\n const [isLoading, setIsLoading] = useState(false);\n const [isDraftSaving, setIsDraftSaving] = useState(false);\n const [validationRegistry, setValidationRegistry] = useState<any>({});\n const fieldRefs = useRef<any>({});\n const submitHooksRef = useRef<Map<string, () => Promise<void>>>(new Map());\n\n // Update form field\n const updateField = useCallback((field: string, value: any) => {\n setFormData((prev: any) => {\n const newData = {\n ...prev,\n [field]: value\n };\n // Save to localStorage after state update\n setTimeout(() => saveToStorage(newData), 0);\n return newData;\n });\n\n // Clear error when user starts typing\n if (errors[field]) {\n setErrors((prev: any) => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n }, [errors, config.enableLocalStorage, saveToStorage]);\n\n // Validate single field\n const validateField = useCallback((field: string, value: any) => {\n const validation = validationRegistry[field];\n if (!validation) return true;\n\n try {\n validation.parse(value);\n return true;\n } catch (error) {\n if (error instanceof z.ZodError) {\n setErrors((prev: any) => ({\n ...prev,\n [field]: error.issues[0]?.message || `Invalid ${field}`\n }));\n return false;\n }\n return false;\n }\n }, [validationRegistry]);\n\n // Register validation for a field\n const registerValidation = useCallback((field: string, validation: any) => {\n setValidationRegistry((prev: any) => ({\n ...prev,\n [field]: validation\n }));\n }, []);\n\n // Validate all fields\n const validateAllFields = useCallback(() => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const [field, validation] of Object.entries(validationRegistry)) {\n if (validation && typeof (validation as any).parse === 'function') {\n try {\n (validation as any).parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n setErrors(allErrors);\n return isValid;\n }, [formData, validationRegistry]);\n\n // Validate specific fields (for tab validation)\n const validateFields = useCallback((fields: string[]) => {\n const allErrors: any = {};\n let isValid = true;\n\n for (const field of fields) {\n const validation = validationRegistry[field];\n if (validation) {\n try {\n validation.parse(formData[field]);\n } catch (error) {\n if (error instanceof z.ZodError) {\n allErrors[field] = error.issues[0]?.message || `Invalid ${field}`;\n isValid = false;\n }\n }\n }\n }\n\n // Only update errors for the fields being validated\n setErrors((prev: any) => ({\n ...prev,\n ...allErrors\n }));\n\n return isValid;\n }, [formData, validationRegistry]);\n\n // Submit form\n const submitForm = useCallback(async () => {\n if (!validateAllFields()) {\n return;\n }\n\n if (!config.api) {\n console.warn('No API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSubmit = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSubmit = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('📤 Submitting form data:', dataToSubmit);\n console.log('🎯 API endpoint:', config.api);\n }\n\n // Build a JSON-safe payload: replace File(s) with filename(s), Dates with ISO\n const toJsonSafe = (val: any): any => {\n if (val instanceof File) return val.name;\n if (val instanceof Date) return val.toISOString();\n if (Array.isArray(val)) {\n return val.map((item) => (item instanceof File ? item.name : toJsonSafe(item)));\n }\n if (val && typeof val === 'object') {\n // shallow map object values\n const out: any = {};\n for (const [k, v] of Object.entries(val)) out[k] = toJsonSafe(v);\n return out;\n }\n return val;\n };\n\n let jsonPayload = toJsonSafe(dataToSubmit);\n \n // Apply transformation if provided\n if (config.transformData) {\n jsonPayload = config.transformData(jsonPayload);\n }\n\n setIsLoading(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: config.method || 'POST',\n headers,\n body: JSON.stringify(jsonPayload),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.api, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.api, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n // Parse response body (JSON or text)\n let responseBody;\n try {\n responseBody = await response.json();\n } catch {\n responseBody = await response.text();\n }\n\n const responseData = {\n status: response.status,\n statusText: response.statusText,\n body: responseBody\n };\n\n // Check if response is successful (2xx status codes)\n if (response.status >= 200 && response.status < 300) {\n if (config.onSuccess) {\n config.onSuccess(responseData);\n }\n\n // After successful submit, run any registered submit hooks (e.g., file uploads)\n for (const hook of submitHooksRef.current.values()) {\n try {\n // eslint-disable-next-line no-await-in-loop\n await hook();\n } catch (hookError) {\n console.error('Submit hook error:', hookError);\n }\n }\n } else {\n // Handle error response\n if (config.onError) {\n config.onError(responseData);\n }\n }\n } catch (error: any) {\n // Handle network errors or other fetch failures\n if (config.onError) {\n config.onError({\n status: 0,\n statusText: 'Network Error',\n body: error.message || 'An error occurred'\n });\n }\n console.error('Form submission error:', error);\n } finally {\n setIsLoading(false);\n }\n }, [formData, config, validateAllFields, getQueryParams]);\n\n // Validate form and return validation result\n const validateFormAndGetResult = useCallback(() => {\n return validateAllFields();\n }, [validateAllFields]);\n\n /**\n * Helper function to refresh access token\n * This function handles token refresh internally and is reusable across projects\n * \n * @param authConfig - The authentication configuration object\n * @returns Promise<string | null> - New access token or null if refresh failed\n */\n const refreshAccessToken = useCallback(async (authConfig: AuthenticationConfig): Promise<string | null> => {\n const { refreshTokenEndpoint, accessTokenKey = 'accessToken', refreshTokenKey = 'refreshToken' } = authConfig;\n \n if (!refreshTokenEndpoint) {\n throw new Error('Refresh token endpoint not provided');\n }\n \n try {\n const refreshToken = localStorage.getItem(refreshTokenKey);\n if (!refreshToken) {\n throw new Error('No refresh token available');\n }\n\n const response = await fetch(refreshTokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error(`Token refresh failed: ${response.status}`);\n }\n\n const result = await response.json();\n // Support different response formats: { data: { accessToken } } or { accessToken }\n const newAccessToken = result.data?.accessToken || result.accessToken;\n \n if (newAccessToken) {\n localStorage.setItem(accessTokenKey, newAccessToken);\n return newAccessToken;\n }\n \n throw new Error('No access token in refresh response');\n } catch (error) {\n console.error('Token refresh failed:', error);\n // Clear tokens on refresh failure to prevent infinite retry loops\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n return null;\n }\n }, []);\n\n // Save draft\n const saveDraft = useCallback(async () => {\n if (!config.saveDraftApi) {\n console.warn('No save draft API endpoint provided');\n return;\n }\n\n // Merge query params with form data if enabled\n let dataToSave = formData;\n if (config.includeQueryParams) {\n const queryParams = getQueryParams(config.queryParamsToInclude);\n // Form data overrides query params in case of conflicts\n dataToSave = { ...queryParams, ...formData };\n }\n\n // Log form data if enabled\n if (config.logFormData) {\n console.log('💾 Saving draft data:', dataToSave);\n console.log('🎯 Draft API endpoint:', config.saveDraftApi);\n }\n\n setIsDraftSaving(true);\n try {\n // Prepare headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add Authorization header if authentication is enabled and token exists\n if (config.authentication?.enable) {\n const { accessTokenKey = 'accessToken' } = config.authentication;\n const token = localStorage.getItem(accessTokenKey);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(dataToSave),\n };\n\n // Add credentials if authentication is enabled\n if (config.authentication?.enable) {\n fetchOptions.credentials = 'include';\n }\n\n let response = await fetch(config.saveDraftApi, fetchOptions);\n\n // Handle token expiration with automatic refresh\n if (response.status === 403 && config.authentication?.enable && config.authentication.refreshTokenEndpoint) {\n const newAccessToken = await refreshAccessToken(config.authentication);\n \n if (newAccessToken) {\n // Retry the request with the new token\n headers.Authorization = `Bearer ${newAccessToken}`;\n response = await fetch(config.saveDraftApi, {\n ...fetchOptions,\n headers,\n });\n }\n }\n\n // Parse response body (JSON or text)\n let responseBody;\n try {\n responseBody = await response.json();\n } catch {\n responseBody = await response.text();\n }\n\n // Check if response is successful (2xx status codes)\n if (response.status >= 200 && response.status < 300) {\n console.log('Draft saved successfully:', responseBody);\n } else {\n console.error('Draft save failed:', {\n status: response.status,\n statusText: response.statusText,\n body: responseBody\n });\n }\n } catch (error) {\n console.error('Draft save error:', error);\n } finally {\n setIsDraftSaving(false);\n }\n }, [formData, config, getQueryParams]);\n\n // Reset form and clear localStorage\n const resetForm = useCallback(() => {\n setFormData(initialData);\n setErrors({});\n clearStorage();\n }, [initialData, config.enableLocalStorage, clearStorage]);\n\n const contextValue: FormContextType = {\n formData,\n errors,\n isLoading,\n isDraftSaving,\n updateField,\n validateField,\n validateFields,\n submitForm,\n validateFormAndGetResult,\n saveDraft,\n resetForm,\n fieldRefs,\n registerValidation,\n validationRegistry,\n config,\n setErrors,\n registerSubmitHook: (key: string, hook: () => Promise<void>) => {\n submitHooksRef.current.set(key, hook);\n },\n unregisterSubmitHook: (key: string) => {\n submitHooksRef.current.delete(key);\n }\n };\n\n return (\n <FormContext.Provider value={contextValue}>\n {children}\n </FormContext.Provider>\n );\n};\n\n// =============================================================================\n// FORM HOOKS\n// =============================================================================\n\nexport const useSmartForm = () => {\n const context = useContext(FormContext);\n if (!context) {\n throw new Error('useSmartForm must be used within a SmartFormProvider');\n }\n return context;\n};\n\nexport const useFormField = (field: string) => {\n const { formData, errors, updateField, fieldRefs, registerValidation } = useSmartForm();\n\n return {\n value: formData[field],\n error: errors[field],\n onChange: (value: any) => updateField(field, value),\n fieldRef: (el: any) => fieldRefs.current[field] = el,\n registerValidation\n };\n};\n","import { createContext, useContext } from 'react';\n\nexport interface FieldDetectionContextType {\n registerField: (fieldName: string) => void;\n}\n\nexport const FieldDetectionContext = createContext<FieldDetectionContextType | null>(null);\n\nexport const useFieldDetection = () => {\n const context = useContext(FieldDetectionContext);\n return context; // Return null if not in context (for backward compatibility)\n};\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Input }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n )\n}\n\nfunction TooltipTrigger({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useFormField } from '../SmartFormProvider';\nimport { useFieldDetection } from '../FieldDetectionHook';\nimport { Input } from '../components/ui/input';\nimport { Textarea } from '../components/ui/textarea';\nimport { Label } from '../components/ui/label';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../components/ui/tooltip';\nimport { EyeIcon, EyeOffIcon, InfoIcon } from 'lucide-react';\n\n// =============================================================================\n// SMART FORM INPUT TYPES\n// =============================================================================\n\nexport interface SmartInputProps {\n field: string;\n label?: string;\n type?: 'text' | 'email' | 'password' | 'tel' | 'number' | 'textarea';\n placeholder?: string;\n validation?: any; // Zod schema\n className?: string;\n required?: boolean;\n defaultValue?: any; // Default value for the field\n info?: string; // Info text to show on hover of info icon\n subLabel?: string; // Additional label text shown below the main label\n}\n\n// =============================================================================\n// SMART FORM INPUT COMPONENT\n// =============================================================================\n\nexport const SmartInput: React.FC<SmartInputProps> = ({\n field,\n label,\n type = 'text',\n placeholder,\n validation,\n className = '',\n required = false,\n defaultValue,\n info,\n subLabel\n}) => {\n const { value, error, onChange, fieldRef, registerValidation } = useFormField(field);\n const fieldDetection = useFieldDetection();\n const hasRegistered = useRef(false);\n const hasSetDefault = useRef(false);\n const [showPassword, setShowPassword] = useState(false);\n\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n\n // Register validation for this field\n useEffect(() => {\n if (validation && !hasRegistered.current) {\n hasRegistered.current = true;\n registerValidation(field, validation);\n }\n }, [validation, field, registerValidation]);\n\n // Auto-register field if in field detection context\n useEffect(() => {\n if (fieldDetection?.registerField) {\n fieldDetection.registerField(field);\n }\n }, [field, fieldDetection]);\n\n // Set default value if provided and field is empty\n useEffect(() => {\n if (defaultValue !== undefined && !hasSetDefault.current && (value === undefined || value === null || value === '')) {\n onChange(defaultValue);\n hasSetDefault.current = true;\n }\n }, [defaultValue, value, onChange]);\n\n // Generate placeholder text\n const getPlaceholder = () => {\n if (placeholder) return placeholder;\n if (!label) return `Enter ${field}`;\n if (type === 'email') return `Enter ${label.toLowerCase()}`;\n if (type === 'tel') return `Enter ${label.toLowerCase()}`;\n return `Enter ${label.toLowerCase()}`;\n };\n\n const renderInput = () => {\n switch (type) {\n case 'textarea':\n return (\n <Textarea\n ref={fieldRef}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n rows={4}\n data-field={field}\n />\n );\n\n case 'password':\n return (\n <div className=\"relative\">\n <Input\n ref={fieldRef}\n type={showPassword ? \"text\" : \"password\"}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full pr-10 ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n <button \n type=\"button\"\n onClick={togglePasswordVisibility}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 p-1 hover:bg-gray-100 rounded transition-colors\"\n >\n {showPassword ? (\n <EyeOffIcon className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <EyeIcon className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </button>\n </div>\n );\n\n default:\n return (\n <Input\n ref={fieldRef}\n type={type}\n value={value || ''}\n onChange={(e) => onChange(e.target.value)}\n className={`w-full ${error ? 'border-destructive' : ''} ${className}`}\n placeholder={getPlaceholder()}\n data-field={field}\n />\n );\n }\n };\n\n return (\n <div className={`flex-1 min-w-0 ${className}`}>\n {label && (\n <div className=\"mb-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label className=\"text-sm font-medium text-foreground\">\n {label} {required && <span className=\"text-destructive\">*</span>}\n </Label>\n {info && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <InfoIcon className=\"h-4 w-4 text-muted-foreground cursor-pointer mr-2\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs\">{info}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n {subLabel && (\n <p className=\"text-xs text-muted-foreground mt-1\">{subLabel}</p>\n )}\n </div>\n )}\n {renderInput()}\n {error && (\n <p className=\"text-destructive text-sm mt-1\">{error}</p>\n )}\n </div>\n );\n};"]}
|