PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.8
Booking for Appointments and Events Calendar – Amelia v2.4.8
2.4.8 2.4.7 2.4.6 2.4.5 2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / v3 / src / assets / js / public / restore.js
ameliabooking / v3 / src / assets / js / public Last commit date
actions.js 1 month ago booking.js 2 days ago cabinet.js 1 month ago cart.js 2 days ago catalog.js 2 days ago coupon.js 1 month ago customFields.js 1 month ago customFontFace.js 1 month ago eventFormCssVars.js 1 month ago events.js 1 month ago facebookPixel.js 1 month ago ivy.js 1 month ago package.js 2 days ago panel.js 1 month ago public.js 1 month ago renderActions.js 1 month ago restore.js 2 days ago slots.js 2 days ago stripePaymentIntent.js 2 days ago translation.js 1 month ago user.js 1 month ago
restore.js
333 lines
1 import { useRemoveUrlParameter } from '../common/helper.js'
2 import {
3 useAppointmentCalendarData,
4 usePackageCalendarData,
5 useEventCalendarData,
6 useBookingError,
7 useNotify,
8 } from './booking.js'
9 import httpClient from '../../../plugins/axios'
10 import { settings } from '../../../plugins/settings'
11
12 function fixType(item, key) {
13 item[key] =
14 item[key] === undefined || item[key] === null || item[key] === '' ? null : parseInt(item[key])
15 }
16
17 function fixCacheData(data) {
18 let keys = []
19
20 data.request.state.attachments = []
21
22 data.request.state.booked = null
23
24 data.request.state.loading = true
25
26 data.request.state.ready = false
27
28 if (!('extras' in data.request.state.appointment.bookings[0])) {
29 data.request.state.appointment.bookings[0].extras = []
30 }
31
32 fixType(data.request.state, 'packageId')
33
34 fixType(data.request.state, 'appointmentsIndex')
35
36 data.request.state.appointments.forEach((a) => {
37 keys = ['index', 'packageId', 'serviceId']
38
39 keys.forEach((key) => {
40 fixType(a, key)
41 })
42
43 for (let serviceId in a.services) {
44 a.services[serviceId].list.forEach((i) => {
45 keys = ['locationId', 'providerId']
46
47 keys.forEach((key) => {
48 fixType(i, key)
49 })
50
51 if (!('extras' in i) || i.extras === undefined || i.extras === null) {
52 i.extras = []
53 }
54 })
55
56 keys = ['locationId', 'providerId']
57
58 keys.forEach((key) => {
59 fixType(a.services[serviceId], key)
60 })
61 }
62 })
63
64 keys = ['locationId', 'providerId', 'serviceId', 'categoryId', 'packageId']
65
66 keys.forEach((key) => {
67 fixType(data.request.state.appointment, key)
68 })
69 }
70
71 function getRestoreTargetStep(data) {
72 if ('bookableType' in data.request.state && data.request.state.bookableType === 'event') {
73 return 'EventPayment'
74 }
75
76 return 'paymentStep'
77 }
78
79 export function resolveRestoreStepIndex(steps, targetStep, fallbackStep) {
80 const targetKey = targetStep || fallbackStep
81 let index = steps.findIndex((step) => step.key === targetKey || step.name === targetKey)
82
83 if (index < 0) {
84 index = Math.max(0, steps.length - 2)
85 }
86
87 return index
88 }
89
90 function setRestoredPaymentGateway(store, data) {
91 const gateway = data.paymentMethod || 'stripe'
92
93 if ('bookableType' in data.request.state && data.request.state.bookableType === 'event') {
94 store.commit('payment/setPaymentGateway', gateway)
95 } else {
96 store.commit('booking/setPaymentGateway', gateway)
97 }
98 }
99
100 function useRestore(store, shortcodeData) {
101 let data =
102 'ameliaCache' in window && window.ameliaCache.length && window.ameliaCache[0]
103 ? JSON.parse(window.ameliaCache[0])
104 : null
105
106 let userClickedBack = false
107
108 if (
109 !data ||
110 (!data.status &&
111 parseInt(data.request.form.shortcode.counter) !== parseInt(shortcodeData.counter))
112 ) {
113 let savedData = sessionStorage.getItem('ameliaCacheData')
114 const navEntries = performance.getEntriesByType('navigation')
115 const navType =
116 navEntries && navEntries.length > 0 ? navEntries[0].type : performance.navigation.type
117 if (savedData && JSON.parse(savedData) && (navType === 'back_forward' || navType === 2)) {
118 data = JSON.parse(savedData)
119 userClickedBack = true
120 } else {
121 if (savedData) {
122 sessionStorage.setItem('ameliaCacheData', null)
123 }
124 return null
125 }
126 }
127
128 sessionStorage.removeItem('ameliaCacheData')
129
130 try {
131 window.history.replaceState(
132 null,
133 null,
134 useRemoveUrlParameter(
135 useRemoveUrlParameter(window.location.href, 'ameliaWcCache'),
136 'ameliaCache',
137 ),
138 )
139 } catch (e) {
140 console.log(e)
141 }
142
143 if (
144 data.request.state.attachments &&
145 (data.request.state.attachments.length || Object.keys(data.request.state.attachments).length)
146 ) {
147 fixCacheData(data)
148 }
149
150 if ('bookableType' in data.request.state && data.request.state.bookableType === 'event') {
151 store.commit('eventEntities/setEventsDisplay', data.request.state.eventsDisplay)
152 store.commit('bookableType/setType', data.request.state.bookableType)
153 store.commit('pagination/setAllData', data.request.state.pagination)
154 store.commit('params/setAllData', data.request.state.params)
155 store.commit('eventBooking/setEventId', data.request.state.eventId)
156 store.commit('coupon/setCoupon', data.request.state.coupon)
157 store.commit('customFields/setAllData', data.request.state.customFields)
158 store.commit('customerInfo/setAllData', data.request.state.customerInfo)
159 store.commit('payment/setAllData', data.request.state.payment)
160 store.commit('persons/setAllData', data.request.state.persons)
161 store.commit('tickets/setAllData', data.request.state.tickets)
162
163 // * Request because event params and pagination
164 if (data.request.state.eventsDisplay === 'calendar') {
165 store.dispatch('eventEntities/requestEvents', 'calendar')
166 store.dispatch('eventEntities/requestEvents', 'upcoming')
167 } else {
168 store.dispatch('eventEntities/requestEvents')
169 }
170 store.dispatch('customFields/filterEventCustomFields')
171 } else {
172 store.state.booking = { ...data.request.state }
173 }
174
175 if (userClickedBack) {
176 if (
177 (data.paymentMethod === 'mollie' ||
178 data.paymentMethod === 'barion' ||
179 data.paymentMethod === 'razorpay') &&
180 data.bookings
181 ) {
182 if (data.packageCustomer) {
183 httpClient
184 .post('/bookings/delete/remotely/' + data.packageCustomer.id, {
185 skipEventHandler: true,
186 type: 'package',
187 token: data.packageCustomer.token,
188 })
189 .catch((e) => {
190 console.log(e.message)
191 })
192 } else {
193 data.bookings.forEach((booking) => {
194 httpClient
195 .post('/bookings/delete/remotely/' + booking.id, {
196 skipEventHandler: true,
197 type: data.type,
198 token: booking.token,
199 })
200 .catch((e) => {
201 console.log(e.message)
202 })
203 })
204 }
205 }
206
207 return {
208 result: 'error',
209 targetStep: getRestoreTargetStep(data),
210 steps: data.request.form.steps,
211 sidebar: data.request.form.sidebar,
212 }
213 }
214
215 if (settings.payments.mollie.cancelBooking && data.status === null) {
216 let bookings = []
217 if (data.response.type === 'package') {
218 bookings = data.response.package.map((p) => p.booking)
219 } else {
220 bookings = [data.response.booking].concat(data.response.recurring.map((r) => r.booking))
221 }
222
223 bookings.forEach((booking) => {
224 httpClient
225 .get(
226 '/bookings/cancel/' +
227 booking.id +
228 '&token=' +
229 booking.token +
230 '&type=' +
231 data.response.type +
232 '&fromForm=' +
233 true,
234 )
235 .catch((e) => {
236 console.log(e.message)
237 })
238 })
239
240 return {
241 result: 'canceled',
242 targetStep: getRestoreTargetStep(data),
243 steps: data.request.form.steps,
244 sidebar: data.request.form.sidebar,
245 }
246 } else {
247 switch (data.status !== null ? data.status : 'paid') {
248 case 'canceled':
249 if ('bookableType' in data.request.state && data.request.state.bookableType === 'event') {
250 store.commit('payment/setError', window.wpAmeliaLabels['payment_canceled'])
251 } else {
252 store.commit('booking/setError', window.wpAmeliaLabels['payment_canceled'])
253 }
254
255 setRestoredPaymentGateway(store, data)
256
257 return {
258 result: 'canceled',
259 targetStep: getRestoreTargetStep(data),
260 steps: data.request.form.steps,
261 sidebar: data.request.form.sidebar,
262 }
263
264 case 'failed': {
265 // Cache may only have status=failed (redirect gateways), or include data from markCompletionFailed
266 const failedErrorResponse =
267 data.data && typeof data.data === 'object'
268 ? { data: data.data }
269 : { data: { paymentSuccessful: false } }
270
271 if ('bookableType' in data.request.state && data.request.state.bookableType === 'event') {
272 store.commit('payment/setError', useBookingError(failedErrorResponse, store))
273 } else {
274 store.commit('booking/setError', useBookingError(failedErrorResponse, store))
275 }
276
277 setRestoredPaymentGateway(store, data)
278
279 return {
280 result: 'error',
281 targetStep: getRestoreTargetStep(data),
282 steps: data.request.form.steps,
283 sidebar: data.request.form.sidebar,
284 }
285 }
286
287 case 'paid':
288 switch (data.response.type) {
289 case 'appointment':
290 store.commit('booking/setBooked', useAppointmentCalendarData(store, data.response))
291
292 break
293
294 case 'package':
295 store.commit('booking/setBooked', usePackageCalendarData(store, data.response))
296
297 break
298
299 case 'event':
300 store.commit('eventBooking/setBooked', useEventCalendarData(store, data.response))
301
302 break
303 }
304
305 if (
306 !(
307 'request' in data &&
308 'form' in data.request &&
309 'shortcode' &&
310 data.request.form &&
311 'trigger' in data.request.form.shortcode &&
312 data.request.form.shortcode.trigger
313 )
314 ) {
315 useNotify(
316 store,
317 data.response,
318 () => {},
319 () => {},
320 )
321 }
322
323 return {
324 result: 'success',
325 steps: data.request.form.steps,
326 sidebar: data.request.form.sidebar,
327 }
328 }
329 }
330 }
331
332 export default useRestore
333