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