Skip to content

Commit c8da3e8

Browse files
committed
Unsubscribe via mc form
1 parent d3e2cf4 commit c8da3e8

File tree

7 files changed

+104
-126
lines changed

7 files changed

+104
-126
lines changed

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ workflows:
282282
filters:
283283
branches:
284284
only:
285-
- email-pref-revamp-develop
285+
- free
286286
# This is alternate dev env for parallel testing
287287
- "build-qa":
288288
context : org-global
@@ -303,7 +303,7 @@ workflows:
303303
filters:
304304
branches:
305305
only:
306-
- develop
306+
- email-pref-revamp-develop
307307
- "approve-smoke-test-on-staging":
308308
type: approval
309309
requires:

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

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,40 @@ exports[`renders email preferences setting page correctly 1`] = `
1818
<p>
1919
If this was a mistake or if you would like to resubscribe, please click the button below.
2020
</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"
21+
<form
22+
action="https://topcoder.us13.list-manage.com/subscribe/post?u=65bd5a1857b73643aad556093&id=28bfd3c062"
23+
id="mc-embedded-subscribe-form"
24+
method="post"
25+
name="mc-embedded-subscribe-form"
26+
noValidate={true}
3627
>
37-
Resubscribe
38-
</ThemedButton>
28+
<input
29+
id="mce-EMAIL"
30+
name="EMAIL"
31+
readOnly={true}
32+
type="email"
33+
value="test@test.com"
34+
/>
35+
<input
36+
id="gdpr_11101"
37+
name="gdpr[11101]"
38+
type="checkbox"
39+
value="Y"
40+
/>
41+
<input
42+
name="b_65bd5a1857b73643aad556093_28bfd3c062"
43+
tabIndex="-1"
44+
type="text"
45+
value=""
46+
/>
47+
<input
48+
className="submit-button"
49+
id="mc-embedded-subscribe"
50+
name="subscribe"
51+
type="submit"
52+
value="Subscribe"
53+
/>
54+
</form>
3955
</div>
4056
</div>
4157
`;

src/shared/actions/newsletterPreferences.js

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -93,53 +93,11 @@ async function updateSubscriptionsDone(
9393
}
9494
}
9595

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-
13696
export default createActions({
13797
NEWSLETTER_PREFERENCES: {
13898
FETCH_DATA_INIT: fetchDataInit,
13999
FETCH_DATA_DONE: fetchDataDone,
140100
UPDATE_TAG_INIT: _.identity,
141101
UPDATE_TAG_DONE: updateSubscriptionsDone,
142-
RESUBSCRIBE_INIT: _.identity,
143-
RESUBSCRIBE_DONE: resubscribeDone,
144102
},
145103
});

src/shared/components/Settings/Preferences/Email/index.jsx

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { debounce, map } from 'lodash';
66
import React from 'react';
77
import PT from 'prop-types';
88
import { toastr } from 'react-redux-toastr';
9-
import { PrimaryButton } from 'topcoder-react-ui-kit';
109

1110
import ToggleableItem from 'components/Settings/ToggleableItem';
1211

