Add all filters into request for subscribers count

[MAILPOET-3469]
This commit is contained in:
Jan Lysý
2021-06-08 11:52:15 +02:00
committed by Veljko V
parent aaf7ea6d99
commit c91b8f75d5
4 changed files with 32 additions and 35 deletions

View File

@@ -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>

View File

@@ -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,

View File

@@ -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 (

View File

@@ -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;
} }