PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.3
GiveWP – Donation Plugin and Fundraising Platform v4.16.3
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 / hooks / useVisibilityCondition.ts
give / src / DonationForms / resources / app / hooks Last commit date
useCurrencyFormatter.ts 2 years ago useDonationSummary.ts 1 year ago useFormData.ts 11 months ago useFormSubmitButton.ts 1 year ago useVisibilityCondition.ts 4 months ago
useVisibilityCondition.ts
86 lines
1 import {useMemo} from 'react';
2 import {useFormContext} from 'react-hook-form';
3 import {FieldCondition} from '@givewp/forms/types';
4 import conditionOperatorFunctions from '@givewp/forms/app/utilities/conditionOperatorFunctions';
5
6 type WatchedFields = Map<string, any>;
7
8 /**
9 * Adds visibility conditions to a field. The given conditions are watched and the hook returns true or false based on
10 * whether the conditions are met.
11 *
12 * 4.14.1 use watch instead of useWatch to get the field values.
13 * @since 3.0.0
14 */
15 export default function useVisibilityCondition(conditions: FieldCondition[]): boolean {
16 const {watch} = useFormContext();
17
18 const watchedFieldNames = useMemo<string[]>(() => {
19 if (!conditions.length) {
20 return [];
21 }
22
23 return [...conditions.reduce(watchFieldsReducer, new Set()).values()];
24 }, [conditions]);
25
26 const fieldValues = watch(watchedFieldNames);
27
28 // watch returns a numeric array of values, so we need to map them to the field names.
29 const watchedFields = useMemo<WatchedFields>(() => {
30 return watchedFieldNames.reduce((fields, name, index) => {
31 fields.set(name, fieldValues[index]);
32 return fields;
33 }, new Map());
34 }, [watchedFieldNames, fieldValues]);
35
36 return useMemo<boolean>(() => {
37 if (!conditions.length) {
38 return true;
39 }
40
41 return visibliityConditionsPass(conditions, watchedFields);
42 }, [watchedFields]);
43 }
44
45 /**
46 * Returns true or false based on whether the conditions are met.
47 *
48 * @since 3.0.0
49 */
50 export function visibliityConditionsPass(conditions: FieldCondition[], watchedFields: WatchedFields): boolean {
51 if (!conditions.length) {
52 return true;
53 }
54
55 function conditionPassReducer(passing: boolean, condition: FieldCondition) {
56 if (condition.type === 'basic') {
57 const value = watchedFields.get(condition.field);
58
59 const conditionPasses = conditionOperatorFunctions[condition.comparisonOperator](value, condition.value);
60
61 return condition.logicalOperator === 'and'
62 ? (passing ?? true) && conditionPasses
63 : (passing ?? false) || conditionPasses;
64 }
65
66 return condition.boolean === 'and'
67 ? (passing ?? true) && condition.conditions.reduce(conditionPassReducer, null)
68 : (passing ?? false) || condition.conditions.reduce(conditionPassReducer, null);
69 }
70
71 return conditions.reduce(conditionPassReducer, null);
72 }
73
74 /**
75 * A recursive reducer that returns a set of fields that are being watched by the conditions.
76 *
77 * @since 3.0.0
78 */
79 function watchFieldsReducer(fields: Set<string>, condition: FieldCondition) {
80 if (condition.type === 'basic') {
81 return fields.add(condition.field);
82 }
83
84 return condition.conditions.reduce(watchFieldsReducer, fields);
85 }
86