Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Commit 7aa493d

Browse files
author
Nick Litwin
committed
2 parents 00d64f2 + 4d61757 commit 7aa493d

13 files changed

+431
-12
lines changed

app/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ require('../assets/css/sitemap/sitemap.scss')
6363
require('../assets/css/settings/update-password.scss')
6464
require('../assets/css/settings/settings.scss')
6565
require('../assets/css/settings/preferences.scss')
66+
require('../assets/css/settings/email.scss')
6667
require('../assets/css/settings/edit-profile.scss')
6768
require('../assets/css/settings/account-info.scss')
6869
require('../assets/css/profile/subtrack.scss')

app/services/api.service.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ import _ from 'lodash'
7474
case 'SUBMISSIONS':
7575
case 'USER':
7676
return _getRestangularV3(CONSTANTS.AUTH_API_URL)
77+
case 'MAILCHIMP':
78+
return _getRestangularV3(CONSTANTS.INTERNAL_API_URL)
7779
default:
7880
return _getRestangularV3()
7981
}
@@ -93,6 +95,10 @@ import _ from 'lodash'
9395
})
9496
.setDefaultHeaders({ 'Content-Type': 'application/json' })
9597
.addRequestInterceptor(function(element, operation, what, url) {
98+
// for mailchimp api, don't add param field in the body
99+
if (url.indexOf('mailchimp') > -1) {
100+
return element
101+
}
96102
if (url.indexOf('members') > -1 || (operation.toLowerCase() === 'post' && url.indexOf('profiles') > -1)) {
97103
return {
98104
param: element

app/services/mailchimp.service.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import angular from 'angular'
2+
3+
(function() {
4+
'use strict'
5+
6+
angular.module('tc.services').factory('MailchimpService', MailchimpService)
7+
8+
MailchimpService.$inject = ['$http', 'logger', 'Restangular', 'CONSTANTS', 'ApiService', '$q']
9+
10+
function MailchimpService($http, logger, Restangular, CONSTANTS, ApiService, $q) {
11+
var mailchimpApi = ApiService.getApiServiceProvider('MAILCHIMP')
12+
var service = {
13+
getMemberSubscription: getMemberSubscription,
14+
addSubscription: addSubscription
15+
}
16+
return service
17+
18+
function getMemberSubscription(user) {
19+
return $q(function(resolve, reject) {
20+
mailchimpApi.one('mailchimp/lists', CONSTANTS.MAILCHIMP_LIST_ID)
21+
.one('members', user.userId).get()
22+
.then(function(resp) {
23+
resolve(resp)
24+
})
25+
.catch(function(err) {
26+
if (err.status === 404) {
27+
logger.debug('Member subscription not found')
28+
resolve()
29+
return
30+
}
31+
logger.error('Error getting member to subscription list', err)
32+
33+
var errorStatus = 'FATAL_ERROR'
34+
reject({
35+
status: errorStatus,
36+
msg: err.errorMessage
37+
})
38+
})
39+
})
40+
}
41+
42+
43+
function addSubscription(user, preferences) {
44+
var subscription = {
45+
userId: user.userId,
46+
firstName: user.firstName,
47+
lastName: user.lastName,
48+
interests: {}
49+
}
50+
if (!preferences) {
51+
subscription.interests[CONSTANTS.MAILCHIMP_NL_TCO] = true
52+
subscription.interests[CONSTANTS.MAILCHIMP_NL_IOS] = true
53+
subscription.interests[CONSTANTS.MAILCHIMP_NL_DEV] = true
54+
subscription.interests[CONSTANTS.MAILCHIMP_NL_DESIGN] = true
55+
subscription.interests[CONSTANTS.MAILCHIMP_NL_DATA] = true
56+
} else {
57+
subscription.interests = preferences
58+
}
59+
return $q(function(resolve, reject) {
60+
mailchimpApi.one('mailchimp/lists', CONSTANTS.MAILCHIMP_LIST_ID)
61+
.customPUT(subscription, 'members')
62+
.then(function(resp) {
63+
resolve(resp)
64+
})
65+
.catch(function(err) {
66+
logger.error('Error adding member to subscription list', err)
67+
68+
var errorStatus = 'FATAL_ERROR'
69+
70+
reject({
71+
status: errorStatus,
72+
msg: err.errorMessage
73+
})
74+
})
75+
})
76+
}
77+
}
78+
})()
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import angular from 'angular'
2+
3+
(function () {
4+
'use strict'
5+
6+
angular.module('tc.settings').controller('EmailSettingsController', EmailSettingsController)
7+
8+
EmailSettingsController.$inject = ['$rootScope', 'userProfile', 'ProfileService', 'MailchimpService', 'logger', 'CONSTANTS', 'toaster', '$q', '$scope']
9+
10+
function EmailSettingsController($rootScope, userProfile, ProfileService, MailchimpService, logger, CONSTANTS, toaster, $q, $scope) {
11+
var vm = this
12+
vm.loading = false
13+
vm.saving = false
14+
vm.isDirty = isDirty
15+
vm.save = save
16+
17+
activate()
18+
19+
function activate() {
20+
vm.newsletters = [
21+
{
22+
id: CONSTANTS.MAILCHIMP_NL_DEV,
23+
name: 'Developer Newsletter',
24+
desc: 'Software architecture, component assembly, application development and bug hunting',
25+
enabled: false,
26+
dirty: false
27+
},
28+
{
29+
id: CONSTANTS.MAILCHIMP_NL_DESIGN,
30+
name: 'Design Newsletter',
31+
desc: 'Website, mobile, and product design; UI and UX',
32+
enabled: false,
33+
dirty: false
34+
},
35+
{
36+
id: CONSTANTS.MAILCHIMP_NL_DATA,
37+
name: 'Data Science Newsletter',
38+
desc: 'Algorithm and data structures, statistical analysis',
39+
enabled: false,
40+
dirty: false
41+
},
42+
{
43+
id: CONSTANTS.MAILCHIMP_NL_TCO,
44+
name: 'TCO Newsletter',
45+
desc: 'Software architecture, component assembly, application development and bug hunting',
46+
enabled: false,
47+
dirty: false
48+
},
49+
{
50+
id: CONSTANTS.MAILCHIMP_NL_IOS,
51+
name: 'iOS Community Newsletter',
52+
desc: 'Software architecture, component assembly, application development and bug hunting',
53+
enabled: false,
54+
dirty: false
55+
}
56+
]
57+
58+
vm.loading = true
59+
return MailchimpService.getMemberSubscription(userProfile).then(function(subscription) {
60+
vm.loading = false
61+
if (!subscription) {
62+
// add member to the list with empty preferences
63+
MailchimpService.addSubscription(userProfile, {}).then(function(resp) {
64+
logger.debug(resp)
65+
}).catch(function(err) {
66+
// no error to user
67+
//TODO some error alert to community admin
68+
logger.debug('error in adding user to member list')
69+
})
70+
} else {
71+
if (subscription.interests) {
72+
vm.newsletters.forEach(function(newsletter) {
73+
if (subscription.interests[newsletter.id]) {
74+
newsletter.enabled = true
75+
}
76+
})
77+
}
78+
}
79+
})
80+
}
81+
82+
function isDirty() {
83+
var dirty = false
84+
vm.newsletters.forEach(function(newsletter) {
85+
if (newsletter.dirty){
86+
dirty = true
87+
}
88+
})
89+
return dirty
90+
}
91+
92+
function save() {
93+
vm.saving = true
94+
var preferences = {}
95+
vm.newsletters.forEach(function(newsletter) {
96+
preferences[newsletter.id] = newsletter.enabled
97+
})
98+
MailchimpService.addSubscription(userProfile, preferences).then(function(resp) {
99+
vm.loading = false
100+
vm.saving = false
101+
// reset dirty state for all newsletter options
102+
vm.newsletters.forEach(function(newsletter) {
103+
newsletter.dirty = false
104+
})
105+
toaster.pop('success', 'Success!', 'Preferences updated.')
106+
}).catch(function(err) {
107+
logger.error('Could not update email preferences', err)
108+
vm.loading = false
109+
vm.saving = false
110+
111+
toaster.pop('error', 'Whoops!', 'Something went wrong. Please try again later.')
112+
})
113+
}
114+
}
115+
})()

app/settings/email/email.jade

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
.email-preferences-container
2+
.settings-section.newsletters
3+
.section-info
4+
h2 Always be up to date
5+
.description Select the email notifications that you'd like to receive. We send them once every week, so you can be up to date with latest news, events and callenges.
6+
7+
.section-fields
8+
.processing(ng-show="vm.loading")
9+
i.fa.fa-spinner.fa-spin
10+
.newsletters(ng-hide="vm.loading")
11+
.newsletter(ng-repeat="newsletter in vm.newsletters")
12+
13+
.content(ng-class="{ disabled: !newsletter.enabled }")
14+
.newsletter-details
15+
.text
16+
span.title {{newsletter.name}}
17+
.description
18+
span(ng-bind="newsletter.desc")
19+
20+
.onoffswitch
21+
input.onoffswitch-checkbox(type='checkbox', name='onoffswitch', checked='', ng-model="newsletter.enabled", id="{{newsletter.name}}-onoffswitch", ng-change="newsletter.dirty = !newsletter.dirty")
22+
label.onoffswitch-label(for='{{newsletter.name}}-onoffswitch')
23+
span.onoffswitch-inner
24+
span.onoffswitch-switch
25+
.save-section
26+
button.tc-btn.tc-btn-l.done-button(
27+
type="button",
28+
tc-busy-button, tc-busy-when="vm.saving",
29+
ng-click="vm.save()",
30+
ng-disabled="!vm.isDirty()") Save

app/settings/preferences/preferences.jade

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
.preferences-container
22
ul
3-
li
4-
a(href="http://thecloud.appirio.com/email_prefs_request.html", target="_blank")
5-
.icon
6-
i.fa.fa-envelope
7-
span Email Preferences
8-
.description Specify what kind of email you would like to receive from us
9-
103
li
114
a(href="https://apps.{{DOMAIN}}/forums/?module=Settings", target="_blank")
125
.icon

app/settings/settings.jade

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
li
1111
a(ui-sref="settings.account", ui-sref-active="active-tab") Account
1212

13+
li
14+
a(ui-sref="settings.email", ui-sref-active="active-tab") Email
15+
1316
li
1417
a(ui-sref="settings.preferences", ui-sref-active="active-tab") Preferences
1518

app/settings/settings.routes.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,23 @@ import angular from 'angular'
4747
title: 'Account Info'
4848
}
4949
},
50+
'settings.email': {
51+
url: 'email/',
52+
template: require('./email/email')(),
53+
controller: 'EmailSettingsController',
54+
controllerAs: 'vm',
55+
data: {
56+
title: 'Email Preferences'
57+
},
58+
resolve: {
59+
userIdentity: ['UserService', function(UserService) {
60+
return UserService.getUserIdentity()
61+
}],
62+
userProfile: ['userIdentity', 'ProfileService', function(userIdentity, ProfileService) {
63+
return ProfileService.getUserProfile(userIdentity.handle.toLowerCase())
64+
}]
65+
}
66+
},
5067
'settings.preferences': {
5168
url: 'preferences/',
5269
template: require('./preferences/preferences')(),

app/skill-picker/skill-picker.controller.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import _ from 'lodash'
66

77
angular.module('tc.skill-picker').controller('SkillPickerController', SkillPickerController)
88

9-
SkillPickerController.$inject = ['$scope', 'CONSTANTS', 'ProfileService', '$state', 'userProfile', 'featuredSkills', 'logger', 'toaster', 'MemberCertService', '$q']
9+
SkillPickerController.$inject = ['$scope', 'CONSTANTS', 'ProfileService', '$state', 'userProfile', 'featuredSkills', 'logger', 'toaster', 'MemberCertService', '$q', 'MailchimpService']
1010

11-
function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, logger, toaster, MemberCertService, $q) {
11+
function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, logger, toaster, MemberCertService, $q, MailchimpService) {
1212
var vm = this
1313
vm.ASSET_PREFIX = CONSTANTS.ASSET_PREFIX
1414
vm.IOS_PROGRAM_ID = CONSTANTS.SWIFT_PROGRAM_ID
@@ -32,6 +32,7 @@ import _ from 'lodash'
3232
* Activates the controller.
3333
*/
3434
function activate() {
35+
addToMailingList()
3536
initCommunities()
3637
checkCommunityStatus()
3738
}
@@ -137,6 +138,25 @@ import _ from 'lodash'
137138
}
138139
}
139140

141+
function addToMailingList() {
142+
return MailchimpService.getMemberSubscription(userProfile).then(function(subscription) {
143+
logger.debug(subscription)
144+
if (!subscription) {
145+
return MailchimpService.addSubscription(userProfile).then(function(resp) {
146+
logger.debug(resp)
147+
}).catch(function(err) {
148+
// no error to user
149+
//TODO some error alert to community admin
150+
logger.debug('error in adding user to member list')
151+
})
152+
}
153+
}).catch(function(err) {
154+
// no error to user
155+
//TODO some error alert to community admin
156+
logger.debug('error in adding user to member list')
157+
})
158+
}
159+
140160
/**
141161
* Persists the user's altered information.
142162
*/

0 commit comments

Comments
 (0)