Skip to content

Commit 1d8c757

Browse files
committed
validating emails for l&e
1 parent 3ab6398 commit 1d8c757

File tree

3 files changed

+105
-4
lines changed

3 files changed

+105
-4
lines changed

src/hooks/useFormEmailValidator.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { RefObject } from 'react';
2+
import useFormListener from './useFormListener';
3+
4+
export interface FormEmailValidatorOptions {
5+
form: RefObject<HTMLFormElement>;
6+
invalid: () => any;
7+
valid: () => any;
8+
}
9+
10+
export default function useFormEmailValidator({
11+
form,
12+
invalid,
13+
valid,
14+
}: FormEmailValidatorOptions) {
15+
useFormListener({
16+
form,
17+
listener: (ev: SubmitEvent) => {
18+
const emailField = document.querySelector(
19+
'input[type="email"]',
20+
) as HTMLInputElement;
21+
22+
if (!emailField) {
23+
return;
24+
}
25+
26+
const value = emailField.value;
27+
28+
if (/@(gmail|yahoo|aol|outlook)\.com/g.test(value)) {
29+
ev.preventDefault();
30+
ev.stopImmediatePropagation();
31+
ev.stopPropagation();
32+
invalid();
33+
34+
return;
35+
}
36+
37+
valid();
38+
},
39+
});
40+
}

src/hooks/useFormListener.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import useIsBrowser from '@docusaurus/useIsBrowser';
2+
import { RefObject, useLayoutEffect } from 'react';
3+
4+
export interface FormListenerOptions {
5+
form: RefObject<HTMLFormElement>;
6+
listener: (this: HTMLFormElement, ev: SubmitEvent) => any;
7+
}
8+
9+
export default function useFormListener({
10+
form,
11+
listener,
12+
}: FormListenerOptions) {
13+
const isBrowser = useIsBrowser();
14+
15+
useLayoutEffect(() => {
16+
if (!isBrowser) {
17+
return;
18+
}
19+
20+
const formEl = form.current;
21+
22+
if (!formEl) {
23+
return;
24+
}
25+
26+
formEl.addEventListener('submit', listener);
27+
28+
return () => {
29+
formEl.removeEventListener('submit', listener);
30+
};
31+
}, [isBrowser, form.current]);
32+
}

src/pages/lp/learn-and-earn-jwt.tsx

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,30 @@
22
import React from 'react';
33
import Layout from '@theme/Layout';
44
import LandingPageWrapper from '../../components/LandingPageWrapper';
5+
import useFormEmailValidator from '../../hooks/useFormEmailValidator';
56

67
export default function LearnAndEarnJWT() {
8+
const form = React.createRef<HTMLFormElement>();
9+
const warn = React.createRef<HTMLSpanElement>();
10+
11+
useFormEmailValidator({
12+
form,
13+
invalid() {
14+
if (!warn.current) {
15+
return;
16+
}
17+
18+
warn.current.style.display = 'block';
19+
},
20+
valid() {
21+
if (!warn.current) {
22+
return;
23+
}
24+
25+
warn.current.style.display = 'none';
26+
},
27+
});
28+
729
return (
830
<LandingPageWrapper>
931
{/* @ts-ignore */}
@@ -17,9 +39,9 @@ export default function LearnAndEarnJWT() {
1739
</h1>
1840
<div
1941
style={{
20-
width: '70%',
21-
minWidth: '370px',
22-
margin: 'auto',
42+
display: 'flex',
43+
justifyContent: 'center',
44+
margin: '1rem',
2345
}}>
2446
<p>
2547
Complete this short assessment for a chance to earn a $25 Amazon
@@ -29,15 +51,22 @@ export default function LearnAndEarnJWT() {
2951
target="_blank">
3052
this e-book.
3153
</a>
54+
<strong>
55+
Only business emails (no gmail, yahoo, etc.) will be accepted.
56+
</strong>
3257
</p>
3358
</div>
3459
<div
3560
style={{
3661
display: 'flex',
3762
justifyContent: 'center',
3863
alignItems: 'center',
64+
flexDirection: 'column',
3965
}}>
40-
<form className="m-form" id="mktoForm_4161"></form>
66+
<form ref={form} className="m-form" id="mktoForm_4161"></form>
67+
<strong ref={warn} style={{ display: 'none' }}>
68+
Only business emails (no gmail, yahoo, etc.) will be accepted.
69+
</strong>
4170
</div>
4271
</article>
4372
</Layout>

0 commit comments

Comments
 (0)