PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.15.1
GiveWP – Donation Plugin and Fundraising Platform v3.15.1
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 2 years ago
index.tsx
163 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.6.0
44 */
45 export default function EventFormModal({isOpen, handleClose, apiSettings, title, event}: EventModalProps) {
46 const API = new EventTicketsApi(apiSettings);
47
48 const {
49 register,
50 handleSubmit,
51 formState: {errors, isDirty},
52 } = useForm<Inputs>({
53 defaultValues: {
54 title: event?.title ?? '',
55 description: event?.description ?? '',
56 startDateTime: getDateString(
57 event?.startDateTime?.date ? new Date(event?.startDateTime?.date) : getNextSharpHour(1)
58 ),
59 endDateTime: getDateString(
60 event?.endDateTime?.date ? new Date(event?.endDateTime?.date) : getNextSharpHour(2)
61 ),
62 },
63 });
64
65 const onSubmit: SubmitHandler<Inputs> = async (inputs) => {
66 try {
67 inputs.startDateTime = getDateString(new Date(inputs.startDateTime));
68 inputs.endDateTime = getDateString(new Date(inputs.endDateTime));
69
70 const endpoint = event?.id ? `/event/${event.id}` : '';
71 const response = await API.fetchWithArgs(endpoint, inputs, 'POST');
72
73 handleClose(response);
74 } catch (error) {
75 console.error('Error submitting event event', error);
76 }
77 };
78
79 return (
80 <FormModal
81 isOpen={isOpen}
82 handleClose={handleClose}
83 title={title}
84 handleSubmit={handleSubmit(onSubmit)}
85 errors={errors}
86 className={styles.eventForm}
87 >
88 <div className="givewp-event-tickets__form-row">
89 <label htmlFor="title">{__('Event Name', 'give')}</label>
90 <input
91 type="text"
92 {...register('title', {required: __('The event must have a name!', 'give')})}
93 aria-invalid={errors.title ? 'true' : 'false'}
94 placeholder={__('Enter event name', 'give')}
95 />
96 </div>
97 <div className="givewp-event-tickets__form-row">
98 <label htmlFor="description">{__('Description', 'give')}</label>
99 <textarea {...register('description')} rows={4} />
100 </div>
101 <div className="givewp-event-tickets__form-row givewp-event-tickets__form-row--half">
102 <div className="givewp-event-tickets__form-column">
103 <label htmlFor="startDateTime">{__('Start date and time', 'give')}</label>
104 <input
105 type="datetime-local"
106 {...register('startDateTime', {required: __('The event must have a start date!', 'give')})}
107 aria-invalid={errors.startDateTime ? 'true' : 'false'}
108 />
109 </div>
110 <div className="givewp-event-tickets__form-column">
111 <label htmlFor="endDateTime">{__('End date and time', 'give')}</label>
112 <input type="datetime-local" {...register('endDateTime')} />
113 </div>
114 </div>
115
116 <button
117 type="submit"
118 className={`button button-primary ${!isDirty ? 'disabled' : ''}`}
119 aria-disabled={!isDirty}
120 disabled={!isDirty}
121 >
122 {event?.id ? __('Save changes', 'give') : __('Save event', 'give')}
123 </button>
124 </FormModal>
125 );
126 }
127
128 type Event = {
129 id?: number;
130 title: string;
131 description: string;
132 startDateTime: {
133 date: string;
134 timezone_type: number;
135 timezone: string;
136 };
137 endDateTime: {
138 date: string;
139 timezone_type: number;
140 timezone: string;
141 };
142 createdAt: string;
143 updatedAt: string;
144 };
145
146 type Inputs = {
147 title: string;
148 description: string;
149 startDateTime: string;
150 endDateTime: string;
151 };
152
153 interface EventModalProps {
154 isOpen: boolean;
155 handleClose: (response?: any) => void;
156 apiSettings: {
157 apiRoot: string;
158 apiNonce: string;
159 };
160 title: string;
161 event?: Event;
162 }
163