@@ -112,7 +111,7 @@ export default class EmailPreferences extends React.Component {
112111

113112
render() {
114113
const { emailPreferences, status } = this.state;
115-
const { resubscibeEmails, email } = this.props;
114+
const { email } = this.props;
116115
return (
117116
<div styleName="EmailPreferences">
118117
<h1 styleName="title">
@@ -123,53 +122,54 @@ export default class EmailPreferences extends React.Component {
123122
<div styleName="unsubscribed-msg">
124123
<h3>You are not subscribed to receive Topcoder emails</h3>
125124
<p>If this was a mistake or if you would like to resubscribe, please click the button below.</p>
126-
<PrimaryButton
127-
onClick={() => resubscibeEmails(email)}
128-
>
129-
Resubscribe
130-
</PrimaryButton>
125+
<form action="https://topcoder.us13.list-manage.com/subscribe/post?u=65bd5a1857b73643aad556093&amp;id=28bfd3c062" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" noValidate>
126+
<input type="email" value={email} readOnly name="EMAIL" id="mce-EMAIL" />
127+
<input type="checkbox" id="gdpr_11101" name="gdpr[11101]" value="Y" />
128+
<input type="text" name="b_65bd5a1857b73643aad556093_28bfd3c062" tabIndex="-1" value="" />
129+
<input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" className="submit-button" />
130+
</form>
131131
</div>
132132
) : (
133133
<React.Fragment>
134134
<div styleName="sub-title">Newsletters</div>
135135
<div styleName="preferences-container">
136136
{
137-
map(newsletters, (newsletter) => {
138-
const checked = emailPreferences[newsletter.id];
139-
return (
140-
<ToggleableItem
141-
key={newsletter.id}
142-
id={newsletter.id}
143-
value={newsletter.id}
144-
checked={checked}
145-
primaryText={newsletter.name}
146-
secondaryText={newsletter.desc}
147-
onToggle={e => this.onChange(newsletter.id, e.target.checked)}
148-
disabled={status !== 'subscribed'}
149-
/>
150-
);
151-
})
152-
}
137+
map(newsletters, (newsletter) => {
138+
const checked = emailPreferences[newsletter.id];
139+
return (
140+
<ToggleableItem
141+
key={newsletter.id}
142+
id={newsletter.id}
143+
value={newsletter.id}
144+
checked={checked}
145+
primaryText={newsletter.name}
146+
secondaryText={newsletter.desc}
147+
onToggle={e => this.onChange(newsletter.id, e.target.checked)}
148+
disabled={status !== 'subscribed'}
149+
/>
150+
);
151+
})
152+
}
153153
</div>
154154
<div styleName="sub-title-2">Programs</div>
155155
<div styleName="preferences-container">
156156
{
157-
map(programs, (program) => {
158-
const checked = emailPreferences[program.id];
159-
return (
160-
<ToggleableItem
161-
key={program.id}
162-
id={program.id}
163-
value={program.id}
164-
checked={checked}
165-
primaryText={program.name}
166-
secondaryText={program.desc}
167-
onToggle={e => this.onChange(program.id, e.target.checked)}
168-
disabled={status !== 'subscribed'}
169-
/>
170-
);
171-
})
172-
}
157+
map(programs, (program) => {
158+
const checked = emailPreferences[program.id];
159+
return (
160+
<ToggleableItem
161+
key={program.id}
162+
id={program.id}
163+
value={program.id}
164+
checked={checked}
165+
primaryText={program.name}
166+
secondaryText={program.desc}
167+
onToggle={e => this.onChange(program.id, e.target.checked)}
168+
disabled={status !== 'subscribed'}
169+
/>
170+
);
171+
})
172+
}
173173
</div>
174174
</React.Fragment>
175175
)
@@ -190,5 +190,4 @@ EmailPreferences.propTypes = {
190190
saveEmailPreferences: PT.func.isRequired,
191191
updated: PT.shape(),
192192
status: PT.string,
193-
resubscibeEmails: PT.func.isRequired,
194193
};

src/shared/components/Settings/Preferences/Email/styles.scss

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,32 @@
5757
}
5858
}
5959
}
60+
61+
:global {
62+
#mc-embedded-subscribe-form {
63+
input {
64+
display: none;
65+
}
66+
67+
#mc-embedded-subscribe {
68+
@include roboto-medium;
69+
70+
display: inline-block;
71+
margin-top: 20px;
72+
cursor: pointer;
73+
height: 40px;
74+
font-size: 15px;
75+
font-weight: 500;
76+
padding: 0;
77+
width: 170px;
78+
white-space: nowrap;
79+
background-color: #006ad7;
80+
color: white;
81+
border-radius: 4px;
82+
83+
&:hover {
84+
background-image: linear-gradient(180deg, #3996ff, #127bf3);
85+
}
86+
}
87+
}
88+
}

src/shared/containers/NewsletterPreferences.jsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class NewsletterPreferencesContainer extends React.Component {
2020

2121
render() {
2222
const {
23-
loading, error, preferences, saveEmailPreferences, email, updated, status, resubscibeEmails,
23+
loading, error, preferences, saveEmailPreferences, email, updated, status,
2424
} = this.props;
2525
if (loading || !preferences) return <LoadingIndicator />;
2626
if (error) {
@@ -33,7 +33,6 @@ class NewsletterPreferencesContainer extends React.Component {
3333
saveEmailPreferences={saveEmailPreferences}
3434
updated={updated}
3535
status={status}
36-
resubscibeEmails={resubscibeEmails}
3736
/>
3837
);
3938
}
@@ -56,7 +55,6 @@ NewsletterPreferencesContainer.propTypes = {
5655
email: PT.string.isRequired,
5756
updated: PT.shape(),
5857
status: PT.string,
59-
resubscibeEmails: PT.func.isRequired,
6058
};
6159

6260
function mapStateToProps(state) {
@@ -83,10 +81,6 @@ function mapDispatchToProps(dispatch) {
8381
dispatch(actions.newsletterPreferences.updateTagInit());
8482
dispatch(actions.newsletterPreferences.updateTagDone(email, id, checked));
8583
},
86-
resubscibeEmails: (email) => {
87-
dispatch(actions.newsletterPreferences.resubscribeInit());
88-
dispatch(actions.newsletterPreferences.resubscribeDone(email));
89-
},
9084
};
9185
}
9286

src/shared/reducers/newsletterPreferences.js

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,6 @@ function onUpdateTagDone(state, { payload }) {
5151
};
5252
}
5353

54-
function onResubscribeInit(state) {
55-
return {
56-
...state,
57-
updated: null,
58-
};
59-
}
60-
61-
function onResubscribeDone(state, { payload }) {
62-
// eslint-disable-next-line no-param-reassign
63-
state.preferences[payload.id] = payload.checked;
64-
return {
65-
...state,
66-
updated: payload,
67-
};
68-
}
69-
7054
/**
7155
* Creates newsletterPreferences reducer with the specified initial state.
7256
* @param {Object} state Optional. If not given, the default one is
@@ -79,8 +63,6 @@ function create(state = {}) {
7963
[actions.newsletterPreferences.fetchDataDone]: onDone,
8064
[actions.newsletterPreferences.updateTagInit]: onUpdateTagInit,
8165
[actions.newsletterPreferences.updateTagDone]: onUpdateTagDone,
82-
[actions.newsletterPreferences.resubscribeInit]: onResubscribeInit,
83-
[actions.newsletterPreferences.resubscribeDone]: onResubscribeDone,
8466
}, state);
8567
}
8668

0 commit comments

Comments
 (0)