PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.3.1
GiveWP – Donation Plugin and Fundraising Platform v3.3.1
4.16.7.2 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 / registrars / templates / groups / Authentication.tsx
give / src / DonationForms / resources / registrars / templates / groups Last commit date
DonationAmount 2 years ago Authentication.tsx 2 years ago BillingAddress.tsx 2 years ago Name.tsx 2 years ago
Authentication.tsx
192 lines
1 import {FC, useState} from 'react';
2 import {__} from '@wordpress/i18n';
3 import type {FieldProps} from '@givewp/forms/propTypes';
4 import {GroupProps} from '@givewp/forms/propTypes';
5 import getWindowData from '@givewp/forms/app/utilities/getWindowData';
6 import postData from '@givewp/forms/app/utilities/postData';
7 import getCurrentFormUrlData from '@givewp/forms/app/utilities/getCurrentFormUrlData';
8 import FieldError from '../layouts/FieldError';
9
10 const {originUrl, isEmbed, embedId} = getCurrentFormUrlData();
11
12 const getRedirectUrl = (redirectUrl: URL) => {
13 const formPageUrl = new URL(originUrl);
14 formPageUrl.searchParams.append('givewp-auth-redirect', 'true');
15
16 if (isEmbed) {
17 formPageUrl.searchParams.append('givewp-is-embed', String(isEmbed));
18 formPageUrl.searchParams.append('givewp-embed-id', embedId);
19 }
20
21 // use wp core login redirect param
22 redirectUrl.searchParams.set('redirect_to', formPageUrl.toString());
23
24 return redirectUrl;
25 };
26 const handleLoginPageRedirected = () => {
27 const formPageUrl = new URL(window.top.location.href);
28
29 const isAuthRedirect =
30 formPageUrl.searchParams.has('givewp-auth-redirect') &&
31 formPageUrl.searchParams.get('givewp-auth-redirect') === 'true';
32
33 if (isAuthRedirect) {
34 const isEmbedRedirect =
35 formPageUrl.searchParams.has('givewp-is-embed') &&
36 formPageUrl.searchParams.get('givewp-is-embed') === 'true';
37 const isThisEmbed =
38 formPageUrl.searchParams.has('givewp-embed-id') &&
39 formPageUrl.searchParams.get('givewp-embed-id') === embedId;
40
41 if (isEmbedRedirect && isThisEmbed) {
42 window.frameElement.scrollIntoView({
43 behavior: 'smooth',
44 });
45 }
46 }
47 };
48
49 handleLoginPageRedirected();
50
51 interface AuthProps extends GroupProps {
52 nodeComponents: {
53 login: FC<FieldProps | {}>;
54 password: FC<FieldProps | {}>;
55 };
56 required: boolean;
57 isAuthenticated: boolean;
58 loginRedirect: boolean;
59 loginRedirectUrl: string;
60 loginNotice: string;
61 loginConfirmation: string;
62 lostPasswordUrl: string;
63 }
64
65 export default function Authentication({
66 nodeComponents: {login: Login, password: Password},
67 required,
68 isAuthenticated,
69 loginRedirect,
70 loginRedirectUrl,
71 loginNotice,
72 loginConfirmation,
73 lostPasswordUrl,
74 name,
75 }: AuthProps) {
76 const [isAuth, setIsAuth] = useState<boolean>(isAuthenticated);
77 const [showLogin, setShowLogin] = useState<boolean>(required);
78 const toggleShowLogin = () => setShowLogin(!showLogin);
79
80 return (
81 <>
82 {isAuth && (
83 <p style={{textAlign: 'center'}}>
84 <em>{loginConfirmation}</em>
85 </p>
86 )}
87 {!isAuth && showLogin && (
88 <LoginForm success={() => setIsAuth(true)} lostPasswordUrl={lostPasswordUrl} nodeName={name}>
89 <Login />
90 <Password />
91 </LoginForm>
92 )}
93 {!isAuth && !showLogin && (
94 <div style={{display: 'flex', flexDirection: 'row-reverse'}}>
95 {loginRedirect ? (
96 <button
97 type="button"
98 onClick={() => {
99 const loginUrl = getRedirectUrl(new URL(loginRedirectUrl));
100
101 window.top.location.assign(loginUrl);
102 }}
103 >
104 {loginNotice}
105 </button>
106 ) : (
107 <LoginNotice onClick={toggleShowLogin}>{loginNotice}</LoginNotice>
108 )}
109 </div>
110 )}
111 </>
112 );
113 }
114
115 const LoginForm = ({children, success, lostPasswordUrl, nodeName}) => {
116 const {authUrl} = getWindowData();
117 const {useWatch, useFormContext} = window.givewp.form.hooks;
118 const {setValue, getValues} = useFormContext();
119 const {firstName, lastName, email} = getValues();
120
121 const login = useWatch({name: 'login'});
122 const password = useWatch({name: 'password'});
123
124 const [errorMessage, setErrorMessage] = useState<string>('');
125
126 const tryLogin = async (event) => {
127 event.preventDefault();
128
129 const {response} = await postData(authUrl, {
130 login: login,
131 password: password,
132 });
133
134 const {data: responseData} = await response.json();
135 if (response.ok) {
136 setValue('firstName', firstName || responseData.firstName);
137 setValue('lastName', lastName || responseData.lastName);
138 setValue('email', email || responseData.email);
139 success();
140 } else {
141 setErrorMessage(
142 'authentication_error' === responseData.type
143 ? responseData.message
144 : __('Something went wrong. Please try or again or contact a site administrator.', 'give')
145 );
146 }
147 };
148
149 return (
150 <div style={{display: 'flex', flexDirection: 'column', gap: '15px'}}>
151 <div style={{display: 'flex', flexDirection: 'row', gap: '15px'}}>{children}</div>
152
153 {!!errorMessage && <FieldError error={errorMessage} name={nodeName} />}
154
155 <div
156 style={{
157 display: 'flex',
158 flexDirection: 'row-reverse',
159 gap: '15px',
160 justifyContent: 'space-between',
161 alignItems: 'baseline',
162 }}
163 >
164 <button style={{width: 'auto'}} onClick={tryLogin}>
165 {__('Log In', 'give')}
166 </button>
167 <a
168 onClick={(event) => {
169 event.preventDefault();
170 const passwordResetUrl = getRedirectUrl(new URL(lostPasswordUrl));
171
172 window.top.location.assign(passwordResetUrl);
173 }}
174 >
175 {__('Reset Password', 'give')}
176 </a>
177 </div>
178 </div>
179 );
180 };
181
182 const LoginNotice = ({children, onClick}) => {
183 return (
184 <button
185 onClick={onClick}
186 style={{width: 'auto', backgroundColor: 'transparent', border: 0, color: 'var(--wp-admin-theme-color)'}}
187 >
188 {children}
189 </button>
190 )
191 }
192