Skip to content

Commit 7640055

Browse files
Merge pull request #59 from MarianaSouza/feature/integrate-mailchimp
Integrating MailChimp
2 parents 0987378 + f6f9a1a commit 7640055

File tree

8 files changed

+2623
-13
lines changed

8 files changed

+2623
-13
lines changed

.env-template

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
# When updating the Subscribe MailChimp functionality present on the footer:
3+
# 1 Ask for the url link on Slack
4+
# 2 Create your local `.env` with the url credentials that will not be tracked into our repository for security reasons
5+
6+
NEXT_PUBLIC_MAILCHIMP_URL={Add the url link}
7+

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.next
22
node_modules
3+
.env
34

components/Footer.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Link from "next/link";
22
import footerStyles from "../styles/Footer.module.scss";
33
import { linksNav, linksSocial } from "../utils/links";
4+
import NewsletterSubscribe from "./mailchimp/NewsletterSubscribe";
45

56
export default function Footer() {
67
return (
@@ -30,10 +31,7 @@ export default function Footer() {
3031
<p className={footerStyles.text}>
3132
Get the answer to the most common questions directly to your email
3233
</p>
33-
<form>
34-
<input type="email" placeholder="Email" />
35-
<button>Subscribe</button>
36-
</form>
34+
< NewsletterSubscribe />
3735
<p>*Unsubscribe anytime</p>
3836
</div>
3937
<div className={footerStyles.socialMedia}>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { useState } from 'react';
2+
import { decode } from 'html-entities';
3+
import newsletterStyles from "../../styles/Newsletter.module.scss";
4+
5+
const NewsletterForm = ( { status, message, onValidated }) => {
6+
7+
const [ error, setError ] = useState(null);
8+
const [ email, setEmail ] = useState(null);
9+
10+
/**
11+
* Handle form submit.
12+
*
13+
* @return {{value}|*|boolean|null}
14+
*/
15+
const handleFormSubmit = () => {
16+
17+
setError(null);
18+
19+
if ( ! email ) {
20+
setError( 'Please enter a valid email address' );
21+
return null;
22+
}
23+
24+
const isFormValidated = onValidated({ EMAIL: email });
25+
26+
// On success return true
27+
return email && email.indexOf("@") > -1 && isFormValidated;
28+
}
29+
30+
/**
31+
* Handle Input Key Event.
32+
*
33+
* @param event
34+
*/
35+
const handleInputKeyEvent = ( event ) => {
36+
setError(null);
37+
// Number 13 is the "Enter" key on the keyboard
38+
if (event.keyCode === 13) {
39+
// Cancel the default action, if needed
40+
event.preventDefault();
41+
// Trigger the button element with a click
42+
handleFormSubmit();
43+
}
44+
}
45+
46+
/**
47+
* Extract message from string.
48+
*
49+
* @param {String} message
50+
* @return {null|*}
51+
*/
52+
const getMessage = (message) => {
53+
if ( !message ) {
54+
return null;
55+
}
56+
const result = message?.split('-') ?? null;
57+
if ( "0" !== result?.[0]?.trim() ) {
58+
return decode(message);
59+
}
60+
const formattedMessage = result?.[1]?.trim() ?? null;
61+
return formattedMessage ? decode( formattedMessage ) : null;
62+
}
63+
64+
return (
65+
<>
66+
<div>
67+
<input
68+
onChange={(event) => setEmail(event?.target?.value ?? '')}
69+
type="email"
70+
placeholder="Your email"
71+
onKeyUp={(event) => handleInputKeyEvent(event)}
72+
/>
73+
<button onClick={handleFormSubmit}>
74+
Submit
75+
</button>
76+
</div>
77+
<div className={ newsletterStyles.newsletterFormInfo }>
78+
{status === "sending" && <div className={ newsletterStyles.newsletterFormSending }>Sending...</div>}
79+
{status === "error" || error ? (
80+
<div
81+
className={ newsletterStyles.newsletterFormError }
82+
dangerouslySetInnerHTML={{ __html: error || getMessage( message ) }}
83+
/>
84+
) : null }
85+
{status === "success" && status !== "error" && !error && (
86+
<div className={ newsletterStyles.newsletterFormSuccess } dangerouslySetInnerHTML={{ __html: decode(message) }} />
87+
)}
88+
</div>
89+
</>
90+
);
91+
}
92+
93+
export default NewsletterForm;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import MailchimpSubscribe from 'react-mailchimp-subscribe';
2+
import NewsletterForm from './NewsletterForm';
3+
4+
const NewsletterSubscribe = () => {
5+
6+
const MAILCHIMP_URL = process.env.NEXT_PUBLIC_MAILCHIMP_URL;
7+
8+
return (
9+
<MailchimpSubscribe
10+
url={ MAILCHIMP_URL }
11+
render={(props) => {
12+
const { subscribe, status, message } = props || {};
13+
return (
14+
<NewsletterForm
15+
status={ status }
16+
message={ message }
17+
onValidated={ formData => subscribe( formData ) }
18+
/>
19+
);
20+
} }
21+
/>
22+
);
23+
};
24+
25+
export default NewsletterSubscribe;

0 commit comments

Comments
 (0)