Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
wp-content
/
plugins
/
give
/
src
/
EventTickets
/
resources
/
admin
/
components
/
TicketTypeFormModal
:
index.tsx
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
import {Controller, SubmitHandler, useForm} from 'react-hook-form'; import {__} from '@wordpress/i18n'; import styles from './TicketTypeFormModal.module.scss'; import FormModal from '../FormModal'; import {useTicketTypeForm} from './ticketTypeFormContext'; import {Inputs, TicketModalProps} from './types'; import {useEffect} from 'react'; import EventTicketsApi from '../api'; import CurrencyInput from 'react-currency-input-field'; import parseValueFromLocale from './parseValueFromLocale'; /** * Ticket Form Modal component * * @since 3.20.0 Replace number input with CurrencyInput component * @since 3.6.0 */ export default function TicketTypeFormModal({isOpen, handleClose, apiSettings, eventId}: TicketModalProps) { const {ticketData} = useTicketTypeForm(); const API = new EventTicketsApi(apiSettings); const { register, control, handleSubmit, reset, formState: {errors, isDirty}, } = useForm<Inputs>(); useEffect(() => { reset({ title: ticketData?.title || '', description: ticketData?.description || '', price: ticketData?.price || null, capacity: ticketData?.capacity || 50, }); }, [ticketData, reset]); const onSubmit: SubmitHandler<Inputs> = async (data) => { try { data.price = data.price * 100; data.capacity = data.capacity || 0; const endpoint = ticketData?.id ? `/ticket-type/${ticketData.id}` : `/event/${eventId}/ticket-types`; const response = await API.fetchWithArgs(endpoint, data, 'POST'); handleClose(response); reset(); } catch (error) { console.error('Error submitting ticket data', error); } }; const modalTitle = ticketData?.id ? __('Edit ticket', 'give') : __('Create ticket', 'give'); return ( <FormModal isOpen={isOpen} handleClose={handleClose} title={modalTitle} handleSubmit={handleSubmit(onSubmit)} errors={errors} className={styles.ticketTypeForm} > <div className="givewp-event-tickets__form-row"> <label htmlFor="title">{__('Ticket Name', 'give')}</label> <input type="text" {...register('title', {required: __('The ticket name is required.', 'give')})} aria-invalid={errors.title ? 'true' : 'false'} placeholder={__('Enter ticket name', 'give')} /> </div> <div className="givewp-event-tickets__form-row"> <label htmlFor="description">{__('Description', 'give')}</label> <textarea {...register('description')} rows={4} /> </div> <div className="givewp-event-tickets__form-row givewp-event-tickets__form-row--half"> <div className="givewp-event-tickets__form-column"> <label htmlFor="price">{__('Price', 'give')}</label> <Controller name="price" control={control} render={({field: {onChange, value: fieldValue, ref}}) => ( <CurrencyInput intlConfig={{ locale: navigator.language, currency: apiSettings.currencyCode, }} ref={ref} id="price" name="price" decimalsLimit={2} value={fieldValue} onValueChange={(value) => onChange(parseInt(value) >= 0 ? parseValueFromLocale(value) : '') } /> )} /> <span> {__('Leave empty for', 'give')} <strong>{__('free', 'give')}</strong> </span> </div> <div className="givewp-event-tickets__form-column"> <label htmlFor="capacity">{__('Capacity', 'give')}</label> <input type="number" {...register('capacity', {required: __('The ticket capacity is required.', 'give')})} /> </div> </div> <button type="submit" className={`button button-primary ${!isDirty ? 'disabled' : ''}`} aria-disabled={!isDirty} disabled={!isDirty} > {ticketData?.id ? __('Save changes', 'give') : __('Save ticket', 'give')} </button> </FormModal> ); }