PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.15.0
GiveWP – Donation Plugin and Fundraising Platform v4.15.0
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 7 months 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 1 year ago getCurrentFormUrlData.js 1 year 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 1 year ago handleFormSubmitRequest.ts 1 year ago handleValidationRequest.ts 2 years ago isRouteInlineRedirect.ts 2 years ago memoNode.ts 2 years ago mountWindowData.ts 1 year ago postData.ts 2 years ago postFormData.ts 2 years ago registerFieldAndBuildProps.tsx 1 year ago setDesignSettings.ts 2 years ago useDonationFormPubSub.ts 1 year ago
useDonationFormPubSub.ts
183 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 GOAL_SOURCE: 'preview:goal_source',
13 COLORS: 'preview:colors',
14 CSS: 'preview:css',
15 DESIGN_SETTINGS: 'preview:design-settings',
16 }
17
18 /**
19 * Simple Publish/Subscribe system used for handling form state in preview mode
20 *
21 * @since 3.1.0
22 */
23 export default function useDonationFormPubSub() {
24
25 const events = {};
26
27 useEffect(() => {
28 addEventListener('message', eventListener, false);
29 return () => removeEventListener('message', eventListener);
30 }, []);
31
32 const getMessage = (message: MessageEvent) => {
33 // handle IframeResizer messages
34 if (typeof message.data === 'string') {
35 if (message.data.includes('[iFrameSizer]message:')) {
36 return JSON.parse(message.data.replace('[iFrameSizer]message:', ''));
37 }
38 }
39
40 return message.data
41 }
42
43 const eventListener = (message: MessageEvent) => {
44 const {event, data} = getMessage(message);
45
46 if (events[event]) {
47
48 const filtered = {};
49 // Allow only primitive values
50 Object.entries(data).forEach(([key, value]) => {
51 if (typeof value !== 'function' && typeof value !== 'object') {
52 filtered[key] = value;
53 }
54 });
55
56 events[event].forEach((callback: (data: any) => void) => {
57 callback(filtered);
58 });
59 }
60 }
61
62 const subscribe = (event: string, callback: Function) => {
63 if (!events[event]) {
64 events[event] = [];
65 }
66
67 events[event].push(callback);
68 }
69
70 const publish = (event: string, data: any, iframeRef: RefObject<any>) => {
71 if (iframeRef.current?.sendMessage) {
72 iframeRef.current.sendMessage({
73 event,
74 data
75 });
76 }
77 }
78
79 const publishSettings = (data: RequireAtLeastOne<FormSettings>) => {
80 publish(PREVIEW_EVENTS.SETTINGS, data, iframeRef)
81 }
82
83
84 const publishDesignSettings = (data: RequireAtLeastOne<FormSettings>) => {
85 publish(PREVIEW_EVENTS.DESIGN_SETTINGS, data, iframeRef)
86 }
87
88 const publishGoal = (data: RequireAtLeastOne<FormGoal>) => {
89 publish(PREVIEW_EVENTS.GOAL, data, iframeRef)
90 }
91
92 /**
93 * @since 4.1.0
94 */
95 const publishGoalSource = (data: RequireAtLeastOne<FormSettings>) => {
96 publish(PREVIEW_EVENTS.GOAL_SOURCE, data, iframeRef)
97 }
98
99 const publishGoalType = (type: string) => {
100 const isMoney = ['amount', 'amountFromSubscriptions'].includes(type);
101
102 publish(PREVIEW_EVENTS.GOAL, {
103 type,
104 label: type,
105 typeIsCount: !isMoney,
106 typeIsMoney: isMoney,
107 }, iframeRef)
108 }
109
110 const publishColors = (data: RequireAtLeastOne<FormColors>) => {
111 publish(PREVIEW_EVENTS.COLORS, data, iframeRef)
112 }
113
114 const publishCss = (data: {customCss: string} ) => {
115 publish(PREVIEW_EVENTS.CSS, data, iframeRef)
116 }
117
118 const subscribeToSettings = (callback: (data: FormSettings) => void) => {
119 subscribe(PREVIEW_EVENTS.SETTINGS, callback)
120 }
121
122 const subscribeToDesignSettings = (callback: (data) => void) => {
123 subscribe(PREVIEW_EVENTS.DESIGN_SETTINGS, callback)
124 }
125
126 const subscribeToGoal = (callback: (data: FormGoal) => void) => {
127 subscribe(PREVIEW_EVENTS.GOAL, callback)
128 }
129
130 /**
131 * @since 4.1.0
132 */
133 const subscribeToGoalSource = (callback: (data: 'campaign' | 'form') => void) => {
134 subscribe(PREVIEW_EVENTS.GOAL, callback)
135 }
136
137 const subscribeToColors = (callback: (data: FormColors) => void) => {
138 subscribe(PREVIEW_EVENTS.COLORS, callback)
139 }
140
141 const subscribeToCss = (callback: (data: {customCss: string}) => void) => {
142 subscribe(PREVIEW_EVENTS.CSS, callback)
143 }
144
145 /**
146 * Unsubscribe from event
147 *
148 * @param event
149 */
150 const unsubscribe = (event: string) => {
151 if (events[event]) {
152 delete events[event];
153 }
154 }
155
156 /**
157 * Unsubscribe from all event
158 */
159 const unsubscribeAll = () => {
160 for (const key in PREVIEW_EVENTS) {
161 delete events[key];
162 }
163 }
164
165 return {
166 unsubscribe,
167 unsubscribeAll,
168 publishGoal,
169 publishGoalSource,
170 publishGoalType,
171 publishColors,
172 publishCss,
173 publishSettings,
174 publishDesignSettings,
175 subscribeToGoal,
176 subscribeToGoalSource,
177 subscribeToColors,
178 subscribeToSettings,
179 subscribeToCss,
180 subscribeToDesignSettings
181 }
182 }
183