PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.1.2
GiveWP – Donation Plugin and Fundraising Platform v3.1.2
4.16.3 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 / DonationForms / resources / app / utilities / useDonationFormPubSub.ts
give / src / DonationForms / resources / app / utilities Last commit date
ConvertFieldAPIRulesToJoi.ts 2 years ago PrepareFormData.ts 2 years ago amountFormatter.ts 2 years ago buildRegisterValidationOptions.ts 2 years ago conditionOperatorFunctions.js 2 years ago convertValuesToFormData.ts 2 years ago createValidationObjectFromFields.js 2 years ago generateRequestErrors.ts 2 years ago getCurrentFormUrlData.js 2 years ago getDefaultValuesFromSections.ts 2 years ago getDonationFormNodeSettings.ts 2 years ago getErrorByFieldName.ts 2 years ago getWindowData.ts 2 years ago groups.ts 2 years ago handleFormRedirect.ts 2 years ago handleFormSubmitRequest.ts 2 years ago handleValidationRequest.ts 2 years ago isRouteInlineRedirect.ts 2 years ago memoNode.ts 2 years ago mountWindowData.ts 2 years ago postData.ts 2 years ago postFormData.ts 2 years ago registerFieldAndBuildProps.tsx 2 years ago useDonationFormPubSub.ts 2 years ago
useDonationFormPubSub.ts
154 lines
1 import {RefObject, useEffect} from 'react';
2 import {iframeRef} from '@givewp/form-builder/components/canvas/DesignPreview';
3 import {FormSettings} from '@givewp/form-builder/types';
4 import {FormColors, FormGoal, RequireAtLeastOne} from '@givewp/forms/types';
5
6 /**
7 * Events used in design mode
8 */
9 export const PREVIEW_EVENTS = {
10 SETTINGS: 'preview:settings',
11 GOAL: 'preview:goal',
12 COLORS: 'preview:colors',
13 CSS: 'preview:css',
14 }
15
16 /**
17 * Simple Publish/Subscribe system used for handling form state in preview mode
18 *
19 * @since 3.1.0
20 */
21 export default function useDonationFormPubSub() {
22
23 const events = {};
24
25 useEffect(() => {
26 addEventListener('message', eventListener, false);
27 return () => removeEventListener('message', eventListener);
28 }, []);
29
30 const getMessage = (message: MessageEvent) => {
31 // handle IframeResizer messages
32 if (typeof message.data === 'string') {
33 if (message.data.includes('[iFrameSizer]message:')) {
34 return JSON.parse(message.data.replace('[iFrameSizer]message:', ''));
35 }
36 }
37
38 return message.data
39 }
40
41 const eventListener = (message: MessageEvent) => {
42 const {event, data} = getMessage(message);
43
44 if (events[event]) {
45
46 const filtered = {};
47 // Allow only primitive values
48 Object.entries(data).forEach(([key, value]) => {
49 if (typeof value !== 'function' && typeof value !== 'object') {
50 filtered[key] = value;
51 }
52 });
53
54 events[event].forEach((callback: (data: any) => void) => {
55 callback(filtered);
56 });
57 }
58 }
59
60 const subscribe = (event: string, callback: Function) => {
61 if (!events[event]) {
62 events[event] = [];
63 }
64
65 events[event].push(callback);
66 }
67
68 const publish = (event: string, data: any, iframeRef: RefObject<any>) => {
69 if (iframeRef.current?.sendMessage) {
70 iframeRef.current.sendMessage({
71 event,
72 data
73 });
74 }
75 }
76
77 const publishSettings = (data: RequireAtLeastOne<FormSettings>) => {
78 publish(PREVIEW_EVENTS.SETTINGS, data, iframeRef)
79 }
80
81 const publishGoal = (data: RequireAtLeastOne<FormGoal>) => {
82 publish(PREVIEW_EVENTS.GOAL, data, iframeRef)
83 }
84
85 const publishGoalType = (type: string) => {
86 const isMoney = ['amount', 'amountFromSubscriptions'].includes(type);
87
88 publish(PREVIEW_EVENTS.GOAL, {
89 type,
90 label: type,
91 typeIsCount: !isMoney,
92 typeIsMoney: isMoney,
93 }, iframeRef)
94 }
95
96 const publishColors = (data: RequireAtLeastOne<FormColors>) => {
97 publish(PREVIEW_EVENTS.COLORS, data, iframeRef)
98 }
99
100 const publishCss = (data: {customCss: string} ) => {
101 publish(PREVIEW_EVENTS.CSS, data, iframeRef)
102 }
103
104 const subscribeToSettings = (callback: (data: FormSettings) => void) => {
105 subscribe(PREVIEW_EVENTS.SETTINGS, callback)
106 }
107
108 const subscribeToGoal = (callback: (data: FormGoal) => void) => {
109 subscribe(PREVIEW_EVENTS.GOAL, callback)
110 }
111
112 const subscribeToColors = (callback: (data: FormColors) => void) => {
113 subscribe(PREVIEW_EVENTS.COLORS, callback)
114 }
115
116 const subscribeToCss = (callback: (data: {customCss: string}) => void) => {
117 subscribe(PREVIEW_EVENTS.CSS, callback)
118 }
119
120 /**
121 * Unsubscribe from event
122 *
123 * @param event
124 */
125 const unsubscribe = (event: string) => {
126 if (events[event]) {
127 delete events[event];
128 }
129 }
130
131 /**
132 * Unsubscribe from all event
133 */
134 const unsubscribeAll = () => {
135 for (const key in PREVIEW_EVENTS) {
136 delete events[key];
137 }
138 }
139
140 return {
141 unsubscribe,
142 unsubscribeAll,
143 publishGoal,
144 publishGoalType,
145 publishColors,
146 publishCss,
147 publishSettings,
148 subscribeToGoal,
149 subscribeToColors,
150 subscribeToSettings,
151 subscribeToCss
152 }
153 }
154