From 1deecafee7f9fff49c38a659b9a1a0b99fa49fb1 Mon Sep 17 00:00:00 2001 From: Sebastian Kippe Date: Fri, 20 Sep 2019 15:43:34 +0200 Subject: [PATCH] Handle pending changes for contributions This adds the pending tx data to pending contributions (after adding or vetoing, until the tx is mined). It also disables the veto button while pending. --- app/components/contribution-list/template.hbs | 7 +++++-- app/models/contribution.js | 8 +++++++- app/services/kredits.js | 4 ++++ tests/unit/models/contribution-test.js | 9 +++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/components/contribution-list/template.hbs b/app/components/contribution-list/template.hbs index d6495a6..f806246 100644 --- a/app/components/contribution-list/template.hbs +++ b/app/components/contribution-list/template.hbs @@ -33,7 +33,7 @@ {{#each contributionsFiltered as |contribution|}}
  • + class="{{contribution-status contribution}}{{if contribution.hasPendingChanges " pending"}}{{if contribution.vetoed " vetoed"}}{{if (eq contribution.id selectedContributionId) " selected"}}">

    {{user-avatar contributor=contribution.contributor}} ({{contribution.kind}}) @@ -45,7 +45,10 @@ {{#unless contribution.vetoed}} {{#unless (is-confirmed-contribution contribution)}}

    - + {{input type="button" class="button small danger" + click=(action "veto" contribution.id) + disabled=contribution.hasPendingChanges + value="veto"}}

    {{/unless}} {{/unless}} diff --git a/app/models/contribution.js b/app/models/contribution.js index c6985fa..1b89125 100644 --- a/app/models/contribution.js +++ b/app/models/contribution.js @@ -1,5 +1,5 @@ import EmberObject, { computed } from '@ember/object'; -import { isEmpty } from '@ember/utils'; +import { isEmpty, isPresent } from '@ember/utils'; import bignumber from 'kredits-web/utils/cps/bignumber'; import moment from 'moment'; @@ -24,6 +24,8 @@ export default EmberObject.extend({ time: null, ipfsData: '', + pendingTx: null, + init () { this._super(...arguments); if (isEmpty(this.details)) this.set('details', {}); @@ -35,6 +37,10 @@ export default EmberObject.extend({ jsDate: computed('iso8601Date', function() { return moment(this.iso8601Date).toDate(); + }), + + hasPendingChanges: computed('pendingTx', function() { + return isPresent(this.pendingTx); }) }); diff --git a/app/services/kredits.js b/app/services/kredits.js index 3fc96d3..30e3eb4 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -225,6 +225,7 @@ export default Service.extend({ console.debug('[kredits] add contribution response', data); attributes.contributor = this.contributors.findBy('id', attributes.contributorId); const contribution = Contribution.create(attributes); + contribution.set('pendingTx', data); contribution.set('confirmedAtBlock', data.blockNumber + 40320); this.contributions.pushObject(contribution); return contribution; @@ -278,10 +279,12 @@ export default Service.extend({ veto (contributionId) { console.debug('[kredits] veto against', contributionId); + const contribution = this.contributions.findBy('id', contributionId); return this.kredits.Contribution.functions.veto(contributionId, { gasLimit: 300000 }) .then(data => { console.debug('[kredits] veto response', data); + contribution.set('pendingTx', data); return data; }); }, @@ -367,6 +370,7 @@ export default Service.extend({ if (contribution) { contribution.set('vetoed', true); + contribution.set('pendingTx', null); } }, diff --git a/tests/unit/models/contribution-test.js b/tests/unit/models/contribution-test.js index 4dc28a1..9ab6905 100644 --- a/tests/unit/models/contribution-test.js +++ b/tests/unit/models/contribution-test.js @@ -24,4 +24,13 @@ module('Unit | Model | contribution', function(hooks) { assert.ok(model.jsDate instanceof Date); assert.equal(model.jsDate.toISOString(), '2019-09-10T09:33:00.141Z'); }); + + test('hasPendingChanges', function(assert) { + const model = Contribution.create({}); + assert.equal(model.hasPendingChanges, false); + + model.set('pendingTx', { hash: 'abcdef123456' }); + assert.equal(model.hasPendingChanges, true); + }); + });