Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions backend/Actions/Wsms/RecordApiHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
<?php

/**
* WSMS (WP SMS) Record Api
*/

namespace BitApps\Integrations\Actions\Wsms;

use BitApps\Integrations\Config;
use BitApps\Integrations\Core\Util\Common;
use BitApps\Integrations\Core\Util\Hooks;
use BitApps\Integrations\Log\LogHandler;

/**
* Provide functionality for Record insert, update
*/
class RecordApiHelper
{
private $_integrationID;

private $_integrationDetails;

public function __construct($integrationDetails, $integId)
{
$this->_integrationDetails = $integrationDetails;
$this->_integrationID = $integId;
}

/**
* Execute the integration
*
* @param array $fieldValues Field values from form
* @param array $fieldMap Field mapping
* @param array $utilities Actions to perform
*
* @return array
*/
public function execute($fieldValues, $fieldMap, $utilities)
{
if (!\defined('WP_SMS_VERSION')) {
return [
'success' => false,
'message' => __('WSMS (WP SMS) is not installed or activated', 'bit-integrations')
];
}

$fieldData = static::generateReqDataFromFieldMap($fieldMap, $fieldValues);

$mainAction = $this->_integrationDetails->mainAction ?? 'send_sms';

$defaultResponse = [
'success' => false,
// translators: %s: Plugin name
'message' => wp_sprintf(__('%s plugin is not installed or activated', 'bit-integrations'), 'Bit Integrations Pro')
];

// Route to appropriate action method
switch ($mainAction) {
case 'send_sms':
$response = Hooks::apply(Config::withPrefix('wsms_send_sms'), $defaultResponse, $fieldData);
$type = 'sms';
$actionType = 'send_sms';

break;

case 'add_subscriber':
$response = Hooks::apply(Config::withPrefix('wsms_add_subscriber'), $defaultResponse, $fieldData, $this->_integrationDetails);
$type = 'subscriber';
$actionType = 'add_subscriber';

break;

case 'update_subscriber':
$response = Hooks::apply(Config::withPrefix('wsms_update_subscriber'), $defaultResponse, $fieldData, $this->_integrationDetails);
$type = 'subscriber';
$actionType = 'update_subscriber';

break;

case 'delete_subscriber':
$response = Hooks::apply(Config::withPrefix('wsms_delete_subscriber'), $defaultResponse, $fieldData, $this->_integrationDetails);
$type = 'subscriber';
$actionType = 'delete_subscriber';

break;

case 'add_group':
$response = Hooks::apply(Config::withPrefix('wsms_add_group'), $defaultResponse, $fieldData);
$type = 'group';
$actionType = 'add_group';

break;

case 'update_group':
$response = Hooks::apply(Config::withPrefix('wsms_update_group'), $defaultResponse, $fieldData);
$type = 'group';
$actionType = 'update_group';

break;

case 'delete_group':
$response = Hooks::apply(Config::withPrefix('wsms_delete_group'), $defaultResponse, $fieldData);
$type = 'group';
$actionType = 'delete_group';

break;

default:
$response = [
'success' => false,
'message' => __('Invalid action', 'bit-integrations')
];
$type = 'WSMS';
$actionType = 'unknown';

break;
}

$responseType = isset($response['success']) && $response['success'] ? 'success' : 'error';
LogHandler::save($this->_integrationID, ['type' => $type, 'type_name' => $actionType], $responseType, $response);

return $response;
}

private static function generateReqDataFromFieldMap($fieldMap, $fieldValues)
{
$dataFinal = [];
foreach ($fieldMap as $item) {
$triggerValue = $item->formField;
$actionValue = $item->wsmsField;

$dataFinal[$actionValue] = $triggerValue === 'custom' && isset($item->customValue) ? Common::replaceFieldWithValue($item->customValue, $fieldValues) : $fieldValues[$triggerValue] ?? '';
}

return $dataFinal;
}
}
11 changes: 11 additions & 0 deletions backend/Actions/Wsms/Routes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

if (!defined('ABSPATH')) {
exit;
}

use BitApps\Integrations\Actions\Wsms\WsmsController;
use BitApps\Integrations\Core\Util\Route;

Route::post('wsms_authorize', [WsmsController::class, 'wsmsAuthorize']);
Route::post('refresh_wsms_groups', [WsmsController::class, 'refreshGroups']);
76 changes: 76 additions & 0 deletions backend/Actions/Wsms/WsmsController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php

/**
* WSMS (WP SMS) Integration
*/

