Skip to content

Commit 4857f16

Browse files
Merge branch 'develop' into gsheet-contentful
2 parents cf02e74 + 719c10b commit 4857f16

File tree

14 files changed

+314
-146
lines changed

14 files changed

+314
-146
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ workflows:
282282
filters:
283283
branches:
284284
only:
285-
- gsheet-contentful
285+
- free
286286
# This is alternate dev env for parallel testing
287287
- "build-qa":
288288
context : org-global

__tests__/shared/components/Settings/Preferences/Email/__snapshots__/index.jsx.snap

Lines changed: 25 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -10,69 +10,32 @@ exports[`renders email preferences setting page correctly 1`] = `
1010
E-Mail Preferences
1111
</h1>
1212
<div
13-
className="src-shared-components-Settings-Preferences-Email-___styles__sub-title___2Fh1W"
13+
className="src-shared-components-Settings-Preferences-Email-___styles__unsubscribed-msg___3yh6s"
1414
>
15-
Your preferences
16-
</div>
17-
<div
18-
className="src-shared-components-Settings-Preferences-Email-___styles__preferences-container___38AVF"
19-
>
20-
<ToggleableItem
21-
checked={false}
22-
id="Pipeline"
23-
onToggle={[Function]}
24-
primaryText="Challenge Pipeline"
25-
secondaryText="Subscribe to this newsletter if you want to get updates on the types of challenges coming up in the future. To view these challenges at your leisure you can always visit the <a href=\\"https://www.topcoder.com/community/pipeline\\" style=\\"color:#0d61bf;text-decoration:underline\\">Challenge Pipeline</a> page."
26-
value="Pipeline"
27-
/>
28-
<ToggleableItem
29-
checked={false}
30-
id="Gig Work"
31-
onToggle={[Function]}
32-
primaryText="Gig Work"
33-
secondaryText="This newsletter gets sent out at various times, specifically when we have an opportunity of mass appeal. For more information you can visit the <a href=\\"https://www.topcoder.com/community/taas\\" style=\\"color:#0d61bf;text-decoration:underline\\">Gig Work</a> page."
34-
value="Gig Work"
35-
/>
36-
<ToggleableItem
37-
checked={false}
38-
id="Monthly Newsletter"
39-
onToggle={[Function]}
40-
primaryText="Monthly Newsletter"
41-
secondaryText="This newsletter gets sent out at the end of every month and contains a variety of important information across all of our tracks."
42-
value="Monthly Newsletter"
43-
/>
44-
<ToggleableItem
45-
checked={false}
46-
id="Marathon Match Reminders"
47-
onToggle={[Function]}
48-
primaryText="Marathon Match Reminders"
49-
secondaryText="Receive updates whenever a new marathon match is scheduled."
50-
value="Marathon Match Reminders"
51-
/>
52-
<ToggleableItem
53-
checked={false}
54-
id="Single Round Match Reminders"
55-
onToggle={[Function]}
56-
primaryText="Single Round Match (SRM) Reminders"
57-
secondaryText="Attention Competitive Programmers! If there is any newsletter you are subscribing too, it better be this one. Receive updates when a new SRM event is scheduled."
58-
value="Single Round Match Reminders"
59-
/>
60-
<ToggleableItem
61-
checked={false}
62-
id="TCO Tuesdays"
63-
onToggle={[Function]}
64-
primaryText="TCO Newsletter"
65-
secondaryText="For all the latest updates surrounding the <a href=\\"https://www.topcoder.com/community/member-programs/topcoder-open\\" style=\\"color:#0d61bf;text-decoration:underline\\">Topcoder Open</a> you should definitely be subscribing to this one. Expect an update in your mailbox every Tuesday!"
66-
value="TCO Tuesdays"
67-
/>
68-
<ToggleableItem
69-
checked={false}
70-
id="RDM"
71-
onToggle={[Function]}
72-
primaryText="Rapid Development Match (RDM) Reminders"
73-
secondaryText="Receive notifications of our brand new RDMs! These rated, development matches will be a fun new way to engage with us!"
74-
value="RDM"
75-
/>
15+
<h3>
16+
You are not subscribed to receive Topcoder emails
17+
</h3>
18+
<p>
19+
If this was a mistake or if you would like to resubscribe, please click the button below.
20+
</p>
21+
<ThemedButton
22+
active={false}
23+
composeAdhocTheme="deeply"
24+
composeContextTheme="softly"
25+
disabled={false}
26+
enforceA={false}
27+
mapThemrProps={[Function]}
28+
onClick={[Function]}
29+
onMouseDown={null}
30+
openNewTab={false}
31+
replace={false}
32+
size={null}
33+
themePriority="adhoc-context-default"
34+
to={null}
35+
type="button"
36+
>
37+
Resubscribe
38+
</ThemedButton>
7639
</div>
7740
</div>
7841
`;

