Add all filters into request for subscribers count
[MAILPOET-3469]
This commit is contained in:
@@ -167,7 +167,7 @@ export const Form: React.FunctionComponent<Props> = ({
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
handleSave(segmentId);
|
handleSave(segmentId);
|
||||||
}}
|
}}
|
||||||
isDisabled={!isFormValid(segment)}
|
isDisabled={!isFormValid(segment.filters)}
|
||||||
>
|
>
|
||||||
{MailPoet.I18n.t('save')}
|
{MailPoet.I18n.t('save')}
|
||||||
</Button>
|
</Button>
|
||||||
|
@@ -3,6 +3,8 @@ import _ from 'lodash';
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
AnyFormItem,
|
AnyFormItem,
|
||||||
|
Segment,
|
||||||
|
SegmentConnectTypes,
|
||||||
} from './types';
|
} from './types';
|
||||||
|
|
||||||
export interface Result {
|
export interface Result {
|
||||||
@@ -10,40 +12,29 @@ export interface Result {
|
|||||||
errors: string[];
|
errors: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
let previousFormItem: AnyFormItem | undefined;
|
export interface Filters {
|
||||||
|
filters: AnyFormItem[];
|
||||||
|
filters_connect: SegmentConnectTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
let previousFormItem: Filters | undefined;
|
||||||
|
|
||||||
let previousResult: Result | undefined;
|
let previousResult: Result | undefined;
|
||||||
|
|
||||||
// Names of keys from interface FormItem
|
function loadCount(formItem: Segment): Promise<Result | void> {
|
||||||
const allowedItemKeys: string[] = [
|
|
||||||
'wordpressRole',
|
|
||||||
'segmentType',
|
|
||||||
'action',
|
|
||||||
'newsletter_id',
|
|
||||||
'category_id',
|
|
||||||
'product_id',
|
|
||||||
'country_code',
|
|
||||||
'link_id',
|
|
||||||
'days',
|
|
||||||
'opens',
|
|
||||||
'operator',
|
|
||||||
'number_of_orders_type',
|
|
||||||
'number_of_orders_count',
|
|
||||||
'number_of_orders_days',
|
|
||||||
'total_spent_type',
|
|
||||||
'total_spent_amount',
|
|
||||||
'total_spent_days',
|
|
||||||
'value',
|
|
||||||
];
|
|
||||||
|
|
||||||
function loadCount(formItem: AnyFormItem): Promise<Result | void> {
|
|
||||||
// We don't want to use properties like name and description
|
// We don't want to use properties like name and description
|
||||||
const item = _.pick(formItem, allowedItemKeys);
|
const item = {
|
||||||
|
filters: formItem.filters,
|
||||||
|
filters_connect: formItem.filters_connect,
|
||||||
|
};
|
||||||
// When item is the same as in the previous call we return previous result
|
// When item is the same as in the previous call we return previous result
|
||||||
if (_.isEqual(item, previousFormItem)) {
|
if (_.isEqual(item, previousFormItem)) {
|
||||||
return Promise.resolve(previousResult);
|
return Promise.resolve(previousResult);
|
||||||
}
|
}
|
||||||
previousFormItem = { ...item } as AnyFormItem;
|
previousFormItem = {
|
||||||
|
filters: [...formItem.filters],
|
||||||
|
filters_connect: formItem.filters_connect,
|
||||||
|
};
|
||||||
|
|
||||||
return MailPoet.Ajax.post({
|
return MailPoet.Ajax.post({
|
||||||
api_version: MailPoet.apiVersion,
|
api_version: MailPoet.apiVersion,
|
||||||
|
@@ -6,7 +6,7 @@ import { isFormValid } from './validator';
|
|||||||
import { loadCount } from './subscribers_calculator';
|
import { loadCount } from './subscribers_calculator';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AnyFormItem,
|
Segment,
|
||||||
} from './types';
|
} from './types';
|
||||||
|
|
||||||
interface SubscriberCount {
|
interface SubscriberCount {
|
||||||
@@ -22,13 +22,14 @@ const SubscribersCounter: React.FunctionComponent = () => {
|
|||||||
errors: undefined,
|
errors: undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
const segment: AnyFormItem = useSelect(
|
const segment: Segment = useSelect(
|
||||||
(select) => select('mailpoet-dynamic-segments-form').getSegment(),
|
(select) => select('mailpoet-dynamic-segments-form').getSegment(),
|
||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const serializedSegment = JSON.stringify(segment);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
function load(loadItem: AnyFormItem): void {
|
function load(loadItem: Segment): void {
|
||||||
setSubscribersCount({
|
setSubscribersCount({
|
||||||
loading: true,
|
loading: true,
|
||||||
count: undefined,
|
count: undefined,
|
||||||
@@ -53,7 +54,7 @@ const SubscribersCounter: React.FunctionComponent = () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isFormValid(segment)) {
|
if (isFormValid(segment.filters)) {
|
||||||
load(segment);
|
load(segment);
|
||||||
} else {
|
} else {
|
||||||
setSubscribersCount({
|
setSubscribersCount({
|
||||||
@@ -61,7 +62,7 @@ const SubscribersCounter: React.FunctionComponent = () => {
|
|||||||
loading: false,
|
loading: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [segment]);
|
}, [segment, serializedSegment]);
|
||||||
|
|
||||||
if (subscribersCount.errors) {
|
if (subscribersCount.errors) {
|
||||||
return (
|
return (
|
||||||
|
@@ -11,7 +11,12 @@ const validationMap = {
|
|||||||
[SegmentTypes.WooCommerceSubscription]: validateWooCommerceSubscription,
|
[SegmentTypes.WooCommerceSubscription]: validateWooCommerceSubscription,
|
||||||
};
|
};
|
||||||
|
|
||||||
export function isFormValid(item: AnyFormItem): boolean {
|
export function isFormValid(items: AnyFormItem[]): boolean {
|
||||||
if (validationMap[item.segmentType] === undefined) return false;
|
if (items.length < 1) return false;
|
||||||
return validationMap[item.segmentType](item);
|
const validationResults: boolean[] = items.map((item: AnyFormItem) => {
|
||||||
|
if (validationMap[item.segmentType] === undefined) return false;
|
||||||
|
return validationMap[item.segmentType](item);
|
||||||
|
});
|
||||||
|
|
||||||
|
return validationResults.filter((result) => result === false).length === 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user