namespace BitApps\Integrations\Actions\Wsms;

use WP_Error;

/**
* Provide functionality for WSMS (WP SMS) integration
*/
class WsmsController
{
public static function isExists()
{
if (!\defined('WP_SMS_VERSION')) {
wp_send_json_error(
__(
'WSMS (WP SMS) is not activated or not installed',
'bit-integrations'
),
400
);
}
}

public static function wsmsAuthorize()
{
self::isExists();
wp_send_json_success(true);
}

public static function refreshGroups()
{
self::isExists();

$groups = [];

if (class_exists('\WP_SMS\Newsletter')) {
$allGroups = \WP_SMS\Newsletter::getGroups();

foreach ($allGroups ?: [] as $group) {
$groups[] = (object) [
'value' => (int) $group->ID,
'label' => $group->name,
];
}
}

$response['groups'] = $groups;
wp_send_json_success($response, 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'));
}

$recordApiHelper = new RecordApiHelper($integrationDetails, $integId);
$wsmsResponse = $recordApiHelper->execute($fieldValues, $fieldMap, $utilities);

if (is_wp_error($wsmsResponse)) {
return $wsmsResponse;
}

return $wsmsResponse;
}
}
1 change: 1 addition & 0 deletions backend/Core/Util/AllTriggersName.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public static function allTriggersName()
'FluentBooking' => ['name' => 'Fluent Booking', 'isPro' => true, 'is_active' => false],
'CreatorLms' => ['name' => 'Creator LMS', 'isPro' => true, 'is_active' => false],
'FluentCart' => ['name' => 'FluentCart', 'isPro' => true, 'is_active' => false],
'Wsms' => ['name' => 'WSMS (WP SMS)', 'isPro' => true, 'is_active' => false],
'FluentCrm' => ['name' => 'Fluent CRM', 'isPro' => true, 'is_active' => false],
'FluentCommunity' => ['name' => 'Fluent Community', 'isPro' => true, 'is_active' => false],
'FluentPdfGenerator' => ['name' => 'Fluent PDF Generator', 'isPro' => true, 'is_active' => false],
Expand Down
10 changes: 9 additions & 1 deletion frontend/src/Utils/StaticData/webhookIntegrations.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,15 @@ export const customFormIntegrations = [
'WordPress',
'FluentPdfGenerator',
'BookingPress',
'FluentPdfGenerator'
'FluentPdfGenerator',
'B2BKing',
'FormyChat',
'GiveWp',
'SenseiLMS',
'SureDash',
'WpDataTables',
'WpErp',
'Wsms'
]