package-lock.json

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/server/routes/mailchimp.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ routes.post('/:listId/members', (req, res, next) => new MailchimpService().doReg
2020

2121
routes.get('/:listId/members/:emailHash', (req, res) => new MailchimpService().checkSubscription(req).then(res.send.bind(res)));
2222

23-
routes.put('/:listId/members/:emailHash', (req, res) => new MailchimpService().subscribeInterests(req).then(res.send.bind(res)));
23+
routes.put('/:listId/members/:emailHash', (req, res) => new MailchimpService().updateMember(req).then(res.send.bind(res)));
2424

2525
routes.post('/:listId/members/:emailHash/tags', (req, res) => new MailchimpService().subscribeTags(req).then(res.send.bind(res)));
2626

src/server/services/mailchimp.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export default class MailchimpService {
5151
return res.json();
5252
}
5353

54-
async subscribeInterests(req) {
54+
async updateMember(req) {
5555
const formData = JSON.stringify(req.body);
5656
const res = await fetch(`${this.mailchimpBaseUrl}/lists/${req.params.listId}/members/${req.params.emailHash}`, {
5757
method: 'PUT',

src/shared/actions/newsletterPreferences.js

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ async function fetchDataDone(emailHash, listId = config.NEWSLETTER_SIGNUP.DEFAUL
3535

3636
return {
3737
email: emailHash,
38-
preferences: subs.tags,
38+
preferences: subs.interests,
39+
status: subs.status,
3940
error,
4041
};
4142
} catch (error) {
@@ -48,26 +49,24 @@ async function fetchDataDone(emailHash, listId = config.NEWSLETTER_SIGNUP.DEFAUL
4849

4950
// Updates member newsletter subscription
5051
async function updateSubscriptionsDone(
51-
emailHash, tagId, status, listId = config.NEWSLETTER_SIGNUP.DEFAUL_LIST_ID,
52+
emailHash, groupId, status, listId = config.NEWSLETTER_SIGNUP.DEFAUL_LIST_ID,
5253
) {
5354
/* NOTE: In the real life in most cases you don't want to use fetch() directly
5455
* in an action. You want to create a service for your calls and use it here.
5556
* However, in this example, to keep it a bit more compact, we use fetch()
5657
* directly here. */
5758
try {
5859
let error = false;
59-
const fetchUrl = `${PROXY_ENDPOINT}/${listId}/members/${emailHash}/tags`;
60+
const fetchUrl = `${PROXY_ENDPOINT}/${listId}/members/${emailHash}`;
6061

6162
const data = {
62-
tags: [
63-
{ name: tagId, status: status ? 'active' : 'inactive' },
64-
],
63+
interests: { [groupId]: !!status },
6564
};
6665

6766
const formData = JSON.stringify(data);
6867
// use proxy for avoid 'Access-Control-Allow-Origin' bug
6968
await fetch(fetchUrl, {
70-
method: 'POST',
69+
method: 'PUT',
7170
headers: {
7271
'Content-Type': 'application/json',
7372
},
@@ -79,26 +78,68 @@ async function updateSubscriptionsDone(
7978
});
8079

8180
return {
82-
id: tagId,
81+
id: groupId,
8382
checked: status,
8483
email: emailHash,
8584
error,
8685
};
8786
} catch (error) {
8887
return {
89-
id: tagId,
88+
id: groupId,
9089
checked: status,
9190
email: emailHash,
9291
error,
9392
};
9493
}
9594
}
9695

96+
/**
97+
* Resubscribe member for TC emails/list
98+
* @param {string} emailHash the email
99+
*/
100+
async function resubscribeDone(emailHash, listId = config.NEWSLETTER_SIGNUP.DEFAUL_LIST_ID) {
101+
try {
102+
let error = false;
103+
const fetchUrl = `${PROXY_ENDPOINT}/${listId}/members/${emailHash}`;
104+
105+
const data = {
106+
status: 'subscribed',
107+
};
108+
109+
const formData = JSON.stringify(data);
110+
// use proxy for avoid 'Access-Control-Allow-Origin' bug
111+
await fetch(fetchUrl, {
112+
method: 'PUT',
113+
headers: {
114+
'Content-Type': 'application/json',
115+
},
116+
body: formData,
117+
})
118+
.then((result) => {
119+
if (!result.ok) error = true;
120+
return result.json();
121+
});
122+
123+
return {
124+
email: emailHash,
125+
resubscribe: true,
126+
error,
127+
};
128+
} catch (error) {
129+
return {
130+
email: emailHash,
131+
error,
132+
};
133+
}
134+
}
135+
97136
export default createActions({
98137
NEWSLETTER_PREFERENCES: {
99138
FETCH_DATA_INIT: fetchDataInit,
100139
FETCH_DATA_DONE: fetchDataDone,
101140
UPDATE_TAG_INIT: _.identity,
102141
UPDATE_TAG_DONE: updateSubscriptionsDone,
142+
RESUBSCRIBE_INIT: _.identity,
143+
RESUBSCRIBE_DONE: resubscribeDone,
103144
},
104145
});

src/shared/components/NewsletterSignupForMembers/ConfirmModal/style.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,9 @@
3333

3434
button {
3535
margin: 24px 12px 0;
36+
37+
&:first-child {
38+
margin-right: 12px !important;
39+
}
3640
}
3741
}

0 commit comments

Comments
 (0)