From 9f5da0dbadede1ed64ba19d0337860d615bd1d4a Mon Sep 17 00:00:00 2001
From: Rishad Alam <101513331+RishadAlam@users.noreply.github.com>
Date: Sat, 23 May 2026 17:38:20 +0600
Subject: [PATCH 1/4] feat: add MainWP integration support with necessary
components and API handlers
---
backend/Actions/MainWP/MainWPController.php | 65 +++++++
backend/Actions/MainWP/RecordApiHelper.php | 123 +++++++++++++
backend/Actions/MainWP/Routes.php | 11 ++
backend/Core/Util/AllTriggersName.php | 1 +
.../components/AllIntegrations/EditInteg.jsx | 3 +
.../components/AllIntegrations/IntegInfo.jsx | 3 +
.../AllIntegrations/MainWP/EditMainWP.jsx | 76 ++++++++
.../AllIntegrations/MainWP/MainWP.jsx | 109 ++++++++++++
.../MainWP/MainWPAuthorization.jsx | 105 +++++++++++
.../MainWP/MainWPCommonFunc.js | 51 ++++++
.../AllIntegrations/MainWP/MainWPFieldMap.jsx | 104 +++++++++++
.../MainWP/MainWPIntegLayout.jsx | 163 ++++++++++++++++++
.../AllIntegrations/MainWP/staticData.js | 52 ++++++
.../components/AllIntegrations/NewInteg.jsx | 10 ++
.../src/components/Flow/New/SelectAction.jsx | 1 +
15 files changed, 877 insertions(+)
create mode 100644 backend/Actions/MainWP/MainWPController.php
create mode 100644 backend/Actions/MainWP/RecordApiHelper.php
create mode 100644 backend/Actions/MainWP/Routes.php
create mode 100644 frontend/src/components/AllIntegrations/MainWP/EditMainWP.jsx
create mode 100644 frontend/src/components/AllIntegrations/MainWP/MainWP.jsx
create mode 100644 frontend/src/components/AllIntegrations/MainWP/MainWPAuthorization.jsx
create mode 100644 frontend/src/components/AllIntegrations/MainWP/MainWPCommonFunc.js
create mode 100644 frontend/src/components/AllIntegrations/MainWP/MainWPFieldMap.jsx
create mode 100644 frontend/src/components/AllIntegrations/MainWP/MainWPIntegLayout.jsx
create mode 100644 frontend/src/components/AllIntegrations/MainWP/staticData.js
diff --git a/backend/Actions/MainWP/MainWPController.php b/backend/Actions/MainWP/MainWPController.php
new file mode 100644
index 000000000..0a58c0231
--- /dev/null
+++ b/backend/Actions/MainWP/MainWPController.php
@@ -0,0 +1,65 @@
+get_sites();
+
+ $sites = [];
+ if (!empty($websites)) {
+ foreach ($websites as $website) {
+ if (empty($website->id)) {
+ continue;
+ }
+ $sites[] = [
+ 'value' => (string) $website->id,
+ 'label' => ($website->name ?? 'Site') . ' (' . ($website->url ?? '') . ')',
+ ];
+ }
+ }
+
+ wp_send_json_success(['sites' => $sites], 200);
+ }
+
+ public function execute($integrationData, $fieldValues)
+ {
+ $integrationDetails = $integrationData->flow_details;
+ $integId = $integrationData->id;
+ $fieldMap = $integrationDetails->field_map;
+ $utilities = isset($integrationDetails->utilities) ? $integrationDetails->utilities : [];
+
+ if (empty($fieldMap)) {
+ return new WP_Error('field_map_empty', __('Field map is empty', 'bit-integrations'));
+ }
+
+ return (new RecordApiHelper($integrationDetails, $integId))->execute($fieldValues, $fieldMap, $utilities);
+ }
+}
diff --git a/backend/Actions/MainWP/RecordApiHelper.php b/backend/Actions/MainWP/RecordApiHelper.php
new file mode 100644
index 000000000..badfe26a4
--- /dev/null
+++ b/backend/Actions/MainWP/RecordApiHelper.php
@@ -0,0 +1,123 @@
+_integrationDetails = $integrationDetails;
+ $this->_integrationID = $integId;
+ }
+
+ public function execute($fieldValues, $fieldMap, $utilities)
+ {
+ if (!class_exists('\MainWP\Dashboard\MainWP_DB')) {
+ return [
+ 'success' => false,
+ 'message' => __('MainWP Dashboard is not installed or activated', 'bit-integrations'),
+ ];
+ }
+
+ $fieldData = static::generateReqDataFromFieldMap($fieldMap, $fieldValues);
+ $mainAction = $this->_integrationDetails->mainAction ?? 'sync_site';
+
+ if (!empty($this->_integrationDetails->selectedSite)) {
+ $fieldData['site_id'] = (int) $this->_integrationDetails->selectedSite;
+ }
+
+ $defaultResponse = [
+ 'success' => false,
+ 'message' => wp_sprintf(__('%s plugin is not installed or activated', 'bit-integrations'), 'Bit Integrations Pro'),
+ ];
+
+ switch ($mainAction) {
+ case 'sync_site':
+ $response = Hooks::apply(Config::withPrefix('main_wp_sync_site'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'sync_site';
+
+ break;
+
+ case 'sync_all_sites':
+ $response = Hooks::apply(Config::withPrefix('main_wp_sync_all_sites'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'sync_all_sites';
+
+ break;
+
+ case 'create_post':
+ $response = Hooks::apply(Config::withPrefix('main_wp_create_post'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'create_post';
+
+ break;
+
+ case 'update_post':
+ $response = Hooks::apply(Config::withPrefix('main_wp_update_post'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'update_post';
+
+ break;
+
+ case 'delete_post':
+ $response = Hooks::apply(Config::withPrefix('main_wp_delete_post'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'delete_post';
+
+ break;
+
+ case 'activate_plugin':
+ $response = Hooks::apply(Config::withPrefix('main_wp_activate_plugin'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'activate_plugin';
+
+ break;
+
+ case 'deactivate_plugin':
+ $response = Hooks::apply(Config::withPrefix('main_wp_deactivate_plugin'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'deactivate_plugin';
+
+ break;
+
+ case 'create_user':
+ $response = Hooks::apply(Config::withPrefix('main_wp_create_user'), $defaultResponse, $fieldData, $utilities, $this->_integrationDetails);
+ $actionType = 'create_user';
+
+ break;
+
+ default:
+ $response = ['success' => false, 'message' => __('Invalid action', 'bit-integrations')];
+ $actionType = 'unknown';
+
+ break;
+ }
+
+ $responseType = isset($response['success']) && $response['success'] ? 'success' : 'error';
+ LogHandler::save($this->_integrationID, ['type' => 'MainWP', 'type_name' => $actionType], $responseType, $response);
+
+ return $response;
+ }
+
+ private static function generateReqDataFromFieldMap($fieldMap, $fieldValues): array
+ {
+ $data = [];
+ foreach ($fieldMap as $item) {
+ $triggerValue = $item->formField;
+ $actionValue = $item->mainWPField;
+
+ $data[$actionValue] = $triggerValue === 'custom' && isset($item->customValue)
+ ? Common::replaceFieldWithValue($item->customValue, $fieldValues)
+ : $fieldValues[$triggerValue] ?? '';
+ }
+
+ return $data;
+ }
+}
diff --git a/backend/Actions/MainWP/Routes.php b/backend/Actions/MainWP/Routes.php
new file mode 100644
index 000000000..bdead431e
--- /dev/null
+++ b/backend/Actions/MainWP/Routes.php
@@ -0,0 +1,11 @@
+ ['name' => 'MailPoet', 'isPro' => true, 'is_active' => false],
'MailMint' => ['name' => 'Mail Mint', 'isPro' => true, 'is_active' => false],
'Mailster' => ['name' => 'Mailster', 'isPro' => true, 'is_active' => false],
+ 'MainWP' => ['name' => 'MainWP', 'isPro' => true, 'is_active' => false],
'MasterStudyLms' => ['name' => 'MasterStudyLms', 'isPro' => true, 'is_active' => false],
'MasteriyoLMS' => ['name' => 'Masteriyo LMS', 'isPro' => true, 'is_active' => false],
'MyCred' => ['name' => 'myCred', 'isPro' => true, 'is_active' => false],
diff --git a/frontend/src/components/AllIntegrations/EditInteg.jsx b/frontend/src/components/AllIntegrations/EditInteg.jsx
index 08d20ab3e..6336ff026 100644
--- a/frontend/src/components/AllIntegrations/EditInteg.jsx
+++ b/frontend/src/components/AllIntegrations/EditInteg.jsx
@@ -159,6 +159,7 @@ const EditNewsletter = lazy(() => import('./Newsletter/EditNewsletter'))
const EditSureDash = lazy(() => import('./SureDash/EditSureDash'))
const EditSureMembers = lazy(() => import('./SureMembers/EditSureMembers'))
const EditMailster = lazy(() => import('./Mailster/EditMailster'))
+const EditMainWP = lazy(() => import('./MainWP/EditMainWP'))
const EditWPForo = lazy(() => import('./WPForo/EditWPForo'))
const EditDokan = lazy(() => import('./Dokan/EditDokan'))
const EditJetEngine = lazy(() => import('./JetEngine/EditJetEngine'))
@@ -576,6 +577,8 @@ const IntegType = memo(({ allIntegURL, flow }) => {
return