Skip to content
Merged
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
5 changes: 4 additions & 1 deletion frontend/src/Utils/StaticData/webhookIntegrations.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,10 @@ export const customFormIntegrations = [
'Post',
'WordPress',
'BookingPress',
"FluentPdfGenerator",
'FluentPdfGenerator',
'B2BKing',
'SureDash',
'Wsms',
"WebbaBooking",
"B2BKing",
"FormyChat",
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 @@ -180,6 +180,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 EditWebbaBooking = lazy(() => import('./WebbaBooking/EditWebbaBooking'))
const EditMoreConvertWishlist = lazy(() => import('./MoreConvertWishlist/EditMoreConvertWishlist'))
const EditHefflCRM = lazy(() => import('./HefflCRM/EditHefflCRM'))
Expand Down Expand Up @@ -628,6 +629,8 @@ const IntegType = memo(({ allIntegURL, flow }) => {
return <EditBookly allIntegURL={allIntegURL} />
case 'FluentCart':
return <EditFluentCart allIntegURL={allIntegURL} />
case 'Wsms':
return <EditWsms allIntegURL={allIntegURL} />
case 'WebbaBooking':
return <EditWebbaBooking allIntegURL={allIntegURL} />
case 'MoreConvert Wishlist':
Expand Down
5 changes: 5 additions & 0 deletions frontend/src/components/AllIntegrations/IntegInfo.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,9 @@ 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 WebbaBookingAuthorization = lazy(() => import('./WebbaBooking/WebbaBookingAuthorization'))
const MoreConvertWishlistAuthorization = lazy(
() => import('./MoreConvertWishlist/MoreConvertWishlistAuthorization')
Expand Down Expand Up @@ -673,6 +676,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 'WebbaBooking':
return <WebbaBookingAuthorization webbaBookingConf={integrationConf} step={1} isInfo />
case 'MoreConvert Wishlist':
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 @@ -179,6 +179,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 WebbaBooking = lazy(() => import('./WebbaBooking/WebbaBooking'))
const MoreConvertWishlist = lazy(() => import('./MoreConvertWishlist/MoreConvertWishlist'))
const HefflCRM = lazy(() => import('./HefflCRM/HefflCRM'))
Expand Down Expand Up @@ -1759,6 +1760,15 @@ export default function NewInteg({ allIntegURL }) {
setFlow={setFlow}
/>
)
case 'Wsms':
return (
<Wsms
allIntegURL={allIntegURL}
formFields={flow?.triggerData?.fields}
flow={flow}
setFlow={setFlow}
/>
)
case 'WebbaBooking':
return (
<WebbaBooking
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