PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 1 year ago BillingAddress.tsx 1 year ago Name.tsx 2 years ago
Authentication.tsx
184 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 import styles from '../styles.module.scss';
10
11 const {originUrl, isEmbed, embedId} = getCurrentFormUrlData();
12
13 const getRedirectUrl = (redirectUrl: URL) => {
14 const formPageUrl = new URL(originUrl);
15 formPageUrl.searchParams.append('givewp-auth-redirect', 'true');
16
17 if (isEmbed) {
18 formPageUrl.searchParams.append('givewp-is-embed', String(isEmbed));
19 formPageUrl.searchParams.append('givewp-embed-id', embedId);
20 }
21
22 // use wp core login redirect param
23 redirectUrl.searchParams.set('redirect_to', formPageUrl.toString());
24
25 return redirectUrl;
26 };
27 const handleLoginPageRedirected = () => {
28 const formPageUrl = new URL(window.top.location.href);
29
30 const isAuthRedirect =
31 formPageUrl.searchParams.has('givewp-auth-redirect') &&
32 formPageUrl.searchParams.get('givewp-auth-redirect') === 'true';
33
34 if (isAuthRedirect) {
35 const isEmbedRedirect =
36 formPageUrl.searchParams.has('givewp-is-embed') &&
37 formPageUrl.searchParams.get('givewp-is-embed') === 'true';
38 const isThisEmbed =
39 formPageUrl.searchParams.has('givewp-embed-id') &&
40 formPageUrl.searchParams.get('givewp-embed-id') === embedId;
41
42 if (isEmbedRedirect && isThisEmbed) {
43 window.frameElement.scrollIntoView({
44 behavior: 'smooth',
45 });
46 }
47 }
48 };
49
50 handleLoginPageRedirected();
51
52 interface AuthProps extends GroupProps {
53 nodeComponents: {
54 login: FC<FieldProps | {}>;
55 password: FC<FieldProps | {}>;
56 };
57 required: boolean;
58 isAuthenticated: boolean;
59 loginRedirect: boolean;
60 loginRedirectUrl: string;
61 loginNotice: string;
62 loginConfirmation: string;
63 lostPasswordUrl: string;
64 }
65
66 export default function Authentication({
67 nodeComponents: {login: Login, password: Password},
68 required,
69 isAuthenticated,
70 loginRedirect,
71 loginRedirectUrl,
72 loginNotice,
73 loginConfirmation,
74 lostPasswordUrl,
75 name,
76 }: AuthProps) {
77 const [isAuth, setIsAuth] = useState<boolean>(isAuthenticated);
78 const [showLogin, setShowLogin] = useState<boolean>(required);
79 const toggleShowLogin = () => setShowLogin(!showLogin);
80 const redirectToLoginPage = (e) => {
81 e.preventDefault();
82 const loginUrl = getRedirectUrl(new URL(loginRedirectUrl));
83 window.top.location.assign(loginUrl);
84 };
85
86 return (
87 <>
88 {isAuth && (
89 <p style={{textAlign: 'center'}}>
90 <em>{loginConfirmation}</em>
91 </p>
92 )}
93 {!isAuth && showLogin && (
94 <LoginForm success={() => setIsAuth(true)} lostPasswordUrl={lostPasswordUrl} nodeName={name}>
95 <Login />
96 <Password />
97 </LoginForm>
98 )}
99 {!isAuth && !showLogin && (
100 <div style={{display: 'flex'}}>
101 {loginRedirect ? (
102 <LoginNotice onClick={redirectToLoginPage}>{loginNotice}</LoginNotice>
103 ) : (
104 <LoginNotice onClick={toggleShowLogin}>{loginNotice}</LoginNotice>
105 )}
106 </div>
107 )}
108 </>
109 );
110 }
111
112 /**
113 * @since 4.3.0 replace "Forgot your password" anchor element with a button since it does not contain a valid href attribute.
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 className={styles['authentication__login-form']}>
151 <div className={styles['authentication__login-form__fields-wrapper']}>{children}</div>
152
153 {!!errorMessage && <FieldError error={errorMessage} name={nodeName} />}
154
155 <div className={styles['authentication__login-form__buttons-wrapper']}>
156 <div className={styles['authentication__login-form__reset-wrapper']}>
157 {__('Forgot your password?', 'give')}
158 <button
159 className={styles['authentication__login-form__reset-button']}
160 onClick={(event) => {
161 event.preventDefault();
162 const passwordResetUrl = getRedirectUrl(new URL(lostPasswordUrl));
163 window.top.location.assign(passwordResetUrl);
164 }}
165 >
166 <span>{__('Reset', 'give')}</span>
167 </button>
168 </div>
169 <button className={styles['authentication__login-form__login-button']} onClick={tryLogin}>
170 {__('Log In', 'give')}
171 </button>
172 </div>
173 </div>
174 );
175 };
176
177 const LoginNotice = ({children, onClick}) => {
178 return (
179 <button className={styles['authentication__login-notice']} onClick={onClick}>
180 {children}
181 </button>
182 );
183 };
184