From f0eb8f8b97efa9752fdf02d4303e68cfbf88ad07 Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Sat, 18 Nov 2017 09:41:58 -0500 Subject: [PATCH 1/2] Uses proper limit parameter --- src/lib/stores/PushAudiencesStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/stores/PushAudiencesStore.js b/src/lib/stores/PushAudiencesStore.js index 6b5e032263..ae442e5c3a 100644 --- a/src/lib/stores/PushAudiencesStore.js +++ b/src/lib/stores/PushAudiencesStore.js @@ -29,7 +29,7 @@ function PushAudiencesStore(state, action) { return Parse.Promise.as(state); } } - const path = action.limit ? `push_audiences?audience_limit=${action.limit}` : 'push_audiences'; + const path = action.limit ? `push_audiences?limit=${action.limit}` : 'push_audiences'; const promise = Parse._request('GET', path, {}, { useMasterKey: true }); return promise.then(({ results, showMore }) => { From 3de48ef08061a814188277a539d8696822f948bb Mon Sep 17 00:00:00 2001 From: Florent Vilmart Date: Sat, 18 Nov 2017 11:22:28 -0500 Subject: [PATCH 2/2] More support for audiences, sizes, creation time --- package.json | 2 +- .../PushAudienceDialog.react.js | 4 ++-- .../PushAudiencesOption.react.js | 4 ++-- .../PushAudiencesSelector.react.js | 4 ++-- src/dashboard/Push/PushAudiencesData.react.js | 4 +++- src/lib/ParseApp.js | 16 ++++++++++------ 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 2f2a7eeda0..e70eac9998 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "js-beautify": "~1.6.14", "marked": "^0.3.5", "node-sass": "^4.5.3", - "parse": "1.9.2", + "parse": "^1.10.2", "prismjs": "~1.6.0", "react": "^15.0.1", "react-addons-test-utils": "^15.0.1", diff --git a/src/components/PushAudienceDialog/PushAudienceDialog.react.js b/src/components/PushAudienceDialog/PushAudienceDialog.react.js index 80e4f35e7b..c823b5b422 100644 --- a/src/components/PushAudienceDialog/PushAudienceDialog.react.js +++ b/src/components/PushAudienceDialog/PushAudienceDialog.react.js @@ -26,8 +26,8 @@ import TextInput from 'components/TextInput/TextInput.react'; import Toggle from 'components/Toggle/Toggle.react'; import { List, Map } from 'immutable'; -const PARSE_SERVER_SUPPORTS_SAVED_AUDIENCES = false; -const AUDIENCE_SIZE_FETCHING_ENABLED = false; +const PARSE_SERVER_SUPPORTS_SAVED_AUDIENCES = true; +const AUDIENCE_SIZE_FETCHING_ENABLED = true; let filterFormatter = (filters, schema) => { return filters.map((filter) => { diff --git a/src/components/PushAudiencesSelector/PushAudiencesOption.react.js b/src/components/PushAudiencesSelector/PushAudiencesOption.react.js index b62ba2f090..fd458e6560 100644 --- a/src/components/PushAudiencesSelector/PushAudiencesOption.react.js +++ b/src/components/PushAudiencesSelector/PushAudiencesOption.react.js @@ -16,8 +16,8 @@ import PushAudiencesBaseRow from 'components/PushAudiencesSelector/PushAudi const FORM_PREFIX = 'audience_radio'; -const AUDIENCE_SIZE_FETCHING_ENABLED = false; -const AUDIENCE_CREATED_DATE_ENABLED = false; +const AUDIENCE_SIZE_FETCHING_ENABLED = true; +const AUDIENCE_CREATED_DATE_ENABLED = true; export default class PushAudiencesOption extends PushAudiencesBaseRow { constructor() { diff --git a/src/components/PushAudiencesSelector/PushAudiencesSelector.react.js b/src/components/PushAudiencesSelector/PushAudiencesSelector.react.js index 98081d8313..a58f262ad4 100644 --- a/src/components/PushAudiencesSelector/PushAudiencesSelector.react.js +++ b/src/components/PushAudiencesSelector/PushAudiencesSelector.react.js @@ -12,8 +12,8 @@ import React from 'react'; import styles from 'components/PushAudiencesSelector/PushAudiencesSelector.scss'; import { fromJS } from 'immutable'; -const AUDIENCE_SIZE_FETCHING_ENABLED = false; -const AUDIENCE_CREATED_DATE_ENABLED = false; +const AUDIENCE_SIZE_FETCHING_ENABLED = true; +const AUDIENCE_CREATED_DATE_ENABLED = true; const PushAudiencesOptions = ({ current, diff --git a/src/dashboard/Push/PushAudiencesData.react.js b/src/dashboard/Push/PushAudiencesData.react.js index b1b395d1f9..c229709d41 100644 --- a/src/dashboard/Push/PushAudiencesData.react.js +++ b/src/dashboard/Push/PushAudiencesData.react.js @@ -126,7 +126,9 @@ export default class PushAudiencesData extends React.Component { // Horrible code here is due to old rails code that sent pushes through it's own endpoint, while Parse Server sends through Parse.Push. // Ideally, we would pass a Parse.Query around everywhere. parseQuery.containedIn('deviceType', platforms); - this.props.onChange(saveForFuture ? (() => {throw "Audiences not supported"})() : PushConstants.NEW_SEGMENT_ID, parseQuery, 1 /* TODO: get the read device count */); + if (!saveForFuture) { + this.props.onChange(PushConstants.NEW_SEGMENT_ID, parseQuery, 1 /* TODO: get the read device count */); + } if (saveForFuture){ this.props.pushAudiencesStore.dispatch(PushAudiencesStore.ActionTypes.CREATE, { diff --git a/src/lib/ParseApp.js b/src/lib/ParseApp.js index 661ef829e4..cf61399317 100644 --- a/src/lib/ParseApp.js +++ b/src/lib/ParseApp.js @@ -374,13 +374,17 @@ export default class ParseApp { } fetchPushSubscriberCount(audienceId, query) { - let path = '/apps/' + this.slug + '/dashboard_ajax/push_subscriber_count'; - let urlsSeparator = '?'; - if (query){ - path += `?where=${encodeURI(JSON.stringify(query))}`; - urlsSeparator = '&'; + let promise; + if (!query) { + promise = new Parse.Query('_Audience').get(audienceId, { useMasterKey: true }).then(function(audience) { + return Parse.Query.fromJSON('_Installation', { where: audience.get('query') }).count({ useMasterKey: true }) + }); + } else { + promise = Parse.Query.fromJSON('_Installation', { where: query }).count({ useMasterKey: true }) } - return AJAX.abortableGet(audienceId ? `${path}${urlsSeparator}audienceId=${audienceId}` : path); + return { xhr: undefined, promise: promise.then(function (count) { + return { count: count }; + }) }; } fetchPushNotifications(type, page, limit) {