@123usmanhaider321/ui 0.1.6 → 1.0.0
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/README.md +416 -31
- package/dist/images/icon/1LINK.svg +50 -0
- package/dist/images/icon/CreditCard.svg +83 -0
- package/dist/images/icon/Easypaisa.png +0 -0
- package/dist/images/icon/MobileWallet.png +0 -0
- package/dist/images/icon/Raast-Logo.png +0 -0
- package/dist/images/icon/VISA.png +0 -0
- package/dist/images/icon/add-circle-1.svg +5 -0
- package/dist/images/icon/check-circle-broken.svg +3 -0
- package/dist/images/icon/close-circle.svg +5 -0
- package/dist/images/icon/jazzcash.png +0 -0
- package/dist/images/icon/loading_icon.json +3347 -0
- package/dist/images/icon/mastercard-logo.webp +0 -0
- package/dist/images/icon/paymo.jpeg +0 -0
- package/dist/images/icon/preview-svgrepo-com.svg +36 -0
- package/dist/images/icon/trash.svg +7 -0
- package/dist/images/icon/unionpay-logo.svg +9 -0
- package/dist/index-87FQZHOs.js +11119 -0
- package/dist/index-87FQZHOs.js.map +1 -0
- package/dist/index-Tl9g213f.js +60475 -0
- package/dist/index-Tl9g213f.js.map +1 -0
- package/dist/index.d.ts +1 -10
- package/dist/index.es-CpgTaa1Y.js +16734 -0
- package/dist/index.es-CpgTaa1Y.js.map +1 -0
- package/dist/index.js +40 -12
- package/dist/index.js.map +1 -1
- package/dist/loading_icon-n5H5dQBl.js +3375 -0
- package/dist/loading_icon-n5H5dQBl.js.map +1 -0
- package/dist/src/components/Alert/ErrorAlert.d.ts +6 -0
- package/dist/src/components/Alert/SuccessAlert.d.ts +6 -0
- package/dist/{components → src/components}/FormBuilder/DiscountInput.d.ts +3 -6
- package/dist/{components → src/components}/FormBuilder/FormBuilder.d.ts +2 -11
- package/dist/{components → src/components}/FormBuilder/QuestionCard.d.ts +0 -5
- package/dist/{components → src/components}/FormBuilder/QuestionEditor.d.ts +0 -5
- package/dist/{components → src/components}/FormBuilder/SortableQuestionList.d.ts +0 -5
- package/dist/src/components/FormBuilder/questionIcons.d.ts +5 -0
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/AddEventLayout.d.ts +2 -1
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/AddEventStepper.d.ts +2 -2
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/common/ConfirmationModal.d.ts +1 -1
- package/dist/src/components/NewAddEvent/components/EventSubmissionConfirmationModal.d.ts +14 -0
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/StepTwo/TicketTierSection.d.ts +1 -1
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/TicketTierForm.d.ts +1 -1
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/hooks/useStepperForm.d.ts +22 -22
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/hooks/useTicketTierForm.d.ts +63 -15
- package/dist/src/components/NewAddEvent/schemas/step1.d.ts +211 -0
- package/dist/src/components/NewAddEvent/schemas/step2.d.ts +411 -0
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/schemas/utils.d.ts +8 -2
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/IndividualFormStep.d.ts +1 -1
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/SocialProfilesStep.d.ts +1 -1
- package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/TeamFormStep.d.ts +1 -1
- package/dist/src/components/Spinner/spinner.d.ts +4 -0
- package/dist/src/components/TicketlyUIProvider.d.ts +35 -0
- package/dist/src/components/common/Loader/index.d.ts +8 -0
- package/dist/src/components/common/Modals/ConfirmationModal.d.ts +7 -0
- package/dist/{components/FormInput → src/components/ui}/FormInput.d.ts +1 -1
- package/dist/src/components/ui/Loader.d.ts +4 -0
- package/dist/{components/Button/Button.d.ts → src/components/ui/button.d.ts} +1 -1
- package/dist/src/index.d.ts +10 -0
- package/dist/{lib → src/lib}/actions.d.ts +0 -126
- package/dist/src/lib/dom-utils.d.ts +2 -0
- package/dist/src/lib/storage-utils.d.ts +5 -0
- package/dist/src/lib/types.d.ts +258 -0
- package/dist/src/redux/baseQuery.d.ts +16 -0
- package/dist/{services → src/redux/features}/eventApi.d.ts +1053 -1745
- package/dist/src/redux/features/globalSlice.d.ts +17 -0
- package/dist/{services → src/redux/features/single-event}/single-event-api.d.ts +856 -1190
- package/dist/src/redux/types.d.ts +2 -0
- package/dist/src/services/library-services.d.ts +15 -0
- package/dist/src/services/remote-config.d.ts +27 -0
- package/dist/{services → src/services}/utils.d.ts +1 -1
- package/dist/src/theme/colors.d.ts +127 -0
- package/dist/src/theme/typography.d.ts +13 -0
- package/dist/src/types/api.d.ts +18 -0
- package/dist/style.css +2984 -0
- package/dist/styles.css +3758 -3636
- package/package.json +78 -68
- package/dist/_virtual/_commonjsHelpers.js +0 -9
- package/dist/_virtual/_commonjsHelpers.js.map +0 -1
- package/dist/_virtual/customParseFormat.js +0 -5
- package/dist/_virtual/customParseFormat.js.map +0 -1
- package/dist/_virtual/dayjs.min.js +0 -5
- package/dist/_virtual/dayjs.min.js.map +0 -1
- package/dist/_virtual/duration.js +0 -5
- package/dist/_virtual/duration.js.map +0 -1
- package/dist/_virtual/index.js +0 -5
- package/dist/_virtual/index.js.map +0 -1
- package/dist/_virtual/isBetween.js +0 -5
- package/dist/_virtual/isBetween.js.map +0 -1
- package/dist/_virtual/relativeTime.js +0 -5
- package/dist/_virtual/relativeTime.js.map +0 -1
- package/dist/_virtual/use-sync-external-store-shim.development.js +0 -5
- package/dist/_virtual/use-sync-external-store-shim.development.js.map +0 -1
- package/dist/_virtual/use-sync-external-store-shim.production.js +0 -5
- package/dist/_virtual/use-sync-external-store-shim.production.js.map +0 -1
- package/dist/_virtual/with-selector.development.js +0 -5
- package/dist/_virtual/with-selector.development.js.map +0 -1
- package/dist/_virtual/with-selector.js +0 -5
- package/dist/_virtual/with-selector.js.map +0 -1
- package/dist/_virtual/with-selector.production.js +0 -5
- package/dist/_virtual/with-selector.production.js.map +0 -1
- package/dist/components/Alert/Alert.js +0 -51
- package/dist/components/Alert/Alert.js.map +0 -1
- package/dist/components/Button/Button.js +0 -52
- package/dist/components/Button/Button.js.map +0 -1
- package/dist/components/Button/Button.test.d.ts +0 -1
- package/dist/components/Button/index.d.ts +0 -1
- package/dist/components/Checkbox/Checkbox.js +0 -50
- package/dist/components/Checkbox/Checkbox.js.map +0 -1
- package/dist/components/Checkbox/Checkbox.test.d.ts +0 -1
- package/dist/components/Checkbox/index.d.ts +0 -1
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +0 -25
- package/dist/components/CheckboxGroup/CheckboxGroup.js +0 -99
- package/dist/components/CheckboxGroup/CheckboxGroup.js.map +0 -1
- package/dist/components/ConfirmationModal/ConfirmationModal.d.ts +0 -15
- package/dist/components/ConfirmationModal/ConfirmationModal.js +0 -136
- package/dist/components/ConfirmationModal/ConfirmationModal.js.map +0 -1
- package/dist/components/ConfirmationModal/index.d.ts +0 -2
- package/dist/components/CustomSelect/CustomSelect.js +0 -259
- package/dist/components/CustomSelect/CustomSelect.js.map +0 -1
- package/dist/components/EventAddForm/AddEventLayout.js +0 -227
- package/dist/components/EventAddForm/AddEventLayout.js.map +0 -1
- package/dist/components/EventAddForm/AddEventStepper.js +0 -719
- package/dist/components/EventAddForm/AddEventStepper.js.map +0 -1
- package/dist/components/EventAddForm/common/ConfirmationModal.js +0 -136
- package/dist/components/EventAddForm/common/ConfirmationModal.js.map +0 -1
- package/dist/components/EventAddForm/common/DescriptionModal.js +0 -70
- package/dist/components/EventAddForm/common/DescriptionModal.js.map +0 -1
- package/dist/components/EventAddForm/components/AnimatedBackground.d.ts +0 -8
- package/dist/components/EventAddForm/components/ApprovalConfirmationModal.d.ts +0 -7
- package/dist/components/EventAddForm/components/CheckboxGroup.js +0 -92
- package/dist/components/EventAddForm/components/CheckboxGroup.js.map +0 -1
- package/dist/components/EventAddForm/components/CustomMeetingForm.js +0 -237
- package/dist/components/EventAddForm/components/CustomMeetingForm.js.map +0 -1
- package/dist/components/EventAddForm/components/DateTimeField.js +0 -173
- package/dist/components/EventAddForm/components/DateTimeField.js.map +0 -1
- package/dist/components/EventAddForm/components/EventSubmissionConfirmationModal.d.ts +0 -33
- package/dist/components/EventAddForm/components/EventSubmissionConfirmationModal.js +0 -366
- package/dist/components/EventAddForm/components/EventSubmissionConfirmationModal.js.map +0 -1
- package/dist/components/EventAddForm/components/FileUpload.js +0 -412
- package/dist/components/EventAddForm/components/FileUpload.js.map +0 -1
- package/dist/components/EventAddForm/components/FormBuilderProceedModal.js +0 -197
- package/dist/components/EventAddForm/components/FormBuilderProceedModal.js.map +0 -1
- package/dist/components/EventAddForm/components/GoogleMapsAutocompleteInput.js +0 -1179
- package/dist/components/EventAddForm/components/GoogleMapsAutocompleteInput.js.map +0 -1
- package/dist/components/EventAddForm/components/InputField.d.ts +0 -15
- package/dist/components/EventAddForm/components/RadioGroupButton.d.ts +0 -14
- package/dist/components/EventAddForm/components/SelectField.d.ts +0 -19
- package/dist/components/EventAddForm/components/SingleDateTimeInput.js +0 -102
- package/dist/components/EventAddForm/components/SingleDateTimeInput.js.map +0 -1
- package/dist/components/EventAddForm/components/StepTwo/CustomFormSection.js +0 -277
- package/dist/components/EventAddForm/components/StepTwo/CustomFormSection.js.map +0 -1
- package/dist/components/EventAddForm/components/StepTwo/TicketTierSection.js +0 -148
- package/dist/components/EventAddForm/components/StepTwo/TicketTierSection.js.map +0 -1
- package/dist/components/EventAddForm/components/TicketTierForm.js +0 -418
- package/dist/components/EventAddForm/components/TicketTierForm.js.map +0 -1
- package/dist/components/EventAddForm/components/TicketTypeSelection.js +0 -93
- package/dist/components/EventAddForm/components/TicketTypeSelection.js.map +0 -1
- package/dist/components/EventAddForm/hooks/useStepperForm.js +0 -371
- package/dist/components/EventAddForm/hooks/useStepperForm.js.map +0 -1
- package/dist/components/EventAddForm/hooks/useTicketTierForm.js +0 -237
- package/dist/components/EventAddForm/hooks/useTicketTierForm.js.map +0 -1
- package/dist/components/EventAddForm/index.d.ts +0 -3
- package/dist/components/EventAddForm/index.js +0 -41
- package/dist/components/EventAddForm/index.js.map +0 -1
- package/dist/components/EventAddForm/schemas/index.d.ts +0 -2
- package/dist/components/EventAddForm/schemas/step1.d.ts +0 -47
- package/dist/components/EventAddForm/schemas/step1.js +0 -135
- package/dist/components/EventAddForm/schemas/step1.js.map +0 -1
- package/dist/components/EventAddForm/schemas/step2.d.ts +0 -138
- package/dist/components/EventAddForm/schemas/step2.js +0 -94
- package/dist/components/EventAddForm/schemas/step2.js.map +0 -1
- package/dist/components/EventAddForm/schemas/utils.js +0 -28
- package/dist/components/EventAddForm/schemas/utils.js.map +0 -1
- package/dist/components/EventAddForm/steps/IndividualFormStep.js +0 -85
- package/dist/components/EventAddForm/steps/IndividualFormStep.js.map +0 -1
- package/dist/components/EventAddForm/steps/SocialProfilesStep.js +0 -123
- package/dist/components/EventAddForm/steps/SocialProfilesStep.js.map +0 -1
- package/dist/components/EventAddForm/steps/StepOne.js +0 -462
- package/dist/components/EventAddForm/steps/StepOne.js.map +0 -1
- package/dist/components/EventAddForm/steps/StepTwo.js +0 -173
- package/dist/components/EventAddForm/steps/StepTwo.js.map +0 -1
- package/dist/components/EventAddForm/steps/TeamFormStep.js +0 -13
- package/dist/components/EventAddForm/steps/TeamFormStep.js.map +0 -1
- package/dist/components/FormBuilder/CategoryList.js +0 -242
- package/dist/components/FormBuilder/CategoryList.js.map +0 -1
- package/dist/components/FormBuilder/DiscountInput.js +0 -366
- package/dist/components/FormBuilder/DiscountInput.js.map +0 -1
- package/dist/components/FormBuilder/FormBuilder.js +0 -918
- package/dist/components/FormBuilder/FormBuilder.js.map +0 -1
- package/dist/components/FormBuilder/OptionList.js +0 -120
- package/dist/components/FormBuilder/OptionList.js.map +0 -1
- package/dist/components/FormBuilder/PaymentPreview.d.ts +0 -12
- package/dist/components/FormBuilder/PaymentPreview.js +0 -70
- package/dist/components/FormBuilder/PaymentPreview.js.map +0 -1
- package/dist/components/FormBuilder/PreviewInput.d.ts +0 -10
- package/dist/components/FormBuilder/PreviewInput.js +0 -143
- package/dist/components/FormBuilder/PreviewInput.js.map +0 -1
- package/dist/components/FormBuilder/QuestionCard.js +0 -252
- package/dist/components/FormBuilder/QuestionCard.js.map +0 -1
- package/dist/components/FormBuilder/QuestionEditor.js +0 -166
- package/dist/components/FormBuilder/QuestionEditor.js.map +0 -1
- package/dist/components/FormBuilder/RequiredToggle.js +0 -43
- package/dist/components/FormBuilder/RequiredToggle.js.map +0 -1
- package/dist/components/FormBuilder/SortableQuestionList.js +0 -137
- package/dist/components/FormBuilder/SortableQuestionList.js.map +0 -1
- package/dist/components/FormBuilder/index.d.ts +0 -4
- package/dist/components/FormBuilder/utils.js +0 -229
- package/dist/components/FormBuilder/utils.js.map +0 -1
- package/dist/components/FormInput/FormInput.js +0 -126
- package/dist/components/FormInput/FormInput.js.map +0 -1
- package/dist/components/FormInput/FormInput.test.d.ts +0 -1
- package/dist/components/FormInput/index.d.ts +0 -2
- package/dist/components/ImageCropModal/index.js +0 -464
- package/dist/components/ImageCropModal/index.js.map +0 -1
- package/dist/components/InformationPopover/InformationPopover.d.ts +0 -7
- package/dist/components/InformationPopover/InformationPopover.js +0 -19
- package/dist/components/InformationPopover/InformationPopover.js.map +0 -1
- package/dist/components/InformationPopover.js +0 -19
- package/dist/components/InformationPopover.js.map +0 -1
- package/dist/components/InputErrorMessage/InputErrorMessage.js +0 -21
- package/dist/components/InputErrorMessage/InputErrorMessage.js.map +0 -1
- package/dist/components/Modal/Modal.d.ts +0 -15
- package/dist/components/Modal/Modal.js +0 -73
- package/dist/components/Modal/Modal.js.map +0 -1
- package/dist/components/Radio/Radio.js +0 -35
- package/dist/components/Radio/Radio.js.map +0 -1
- package/dist/components/Spinner/spinner.d.ts +0 -2
- package/dist/components/Spinner/spinner.js +0 -22
- package/dist/components/Spinner/spinner.js.map +0 -1
- package/dist/components/Toggle/Toggle.d.ts +0 -16
- package/dist/components/Toggle/index.d.ts +0 -2
- package/dist/components/Tooltip/Tooltip.d.ts +0 -12
- package/dist/components/Tooltip/Tooltip.js +0 -134
- package/dist/components/Tooltip/Tooltip.js.map +0 -1
- package/dist/components/common/FallbackImage.js +0 -47
- package/dist/components/common/FallbackImage.js.map +0 -1
- package/dist/components/ui/Calendar/calendar-utils.js +0 -51
- package/dist/components/ui/Calendar/calendar-utils.js.map +0 -1
- package/dist/components/ui/Calendar/index.js +0 -142
- package/dist/components/ui/Calendar/index.js.map +0 -1
- package/dist/components/ui/Checkbox.d.ts +0 -9
- package/dist/components/ui/Checkbox.js +0 -50
- package/dist/components/ui/Checkbox.js.map +0 -1
- package/dist/components/ui/DatePicker/index.js +0 -188
- package/dist/components/ui/DatePicker/index.js.map +0 -1
- package/dist/components/ui/FormInput.js +0 -129
- package/dist/components/ui/FormInput.js.map +0 -1
- package/dist/components/ui/InputErrorMessage.d.ts +0 -7
- package/dist/components/ui/InputErrorMessage.js +0 -21
- package/dist/components/ui/InputErrorMessage.js.map +0 -1
- package/dist/components/ui/Modal/index.js +0 -73
- package/dist/components/ui/Modal/index.js.map +0 -1
- package/dist/components/ui/Radio.d.ts +0 -6
- package/dist/components/ui/Radio.js +0 -35
- package/dist/components/ui/Radio.js.map +0 -1
- package/dist/components/ui/RichTextEditor.js +0 -242
- package/dist/components/ui/RichTextEditor.js.map +0 -1
- package/dist/components/ui/TimePicker/index.js +0 -215
- package/dist/components/ui/TimePicker/index.js.map +0 -1
- package/dist/components/ui/TimeSelector/index.js +0 -138
- package/dist/components/ui/TimeSelector/index.js.map +0 -1
- package/dist/components/ui/Tooltip.d.ts +0 -12
- package/dist/components/ui/Tooltip.js +0 -136
- package/dist/components/ui/Tooltip.js.map +0 -1
- package/dist/hooks/useDropdownPosition.d.ts +0 -11
- package/dist/hooks/useFirebaseAuthState.d.ts +0 -6
- package/dist/hooks/useFirebaseAuthState.js +0 -23
- package/dist/hooks/useFirebaseAuthState.js.map +0 -1
- package/dist/hooks/useTicketTierForm.d.ts +0 -61
- package/dist/lib/actions.js +0 -32
- package/dist/lib/actions.js.map +0 -1
- package/dist/lib/cropImage.js +0 -113
- package/dist/lib/cropImage.js.map +0 -1
- package/dist/lib/imageAnalysis.js +0 -58
- package/dist/lib/imageAnalysis.js.map +0 -1
- package/dist/lib/utils.js +0 -9
- package/dist/lib/utils.js.map +0 -1
- package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -60
- package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
- package/dist/node_modules/@dnd-kit/core/dist/core.esm.js +0 -3458
- package/dist/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
- package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -593
- package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
- package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -302
- package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
- package/dist/node_modules/@firebase/app/dist/esm/index.esm.js +0 -768
- package/dist/node_modules/@firebase/app/dist/esm/index.esm.js.map +0 -1
- package/dist/node_modules/@firebase/component/dist/esm/index.esm.js +0 -340
- package/dist/node_modules/@firebase/component/dist/esm/index.esm.js.map +0 -1
- package/dist/node_modules/@firebase/logger/dist/esm/index.esm.js +0 -123
- package/dist/node_modules/@firebase/logger/dist/esm/index.esm.js.map +0 -1
- package/dist/node_modules/@firebase/storage/dist/index.esm.js +0 -2623
- package/dist/node_modules/@firebase/storage/dist/index.esm.js.map +0 -1
- package/dist/node_modules/@firebase/util/dist/index.esm.js +0 -658
- package/dist/node_modules/@firebase/util/dist/index.esm.js.map +0 -1
- package/dist/node_modules/@firebase/util/dist/postinstall.js +0 -5
- package/dist/node_modules/@firebase/util/dist/postinstall.js.map +0 -1
- package/dist/node_modules/@fortawesome/fontawesome-svg-core/index.js +0 -3179
- package/dist/node_modules/@fortawesome/fontawesome-svg-core/index.js.map +0 -1
- package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.js +0 -60
- package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.js.map +0 -1
- package/dist/node_modules/@fortawesome/react-fontawesome/dist/index.js +0 -400
- package/dist/node_modules/@fortawesome/react-fontawesome/dist/index.js.map +0 -1
- package/dist/node_modules/@heroicons/react/20/solid/esm/CheckIcon.js +0 -27
- package/dist/node_modules/@heroicons/react/20/solid/esm/CheckIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/20/solid/esm/ChevronDownIcon.js +0 -27
- package/dist/node_modules/@heroicons/react/20/solid/esm/ChevronDownIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/ArrowRightIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/ClockIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/ClockIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/DocumentDuplicateIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/DocumentDuplicateIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/InformationCircleIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/LinkIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/LinkIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/MagnifyingGlassIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/MagnifyingGlassIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/MapPinIcon.js +0 -33
- package/dist/node_modules/@heroicons/react/24/outline/esm/MapPinIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/VideoCameraIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/VideoCameraIcon.js.map +0 -1
- package/dist/node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js +0 -29
- package/dist/node_modules/@heroicons/react/24/outline/esm/XMarkIcon.js.map +0 -1
- package/dist/node_modules/@tiptap/core/dist/index.js +0 -5446
- package/dist/node_modules/@tiptap/core/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/core/dist/jsx-runtime/jsx-runtime.js +0 -21
- package/dist/node_modules/@tiptap/core/dist/jsx-runtime/jsx-runtime.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-blockquote/dist/index.js +0 -78
- package/dist/node_modules/@tiptap/extension-blockquote/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-bold/dist/index.js +0 -100
- package/dist/node_modules/@tiptap/extension-bold/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-code/dist/index.js +0 -70
- package/dist/node_modules/@tiptap/extension-code/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-code-block/dist/index.js +0 -317
- package/dist/node_modules/@tiptap/extension-code-block/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-document/dist/index.js +0 -16
- package/dist/node_modules/@tiptap/extension-document/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-hard-break/dist/index.js +0 -66
- package/dist/node_modules/@tiptap/extension-hard-break/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-heading/dist/index.js +0 -86
- package/dist/node_modules/@tiptap/extension-heading/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-horizontal-rule/dist/index.js +0 -80
- package/dist/node_modules/@tiptap/extension-horizontal-rule/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-italic/dist/index.js +0 -98
- package/dist/node_modules/@tiptap/extension-italic/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-link/dist/index.js +0 -423
- package/dist/node_modules/@tiptap/extension-link/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-list/dist/index.js +0 -1039
- package/dist/node_modules/@tiptap/extension-list/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-paragraph/dist/index.js +0 -61
- package/dist/node_modules/@tiptap/extension-paragraph/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-placeholder/dist/index.js +0 -7
- package/dist/node_modules/@tiptap/extension-placeholder/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-strike/dist/index.js +0 -79
- package/dist/node_modules/@tiptap/extension-strike/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-text/dist/index.js +0 -16
- package/dist/node_modules/@tiptap/extension-text/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extension-underline/dist/index.js +0 -76
- package/dist/node_modules/@tiptap/extension-underline/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/extensions/dist/index.js +0 -376
- package/dist/node_modules/@tiptap/extensions/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/react/dist/index.js +0 -650
- package/dist/node_modules/@tiptap/react/dist/index.js.map +0 -1
- package/dist/node_modules/@tiptap/starter-kit/dist/index.js +0 -97
- package/dist/node_modules/@tiptap/starter-kit/dist/index.js.map +0 -1
- package/dist/node_modules/dayjs/dayjs.min.js +0 -283
- package/dist/node_modules/dayjs/dayjs.min.js.map +0 -1
- package/dist/node_modules/dayjs/plugin/customParseFormat.js +0 -130
- package/dist/node_modules/dayjs/plugin/customParseFormat.js.map +0 -1
- package/dist/node_modules/dayjs/plugin/duration.js +0 -137
- package/dist/node_modules/dayjs/plugin/duration.js.map +0 -1
- package/dist/node_modules/dayjs/plugin/isBetween.js +0 -20
- package/dist/node_modules/dayjs/plugin/isBetween.js.map +0 -1
- package/dist/node_modules/dayjs/plugin/relativeTime.js +0 -49
- package/dist/node_modules/dayjs/plugin/relativeTime.js.map +0 -1
- package/dist/node_modules/fast-equals/dist/es/index.js +0 -442
- package/dist/node_modules/fast-equals/dist/es/index.js.map +0 -1
- package/dist/node_modules/idb/build/index.js +0 -70
- package/dist/node_modules/idb/build/index.js.map +0 -1
- package/dist/node_modules/idb/build/wrap-idb-value.js +0 -149
- package/dist/node_modules/idb/build/wrap-idb-value.js.map +0 -1
- package/dist/node_modules/linkifyjs/dist/linkify.js +0 -1159
- package/dist/node_modules/linkifyjs/dist/linkify.js.map +0 -1
- package/dist/node_modules/orderedmap/dist/index.js +0 -120
- package/dist/node_modules/orderedmap/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-commands/dist/index.js +0 -527
- package/dist/node_modules/prosemirror-commands/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-dropcursor/dist/index.js +0 -137
- package/dist/node_modules/prosemirror-dropcursor/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-gapcursor/dist/index.js +0 -221
- package/dist/node_modules/prosemirror-gapcursor/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-history/dist/index.js +0 -357
- package/dist/node_modules/prosemirror-history/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-keymap/dist/index.js +0 -84
- package/dist/node_modules/prosemirror-keymap/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-model/dist/index.js +0 -3209
- package/dist/node_modules/prosemirror-model/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-schema-list/dist/index.js +0 -131
- package/dist/node_modules/prosemirror-schema-list/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-state/dist/index.js +0 -936
- package/dist/node_modules/prosemirror-state/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-transform/dist/index.js +0 -1881
- package/dist/node_modules/prosemirror-transform/dist/index.js.map +0 -1
- package/dist/node_modules/prosemirror-view/dist/index.js +0 -5232
- package/dist/node_modules/prosemirror-view/dist/index.js.map +0 -1
- package/dist/node_modules/rope-sequence/dist/index.js +0 -184
- package/dist/node_modules/rope-sequence/dist/index.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -82
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +0 -78
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -78
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -63
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +0 -13
- package/dist/node_modules/use-sync-external-store/shim/index.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/shim/with-selector.js +0 -13
- package/dist/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -1
- package/dist/node_modules/w3c-keyname/index.js +0 -106
- package/dist/node_modules/w3c-keyname/index.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/coerce.js +0 -10
- package/dist/node_modules/zod/v4/classic/coerce.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/compat.js +0 -8
- package/dist/node_modules/zod/v4/classic/compat.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/errors.js +0 -45
- package/dist/node_modules/zod/v4/classic/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/iso.js +0 -44
- package/dist/node_modules/zod/v4/classic/iso.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/parse.js +0 -30
- package/dist/node_modules/zod/v4/classic/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/classic/schemas.js +0 -711
- package/dist/node_modules/zod/v4/classic/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/api.js +0 -588
- package/dist/node_modules/zod/v4/core/api.js.map +0 -1
- package/dist/node_modules/zod/v4/core/checks.js +0 -411
- package/dist/node_modules/zod/v4/core/checks.js.map +0 -1
- package/dist/node_modules/zod/v4/core/core.js +0 -75
- package/dist/node_modules/zod/v4/core/core.js.map +0 -1
- package/dist/node_modules/zod/v4/core/doc.js +0 -38
- package/dist/node_modules/zod/v4/core/doc.js.map +0 -1
- package/dist/node_modules/zod/v4/core/errors.js +0 -73
- package/dist/node_modules/zod/v4/core/errors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/json-schema-processors.js +0 -359
- package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +0 -1
- package/dist/node_modules/zod/v4/core/parse.js +0 -96
- package/dist/node_modules/zod/v4/core/parse.js.map +0 -1
- package/dist/node_modules/zod/v4/core/regexes.js +0 -84
- package/dist/node_modules/zod/v4/core/regexes.js.map +0 -1
- package/dist/node_modules/zod/v4/core/registries.js +0 -52
- package/dist/node_modules/zod/v4/core/registries.js.map +0 -1
- package/dist/node_modules/zod/v4/core/schemas.js +0 -1391
- package/dist/node_modules/zod/v4/core/schemas.js.map +0 -1
- package/dist/node_modules/zod/v4/core/to-json-schema.js +0 -363
- package/dist/node_modules/zod/v4/core/to-json-schema.js.map +0 -1
- package/dist/node_modules/zod/v4/core/util.js +0 -431
- package/dist/node_modules/zod/v4/core/util.js.map +0 -1
- package/dist/node_modules/zod/v4/core/versions.js +0 -9
- package/dist/node_modules/zod/v4/core/versions.js.map +0 -1
- package/dist/redux/baseQuery.d.ts +0 -1
- package/dist/redux/baseQuery.js +0 -24
- package/dist/redux/baseQuery.js.map +0 -1
- package/dist/services/eventApi.js +0 -411
- package/dist/services/eventApi.js.map +0 -1
- package/dist/services/helpers.js +0 -115
- package/dist/services/helpers.js.map +0 -1
- package/dist/services/initialize-firebase.d.ts +0 -2
- package/dist/services/initialize-firebase.js +0 -20
- package/dist/services/initialize-firebase.js.map +0 -1
- package/dist/services/process-image-on-server.js +0 -30
- package/dist/services/process-image-on-server.js.map +0 -1
- package/dist/services/remote-config.d.ts +0 -5
- package/dist/services/remote-config.js +0 -9
- package/dist/services/remote-config.js.map +0 -1
- package/dist/services/single-event-api.js +0 -301
- package/dist/services/single-event-api.js.map +0 -1
- package/dist/services/utils.js +0 -107
- package/dist/services/utils.js.map +0 -1
- package/dist/setupTests.d.ts +0 -1
- package/dist/stories/Alert.stories.d.ts +0 -10
- package/dist/stories/Button.stories.d.ts +0 -13
- package/dist/types/redux-types.d.ts +0 -15
- package/dist/types/types.d.ts +0 -60
- package/dist/types/types.js +0 -10
- package/dist/types/types.js.map +0 -1
- package/dist/utils/cn.d.ts +0 -6
- package/dist/utils/cn.js +0 -9
- package/dist/utils/cn.js.map +0 -1
- package/dist/utils/date-range.d.ts +0 -4
- package/dist/utils/date-range.js +0 -13
- package/dist/utils/date-range.js.map +0 -1
- package/dist/utils/single-event-helpers.d.ts +0 -50
- package/dist/utils/single-event-helpers.js +0 -18
- package/dist/utils/single-event-helpers.js.map +0 -1
- package/dist/utils/social-validation.js +0 -42
- package/dist/utils/social-validation.js.map +0 -1
- package/dist/utils/utils.js +0 -20
- package/dist/utils/utils.js.map +0 -1
- /package/dist/{components/Alert/Alert.d.ts → src/components/Alert/index.d.ts} +0 -0
- /package/dist/{components → src/components}/FormBuilder/CategoryList.d.ts +0 -0
- /package/dist/{components → src/components}/FormBuilder/OptionList.d.ts +0 -0
- /package/dist/{components → src/components}/FormBuilder/RequiredToggle.d.ts +0 -0
- /package/dist/{components → src/components}/FormBuilder/types.d.ts +0 -0
- /package/dist/{components → src/components}/FormBuilder/utils.d.ts +0 -0
- /package/dist/{components → src/components}/ImageCropModal/index.d.ts +0 -0
- /package/dist/{components → src/components}/InformationPopover.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/common/DescriptionModal.d.ts +0 -0
- /package/dist/{components/ui/FormInput.d.ts → src/components/NewAddEvent/components/AddEventFormInput.d.ts} +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/CheckboxGroup.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/CustomMeetingForm.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/DateTimeField.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/FileUpload.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/FormBuilderProceedModal.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/GoogleMapsAutocompleteInput.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/SingleDateTimeInput.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/StepTwo/CustomFormSection.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/components/TicketTypeSelection.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/StepOne.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/steps/StepTwo.d.ts +0 -0
- /package/dist/{components/EventAddForm → src/components/NewAddEvent}/types.d.ts +0 -0
- /package/dist/{components → src/components}/common/FallbackImage.d.ts +0 -0
- /package/dist/{components → src/components}/ui/Calendar/calendar-utils.d.ts +0 -0
- /package/dist/{components → src/components}/ui/Calendar/index.d.ts +0 -0
- /package/dist/{components/Checkbox → src/components/ui}/Checkbox.d.ts +0 -0
- /package/dist/{components/CustomSelect → src/components/ui}/CustomSelect.d.ts +0 -0
- /package/dist/{components → src/components}/ui/DatePicker/index.d.ts +0 -0
- /package/dist/{components/InputErrorMessage → src/components/ui}/InputErrorMessage.d.ts +0 -0
- /package/dist/{components → src/components}/ui/Modal/index.d.ts +0 -0
- /package/dist/{components/Radio → src/components/ui}/Radio.d.ts +0 -0
- /package/dist/{components → src/components}/ui/RichTextEditor.d.ts +0 -0
- /package/dist/{components → src/components}/ui/TimePicker/index.d.ts +0 -0
- /package/dist/{components → src/components}/ui/TimeSelector/index.d.ts +0 -0
- /package/dist/{components → src/components}/ui/Tooltip/index.d.ts +0 -0
- /package/dist/{lib → src/lib}/constants.d.ts +0 -0
- /package/dist/{lib → src/lib}/cropImage.d.ts +0 -0
- /package/dist/{lib → src/lib}/imageAnalysis.d.ts +0 -0
- /package/dist/{utils → src/lib}/social-validation.d.ts +0 -0
- /package/dist/{lib/utils.d.ts → src/lib/tailwind-merge.d.ts} +0 -0
- /package/dist/{utils → src/lib}/utils.d.ts +0 -0
- /package/dist/{services → src/redux/features/single-event}/helpers.d.ts +0 -0
- /package/dist/{services → src/services}/process-image-on-server.d.ts +0 -0
- /package/dist/{types → src/types}/events.d.ts +0 -0
- /package/dist/{types → src/types}/question.d.ts +0 -0
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
import { useCallback, useState, useRef, useEffect } from "react";
|
|
2
|
-
import { step1Schema } from "../schemas/step1.js";
|
|
3
|
-
import { getStep2Schema } from "../schemas/step2.js";
|
|
4
|
-
const useStepperForm = ({
|
|
5
|
-
initialData,
|
|
6
|
-
storageKey,
|
|
7
|
-
onSaveDraft,
|
|
8
|
-
onSubmitFinal,
|
|
9
|
-
enableLocalStorage = true,
|
|
10
|
-
// Default to true
|
|
11
|
-
initialStep
|
|
12
|
-
}) => {
|
|
13
|
-
const getSavedData = useCallback(() => {
|
|
14
|
-
if (!enableLocalStorage || !storageKey) return null;
|
|
15
|
-
if (typeof window !== "undefined") {
|
|
16
|
-
try {
|
|
17
|
-
const saved = localStorage.getItem(storageKey);
|
|
18
|
-
if (saved) {
|
|
19
|
-
return JSON.parse(saved);
|
|
20
|
-
}
|
|
21
|
-
} catch (e) {
|
|
22
|
-
console.error("Failed to load draft form state", e);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
26
|
-
}, [storageKey, enableLocalStorage]);
|
|
27
|
-
const [currentStep, setCurrentStep] = useState(() => {
|
|
28
|
-
if (initialStep) return initialStep;
|
|
29
|
-
const savedData = getSavedData();
|
|
30
|
-
if (savedData && typeof savedData.currentStep === "number") {
|
|
31
|
-
return savedData.currentStep;
|
|
32
|
-
}
|
|
33
|
-
return 1;
|
|
34
|
-
});
|
|
35
|
-
const [maxStepReached, setMaxStepReached] = useState(() => {
|
|
36
|
-
const savedData = getSavedData();
|
|
37
|
-
let savedMax = 1;
|
|
38
|
-
if (savedData && typeof savedData.maxStepReached === "number") {
|
|
39
|
-
savedMax = Math.max(savedData.maxStepReached, savedData.currentStep || 1);
|
|
40
|
-
}
|
|
41
|
-
if (initialStep) {
|
|
42
|
-
return Math.max(savedMax, initialStep);
|
|
43
|
-
}
|
|
44
|
-
return savedMax;
|
|
45
|
-
});
|
|
46
|
-
const [formState, setFormState] = useState(() => {
|
|
47
|
-
const baseState = {
|
|
48
|
-
name: "",
|
|
49
|
-
description: "",
|
|
50
|
-
event_type: [],
|
|
51
|
-
event_categories: [],
|
|
52
|
-
custom_category: "",
|
|
53
|
-
institution_name: "",
|
|
54
|
-
event_start_timestamp: { date: "", time: "" },
|
|
55
|
-
event_end_timestamp: { date: "", time: "" },
|
|
56
|
-
registration_start_timestamp: { date: "", time: "" },
|
|
57
|
-
registration_end_timestamp: { date: "", time: "" },
|
|
58
|
-
venue: "",
|
|
59
|
-
location_type: "",
|
|
60
|
-
...initialData
|
|
61
|
-
// Merge API data first
|
|
62
|
-
};
|
|
63
|
-
const savedData = getSavedData();
|
|
64
|
-
if (savedData) {
|
|
65
|
-
const restoredState = savedData.formState || savedData;
|
|
66
|
-
return {
|
|
67
|
-
...baseState,
|
|
68
|
-
...restoredState
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
return baseState;
|
|
72
|
-
});
|
|
73
|
-
const saveToLocalStorage = useCallback((data, step, maxStep) => {
|
|
74
|
-
if (typeof window !== "undefined" && enableLocalStorage && storageKey) {
|
|
75
|
-
const storageData = {
|
|
76
|
-
formState: data,
|
|
77
|
-
currentStep: step,
|
|
78
|
-
maxStepReached: maxStep,
|
|
79
|
-
lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
|
|
80
|
-
};
|
|
81
|
-
localStorage.setItem(storageKey, JSON.stringify(storageData));
|
|
82
|
-
}
|
|
83
|
-
}, [storageKey, enableLocalStorage]);
|
|
84
|
-
const [touched, setTouched] = useState({});
|
|
85
|
-
const [errors, setErrors] = useState({});
|
|
86
|
-
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
87
|
-
const latestFormState = useRef(formState);
|
|
88
|
-
const latestCurrentStep = useRef(currentStep);
|
|
89
|
-
const latestMaxStepReached = useRef(maxStepReached);
|
|
90
|
-
useEffect(() => {
|
|
91
|
-
latestFormState.current = formState;
|
|
92
|
-
latestCurrentStep.current = currentStep;
|
|
93
|
-
latestMaxStepReached.current = maxStepReached;
|
|
94
|
-
}, [formState, currentStep, maxStepReached]);
|
|
95
|
-
const [alert, setAlert] = useState({
|
|
96
|
-
show: false,
|
|
97
|
-
message: "",
|
|
98
|
-
type: "success"
|
|
99
|
-
});
|
|
100
|
-
useEffect(() => {
|
|
101
|
-
if (initialData && Object.keys(initialData).length > 0 && setFormState) {
|
|
102
|
-
setFormState((prev) => {
|
|
103
|
-
const nextState = { ...prev };
|
|
104
|
-
Object.keys(initialData).forEach((key) => {
|
|
105
|
-
if (!touched[key]) {
|
|
106
|
-
nextState[key] = initialData[key];
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
if (JSON.stringify(prev) === JSON.stringify(nextState)) {
|
|
110
|
-
return prev;
|
|
111
|
-
}
|
|
112
|
-
saveToLocalStorage(nextState, currentStep, maxStepReached);
|
|
113
|
-
return nextState;
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}, [initialData]);
|
|
117
|
-
useEffect(() => {
|
|
118
|
-
const savedData = getSavedData();
|
|
119
|
-
if (savedData && typeof savedData.currentStep === "number") {
|
|
120
|
-
setCurrentStep(savedData.currentStep);
|
|
121
|
-
setMaxStepReached(savedData.maxStepReached || savedData.currentStep);
|
|
122
|
-
} else {
|
|
123
|
-
if (initialStep) {
|
|
124
|
-
setCurrentStep(initialStep);
|
|
125
|
-
setMaxStepReached(Math.max(1, initialStep));
|
|
126
|
-
} else {
|
|
127
|
-
setCurrentStep(1);
|
|
128
|
-
setMaxStepReached(1);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}, [storageKey, getSavedData, initialStep]);
|
|
132
|
-
const closeAlert = useCallback(() => {
|
|
133
|
-
setAlert((prev) => ({ ...prev, show: false }));
|
|
134
|
-
}, []);
|
|
135
|
-
const getSchemaForStep = useCallback((step, currentState) => {
|
|
136
|
-
switch (step) {
|
|
137
|
-
case 1:
|
|
138
|
-
return step1Schema;
|
|
139
|
-
case 2:
|
|
140
|
-
return getStep2Schema(currentState);
|
|
141
|
-
default:
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
}, []);
|
|
145
|
-
const validateFields = useCallback((fields, currentState) => {
|
|
146
|
-
const schema = getSchemaForStep(currentStep, currentState);
|
|
147
|
-
if (!schema) return;
|
|
148
|
-
const result = schema.safeParse(currentState);
|
|
149
|
-
setErrors((prevErrors) => {
|
|
150
|
-
const newErrors = { ...prevErrors };
|
|
151
|
-
fields.forEach((field) => {
|
|
152
|
-
const fieldKey = field;
|
|
153
|
-
if (result.success) {
|
|
154
|
-
delete newErrors[fieldKey];
|
|
155
|
-
} else {
|
|
156
|
-
const issue = result.error.issues.find((i) => i.path[0] === fieldKey);
|
|
157
|
-
if (issue) {
|
|
158
|
-
newErrors[fieldKey] = issue.message;
|
|
159
|
-
} else {
|
|
160
|
-
delete newErrors[fieldKey];
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
return newErrors;
|
|
165
|
-
});
|
|
166
|
-
}, [currentStep, getSchemaForStep]);
|
|
167
|
-
const validateSingleField = useCallback((field, value, currentState) => {
|
|
168
|
-
validateFields([field], { ...currentState, [field]: value });
|
|
169
|
-
}, [validateFields]);
|
|
170
|
-
const setField = useCallback((field, value, relatedFields = []) => {
|
|
171
|
-
if (setFormState) setFormState((prev) => {
|
|
172
|
-
const newState = { ...prev, [field]: value };
|
|
173
|
-
setTouched((prevTouched) => ({ ...prevTouched, [field]: true }));
|
|
174
|
-
if (touched[field] || errors[field] || relatedFields.length > 0) {
|
|
175
|
-
validateFields([field, ...relatedFields], newState);
|
|
176
|
-
}
|
|
177
|
-
return newState;
|
|
178
|
-
});
|
|
179
|
-
}, [touched, errors, validateFields]);
|
|
180
|
-
const setMultipleFields = useCallback((fieldsOrFn) => {
|
|
181
|
-
if (setFormState) setFormState((prev) => {
|
|
182
|
-
const fields = typeof fieldsOrFn === "function" ? fieldsOrFn(prev) : fieldsOrFn;
|
|
183
|
-
const newState = { ...prev, ...fields };
|
|
184
|
-
const fieldsToValidate = [];
|
|
185
|
-
Object.keys(fields).forEach((key) => {
|
|
186
|
-
const k = key;
|
|
187
|
-
if (touched[k] || errors[k]) {
|
|
188
|
-
fieldsToValidate.push(k);
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
if (fieldsToValidate.length > 0) {
|
|
192
|
-
validateFields(fieldsToValidate, newState);
|
|
193
|
-
}
|
|
194
|
-
return newState;
|
|
195
|
-
});
|
|
196
|
-
}, [touched, errors, validateFields]);
|
|
197
|
-
const handleBlur = useCallback((field) => {
|
|
198
|
-
setTouched((prev) => ({ ...prev, [field]: true }));
|
|
199
|
-
validateSingleField(field, latestFormState.current[field], latestFormState.current);
|
|
200
|
-
}, [validateSingleField]);
|
|
201
|
-
const clearError = useCallback((field) => {
|
|
202
|
-
setErrors((prev) => {
|
|
203
|
-
const newErrors = { ...prev };
|
|
204
|
-
delete newErrors[field];
|
|
205
|
-
return newErrors;
|
|
206
|
-
});
|
|
207
|
-
}, []);
|
|
208
|
-
const scrollToFirstError = (currentErrors) => {
|
|
209
|
-
if (typeof document === "undefined") return;
|
|
210
|
-
const inputs = document.querySelectorAll("[data-name]");
|
|
211
|
-
for (const input of Array.from(inputs)) {
|
|
212
|
-
const fieldName = input.getAttribute("data-name");
|
|
213
|
-
if (fieldName && currentErrors[fieldName]) {
|
|
214
|
-
input.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
215
|
-
const actualInput = input.querySelector("input, textarea, select");
|
|
216
|
-
if (actualInput) actualInput.focus();
|
|
217
|
-
input.classList.add("error-highlight");
|
|
218
|
-
setTimeout(() => input.classList.remove("error-highlight"), 2e3);
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
const validateStep = useCallback((step) => {
|
|
224
|
-
const schema = getSchemaForStep(step, formState);
|
|
225
|
-
if (!schema) return true;
|
|
226
|
-
const result = schema.safeParse(formState);
|
|
227
|
-
if (!result.success) {
|
|
228
|
-
const newErrors = {};
|
|
229
|
-
const newTouched = {};
|
|
230
|
-
result.error.issues.forEach((issue) => {
|
|
231
|
-
const path = issue.path[0];
|
|
232
|
-
if (!newErrors[path]) {
|
|
233
|
-
newErrors[path] = issue.message;
|
|
234
|
-
}
|
|
235
|
-
newTouched[path] = true;
|
|
236
|
-
});
|
|
237
|
-
setErrors((prev) => ({ ...prev, ...newErrors }));
|
|
238
|
-
setTouched((prev) => ({ ...prev, ...newTouched }));
|
|
239
|
-
setTimeout(() => {
|
|
240
|
-
scrollToFirstError(newErrors);
|
|
241
|
-
}, 0);
|
|
242
|
-
return false;
|
|
243
|
-
}
|
|
244
|
-
setErrors({});
|
|
245
|
-
return true;
|
|
246
|
-
}, [formState, getSchemaForStep]);
|
|
247
|
-
const handleNext = () => {
|
|
248
|
-
if (validateStep(currentStep)) {
|
|
249
|
-
const nextStep = currentStep + 1;
|
|
250
|
-
const newMaxStep = Math.max(maxStepReached, nextStep);
|
|
251
|
-
saveToLocalStorage(formState, nextStep, newMaxStep);
|
|
252
|
-
setCurrentStep(nextStep);
|
|
253
|
-
setMaxStepReached(newMaxStep);
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
const handleBack = () => {
|
|
257
|
-
if (currentStep > 1) {
|
|
258
|
-
const prevStep = currentStep - 1;
|
|
259
|
-
saveToLocalStorage(formState, prevStep, maxStepReached);
|
|
260
|
-
setCurrentStep(prevStep);
|
|
261
|
-
}
|
|
262
|
-
};
|
|
263
|
-
const jumpToStep = (targetStep) => {
|
|
264
|
-
if (targetStep === currentStep) return;
|
|
265
|
-
if (targetStep > currentStep) {
|
|
266
|
-
if (!validateStep(currentStep)) return;
|
|
267
|
-
}
|
|
268
|
-
if (targetStep < currentStep || targetStep <= maxStepReached) {
|
|
269
|
-
saveToLocalStorage(formState, targetStep, maxStepReached);
|
|
270
|
-
setCurrentStep(targetStep);
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
const handleSaveDraft = () => {
|
|
274
|
-
saveToLocalStorage(formState, currentStep, maxStepReached);
|
|
275
|
-
if (onSaveDraft) onSaveDraft(formState);
|
|
276
|
-
};
|
|
277
|
-
const handleSubmit = async () => {
|
|
278
|
-
const step1Valid = step1Schema.safeParse(formState).success;
|
|
279
|
-
if (!step1Valid) {
|
|
280
|
-
setCurrentStep(1);
|
|
281
|
-
setTimeout(() => validateStep(1), 100);
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
if (currentStep === 2 && !validateStep(2)) {
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
|
-
if (currentStep === 3 && !validateStep(3)) {
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
if (onSubmitFinal) {
|
|
291
|
-
setIsSubmitting(true);
|
|
292
|
-
try {
|
|
293
|
-
await onSubmitFinal(formState);
|
|
294
|
-
if (typeof window !== "undefined" && enableLocalStorage && storageKey) {
|
|
295
|
-
localStorage.removeItem(storageKey);
|
|
296
|
-
}
|
|
297
|
-
} finally {
|
|
298
|
-
setIsSubmitting(false);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
};
|
|
302
|
-
useEffect(() => {
|
|
303
|
-
if (!enableLocalStorage || !storageKey) return;
|
|
304
|
-
const timer = setTimeout(() => {
|
|
305
|
-
saveToLocalStorage(formState, currentStep, maxStepReached);
|
|
306
|
-
}, 1e3);
|
|
307
|
-
return () => clearTimeout(timer);
|
|
308
|
-
}, [formState, currentStep, maxStepReached, enableLocalStorage, storageKey, saveToLocalStorage]);
|
|
309
|
-
useEffect(() => {
|
|
310
|
-
return () => {
|
|
311
|
-
if (enableLocalStorage && storageKey) {
|
|
312
|
-
const storageData = {
|
|
313
|
-
formState: latestFormState.current,
|
|
314
|
-
currentStep: latestCurrentStep.current,
|
|
315
|
-
maxStepReached: latestMaxStepReached.current,
|
|
316
|
-
lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
|
|
317
|
-
};
|
|
318
|
-
localStorage.setItem(storageKey, JSON.stringify(storageData));
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
}, [storageKey, enableLocalStorage]);
|
|
322
|
-
useEffect(() => {
|
|
323
|
-
const handleBeforeUnload = () => {
|
|
324
|
-
if (enableLocalStorage && storageKey && typeof window !== "undefined") {
|
|
325
|
-
const storageData = {
|
|
326
|
-
formState: latestFormState.current,
|
|
327
|
-
currentStep: latestCurrentStep.current,
|
|
328
|
-
maxStepReached: latestMaxStepReached.current,
|
|
329
|
-
lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
|
|
330
|
-
};
|
|
331
|
-
localStorage.setItem(storageKey, JSON.stringify(storageData));
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
335
|
-
return () => {
|
|
336
|
-
window.removeEventListener("beforeunload", handleBeforeUnload);
|
|
337
|
-
};
|
|
338
|
-
}, [storageKey, enableLocalStorage]);
|
|
339
|
-
return {
|
|
340
|
-
currentStep,
|
|
341
|
-
formState,
|
|
342
|
-
errors,
|
|
343
|
-
isSubmitting,
|
|
344
|
-
setField,
|
|
345
|
-
setMultipleFields,
|
|
346
|
-
handleNext,
|
|
347
|
-
handleBack,
|
|
348
|
-
handleSaveDraft,
|
|
349
|
-
handleSubmit,
|
|
350
|
-
setCurrentStep,
|
|
351
|
-
handleBlur,
|
|
352
|
-
clearError,
|
|
353
|
-
validateStep,
|
|
354
|
-
setErrors,
|
|
355
|
-
validateField: handleBlur,
|
|
356
|
-
alert,
|
|
357
|
-
setAlert,
|
|
358
|
-
closeAlert,
|
|
359
|
-
jumpToStep,
|
|
360
|
-
maxStepReached,
|
|
361
|
-
setMaxStepReached,
|
|
362
|
-
saveToLocalStorage,
|
|
363
|
-
validateFields,
|
|
364
|
-
// Allow manual triggering if strictly needed
|
|
365
|
-
touched
|
|
366
|
-
};
|
|
367
|
-
};
|
|
368
|
-
export {
|
|
369
|
-
useStepperForm
|
|
370
|
-
};
|
|
371
|
-
//# sourceMappingURL=useStepperForm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStepperForm.js","sources":["../../../../src/components/EventAddForm/hooks/useStepperForm.ts"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\r\nimport { useState, useCallback, useEffect, useRef } from 'react';\r\nimport { step1Schema } from '../schemas/step1';\r\nimport { getStep2Schema } from '../schemas/step2';\r\nimport { StepperFormState } from '../types';\r\n\r\ninterface UseStepperFormProps {\r\n initialData?: StepperFormState;\r\n storageKey?: string; // Optional now\r\n onSaveDraft?: (data: StepperFormState) => void;\r\n onSubmitFinal?: (data: StepperFormState) => Promise<void>;\r\n enableLocalStorage?: boolean; // New prop\r\n initialStep?: number;\r\n}\r\n\r\nexport const useStepperForm = ({\r\n initialData,\r\n storageKey,\r\n onSaveDraft,\r\n onSubmitFinal,\r\n enableLocalStorage = true, // Default to true\r\n initialStep\r\n}: UseStepperFormProps) => {\r\n\r\n // Helper to get saved data safely\r\n const getSavedData = useCallback(() => {\r\n if (!enableLocalStorage || !storageKey) return null;\r\n\r\n if (typeof window !== 'undefined') {\r\n try {\r\n const saved = localStorage.getItem(storageKey);\r\n if (saved) {\r\n return JSON.parse(saved);\r\n }\r\n } catch (e) {\r\n console.error(\"Failed to load draft form state\", e);\r\n }\r\n }\r\n return null;\r\n }, [storageKey, enableLocalStorage]);\r\n\r\n // Initialize State\r\n // Priority: 1. Props (initialStep) -> 2. Local Storage Draft -> 3. Defaults\r\n const [currentStep, setCurrentStep] = useState(() => {\r\n if (initialStep) return initialStep;\r\n\r\n const savedData = getSavedData();\r\n if (savedData && typeof savedData.currentStep === 'number') {\r\n return savedData.currentStep;\r\n }\r\n return 1;\r\n });\r\n\r\n const [maxStepReached, setMaxStepReached] = useState(() => {\r\n const savedData = getSavedData();\r\n let savedMax = 1;\r\n if (savedData && typeof savedData.maxStepReached === 'number') {\r\n savedMax = Math.max(savedData.maxStepReached, savedData.currentStep || 1);\r\n }\r\n\r\n if (initialStep) {\r\n return Math.max(savedMax, initialStep);\r\n }\r\n return savedMax;\r\n });\r\n\r\n const [formState, setFormState] = useState<StepperFormState>(() => {\r\n const baseState = {\r\n name: '',\r\n description: '',\r\n event_type: [],\r\n event_categories: [],\r\n custom_category: '',\r\n institution_name: '',\r\n event_start_timestamp: { date: '', time: '' },\r\n event_end_timestamp: { date: '', time: '' },\r\n registration_start_timestamp: { date: '', time: '' },\r\n registration_end_timestamp: { date: '', time: '' },\r\n venue: '',\r\n location_type: '',\r\n ...initialData // Merge API data first\r\n };\r\n\r\n const savedData = getSavedData();\r\n if (savedData) {\r\n const restoredState = savedData.formState || savedData;\r\n // Merge Saved Draft ON TOP of API data/Defaults\r\n return {\r\n ...baseState,\r\n ...restoredState\r\n };\r\n }\r\n\r\n return baseState;\r\n });\r\n\r\n // Save to Local Storage whenever state changes\r\n const saveToLocalStorage = useCallback((data: StepperFormState, step: number, maxStep: number) => {\r\n if (typeof window !== 'undefined' && enableLocalStorage && storageKey) {\r\n const storageData = {\r\n formState: data,\r\n currentStep: step,\r\n maxStepReached: maxStep,\r\n lastUpdated: new Date().toISOString()\r\n };\r\n localStorage.setItem(storageKey, JSON.stringify(storageData));\r\n }\r\n }, [storageKey, enableLocalStorage]);\r\n\r\n const [touched, setTouched] = useState<Record<string, boolean>>({});\r\n const [errors, setErrors] = useState<Record<string, string>>({});\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n\r\n // PERSISTENCE REFS: Keep latest values for unmount cleanup\r\n const latestFormState = useRef(formState);\r\n const latestCurrentStep = useRef(currentStep);\r\n const latestMaxStepReached = useRef(maxStepReached);\r\n\r\n useEffect(() => {\r\n latestFormState.current = formState;\r\n latestCurrentStep.current = currentStep;\r\n latestMaxStepReached.current = maxStepReached;\r\n }, [formState, currentStep, maxStepReached]);\r\n\r\n // Alert State\r\n const [alert, setAlert] = useState<{ show: boolean; message: string; type: 'success' | 'error' }>({\r\n show: false,\r\n message: '',\r\n type: 'success'\r\n });\r\n\r\n // React to initialData changes (API Load)\r\n useEffect(() => {\r\n if (initialData && Object.keys(initialData).length > 0 && setFormState) {\r\n setFormState(prev => {\r\n // Smart Merge: Only update fields that haven't been touched by the user\r\n // or where the local value matches the base default (indicating no interaction)\r\n\r\n const nextState = { ...prev };\r\n\r\n (Object.keys(initialData) as Array<keyof StepperFormState>).forEach(key => {\r\n // If user hasn't touched this field, allow API to update it\r\n // Or if we want to be more aggressive, checks strictly against \"touched\" map\r\n if (!touched[key]) {\r\n (nextState as any)[key] = initialData[key];\r\n }\r\n });\r\n\r\n // Avoid unnecessary updates\r\n if (JSON.stringify(prev) === JSON.stringify(nextState)) {\r\n return prev;\r\n }\r\n\r\n // Sync to localStorage\r\n saveToLocalStorage(nextState, currentStep, maxStepReached);\r\n\r\n return nextState;\r\n });\r\n }\r\n }, [initialData]);\r\n\r\n // Reset steps when storageKey changes (e.g. Navigation between Create/Edit or different IDs)\r\n useEffect(() => {\r\n const savedData = getSavedData();\r\n if (savedData && typeof savedData.currentStep === 'number') {\r\n setCurrentStep(savedData.currentStep);\r\n setMaxStepReached(savedData.maxStepReached || savedData.currentStep);\r\n } else {\r\n // Default Reset: If no saved data (or rehydration disabled), fallback to initialStep or 1\r\n if (initialStep) {\r\n setCurrentStep(initialStep);\r\n setMaxStepReached(Math.max(1, initialStep));\r\n } else {\r\n setCurrentStep(1);\r\n setMaxStepReached(1);\r\n }\r\n }\r\n }, [storageKey, getSavedData, initialStep]);\r\n\r\n\r\n const closeAlert = useCallback(() => {\r\n setAlert(prev => ({ ...prev, show: false }));\r\n }, []);\r\n\r\n // --- Core Validation Logic ---\r\n\r\n const getSchemaForStep = useCallback((step: number, currentState: StepperFormState) => {\r\n switch (step) {\r\n case 1:\r\n return step1Schema;\r\n case 2:\r\n return getStep2Schema(currentState);\r\n default:\r\n // Step 3 or others might not have strict schema validation yet\r\n return null;\r\n }\r\n }, []);\r\n\r\n const validateFields = useCallback((fields: (keyof StepperFormState)[], currentState: StepperFormState) => {\r\n const schema = getSchemaForStep(currentStep, currentState);\r\n\r\n if (!schema) return;\r\n\r\n // Zod check on the FULL state\r\n const result = schema.safeParse(currentState);\r\n\r\n setErrors(prevErrors => {\r\n const newErrors = { ...prevErrors };\r\n\r\n fields.forEach(field => {\r\n const fieldKey = field as string;\r\n if (result.success) {\r\n delete newErrors[fieldKey];\r\n } else {\r\n const issue = result.error.issues.find(i => i.path[0] === fieldKey);\r\n if (issue) {\r\n newErrors[fieldKey] = issue.message;\r\n } else {\r\n delete newErrors[fieldKey];\r\n }\r\n }\r\n });\r\n return newErrors;\r\n });\r\n }, [currentStep, getSchemaForStep]);\r\n\r\n // Legacy alias compliance if needed, but we typically use setField\r\n const validateSingleField = useCallback((field: keyof StepperFormState, value: any, currentState: StepperFormState) => {\r\n validateFields([field], { ...currentState, [field]: value });\r\n }, [validateFields]);\r\n\r\n // --- Field Setters ---\r\n\r\n const setField = useCallback((field: keyof StepperFormState, value: any, relatedFields: (keyof StepperFormState)[] = []) => {\r\n if (setFormState) setFormState(prev => {\r\n const newState = { ...prev, [field]: value };\r\n \r\n // Mark as touched on change\r\n setTouched(prevTouched => ({ ...prevTouched, [field as string]: true }));\r\n\r\n // Validate if touched OR if error exists OR if it's in dependent relation\r\n if (touched[field as string] || errors[field as string] || relatedFields.length > 0) {\r\n validateFields([field, ...relatedFields], newState);\r\n }\r\n return newState;\r\n });\r\n }, [touched, errors, validateFields]);\r\n\r\n const setMultipleFields = useCallback((fieldsOrFn: Partial<StepperFormState> | ((prev: StepperFormState) => Partial<StepperFormState>)) => {\r\n if (setFormState) setFormState(prev => {\r\n const fields = typeof fieldsOrFn === 'function' ? fieldsOrFn(prev) : fieldsOrFn;\r\n const newState = { ...prev, ...fields };\r\n\r\n // Collect fields to validate\r\n const fieldsToValidate: (keyof StepperFormState)[] = [];\r\n Object.keys(fields).forEach(key => {\r\n const k = key as keyof StepperFormState;\r\n if (touched[k as string] || errors[k as string]) {\r\n fieldsToValidate.push(k);\r\n }\r\n });\r\n\r\n if (fieldsToValidate.length > 0) {\r\n validateFields(fieldsToValidate, newState);\r\n }\r\n return newState;\r\n });\r\n }, [touched, errors, validateFields]);\r\n\r\n // --- Interaction Handlers ---\r\n\r\n const handleBlur = useCallback((field: keyof StepperFormState) => {\r\n setTouched(prev => ({ ...prev, [field as string]: true }));\r\n validateSingleField(field, latestFormState.current[field], latestFormState.current);\r\n }, [validateSingleField]);\r\n\r\n const clearError = useCallback((field: string) => {\r\n setErrors(prev => {\r\n const newErrors = { ...prev };\r\n delete newErrors[field];\r\n return newErrors;\r\n });\r\n }, []);\r\n\r\n // --- Navigation & Submission ---\r\n\r\n const scrollToFirstError = (currentErrors: Record<string, string>) => {\r\n if (typeof document === 'undefined') return;\r\n const inputs = document.querySelectorAll('[data-name]');\r\n for (const input of Array.from(inputs)) {\r\n const fieldName = input.getAttribute('data-name');\r\n if (fieldName && currentErrors[fieldName]) {\r\n input.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n // Try to focus the input inside\r\n const actualInput = input.querySelector('input, textarea, select') as HTMLElement;\r\n if (actualInput) actualInput.focus();\r\n\r\n // Visual feedback\r\n input.classList.add('error-highlight');\r\n setTimeout(() => input.classList.remove('error-highlight'), 2000);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n const validateStep = useCallback((step: number): boolean => {\r\n const schema = getSchemaForStep(step, formState);\r\n if (!schema) return true;\r\n\r\n const result = schema.safeParse(formState);\r\n\r\n if (!result.success) {\r\n const newErrors: Record<string, string> = {};\r\n const newTouched: Record<string, boolean> = {};\r\n\r\n result.error.issues.forEach((issue: any) => {\r\n const path = issue.path[0] as string;\r\n if (!newErrors[path]) {\r\n newErrors[path] = issue.message;\r\n }\r\n newTouched[path] = true;\r\n });\r\n\r\n setErrors(prev => ({ ...prev, ...newErrors }));\r\n setTouched(prev => ({ ...prev, ...newTouched }));\r\n\r\n // Timeout to allow state update before scrolling\r\n setTimeout(() => {\r\n scrollToFirstError(newErrors);\r\n }, 0);\r\n\r\n return false;\r\n }\r\n\r\n setErrors({});\r\n return true;\r\n }, [formState, getSchemaForStep]);\r\n\r\n const handleNext = () => {\r\n if (validateStep(currentStep)) {\r\n const nextStep = currentStep + 1;\r\n const newMaxStep = Math.max(maxStepReached, nextStep);\r\n saveToLocalStorage(formState, nextStep, newMaxStep);\r\n setCurrentStep(nextStep);\r\n setMaxStepReached(newMaxStep);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n if (currentStep > 1) {\r\n const prevStep = currentStep - 1;\r\n saveToLocalStorage(formState, prevStep, maxStepReached);\r\n setCurrentStep(prevStep);\r\n }\r\n };\r\n\r\n const jumpToStep = (targetStep: number) => {\r\n if (targetStep === currentStep) return;\r\n\r\n if (targetStep > currentStep) {\r\n if (!validateStep(currentStep)) return;\r\n }\r\n\r\n if (targetStep < currentStep || targetStep <= maxStepReached) {\r\n saveToLocalStorage(formState, targetStep, maxStepReached);\r\n setCurrentStep(targetStep);\r\n }\r\n };\r\n\r\n const handleSaveDraft = () => {\r\n saveToLocalStorage(formState, currentStep, maxStepReached);\r\n if (onSaveDraft) onSaveDraft(formState);\r\n };\r\n\r\n const handleSubmit = async () => {\r\n const step1Valid = step1Schema.safeParse(formState).success;\r\n\r\n if (!step1Valid) {\r\n setCurrentStep(1);\r\n setTimeout(() => validateStep(1), 100);\r\n return;\r\n }\r\n\r\n if (currentStep === 2 && !validateStep(2)) {\r\n return;\r\n }\r\n\r\n if (currentStep === 3 && !validateStep(3)) {\r\n return;\r\n }\r\n\r\n if (onSubmitFinal) {\r\n setIsSubmitting(true);\r\n try {\r\n await onSubmitFinal(formState);\r\n if (typeof window !== 'undefined' && enableLocalStorage && storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n }\r\n };\r\n\r\n // DEBOUNCED AUTO-SAVE: Capture changes as they happen\r\n useEffect(() => {\r\n if (!enableLocalStorage || !storageKey) return;\r\n\r\n const timer = setTimeout(() => {\r\n saveToLocalStorage(formState, currentStep, maxStepReached);\r\n }, 1000); // 1 second debounce\r\n\r\n return () => clearTimeout(timer);\r\n }, [formState, currentStep, maxStepReached, enableLocalStorage, storageKey, saveToLocalStorage]);\r\n\r\n // UNMOUNT PROTECTION: Ensure SPA navigation (browser back/forth) also persists\r\n useEffect(() => {\r\n return () => {\r\n if (enableLocalStorage && storageKey) {\r\n // Use Refs to get the absolute latest state during cleanup\r\n const storageData = {\r\n formState: latestFormState.current,\r\n currentStep: latestCurrentStep.current,\r\n maxStepReached: latestMaxStepReached.current,\r\n lastUpdated: new Date().toISOString()\r\n };\r\n localStorage.setItem(storageKey, JSON.stringify(storageData));\r\n }\r\n };\r\n }, [storageKey, enableLocalStorage]);\r\n\r\n // Auto-save on window close (BeforeUnload)\r\n useEffect(() => {\r\n const handleBeforeUnload = () => {\r\n if (enableLocalStorage && storageKey && typeof window !== 'undefined') {\r\n const storageData = {\r\n formState: latestFormState.current,\r\n currentStep: latestCurrentStep.current,\r\n maxStepReached: latestMaxStepReached.current,\r\n lastUpdated: new Date().toISOString()\r\n };\r\n localStorage.setItem(storageKey, JSON.stringify(storageData));\r\n }\r\n };\r\n\r\n window.addEventListener('beforeunload', handleBeforeUnload);\r\n\r\n return () => {\r\n window.removeEventListener('beforeunload', handleBeforeUnload);\r\n };\r\n }, [storageKey, enableLocalStorage]);\r\n\r\n return {\r\n currentStep,\r\n formState,\r\n errors,\r\n isSubmitting,\r\n setField,\r\n setMultipleFields,\r\n handleNext,\r\n handleBack,\r\n handleSaveDraft,\r\n handleSubmit,\r\n setCurrentStep,\r\n handleBlur,\r\n clearError,\r\n validateStep,\r\n setErrors,\r\n validateField: handleBlur,\r\n alert,\r\n setAlert,\r\n closeAlert,\r\n jumpToStep,\r\n maxStepReached,\r\n setMaxStepReached,\r\n saveToLocalStorage,\r\n validateFields, // Allow manual triggering if strictly needed\r\n touched\r\n };\r\n};\r\n"],"names":[],"mappings":"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"}
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect, useMemo, useCallback } from "react";
|
|
2
|
-
import { TicketTierAvailabilityType } from "../../../types/types.js";
|
|
3
|
-
import { preprocessNumber } from "../schemas/utils.js";
|
|
4
|
-
import dayjs from "../../../node_modules/dayjs/dayjs.min.js";
|
|
5
|
-
import isBetween from "../../../node_modules/dayjs/plugin/isBetween.js";
|
|
6
|
-
import customParseFormat from "../../../node_modules/dayjs/plugin/customParseFormat.js";
|
|
7
|
-
import { object, string, boolean, array, nativeEnum } from "../../../node_modules/zod/v4/classic/schemas.js";
|
|
8
|
-
import { number } from "../../../node_modules/zod/v4/classic/coerce.js";
|
|
9
|
-
import { ZodIssueCode } from "../../../node_modules/zod/v4/classic/compat.js";
|
|
10
|
-
dayjs.extend(isBetween);
|
|
11
|
-
dayjs.extend(customParseFormat);
|
|
12
|
-
const getTicketTierSchema = (eventStart, eventEnd, registrationStart, registrationEnd, existingTierNames) => object({
|
|
13
|
-
name: string().trim().min(1, "Name is required"),
|
|
14
|
-
description: string().trim().max(255, "Description cannot exceed 255 characters").optional(),
|
|
15
|
-
price: preprocessNumber(0, "Price must be a number", true, 1e6, "Price cannot exceed 1,000,000"),
|
|
16
|
-
capacity: preprocessNumber(1, "Capacity must be at least 1."),
|
|
17
|
-
members: preprocessNumber(1, "Members is required."),
|
|
18
|
-
availability_type: nativeEnum(TicketTierAvailabilityType),
|
|
19
|
-
availability_schedule: array(string()),
|
|
20
|
-
has_discount: boolean().optional(),
|
|
21
|
-
discounted_price: number().min(0, "Discounted price must be positive").max(1e6, "Discounted price cannot exceed 1,000,000").int("Price must be an integer").optional(),
|
|
22
|
-
discount_valid_till_date: string().optional(),
|
|
23
|
-
discount_valid_till_time: string().optional()
|
|
24
|
-
}).superRefine((data, ctx) => {
|
|
25
|
-
if (existingTierNames && existingTierNames.length > 0) {
|
|
26
|
-
const trimmedName = data.name.trim().toLowerCase();
|
|
27
|
-
if (existingTierNames.some((n) => n.trim().toLowerCase() === trimmedName)) {
|
|
28
|
-
ctx.addIssue({
|
|
29
|
-
code: ZodIssueCode.custom,
|
|
30
|
-
message: "Ticket tier name must be unique",
|
|
31
|
-
path: ["name"]
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (((data == null ? void 0 : data.capacity) || 1) % ((data == null ? void 0 : data.members) || 1) !== 0) {
|
|
36
|
-
ctx.addIssue({
|
|
37
|
-
code: ZodIssueCode.custom,
|
|
38
|
-
message: "Capacity must be evenly divisible by the number of members",
|
|
39
|
-
path: ["capacity"]
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
if (data.availability_type === TicketTierAvailabilityType.CUSTOM && (!data.availability_schedule || data.availability_schedule.length === 0)) {
|
|
43
|
-
ctx.addIssue({
|
|
44
|
-
code: ZodIssueCode.custom,
|
|
45
|
-
message: "Please select at least one date",
|
|
46
|
-
path: ["availability_schedule"]
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
if (data.has_discount) {
|
|
50
|
-
if (data.discounted_price === void 0) {
|
|
51
|
-
ctx.addIssue({
|
|
52
|
-
code: ZodIssueCode.custom,
|
|
53
|
-
message: "Discounted price is required",
|
|
54
|
-
path: ["discounted_price"]
|
|
55
|
-
});
|
|
56
|
-
} else if (data.discounted_price >= ((data == null ? void 0 : data.price) || 0)) {
|
|
57
|
-
ctx.addIssue({
|
|
58
|
-
code: ZodIssueCode.custom,
|
|
59
|
-
message: "Discounted price must be less than the actual price",
|
|
60
|
-
path: ["discounted_price"]
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
if (!(data == null ? void 0 : data.discount_valid_till_date) && !(data == null ? void 0 : data.discount_valid_till_time)) {
|
|
64
|
-
ctx.addIssue({
|
|
65
|
-
code: ZodIssueCode.custom,
|
|
66
|
-
message: "Please select a discount expiry date and time",
|
|
67
|
-
path: ["discount_valid_till"]
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
const { discount_valid_till_date: date, discount_valid_till_time: time } = data;
|
|
71
|
-
if (!date) {
|
|
72
|
-
ctx.addIssue({
|
|
73
|
-
code: ZodIssueCode.custom,
|
|
74
|
-
message: "Please select a discount expiry date",
|
|
75
|
-
path: ["discount_valid_till_date"]
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
if (!time) {
|
|
79
|
-
ctx.addIssue({
|
|
80
|
-
code: ZodIssueCode.custom,
|
|
81
|
-
message: "Please select a discount expiry time",
|
|
82
|
-
path: ["discount_valid_till_time"]
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
if (date && time) {
|
|
86
|
-
const combined = dayjs(`${date} ${time}`);
|
|
87
|
-
if (!combined.isValid()) {
|
|
88
|
-
ctx.addIssue({
|
|
89
|
-
code: ZodIssueCode.custom,
|
|
90
|
-
message: "Invalid discount expiry date/time",
|
|
91
|
-
path: ["discount_valid_till"]
|
|
92
|
-
});
|
|
93
|
-
} else {
|
|
94
|
-
if ((registrationStart == null ? void 0 : registrationStart.date) && (registrationStart == null ? void 0 : registrationStart.time) && (registrationEnd == null ? void 0 : registrationEnd.date) && (registrationEnd == null ? void 0 : registrationEnd.time)) {
|
|
95
|
-
const startObj = dayjs(`${registrationStart.date} ${registrationStart.time}`);
|
|
96
|
-
const endObj = dayjs(`${registrationEnd.date} ${registrationEnd.time}`);
|
|
97
|
-
if (startObj.isValid() && endObj.isValid()) {
|
|
98
|
-
if (combined.isBefore(startObj)) {
|
|
99
|
-
ctx.addIssue({
|
|
100
|
-
code: ZodIssueCode.custom,
|
|
101
|
-
message: "Discount cannot expire before ticket registration starts",
|
|
102
|
-
path: ["discount_valid_till_date"]
|
|
103
|
-
});
|
|
104
|
-
} else if (combined.isAfter(endObj)) {
|
|
105
|
-
ctx.addIssue({
|
|
106
|
-
code: ZodIssueCode.custom,
|
|
107
|
-
message: "Discount expiry cannot be after ticket registration closes",
|
|
108
|
-
path: ["discount_valid_till_date"]
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
const useTicketTierForm = ({ initialData, defaultState, eventStart, eventEnd, registrationStart, registrationEnd, existingTierNames }) => {
|
|
118
|
-
const [formState, setFormState] = useState({ ...defaultState, ...initialData });
|
|
119
|
-
const [errors, setErrors] = useState({});
|
|
120
|
-
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
121
|
-
useEffect(() => {
|
|
122
|
-
if (initialData) {
|
|
123
|
-
setFormState((prev) => ({ ...prev, ...initialData }));
|
|
124
|
-
}
|
|
125
|
-
}, [initialData]);
|
|
126
|
-
const schema = useMemo(() => getTicketTierSchema(eventStart, eventEnd, registrationStart, registrationEnd, existingTierNames), [eventStart, eventEnd, registrationStart, registrationEnd, existingTierNames]);
|
|
127
|
-
const validateFields = useCallback((fields, currentState) => {
|
|
128
|
-
const result = schema.safeParse(currentState);
|
|
129
|
-
setErrors((prevErrors) => {
|
|
130
|
-
const newErrors = { ...prevErrors };
|
|
131
|
-
fields.forEach((field) => {
|
|
132
|
-
const fieldKey = field;
|
|
133
|
-
if (result.success) {
|
|
134
|
-
delete newErrors[fieldKey];
|
|
135
|
-
} else {
|
|
136
|
-
const issue = result.error.issues.find((i) => i.path[0] === fieldKey);
|
|
137
|
-
if (issue) {
|
|
138
|
-
newErrors[fieldKey] = issue.message;
|
|
139
|
-
} else {
|
|
140
|
-
delete newErrors[fieldKey];
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
if (fields.includes("discount_valid_till_date") || fields.includes("discount_valid_till_time")) {
|
|
145
|
-
if (result.success) {
|
|
146
|
-
delete newErrors.discount_valid_till;
|
|
147
|
-
delete newErrors.discount_valid_till_date;
|
|
148
|
-
delete newErrors.discount_valid_till_time;
|
|
149
|
-
} else {
|
|
150
|
-
const combinedIssue = result.error.issues.find((i) => i.path[0] === "discount_valid_till");
|
|
151
|
-
if (combinedIssue) {
|
|
152
|
-
if (!newErrors.discount_valid_till_date && !newErrors.discount_valid_till_time) {
|
|
153
|
-
newErrors.discount_valid_till_date = combinedIssue.message;
|
|
154
|
-
}
|
|
155
|
-
} else {
|
|
156
|
-
delete newErrors.discount_valid_till;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return newErrors;
|
|
161
|
-
});
|
|
162
|
-
}, [schema]);
|
|
163
|
-
const setFields = useCallback((updates) => {
|
|
164
|
-
if (setFormState) setFormState((prev) => {
|
|
165
|
-
const newState = { ...prev, ...updates };
|
|
166
|
-
if (updates.availability_type !== void 0 && updates.availability_type !== TicketTierAvailabilityType.CUSTOM) {
|
|
167
|
-
newState.availability_schedule = [];
|
|
168
|
-
}
|
|
169
|
-
const fieldsToValidate = Object.keys(updates);
|
|
170
|
-
const hasExistingErrors = fieldsToValidate.some((f) => errors[f]);
|
|
171
|
-
const isDiscountUpdate = updates.discount_valid_till_date !== void 0 || updates.discount_valid_till_time !== void 0;
|
|
172
|
-
if (hasExistingErrors || isDiscountUpdate || updates.price !== void 0 || updates.members !== void 0) {
|
|
173
|
-
const fieldsForSchema = [...fieldsToValidate];
|
|
174
|
-
if (updates.discount_valid_till_date !== void 0) fieldsForSchema.push("discount_valid_till_time", "discount_valid_till");
|
|
175
|
-
if (updates.discount_valid_till_time !== void 0) fieldsForSchema.push("discount_valid_till_date", "discount_valid_till");
|
|
176
|
-
if (updates.price !== void 0) fieldsForSchema.push("discounted_price");
|
|
177
|
-
if (updates.members !== void 0) fieldsForSchema.push("capacity");
|
|
178
|
-
validateFields(fieldsForSchema, newState);
|
|
179
|
-
}
|
|
180
|
-
return newState;
|
|
181
|
-
});
|
|
182
|
-
}, [errors, validateFields]);
|
|
183
|
-
const setField = useCallback((field, value) => {
|
|
184
|
-
setFields({ [field]: value });
|
|
185
|
-
}, [setFields]);
|
|
186
|
-
const handleBlur = useCallback((field) => {
|
|
187
|
-
validateFields([field], formState);
|
|
188
|
-
}, [formState, validateFields]);
|
|
189
|
-
const validate = useCallback(() => {
|
|
190
|
-
const result = schema.safeParse(formState);
|
|
191
|
-
if (!result.success) {
|
|
192
|
-
const newErrors = {};
|
|
193
|
-
result.error.issues.forEach((issue) => {
|
|
194
|
-
const path = issue.path[0];
|
|
195
|
-
if (path) {
|
|
196
|
-
newErrors[path] = issue.message;
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
setErrors(newErrors);
|
|
200
|
-
return false;
|
|
201
|
-
}
|
|
202
|
-
setErrors({});
|
|
203
|
-
return true;
|
|
204
|
-
}, [formState, schema]);
|
|
205
|
-
const handleSubmit = useCallback(async (onSubmit) => {
|
|
206
|
-
if (validate()) {
|
|
207
|
-
setIsSubmitting(true);
|
|
208
|
-
try {
|
|
209
|
-
await onSubmit(formState);
|
|
210
|
-
} finally {
|
|
211
|
-
setIsSubmitting(false);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}, [validate, formState]);
|
|
215
|
-
const resetForm = useCallback(() => {
|
|
216
|
-
setFormState(defaultState);
|
|
217
|
-
setErrors({});
|
|
218
|
-
}, [defaultState]);
|
|
219
|
-
return {
|
|
220
|
-
formState,
|
|
221
|
-
setField,
|
|
222
|
-
setFields,
|
|
223
|
-
handleBlur,
|
|
224
|
-
handleSubmit,
|
|
225
|
-
errors,
|
|
226
|
-
setErrors,
|
|
227
|
-
// Exposing setErrors to allow manual error clearing if needed
|
|
228
|
-
isSubmitting,
|
|
229
|
-
setFormState,
|
|
230
|
-
resetForm
|
|
231
|
-
};
|
|
232
|
-
};
|
|
233
|
-
export {
|
|
234
|
-
getTicketTierSchema,
|
|
235
|
-
useTicketTierForm
|
|
236
|
-
};
|
|
237
|
-
//# sourceMappingURL=useTicketTierForm.js.map
|