export const actionHookIntegrations = ['ActionHook']
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/components/AllIntegrations/EditInteg.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ const EditCreatorLms = lazy(() => import('./CreatorLms/EditCreatorLms'))
const EditUltimateAffiliatePro = lazy(() => import('./UltimateAffiliatePro/EditUltimateAffiliatePro'))
const EditBookly = lazy(() => import('./Bookly/EditBookly'))
const EditFluentCart = lazy(() => import('./FluentCart/EditFluentCart'))
const EditWsms = lazy(() => import('./Wsms/EditWsms'))
const EditMoreConvertWishlist = lazy(() => import('./MoreConvertWishlist/EditMoreConvertWishlist'))
const EditHefflCRM = lazy(() => import('./HefflCRM/EditHefflCRM'))
const EditSecureCustomFields = lazy(() => import('./SecureCustomFields/EditSecureCustomFields'))
Expand Down Expand Up @@ -618,6 +619,8 @@ const IntegType = memo(({ allIntegURL, flow }) => {
return <EditBookly allIntegURL={allIntegURL} />
case 'FluentCart':
return <EditFluentCart allIntegURL={allIntegURL} />
case 'Wsms':
return <EditWsms allIntegURL={allIntegURL} />
case 'MoreConvert Wishlist':
return <EditMoreConvertWishlist allIntegURL={allIntegURL} />
case 'Heffl CRM':
Expand Down
3 changes: 3 additions & 0 deletions frontend/src/components/AllIntegrations/IntegInfo.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ const UltimateAffiliateProAuthorization = lazy(
)
const BooklyAuthorization = lazy(() => import('./Bookly/BooklyAuthorization'))
const FluentCartAuthorization = lazy(() => import('./FluentCart/FluentCartAuthorization'))
const WsmsAuthorization = lazy(() => import('./Wsms/WsmsAuthorization'))
const MoreConvertWishlistAuthorization = lazy(() =>
import('./MoreConvertWishlist/MoreConvertWishlistAuthorization'))
const HefflCRMAuthorization = lazy(() => import('./HefflCRM/HefflCRMAuthorization'))
Expand Down Expand Up @@ -666,6 +667,8 @@ export default function IntegInfo() {
return <BooklyAuthorization booklyConf={integrationConf} step={1} isInfo />
case 'FluentCart':
return <FluentCartAuthorization fluentCartConf={integrationConf} step={1} isInfo />
case 'Wsms':
return <WsmsAuthorization wsmsConf={integrationConf} step={1} isInfo />
case 'MoreConvert Wishlist':
return (
<MoreConvertWishlistAuthorization
Expand Down
10 changes: 10 additions & 0 deletions frontend/src/components/AllIntegrations/NewInteg.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ const CreatorLms = lazy(() => import('./CreatorLms/CreatorLms'))
const UltimateAffiliatePro = lazy(() => import('./UltimateAffiliatePro/UltimateAffiliatePro'))
const Bookly = lazy(() => import('./Bookly/Bookly'))
const FluentCart = lazy(() => import('./FluentCart/FluentCart'))
const Wsms = lazy(() => import('./Wsms/Wsms'))
const MoreConvertWishlist = lazy(() => import('./MoreConvertWishlist/MoreConvertWishlist'))
const HefflCRM = lazy(() => import('./HefflCRM/HefflCRM'))
const SecureCustomFields = lazy(() => import('./SecureCustomFields/SecureCustomFields'))
Expand Down Expand Up @@ -1728,6 +1729,15 @@ export default function NewInteg({ allIntegURL }) {
setFlow={setFlow}
/>
)
case 'Wsms':
return (
<Wsms
allIntegURL={allIntegURL}
formFields={flow?.triggerData?.fields}
flow={flow}
setFlow={setFlow}
/>
)
case 'MoreConvert Wishlist':
return (
<MoreConvertWishlist
Expand Down
76 changes: 76 additions & 0 deletions frontend/src/components/AllIntegrations/Wsms/EditWsms.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { useState } from 'react'
import { useNavigate, useParams } from 'react-router'
import { useRecoilState, useRecoilValue } from 'recoil'
import { $actionConf, $formFields, $newFlow } from '../../../GlobalStates'
import { __ } from '../../../Utils/i18nwrap'
import SnackMsg from '../../Utilities/SnackMsg'
import { saveActionConf } from '../IntegrationHelpers/IntegrationHelpers'
import IntegrationStepThree from '../IntegrationHelpers/IntegrationStepThree'
import SetEditIntegComponents from '../IntegrationHelpers/SetEditIntegComponents'
import { checkMappedFields, handleInput } from './WsmsCommonFunc'
import WsmsIntegLayout from './WsmsIntegLayout'

export default function EditWsms({ allIntegURL }) {
const navigate = useNavigate()
const { id, formID } = useParams()

const [wsmsConf, setWsmsConf] = useRecoilState($actionConf)
const [flow, setFlow] = useRecoilState($newFlow)
const formFields = useRecoilValue($formFields)
const [isLoading, setIsLoading] = useState(false)
const [snack, setSnackbar] = useState({ show: false })

return (
<div style={{ width: 900 }}>
<SnackMsg snack={snack} setSnackbar={setSnackbar} />

<div className="flx mt-3">
<b className="wdt-200 d-in-b">{__('Integration Name:', 'bit-integrations')}</b>
<input
className="btcd-paper-inp w-5"
onChange={e => handleInput(e, wsmsConf, setWsmsConf)}
name="name"
value={wsmsConf.name}
type="text"
placeholder={__('Integration Name...', 'bit-integrations')}
/>
</div>
<br />

<SetEditIntegComponents entity={flow.triggered_entity} setSnackbar={setSnackbar} />

<WsmsIntegLayout
formID={formID}
formFields={formFields}
wsmsConf={wsmsConf}
setWsmsConf={setWsmsConf}
setSnackbar={setSnackbar}
setIsLoading={setIsLoading}
isLoading={isLoading}
/>

<IntegrationStepThree
edit
saveConfig={() =>
saveActionConf({
flow,
setFlow,
allIntegURL,
conf: wsmsConf,
navigate,
id,
edit: 1,
setIsLoading,
setSnackbar
})
}
disabled={!checkMappedFields(wsmsConf)}
isLoading={isLoading}
dataConf={wsmsConf}
setDataConf={setWsmsConf}
formFields={formFields}
/>
<br />
</div>
)
}
Loading
Loading