PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / EventTickets / resources / admin / components / EventFormModal / index.tsx
give / src / EventTickets / resources / admin / components / EventFormModal Last commit date
EventFormModal.module.scss 2 years ago index.tsx 1 year ago
index.tsx
168 lines
1 import {SubmitHandler, useForm} from 'react-hook-form';
2 import {__} from '@wordpress/i18n';
3 import styles from './EventFormModal.module.scss';
4 import FormModal from '../FormModal';
5 import EventTicketsApi from '../api';
6
7 /**
8 * Get the next sharp hour
9 *
10 * @since 3.6.0
11 */
12 const getNextSharpHour = (hoursToAdd: number) => {
13 const date = new Date();
14 date.setHours(date.getHours() + hoursToAdd, 0, 0, 0);
15
16 return date;
17 };
18
19 /**
20 * Format a given date to be used in datetime inputs
21 *
22 * @since 3.6.0
23 */
24 const getDateString = (date: Date) => {
25 const offsetInMilliseconds = date.getTimezoneOffset() * 60 * 1000;
26 const dateWithOffset = new Date(date.getTime() - offsetInMilliseconds);
27
28 return removeTimezoneFromDateISOString(dateWithOffset.toISOString());
29 };
30
31 /**
32 * Remove timezone from date string
33 *
34 * @since 3.6.0
35 */
36 const removeTimezoneFromDateISOString = (date: string) => {
37 return date.slice(0, -5);
38 };
39
40 /**
41 * Event Form Modal component
42 *
43 * @since 3.20.0 Added placeholder to event description field
44 * @since 3.6.0
45 */
46 export default function EventFormModal({isOpen, handleClose, apiSettings, title, event}: EventModalProps) {
47 const API = new EventTicketsApi(apiSettings);
48
49 const {
50 register,
51 handleSubmit,
52 formState: {errors, isDirty},
53 } = useForm<Inputs>({
54 defaultValues: {
55 title: event?.title ?? '',
56 description: event?.description ?? '',
57 startDateTime: getDateString(
58 event?.startDateTime?.date ? new Date(event?.startDateTime?.date) : getNextSharpHour(1)
59 ),
60 endDateTime: getDateString(
61 event?.endDateTime?.date ? new Date(event?.endDateTime?.date) : getNextSharpHour(2)
62 ),
63 },
64 });
65
66 const onSubmit: SubmitHandler<Inputs> = async (inputs) => {
67 try {
68 inputs.startDateTime = getDateString(new Date(inputs.startDateTime));
69 inputs.endDateTime = getDateString(new Date(inputs.endDateTime));
70
71 const endpoint = event?.id ? `/event/${event.id}` : '';
72 const response = await API.fetchWithArgs(endpoint, inputs, 'POST');
73
74 handleClose(response);
75 } catch (error) {
76 console.error('Error submitting event event', error);
77 }
78 };
79
80 return (
81 <FormModal
82 isOpen={isOpen}
83 handleClose={handleClose}
84 title={title}
85 handleSubmit={handleSubmit(onSubmit)}
86 errors={errors}
87 className={styles.eventForm}
88 >
89 <div className="givewp-event-tickets__form-row">
90 <label htmlFor="title">{__('Event Name', 'give')}</label>
91 <input
92 type="text"
93 {...register('title', {required: __('The event must have a name!', 'give')})}
94 aria-invalid={errors.title ? 'true' : 'false'}
95 placeholder={__('Enter event name', 'give')}
96 />
97 </div>
98 <div className="givewp-event-tickets__form-row">
99 <label htmlFor="description">{__('Description', 'give')}</label>
100 <textarea
101 {...register('description')}
102 rows={4}
103 placeholder={__('Briefly describe the details of your event', 'give')}
104 />
105 </div>
106 <div className="givewp-event-tickets__form-row givewp-event-tickets__form-row--half">
107 <div className="givewp-event-tickets__form-column">
108 <label htmlFor="startDateTime">{__('Start date and time', 'give')}</label>
109 <input
110 type="datetime-local"
111 {...register('startDateTime', {required: __('The event must have a start date!', 'give')})}
112 aria-invalid={errors.startDateTime ? 'true' : 'false'}
113 />
114 </div>
115 <div className="givewp-event-tickets__form-column">
116 <label htmlFor="endDateTime">{__('End date and time', 'give')}</label>
117 <input type="datetime-local" {...register('endDateTime')} />
118 </div>
119 </div>
120
121 <button
122 type="submit"
123 className={`button button-primary ${!isDirty ? 'disabled' : ''}`}
124 aria-disabled={!isDirty}
125 disabled={!isDirty}
126 >
127 {event?.id ? __('Save changes', 'give') : __('Save event', 'give')}
128 </button>
129 </FormModal>
130 );
131 }
132
133 type Event = {
134 id?: number;
135 title: string;
136 description: string;
137 startDateTime: {
138 date: string;
139 timezone_type: number;
140 timezone: string;
141 };
142 endDateTime: {
143 date: string;
144 timezone_type: number;
145 timezone: string;
146 };
147 createdAt: string;
148 updatedAt: string;
149 };
150
151 type Inputs = {
152 title: string;
153 description: string;
154 startDateTime: string;
155 endDateTime: string;
156 };
157
158 interface EventModalProps {
159 isOpen: boolean;
160 handleClose: (response?: any) => void;
161 apiSettings: {
162 apiRoot: string;
163 apiNonce: string;
164 };
165 title: string;
166 event?: Event;
167 }
168