Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 2 additions & 9 deletions app/components/category-item.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,7 @@ export default Component.extend({
* @private
*/
_flashError(message) {
let flashMessages = get(this, 'flashMessages');
flashMessages.clearMessages();
return flashMessages.add({
message,
type: 'danger',
fixed: true,
sticky: false,
timeout: 5000
});
let options = { fixed: true, sticky: false, timeout: 5000 };
get(this, 'flashMessages').clearMessages().danger(message, options);
}
});
11 changes: 2 additions & 9 deletions app/components/member-list-item.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,7 @@ export default Component.extend({
},

_flashSuccess(message) {
let flashMessages = get(this, 'flashMessages');
flashMessages.clearMessages();
return flashMessages.add({
message,
type: 'success',
fixed: true,
sticky: false,
timeout: 5000
});
let options = { fixed: true, sticky: false, timeout: 5000 };
get(this, 'flashMessages').clearMessages().success(message, options);
}
});
3 changes: 1 addition & 2 deletions app/components/organization-settings-form.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ export default Component.extend({

actions: {
save() {
let flashMessages = get(this, 'flashMessages');
get(this, 'organization').save().then(() => {
flashMessages.success('Organization updated successfully');
get(this, 'flashMessages').clearMessages().success('Organization updated successfully');
});
}
}
Expand Down
4 changes: 1 addition & 3 deletions app/components/project-settings-form.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@ export default Component.extend({

actions: {
save() {
let flashMessages = get(this, 'flashMessages');

this.get('project').save().then(() => {
flashMessages.success('Project updated successfully');
get(this, 'flashMessages').clearMessages().success('Project updated successfully');
});
}
}
Expand Down
11 changes: 2 additions & 9 deletions app/components/role-item.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,7 @@ export default Component.extend({
},

_flashError(message) {
let flashMessages = get(this, 'flashMessages');
flashMessages.clearMessages();
return flashMessages.add({
message,
type: 'danger',
fixed: true,
sticky: false,
timeout: 5000
});
let options = { fixed: true, sticky: false, timeout: 5000 };
get(this, 'flashMessages').clearMessages().danger(message, options);
}
});
6 changes: 2 additions & 4 deletions app/components/user-settings-form.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,8 @@ export default Component.extend({
@method save
*/
save() {
let flashMessages = get(this, 'flashMessages');

this.get('user').save().then(function() {
flashMessages.success('Profile updated successfully');
this.get('user').save().then(() => {
get(this, 'flashMessages').clearMessages().success('Profile updated successfully');
});
}
}
Expand Down
10 changes: 3 additions & 7 deletions app/controllers/project/donate.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ const {
const CUSTOMER_CREATION_ERROR = 'There was a problem in connecting your account with our payment processor. Please try again.';
const CARD_CREATION_ERROR = 'There was a problem in using your payment information. Please try again.';
const SUBSCRIPTION_CREATION_ERROR = 'There was a problem in setting up your monthly donation. Please try again.';
const SUBSCRIPTION_VALIDATION_ERROR = "The amount you've set for your monthly donation is invalid.";

export default Controller.extend({
amount: null,
Expand Down Expand Up @@ -132,13 +133,8 @@ export default Controller.extend({
},

_handleSubscriptionCreationError(response) {
let friendlyError;

if (isValidationError(response)) {
friendlyError = new FriendlyError('The amount you\'ve set for your monthly donation is invalid.');
} else {
friendlyError = new FriendlyError(SUBSCRIPTION_CREATION_ERROR);
}
let message = isValidationError(response) ? SUBSCRIPTION_VALIDATION_ERROR : SUBSCRIPTION_CREATION_ERROR;
let friendlyError = new FriendlyError(message);

return RSVP.reject(friendlyError);
},
Expand Down
6 changes: 0 additions & 6 deletions app/routes/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,6 @@ export default Route.extend(ApplicationRouteMixin, {
},

actions: {
didTransition() {
// Clear flash messages on every transition
this.get('flashMessages').clearMessages();
return true; // Bubble the event
},

willTransition(transition) {
if (this._shouldTransitionToOnboardingRoute(transition)) {
this._abortAndFixHistory(transition);
Expand Down
34 changes: 32 additions & 2 deletions app/routes/project/donate.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,37 @@ import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-rout
import Ember from 'ember';

const {
Route
get,
inject: { service },
Route,
RSVP
} = Ember;

export default Route.extend(AuthenticatedRouteMixin, {});
const ALREADY_A_SUBSCRIBER = "You're already supporting this project.";

export default Route.extend(AuthenticatedRouteMixin, {
flashMessages: service(),
userSubscriptions: service(),

model() {
let project = this.modelFor('project');

return RSVP.hash({
project,
subscription: this.get('userSubscriptions').fetchForProject(project)
});
},

afterModel({ project, subscription }) {
if (subscription) {
get(this, 'flashMessages').success(ALREADY_A_SUBSCRIBER);
this.transitionTo('project', project);
} else {
this._super.call(...arguments);
}
},

setupController(controller, models) {
controller.setProperties(models);
}
});
21 changes: 2 additions & 19 deletions app/routes/project/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,18 @@ const {
} = Ember;

export default Route.extend({
currentUser: service(),
userSubscriptions: service(),

model() {
let project = this.modelFor('project');

return RSVP.hash({
project,
subscription: this._fetchCurrentUserSubscriptionFor(project)
subscription: this.get('userSubscriptions').fetchForProject(project)
});
},

setupController(controller, models) {
controller.setProperties(models);
},

_fetchCurrentUserSubscriptionFor(project) {
let user = this.get('currentUser.user');

if (user) {
let subscriptions = user.get('stripeConnectSubscriptions');
let planId = project.belongsTo('stripeConnectPlan').id();
return RSVP.hash({ subscriptions, planId }).then(({ subscriptions, planId }) => {
let subscription = subscriptions.find((subscription) => {
return subscription.belongsTo('stripeConnectPlan').id() === planId;
});
return RSVP.resolve(subscription);
});
} else {
return null;
}
}
});
32 changes: 32 additions & 0 deletions app/services/user-subscriptions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import Ember from 'ember';

const {
computed,
inject: { service },
RSVP,
Service
} = Ember;

export default Service.extend({
currentUser: service(),
store: service(),

user: computed.alias('currentUser.user'),

fetchForProject(project) {
let user = this.get('user');

if (user) {
let subscriptions = user.get('stripeConnectSubscriptions');
let planId = project.belongsTo('stripeConnectPlan').id();
return RSVP.hash({ subscriptions, planId }).then(({ subscriptions, planId }) => {
let subscription = subscriptions.find((subscription) => {
return subscription.belongsTo('stripeConnectPlan').id() === planId;
});
return RSVP.resolve(subscription);
});
} else {
return null;
}
}
});
1 change: 0 additions & 1 deletion mirage/models/project.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Model, belongsTo, hasMany } from 'ember-cli-mirage';

export default Model.extend({
currentDonationGoal: belongsTo('donation-goal'),
donationGoals: hasMany(),
organization: belongsTo(),
tasks: hasMany(),
Expand Down
2 changes: 1 addition & 1 deletion mirage/models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export default Model.extend({
organizationMemberships: hasMany({ inverse: 'member' }),
stripePlatformCard: belongsTo('stripe-platform-card'),
stripePlatformCustomer: belongsTo('stripe-platform-customer'),
subscriptions: hasMany('stripe-connect-subscription'),
stripeConnectSubscriptions: hasMany('stripe-connect-subscription'),
userCategories: hasMany(),
userRoles: hasMany(),
userSkills: hasMany()
Expand Down
26 changes: 26 additions & 0 deletions tests/acceptance/project-donate-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Ember from 'ember';
import Mirage from 'ember-cli-mirage';

import { authenticateSession } from 'code-corps-ember/tests/helpers/ember-simple-auth';
import { getFlashMessageCount } from 'code-corps-ember/tests/helpers/flash-message';
import createOrganizationWithSluggedRoute from 'code-corps-ember/tests/helpers/mirage/create-organization-with-slugged-route';
import projectDonatePage from '../pages/project/donate';

Expand Down Expand Up @@ -85,6 +86,31 @@ test('It requires authentication', function(assert) {
});
});

test('It redirects to project route if already a subscriber, with a flash', function(assert) {
assert.expect(2);

let user = server.create('user');
authenticateSession(this.application, { 'user_id': user.id });

let organization = createOrganizationWithSluggedRoute();
let project = server.create('project', { organization });

let stripeConnectPlan = project.createStripeConnectPlan({ project });

server.create('stripeConnectSubscription', { stripeConnectPlan, user });

projectDonatePage.visit({
amount: 10,
organization: organization.slug,
project: project.slug
});

andThen(() => {
assert.equal(getFlashMessageCount(this), 1, 'A flash message was shown.');
assert.equal(currentRouteName(), 'project.index', 'User was redirected to index');
});
});

test('Allows creating a card and donating (creating a subscription)', function(assert) {
assert.expect(8);

Expand Down
19 changes: 18 additions & 1 deletion tests/helpers/flash-message.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
import Ember from 'ember';
import FlashObject from 'ember-cli-flash/flash/object';

const { K } = Ember;
const { getOwner, K } = Ember;

FlashObject.reopen({ init: K });

export function getFlashMessageCount(context) {
return getTestContainer(context).lookup('service:flash-messages').get('queue').length;
}

export function getFlashMessageAt(index, context) {
return getTestContainer(context).lookup('service:flash-messages').get('queue')[index];
}

function getTestContainer(context) {
if (context.application) { // acceptance test
return context.application.__container__;

} else { // integration/unit test
return getOwner(context);
}
}
Loading