From bc2996f6083007535970fc888eb0e533df95d3af Mon Sep 17 00:00:00 2001 From: Max Axenov Date: Mon, 17 Jun 2019 13:42:48 +0300 Subject: [PATCH 01/15] DEXW-1723: ratingStars component init --- .../directives/ratingStars/ratingStars.html | 5 ++ .../ui/directives/ratingStars/ratingStars.js | 55 +++++++++++++++++++ .../directives/ratingStars/ratingStars.less | 4 ++ 3 files changed, 64 insertions(+) create mode 100644 src/modules/ui/directives/ratingStars/ratingStars.html create mode 100644 src/modules/ui/directives/ratingStars/ratingStars.js create mode 100644 src/modules/ui/directives/ratingStars/ratingStars.less diff --git a/src/modules/ui/directives/ratingStars/ratingStars.html b/src/modules/ui/directives/ratingStars/ratingStars.html new file mode 100644 index 0000000000..147295494b --- /dev/null +++ b/src/modules/ui/directives/ratingStars/ratingStars.html @@ -0,0 +1,5 @@ +
+
+
\ No newline at end of file diff --git a/src/modules/ui/directives/ratingStars/ratingStars.js b/src/modules/ui/directives/ratingStars/ratingStars.js new file mode 100644 index 0000000000..f405bd7062 --- /dev/null +++ b/src/modules/ui/directives/ratingStars/ratingStars.js @@ -0,0 +1,55 @@ +(function () { + 'use strict'; + + const controller = function (Base, user, $scope) { + + const STARS_AMOUNT = 5; + const { range } = require('ramda'); + + class RatingStars extends Base { + + /** + * @public + * @type {array} + */ + starsList = []; + + /** + * @private + * @type {number} + */ + rating = null; + + /** + * @private + * @type {boolean} + */ + canRate = false; + + constructor() { + super($scope); + + const filledAmount = Math.round(this.rating); + const remapStars = index => ({ filled: index <= filledAmount }); + + this.starsList = range(0, STARS_AMOUNT).map(remapStars); + } + + + } + + return new RatingStars(); + }; + + controller.$inject = ['Base', 'user', '$scope']; + + angular.module('app.ui').component('wRatingStars', { + templateUrl: 'modules/ui/directives/getStartedLink/ratingStars.html', + bindings: { + rating: '<', + canRate: '<' + }, + controller + }); + +})(); diff --git a/src/modules/ui/directives/ratingStars/ratingStars.less b/src/modules/ui/directives/ratingStars/ratingStars.less new file mode 100644 index 0000000000..0bf9e28e0b --- /dev/null +++ b/src/modules/ui/directives/ratingStars/ratingStars.less @@ -0,0 +1,4 @@ +.rating-stars { + display: flex; + justify-content: space-around; +} \ No newline at end of file From 7e4b16e4260e87dd00226253235d85e5d57ee696 Mon Sep 17 00:00:00 2001 From: Max Axenov Date: Mon, 17 Jun 2019 18:44:50 +0300 Subject: [PATCH 02/15] DEXW-1723: added icons and polling from rating api --- src/img/icons/rating-basic-200.svg | 3 +++ src/img/icons/rating-submit-300.svg | 3 +++ .../directives/assetInfoHead/AssetInfoHead.js | 17 ++++++++++++++-- .../assetInfoHead/asset-info-head.html | 11 +++++----- .../directives/ratingStars/ratingStars.html | 2 +- .../ui/directives/ratingStars/ratingStars.js | 20 +++++++++++-------- .../directives/ratingStars/ratingStars.less | 20 ++++++++++++++++++- .../utils/modals/assetInfo/assetInfo.html | 4 ++++ src/themeConfig/default/icons.less | 2 ++ 9 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 src/img/icons/rating-basic-200.svg create mode 100644 src/img/icons/rating-submit-300.svg diff --git a/src/img/icons/rating-basic-200.svg b/src/img/icons/rating-basic-200.svg new file mode 100644 index 0000000000..a8a43b580d --- /dev/null +++ b/src/img/icons/rating-basic-200.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/img/icons/rating-submit-300.svg b/src/img/icons/rating-submit-300.svg new file mode 100644 index 0000000000..b09778508c --- /dev/null +++ b/src/img/icons/rating-submit-300.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js b/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js index cd956f7af0..6f1eab4582 100644 --- a/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js +++ b/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js @@ -9,7 +9,7 @@ * @param utils * @return {AssetInfoHead} */ - const controller = function (Base, $scope, user, waves, utils) { + const controller = function (Base, $scope, user, waves, utils, createPoll) { class AssetInfoHead extends Base { @@ -21,6 +21,7 @@ $postLink() { this._getAssetInfo(); this.observe('assetId', this._getAssetInfo); + createPoll(this, this._getTokenRating, this._setTokenRating, 60 * 1000); } /** @@ -38,12 +39,24 @@ this.state = { assetId: this.assetId }; } + _getTokenRating() { + return ds.fetch(`https://tokenrating.wavesexplorer.com/api/v1/token/${this.assetId}`); + } + + _setTokenRating({ token }) { + if (!token) { + return null; + } + this.rating = token.averageScore; + $scope.$apply(); + } + } return new AssetInfoHead(); }; - controller.$inject = ['Base', '$scope', 'user', 'waves', 'utils']; + controller.$inject = ['Base', '$scope', 'user', 'waves', 'utils', 'createPoll']; angular.module('app.ui') .component('wAssetInfoHead', { diff --git a/src/modules/ui/directives/assetInfoHead/asset-info-head.html b/src/modules/ui/directives/assetInfoHead/asset-info-head.html index dfac83f7f8..1fc18652a1 100644 --- a/src/modules/ui/directives/assetInfoHead/asset-info-head.html +++ b/src/modules/ui/directives/assetInfoHead/asset-info-head.html @@ -11,12 +11,13 @@

-
{{$ctrl.ticker}}
+ -
- -
-
+
+ +
+
+ diff --git a/src/modules/ui/directives/ratingStars/ratingStars.html b/src/modules/ui/directives/ratingStars/ratingStars.html index 147295494b..d04bc764f5 100644 --- a/src/modules/ui/directives/ratingStars/ratingStars.html +++ b/src/modules/ui/directives/ratingStars/ratingStars.html @@ -1,5 +1,5 @@
\ No newline at end of file diff --git a/src/modules/ui/directives/ratingStars/ratingStars.js b/src/modules/ui/directives/ratingStars/ratingStars.js index f405bd7062..d05571db72 100644 --- a/src/modules/ui/directives/ratingStars/ratingStars.js +++ b/src/modules/ui/directives/ratingStars/ratingStars.js @@ -15,24 +15,28 @@ starsList = []; /** - * @private * @type {number} */ - rating = null; + rating; /** - * @private * @type {boolean} */ - canRate = false; + canRate; constructor() { super($scope); - const filledAmount = Math.round(this.rating); - const remapStars = index => ({ filled: index <= filledAmount }); + this.observe('rating', () => { + const filledAmount = Math.round(this.rating); + const remapStars = index => ({ filled: (index + 1) <= filledAmount }); + this.starsList = range(0, STARS_AMOUNT).map(remapStars); + }); + } + + $postLink() { + - this.starsList = range(0, STARS_AMOUNT).map(remapStars); } @@ -44,11 +48,11 @@ controller.$inject = ['Base', 'user', '$scope']; angular.module('app.ui').component('wRatingStars', { - templateUrl: 'modules/ui/directives/getStartedLink/ratingStars.html', bindings: { rating: '<', canRate: '<' }, + templateUrl: 'modules/ui/directives/ratingStars/ratingStars.html', controller }); diff --git a/src/modules/ui/directives/ratingStars/ratingStars.less b/src/modules/ui/directives/ratingStars/ratingStars.less index 0bf9e28e0b..05db465d36 100644 --- a/src/modules/ui/directives/ratingStars/ratingStars.less +++ b/src/modules/ui/directives/ratingStars/ratingStars.less @@ -1,4 +1,22 @@ +@import (reference) 'config'; +@import (reference) 'icons'; + .rating-stars { display: flex; - justify-content: space-around; + justify-content: flex-start; + margin-top: 7px; + + &__star { + width: 14px; + height: 14px; + margin-right: 5px; + background: @rating-star-asset-icon center no-repeat; + &:last-child { + margin-right: 0; + } + + &.filled { + background: @rating-filled-star-asset-icon center no-repeat; + } + } } \ No newline at end of file diff --git a/src/modules/utils/modals/assetInfo/assetInfo.html b/src/modules/utils/modals/assetInfo/assetInfo.html index 9e8e4ee5be..04deaa0448 100644 --- a/src/modules/utils/modals/assetInfo/assetInfo.html +++ b/src/modules/utils/modals/assetInfo/assetInfo.html @@ -18,6 +18,10 @@
{{::$ctrl.asset.name}}
+
+
+
{{::$ctrl.asset.ticker}}
+
{{::$ctrl.quantity}}
diff --git a/src/themeConfig/default/icons.less b/src/themeConfig/default/icons.less index 306e6f36ed..0c5bbb22f4 100644 --- a/src/themeConfig/default/icons.less +++ b/src/themeConfig/default/icons.less @@ -22,6 +22,8 @@ @error-circle-icon: url(/img/icons/icon-error-import.svg); @unpin-asset-icon: url(/img/icons/unpin-asset.svg); @add-asset-icon: url(/img/icons/add-asset.svg); +@rating-star-asset-icon: url(/img/icons/rating-basic-200.svg); +@rating-filled-star-asset-icon: url(/img/icons/rating-submit-300.svg); @arrow-left-icon: url(/img/icons/arrowleft-18-basic-500.svg); @arrow-right-icon: url(/img/icons/arrowright-18-basic-500.svg); @transaction-icons: url(/img/icons/transaction-icons-80.svg); From b1afadc0d3cda3d0a5969f011f234c5830f630bc Mon Sep 17 00:00:00 2001 From: Max Axenov Date: Tue, 18 Jun 2019 20:08:58 +0300 Subject: [PATCH 03/15] DEXW-1723: some rating factory --- data-service/api/API.ts | 5 ++ data-service/api/rating/rating.ts | 17 ++++ .../directives/assetInfoHead/AssetInfoHead.js | 9 ++- .../ui/directives/ratingStars/ratingStars.js | 37 ++------- .../directives/ratingStars/ratingStars.less | 4 +- .../ratingStars/ratingStarsFactory.js | 77 +++++++++++++++++++ .../portfolio/controllers/PortfolioCtrl.js | 15 +++- .../directives/portfolioRow/PortfolioRow.js | 12 ++- .../portfolio/directives/portfolioRow/row.hbs | 2 + src/themeConfig/default/icons.less | 4 +- 10 files changed, 140 insertions(+), 42 deletions(-) create mode 100644 data-service/api/rating/rating.ts create mode 100644 src/modules/ui/directives/ratingStars/ratingStarsFactory.js diff --git a/data-service/api/API.ts b/data-service/api/API.ts index 380efa0a76..9e3243ca15 100644 --- a/data-service/api/API.ts +++ b/data-service/api/API.ts @@ -18,6 +18,7 @@ import * as addressModule from './address'; import { getLastPrice } from './matcher/getLastPrice'; import { getAddressByAlias, getAliasesByAddress } from './aliases/aliases'; import * as pairsModule from './pairs/pairs'; +import * as ratingModule from './rating/rating'; import * as dataModule from './data'; @@ -39,6 +40,10 @@ export const pairs = { ...pairsModule }; +export const rating = { + ...ratingModule +}; + export const data = { ...dataModule }; diff --git a/data-service/api/rating/rating.ts b/data-service/api/rating/rating.ts new file mode 100644 index 0000000000..1bc6034a24 --- /dev/null +++ b/data-service/api/rating/rating.ts @@ -0,0 +1,17 @@ +// import { AssetPair, Money, BigNumber, OrderPrice } from '@waves/data-entities'; +import { request } from '../../utils/request'; +import { toArray } from '../../utils/utils'; +// import { get } from '../../config'; + + +// export function getAssetRating(assets: string | Array): Promise> { +export function getAssetsRating(assets: string | Array) { + return Promise.all(toArray(assets).map(id => request({ + url: `https://tokenrating.philsitumorang.com/api/v1/token/${id}` + }))) + .then(tokensList => { + return tokensList.map(({token}) => { + return token ? token.averageScore : null; + }) + }); +} \ No newline at end of file diff --git a/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js b/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js index 6f1eab4582..155815d9b2 100644 --- a/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js +++ b/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js @@ -40,14 +40,15 @@ } _getTokenRating() { - return ds.fetch(`https://tokenrating.wavesexplorer.com/api/v1/token/${this.assetId}`); + // return ds.fetch(`https://tokenrating.wavesexplorer.com/api/v1/token/${this.assetId}`); + return ds.api.rating.getAssetsRating(this.assetId); } - _setTokenRating({ token }) { - if (!token) { + _setTokenRating([rating]) { + if (!rating) { return null; } - this.rating = token.averageScore; + this.rating = rating; $scope.$apply(); } diff --git a/src/modules/ui/directives/ratingStars/ratingStars.js b/src/modules/ui/directives/ratingStars/ratingStars.js index d05571db72..ab2f802642 100644 --- a/src/modules/ui/directives/ratingStars/ratingStars.js +++ b/src/modules/ui/directives/ratingStars/ratingStars.js @@ -1,58 +1,35 @@ (function () { 'use strict'; - const controller = function (Base, user, $scope) { - - const STARS_AMOUNT = 5; - const { range } = require('ramda'); + const controller = function (Base, user, $scope, RatingStarsFactory, $element) { class RatingStars extends Base { - /** - * @public - * @type {array} - */ - starsList = []; - - /** - * @type {number} - */ - rating; - - /** - * @type {boolean} - */ - canRate; - constructor() { super($scope); + const ratingStars = new RatingStarsFactory($element, this.rating); + this.observe('rating', () => { - const filledAmount = Math.round(this.rating); - const remapStars = index => ({ filled: (index + 1) <= filledAmount }); - this.starsList = range(0, STARS_AMOUNT).map(remapStars); + ratingStars.update(this.rating); }); } - $postLink() { - - - } - } return new RatingStars(); }; - controller.$inject = ['Base', 'user', '$scope']; + controller.$inject = ['Base', 'user', '$scope', 'RatingStarsFactory', '$element']; angular.module('app.ui').component('wRatingStars', { bindings: { rating: '<', canRate: '<' }, - templateUrl: 'modules/ui/directives/ratingStars/ratingStars.html', + scope: false, + // templateUrl: 'modules/ui/directives/ratingStars/ratingStars.html', controller }); diff --git a/src/modules/ui/directives/ratingStars/ratingStars.less b/src/modules/ui/directives/ratingStars/ratingStars.less index 05db465d36..d7cddc7370 100644 --- a/src/modules/ui/directives/ratingStars/ratingStars.less +++ b/src/modules/ui/directives/ratingStars/ratingStars.less @@ -10,13 +10,13 @@ width: 14px; height: 14px; margin-right: 5px; - background: @rating-star-asset-icon center no-repeat; + background: @rating-star-icon center no-repeat; &:last-child { margin-right: 0; } &.filled { - background: @rating-filled-star-asset-icon center no-repeat; + background: @rating-filled-star-icon center no-repeat; } } } \ No newline at end of file diff --git a/src/modules/ui/directives/ratingStars/ratingStarsFactory.js b/src/modules/ui/directives/ratingStars/ratingStarsFactory.js new file mode 100644 index 0000000000..a8ca7908c4 --- /dev/null +++ b/src/modules/ui/directives/ratingStars/ratingStarsFactory.js @@ -0,0 +1,77 @@ +(function () { + 'use strict'; + + const factory = function () { + + const STARS_AMOUNT = 5; + const { range } = require('ramda'); + + class RatingStarsFactory { + + /** + * @public + * @type {array} + */ + starsList = []; + + constructor($container, rating, canRate = false) { + /** + * @type {number} + */ + this.rating = rating; + + /** + * @type {boolean} + */ + this.canRate = canRate; + + /** + * @type {jQuery} + */ + this.$container = $container; + + // this.observe('rating', () => { + // const filledAmount = Math.round(this.rating); + // const remapStars = index => ({ filled: (index + 1) <= filledAmount }); + // this.starsList = range(0, STARS_AMOUNT).map(remapStars); + // this._render($container); + // }); + + this.update(this.rating); + } + + _render($container) { + this.template = `
${this.starsList.map(obj => obj.$star).join('')}
`; + $container.html(this.template); + } + + + // get template() { + // return this.template; + // } + + static getStar(index, filledAmount) { + return `
`; + } + + update(rating) { + const filledAmount = Math.round(rating); + const remapStars = index => ({ + weight: index + 1, + $star: RatingStarsFactory.getStar(index, filledAmount) + }); + this.starsList = range(0, STARS_AMOUNT).map(remapStars); + this._render(this.$container); + } + + + } + + return RatingStarsFactory; + }; + + // factory.$inject = ['Base']; + + angular.module('app.ui').factory('RatingStarsFactory', factory); + +})(); diff --git a/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js b/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js index 4719ade88f..3b0ba42f30 100644 --- a/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js +++ b/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js @@ -289,7 +289,17 @@ throw new Error('Wrong filter name!'); } - this.balanceList = balanceList; + ds.api.rating.getAssetsRating(this.balanceList.map(balance => balance.asset.id)) + .then(ratingList => { + balanceList = balanceList.map((balance, i) => ({ + ...balance, + rating: ratingList[i] + })); + + this.balanceList = balanceList; + }); + + } /** @@ -301,7 +311,7 @@ const isPinned = this._isPinned(item.asset.id); const isSpam = this._isSpam(item.asset.id); const isOnScamList = user.scam[item.asset.id]; - + // TODO Сунуть рейтинг тут return { available: item.available, asset: item.asset, @@ -340,6 +350,7 @@ }, { spam: [], my: [], active: [], verified: [] }); this.details = details; + utils.safeApply($scope); } diff --git a/src/modules/wallet/modules/portfolio/directives/portfolioRow/PortfolioRow.js b/src/modules/wallet/modules/portfolio/directives/portfolioRow/PortfolioRow.js index 7155d71435..d9efe531b2 100644 --- a/src/modules/wallet/modules/portfolio/directives/portfolioRow/PortfolioRow.js +++ b/src/modules/wallet/modules/portfolio/directives/portfolioRow/PortfolioRow.js @@ -26,6 +26,7 @@ EXCHANGE_RATE: 'js-exchange-rate', CHANGE_24: 'js-change-24', CHART_CONTAINER: 'js-chart-container', + STARS_CONTAINER: 'js-stars-container', BUTTONS: { SEND: 'js-button-send', RECEIVE: 'js-button-receive', @@ -63,6 +64,7 @@ modalManager, $state, ChartFactory, + RatingStarsFactory, i18n, $scope, gatewayService, @@ -189,8 +191,10 @@ this.isSmart = balance.asset.hasScript; const firstAssetChar = this.balance.asset.name.slice(0, 1); const canPayFee = list.find(item => item.asset.id === this.balance.asset.id) && !this._isWaves; - const { isVerified, isGateway, - isTokenomica, logo } = utils.getDataFromOracles(this.balance.asset.id); + const { + isVerified, isGateway, + isTokenomica, logo + } = utils.getDataFromOracles(this.balance.asset.id); this.isVerifiedOrGateway = isVerified || isGateway; @@ -364,6 +368,8 @@ values ); }).catch(() => null); + + new RatingStarsFactory(this.$node.find(`.${SELECTORS.STARS_CONTAINER}`), balance.rating); } /** @@ -641,6 +647,7 @@ modalManager, $state, ChartFactory, + RatingStarsFactory, i18n, $scope, gatewayService, @@ -657,6 +664,7 @@ 'modalManager', '$state', 'ChartFactory', + 'RatingStarsFactory', 'i18n', '$scope', 'gatewayService', diff --git a/src/modules/wallet/modules/portfolio/directives/portfolioRow/row.hbs b/src/modules/wallet/modules/portfolio/directives/portfolioRow/row.hbs index d196585b47..03d0cf0c54 100644 --- a/src/modules/wallet/modules/portfolio/directives/portfolioRow/row.hbs +++ b/src/modules/wallet/modules/portfolio/directives/portfolioRow/row.hbs @@ -24,6 +24,8 @@ {{/if}}
+
+
diff --git a/src/themeConfig/default/icons.less b/src/themeConfig/default/icons.less index 0c5bbb22f4..e85989e419 100644 --- a/src/themeConfig/default/icons.less +++ b/src/themeConfig/default/icons.less @@ -22,8 +22,8 @@ @error-circle-icon: url(/img/icons/icon-error-import.svg); @unpin-asset-icon: url(/img/icons/unpin-asset.svg); @add-asset-icon: url(/img/icons/add-asset.svg); -@rating-star-asset-icon: url(/img/icons/rating-basic-200.svg); -@rating-filled-star-asset-icon: url(/img/icons/rating-submit-300.svg); +@rating-star-icon: url(/img/icons/rating-basic-200.svg); +@rating-filled-star-icon: url(/img/icons/rating-submit-300.svg); @arrow-left-icon: url(/img/icons/arrowleft-18-basic-500.svg); @arrow-right-icon: url(/img/icons/arrowright-18-basic-500.svg); @transaction-icons: url(/img/icons/transaction-icons-80.svg); From f6464fb0e876a31b08148b2c8e6eea836d3360f6 Mon Sep 17 00:00:00 2001 From: Max Axenov Date: Wed, 19 Jun 2019 14:34:32 +0300 Subject: [PATCH 04/15] DEXW-1723: get rating in portfolio --- data-service/api/rating/rating.ts | 28 +++- data-service/interface.d.ts | 18 +++ .../portfolio/controllers/PortfolioCtrl.js | 125 ++++++++++-------- 3 files changed, 110 insertions(+), 61 deletions(-) diff --git a/data-service/api/rating/rating.ts b/data-service/api/rating/rating.ts index 1bc6034a24..e7abf71ba2 100644 --- a/data-service/api/rating/rating.ts +++ b/data-service/api/rating/rating.ts @@ -1,17 +1,31 @@ // import { AssetPair, Money, BigNumber, OrderPrice } from '@waves/data-entities'; import { request } from '../../utils/request'; -import { toArray } from '../../utils/utils'; +import { ITokenRating } from '../../interface'; +import { stringifyJSON, toArray } from '../../utils/utils'; // import { get } from '../../config'; // export function getAssetRating(assets: string | Array): Promise> { export function getAssetsRating(assets: string | Array) { - return Promise.all(toArray(assets).map(id => request({ - url: `https://tokenrating.philsitumorang.com/api/v1/token/${id}` - }))) - .then(tokensList => { - return tokensList.map(({token}) => { - return token ? token.averageScore : null; + return request( + { + url: `https://tokenrating.wavesexplorer.com/api/v1/token/`, + fetchOptions: { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json;charset=UTF-8' + }, + // body: stringifyJSON(toArray(assets)) + body: stringifyJSON({ + "assetIds": toArray(assets) + }) + } + }) + .then((data: any) => { + const tokensList = JSON.parse(data); + return tokensList.map((ratingItem: ITokenRating) => { + return ratingItem.averageScore; }) }); } \ No newline at end of file diff --git a/data-service/interface.d.ts b/data-service/interface.d.ts index 48996a9c05..6906514778 100644 --- a/data-service/interface.d.ts +++ b/data-service/interface.d.ts @@ -28,3 +28,21 @@ export interface IMoneyFactory { export interface IPriceMoneyFactory { (data: string | number | BigNumber, pair: AssetPair): Money; } + +export interface ITokenRating { + assetId: string; + assetName: string; + averageScore: number; + createdAt: string; + details: object; + lastAverageScore: number; + scoreBoard: object; + sender: string + sumTokens: number; + timestamp: number; + top: boolean; + txId: string + voted: boolean; + votes: array; + votesCount: 2; +} \ No newline at end of file diff --git a/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js b/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js index 3b0ba42f30..232c1f410b 100644 --- a/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js +++ b/src/modules/wallet/modules/portfolio/controllers/PortfolioCtrl.js @@ -159,7 +159,7 @@ this.observe('details', this._onChangeDetails); this.observe('filter', this._onChangeDetails); - this._onChangeDetails(); + // this._onChangeDetails(); utils.safeApply($scope); }); @@ -289,69 +289,86 @@ throw new Error('Wrong filter name!'); } - ds.api.rating.getAssetsRating(this.balanceList.map(balance => balance.asset.id)) - .then(ratingList => { - balanceList = balanceList.map((balance, i) => ({ - ...balance, - rating: ratingList[i] - })); - - this.balanceList = balanceList; - }); - - + this.balanceList = balanceList; } + // _addRating() { + // this.details.forEach(type => { + // type.forEach(asset => { + // + // }) + // }); + // ds.api.rating.getAssetsRating(this.balanceList.map(balance => balance.asset.id)) + // .then(ratingList => { + // balanceList = balanceList.map((balance, i) => ({ + // ...balance, + // rating: ratingList[i] + // })); + // + // this.balanceList = balanceList; + // }); + // } + /** * @private */ _updateBalances() { - const details = balanceWatcher.getFullBalanceList() - .map(item => { - const isPinned = this._isPinned(item.asset.id); - const isSpam = this._isSpam(item.asset.id); - const isOnScamList = user.scam[item.asset.id]; - // TODO Сунуть рейтинг тут - return { - available: item.available, - asset: item.asset, - inOrders: item.inOrders, - isPinned, - isSpam, - isOnScamList, - minSponsoredAssetFee: item.asset.minSponsoredAssetFee, - sponsorBalance: item.asset.sponsorBalance - }; - }) - .reduce((acc, item) => { - const oracleData = ds.dataManager.getOraclesAssetData(item.asset.id); - const spam = item.isOnScamList || item.isSpam; - - if (oracleData && oracleData.status > 0) { - acc.verified.push(item); - } - - if (spam) { - if (!this.dontShowSpam) { - if (item.asset.sender === user.address) { - acc.my.push(item); + const balanceList = balanceWatcher.getFullBalanceList(); + ds.api.rating.getAssetsRating(balanceList.map(balanceItem => balanceItem.asset.id)) + .then(ratingList => { + const balanceListWithRating = balanceList.map((balanceItem, i) => ({ + ...balanceItem, + rating: ratingList[i] + })); + + const details = balanceListWithRating + .map(item => { + const isPinned = this._isPinned(item.asset.id); + const isSpam = this._isSpam(item.asset.id); + const isOnScamList = user.scam[item.asset.id]; + return { + available: item.available, + asset: item.asset, + inOrders: item.inOrders, + isPinned, + isSpam, + isOnScamList, + rating: item.rating, + minSponsoredAssetFee: item.asset.minSponsoredAssetFee, + sponsorBalance: item.asset.sponsorBalance + }; + }) + .reduce((acc, item) => { + const oracleData = ds.dataManager.getOraclesAssetData(item.asset.id); + const spam = item.isOnScamList || item.isSpam; + + if (oracleData && oracleData.status > 0) { + acc.verified.push(item); } - acc.spam.push(item); - acc.active.push(item); - } - } else { - if (item.asset.sender === user.address) { - acc.my.push(item); - } - acc.active.push(item); - } - return acc; - }, { spam: [], my: [], active: [], verified: [] }); + if (spam) { + if (!this.dontShowSpam) { + if (item.asset.sender === user.address) { + acc.my.push(item); + } + acc.spam.push(item); + acc.active.push(item); + } + } else { + if (item.asset.sender === user.address) { + acc.my.push(item); + } + acc.active.push(item); + } + + return acc; + }, { spam: [], my: [], active: [], verified: [] }); - this.details = details; + this.details = details; - utils.safeApply($scope); + utils.safeApply($scope); + + }); } /** From a4056cf8c0fa4560d537857e24ecb33481b9516b Mon Sep 17 00:00:00 2001 From: Max Axenov Date: Wed, 19 Jun 2019 14:39:34 +0300 Subject: [PATCH 05/15] DEXW-1723: fix parse rating list --- data-service/api/rating/rating.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/data-service/api/rating/rating.ts b/data-service/api/rating/rating.ts index e7abf71ba2..eb8385cf9c 100644 --- a/data-service/api/rating/rating.ts +++ b/data-service/api/rating/rating.ts @@ -22,9 +22,8 @@ export function getAssetsRating(assets: string | Array) { }) } }) - .then((data: any) => { - const tokensList = JSON.parse(data); - return tokensList.map((ratingItem: ITokenRating) => { + .then((tokensList: any) => { + return Object.values(tokensList).map((ratingItem: ITokenRating) => { return ratingItem.averageScore; }) }); From d6d980e32484f8003bf0161246f2e252bb33c870 Mon Sep 17 00:00:00 2001 From: Max Axenov Date: Wed, 19 Jun 2019 19:07:10 +0300 Subject: [PATCH 06/15] DEXW-1723: stars in portfolio and asetinfo ready --- data-service/api/rating/rating.ts | 18 +-- data-service/config.ts | 1 - data-service/interface.d.ts | 5 + .../directives/assetInfoHead/AssetInfoHead.js | 7 +- src/modules/ui/directives/footer/footer.html | 2 +- .../ui/directives/ratingStars/ratingStars.js | 3 +- .../directives/ratingStars/ratingStars.less | 31 ++++- .../ratingStars/ratingStarsFactory.js | 22 ++-- .../assets/directives/asset/asset.html | 7 +- .../portfolio/controllers/PortfolioCtrl.js | 116 ++++++++---------- .../directives/portfolioRow/PortfolioRow.js | 5 +- .../portfolio/directives/portfolioRow/row.hbs | 30 ++--- 12 files changed, 136 insertions(+), 111 deletions(-) diff --git a/data-service/api/rating/rating.ts b/data-service/api/rating/rating.ts index eb8385cf9c..082e9e262b 100644 --- a/data-service/api/rating/rating.ts +++ b/data-service/api/rating/rating.ts @@ -1,30 +1,34 @@ // import { AssetPair, Money, BigNumber, OrderPrice } from '@waves/data-entities'; import { request } from '../../utils/request'; -import { ITokenRating } from '../../interface'; +import { ITokenRating, IParsedRating } from '../../interface'; import { stringifyJSON, toArray } from '../../utils/utils'; // import { get } from '../../config'; +const ratingApiUrl = 'https://tokenrating.wavesexplorer.com/api/v1'; -// export function getAssetRating(assets: string | Array): Promise> { -export function getAssetsRating(assets: string | Array) { +export function getAssetsRating(assets: string | Array): Promise> { return request( { - url: `https://tokenrating.wavesexplorer.com/api/v1/token/`, + url: `${ratingApiUrl}/token/`, fetchOptions: { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json;charset=UTF-8' }, - // body: stringifyJSON(toArray(assets)) body: stringifyJSON({ - "assetIds": toArray(assets) + "assetIds": toArray(assets), + "page": 1, + "limit": 25 }) } }) .then((tokensList: any) => { return Object.values(tokensList).map((ratingItem: ITokenRating) => { - return ratingItem.averageScore; + return { + assetId: ratingItem.assetId, + rating: ratingItem.averageScore + }; }) }); } \ No newline at end of file diff --git a/data-service/config.ts b/data-service/config.ts index 3904d36fab..4c19c347b2 100644 --- a/data-service/config.ts +++ b/data-service/config.ts @@ -69,7 +69,6 @@ export interface IConfigParams { assets: IHash; minimalSeedLength: number; remappedAssetNames: IHash; - // oracleAddress: string; oracleWaves: string; oracleTokenomica: string; } diff --git a/data-service/interface.d.ts b/data-service/interface.d.ts index 6906514778..233f6a8076 100644 --- a/data-service/interface.d.ts +++ b/data-service/interface.d.ts @@ -45,4 +45,9 @@ export interface ITokenRating { voted: boolean; votes: array; votesCount: 2; +} + +export interface IParsedRating { + assetId: string; + rating: number; } \ No newline at end of file diff --git a/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js b/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js index 155815d9b2..1edd687cbf 100644 --- a/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js +++ b/src/modules/ui/directives/assetInfoHead/AssetInfoHead.js @@ -40,15 +40,14 @@ } _getTokenRating() { - // return ds.fetch(`https://tokenrating.wavesexplorer.com/api/v1/token/${this.assetId}`); return ds.api.rating.getAssetsRating(this.assetId); } - _setTokenRating([rating]) { - if (!rating) { + _setTokenRating([asset]) { + if (!asset) { return null; } - this.rating = rating; + this.rating = asset.rating; $scope.$apply(); } diff --git a/src/modules/ui/directives/footer/footer.html b/src/modules/ui/directives/footer/footer.html index 0d98719ab7..aef48574e4 100644 --- a/src/modules/ui/directives/footer/footer.html +++ b/src/modules/ui/directives/footer/footer.html @@ -1,4 +1,4 @@ -