diff --git a/mailpoet/assets/js/src/segments/dynamic/store/actions.ts b/mailpoet/assets/js/src/segments/dynamic/store/actions.ts index 56cc384756..5733df85a3 100644 --- a/mailpoet/assets/js/src/segments/dynamic/store/actions.ts +++ b/mailpoet/assets/js/src/segments/dynamic/store/actions.ts @@ -13,6 +13,7 @@ import { SubscriberCount, SetSubscriberCountActionType, UpdateSegmentActionData, + Segment, } from '../types'; import { storeName } from './constants'; @@ -156,10 +157,11 @@ export function* handleSave(segmentId?: number): Generator<{ export function* createFromTemplate(): Generator<{ type: string; - segment?: AnyFormItem; + segment?: Segment; }> { MailPoet.Modal.loading(true); const segment = select(storeName).getSegment(); + segment.force_creation = true; // create segment with a random name if one with the same name already exists yield setErrors([]); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -- I don't know how to configure typescript to understand this diff --git a/mailpoet/assets/js/src/segments/dynamic/store/controls.ts b/mailpoet/assets/js/src/segments/dynamic/store/controls.ts index 5980e7b423..3ccddeda67 100644 --- a/mailpoet/assets/js/src/segments/dynamic/store/controls.ts +++ b/mailpoet/assets/js/src/segments/dynamic/store/controls.ts @@ -1,7 +1,7 @@ import { MailPoet } from 'mailpoet'; import { assign, has } from 'lodash/fp'; -import { AnyFormItem } from '../types'; +import { AnyFormItem, Segment } from '../types'; import { isErrorResponse } from '../../../ajax'; function convertSavedData(data: Record): AnyFormItem { @@ -53,7 +53,7 @@ export async function SAVE_SEGMENT(actionData): Promise<{ success: boolean; error?: string[]; }> { - const segment: AnyFormItem = actionData.segment; + const segment: Segment = actionData.segment; try { const response = await MailPoet.Ajax.post({ api_version: MailPoet.apiVersion, @@ -61,7 +61,10 @@ export async function SAVE_SEGMENT(actionData): Promise<{ action: 'save', data: segment, }); + segment.id = response.data.id; + segment.name = response.data.name; + return { success: true, }; diff --git a/mailpoet/assets/js/src/segments/dynamic/types.ts b/mailpoet/assets/js/src/segments/dynamic/types.ts index 755072bb84..28e33d43e5 100644 --- a/mailpoet/assets/js/src/segments/dynamic/types.ts +++ b/mailpoet/assets/js/src/segments/dynamic/types.ts @@ -181,6 +181,7 @@ export type Segment = { description?: string; filters_connect?: SegmentConnectTypes; filters?: AnyFormItem[]; + force_creation?: boolean; }; export type AnyFormItem = diff --git a/mailpoet/lib/Segments/DynamicSegments/SegmentSaveController.php b/mailpoet/lib/Segments/DynamicSegments/SegmentSaveController.php index 29a5e5e0e5..4782c21a80 100644 --- a/mailpoet/lib/Segments/DynamicSegments/SegmentSaveController.php +++ b/mailpoet/lib/Segments/DynamicSegments/SegmentSaveController.php @@ -38,6 +38,11 @@ class SegmentSaveController { public function save(array $data = []): SegmentEntity { $id = isset($data['id']) ? (int)$data['id'] : null; $name = $data['name'] ?? ''; + + if (!$this->segmentsRepository->isNameUnique($name, null) && isset($data['force_creation']) && $data['force_creation'] === 'true') { + $name = $name . ' (' . wp_generate_password(12, false) . ')'; + } + $description = $data['description'] ?? ''; $filtersData = $this->filterDataMapper->map($data);