PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.16.6.1
GiveWP – Donation Plugin and Fundraising Platform v4.16.6.1
4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 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 / templates / index.tsx
give / src / DonationForms / resources / app / templates Last commit date
index.tsx 2 years ago
index.tsx
114 lines
1 import type {FC, ReactNode} from 'react';
2 import {useMemo} from 'react';
3 import {Element, Field, Group} from '@givewp/forms/types';
4
5 /**
6 * Get the active template from the window
7 *
8 * @since 3.0.0
9 */
10 const template = window.givewp.form.templates
11
12 /**
13 * Get the NodeWrapper from active template
14 *
15 * @since 3.0.0
16 */
17 const NodeWrapper = template.layouts.wrapper;
18
19 /**
20 * Find the names of nodeType and type based on the value of the template.
21 *
22 * @since 3.0.0
23 */
24 export function findTemplateKeys<S extends keyof typeof template, T extends keyof typeof template[S]>(
25 templateValue: ReactNode
26 ): {nodeType: S | null; type: T | null} {
27 let nodeType = null;
28 let type = null;
29
30 Object.entries(template).forEach((firstLevel) => {
31 if (typeof firstLevel[1] === 'object') {
32 const firstLevelKey = firstLevel[0];
33 const secondLevelKeys = Object.keys(firstLevel[1]);
34 const templateType = secondLevelKeys.find((key) => firstLevel[1][key] === templateValue);
35
36 if (templateType) {
37 type = templateType;
38 nodeType = firstLevelKey;
39 }
40 }
41 });
42
43 return {nodeType, type};
44 }
45
46 /**
47 * This HOC will wrap a template component in our NodeWrapper and automatically figure out what nodeType and type to use as props.
48 *
49 * @since 3.0.0
50 */
51 export function withTemplateWrapper<TemplateProps>(
52 Template: FC<TemplateProps>,
53 htmlTag: keyof JSX.IntrinsicElements = 'div',
54 name?: string
55 ): FC<TemplateProps> {
56 // @ts-ignore
57 const {nodeType, type} = findTemplateKeys(Template);
58
59 return (props: TemplateProps) => (
60 <NodeWrapper nodeType={nodeType} type={type} htmlTag={htmlTag} name={name}>
61 <Template {...(props as TemplateProps)} />
62 </NodeWrapper>
63 );
64 }
65
66 /**
67 * A component version of withTemplateWrapper that uses the child component to determine the NodeWrapper props.
68 *
69 * @since 3.0.0
70 */
71 export function TemplateWrapper({children, htmlTag}: {children: JSX.Element; htmlTag?: keyof JSX.IntrinsicElements}) {
72 const {nodeType, type} = useMemo(() => findTemplateKeys(children.type), []);
73
74 return (
75 <NodeWrapper nodeType={nodeType} type={type} htmlTag={htmlTag}>
76 {children}
77 </NodeWrapper>
78 );
79 }
80
81 /**
82 * A hook version of withTemplateWrapper
83 *
84 * @since 3.0.0
85 */
86 export function useTemplateWrapper<TemplateProps>(
87 Template: FC<TemplateProps>,
88 htmlTag: keyof JSX.IntrinsicElements = 'div',
89 name?: string
90 ): FC<TemplateProps> {
91 return useMemo(() => withTemplateWrapper(Template, htmlTag, name), [Template]);
92 }
93
94 /**
95 * @since 3.0.0
96 */
97 export function fieldTemplateExists(field: Field): boolean {
98 return template.fields.hasOwnProperty(field.type);
99 }
100
101 /**
102 * @since 3.0.0
103 */
104 export function elementTemplateExists(element: Element): boolean {
105 return template.elements.hasOwnProperty(element.type);
106 }
107
108 /**
109 * @since 3.0.0
110 */
111 export function groupTemplateExists(group: Group): boolean {
112 return template.groups.hasOwnProperty(group.type);
113 }
114