Repository navigation
Creator LMS Integration added #142
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
987e853
e3eda6a
36e105c
a61a69e
284cc59
d38ed3d
0725d1b
0a3fefd
b5f9aad
aab76f6
04d0a9e
5ae10ea
1f262aa
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| <?php | ||
|
|
||
| /** | ||
| * Creator LMS Integration | ||
| */ | ||
|
|
||
| namespace BitApps\Integrations\Actions\CreatorLms; | ||
|
|
||
| use WP_Error; | ||
|
|
||
| /** | ||
| * Provide functionality for Creator LMS integration | ||
| */ | ||
| class CreatorLmsController | ||
| { | ||
| public static function isExists() | ||
| { | ||
| if (!class_exists('CreatorLms') || !\function_exists('crlms_get_course')) { | ||
| wp_send_json_error( | ||
| __( | ||
| 'Creator LMS is not activated or not installed', | ||
| 'bit-integrations' | ||
| ), | ||
| 400 | ||
| ); | ||
| } | ||
| } | ||
|
|
||
| public static function creatorLmsAuthorize() | ||
| { | ||
| self::isExists(); | ||
| wp_send_json_success(true); | ||
| } | ||
|
|
||
| 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); | ||
|
|
||
| return $recordApiHelper->execute($fieldValues, $fieldMap, $utilities); | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| <?php | ||
|
|
||
| /** | ||
| * Creator LMS Record Api | ||
| */ | ||
|
|
||
| namespace BitApps\Integrations\Actions\CreatorLms; | ||
|
|
||
| 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; | ||
| } | ||
|
|
||
| public function execute($fieldValues, $fieldMap, $utilities) | ||
| { | ||
| if (!class_exists('CreatorLms') || !\function_exists('crlms_get_course')) { | ||
| return [ | ||
| 'success' => false, | ||
| 'message' => __('Creator LMS is not installed or activated', 'bit-integrations') | ||
| ]; | ||
| } | ||
|
|
||
| $fieldData = $this->generateReqDataFromFieldMap($fieldMap, $fieldValues); | ||
| $mainAction = $this->_integrationDetails->mainAction ?? 'create_student'; | ||
|
|
||
| $defaultResponse = [ | ||
| 'success' => false, | ||
| // translators: %s is replaced with the plugin name "Bit Integrations Pro" | ||
| 'message' => wp_sprintf(__('%s plugin is not installed or activated', 'bit-integrations'), 'Bit Integrations Pro') | ||
| ]; | ||
|
|
||
| switch ($mainAction) { | ||
| case 'create_student': | ||
| $response = Hooks::apply(Config::withPrefix('creator_lms_create_student'), $defaultResponse, $fieldData); | ||
| $type = 'student'; | ||
| $actionType = 'create_student'; | ||
|
|
||
| break; | ||
| case 'update_student_data': | ||
| $response = Hooks::apply(Config::withPrefix('creator_lms_update_student_data'), $defaultResponse, $fieldData); | ||
| $type = 'student'; | ||
| $actionType = 'update_student_data'; | ||
|
|
||
| break; | ||
| case 'enroll_user_in_course': | ||
| $response = Hooks::apply(Config::withPrefix('creator_lms_enroll_user_in_course'), $defaultResponse, $fieldData); | ||
| $type = 'enrollment'; | ||
| $actionType = 'enroll_user_in_course'; | ||
|
|
||
| break; | ||
| case 'create_course': | ||
| $response = Hooks::apply(Config::withPrefix('creator_lms_create_course'), $defaultResponse, $fieldData, $this->_integrationDetails); | ||
| $type = 'course'; | ||
| $actionType = 'create_course'; | ||
|
|
||
| break; | ||
| case 'mark_lesson_completed': | ||
| $response = Hooks::apply(Config::withPrefix('creator_lms_mark_lesson_completed'), $defaultResponse, $fieldData); | ||
| $type = 'lesson'; | ||
| $actionType = 'mark_lesson_completed'; | ||
|
|
||
| break; | ||
| default: | ||
| $response = ['success' => false, 'message' => __('Invalid action', 'bit-integrations')]; | ||
| $type = 'CreatorLms'; | ||
| $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 function generateReqDataFromFieldMap($fieldMap, $fieldValues) | ||
| { | ||
| $dataFinal = []; | ||
| foreach ($fieldMap as $item) { | ||
| $triggerValue = $item->formField; | ||
| $actionValue = $item->creatorLmsField; | ||
|
|
||
| $dataFinal[$actionValue] = $triggerValue === 'custom' && isset($item->customValue) | ||
| ? Common::replaceFieldWithValue($item->customValue, $fieldValues) | ||
| : $fieldValues[$triggerValue] ?? ''; | ||
| } | ||
|
|
||
| return $dataFinal; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| <?php | ||
|
|
||
| if (!defined('ABSPATH')) { | ||
| exit; | ||
| } | ||
|
|
||
| use BitApps\Integrations\Actions\CreatorLms\CreatorLmsController; | ||
| use BitApps\Integrations\Core\Util\Route; | ||
|
|
||
| Route::post('creator_lms_authorize', [CreatorLmsController::class, 'creatorLmsAuthorize']); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -53,7 +53,7 @@ public function insertTag($contactId, $tags) | |
| $header['Content-Type'] = 'application/json'; | ||
| $insertTagEndpoint = 'https://api.infusionsoft.com/crm/rest/v1/contacts/' . $contactId . '/tags'; | ||
|
|
||
| return $response = HttpHelper::post($insertTagEndpoint, wp_json_encode($data), $header); | ||
| return HttpHelper::post($insertTagEndpoint, wp_json_encode($data), $header); | ||
| } | ||
|
|
||
| public function generateReqDataFromFieldMap($data, $fieldMap) | ||
|
|
@@ -136,18 +136,17 @@ public function generateReqDataFromFieldMap($data, $fieldMap) | |
|
|
||
| public function execute($defaultConf, $fieldValues, $fieldMap, $actions) | ||
| { | ||
| $fieldData = []; | ||
| $finalData = $this->generateReqDataFromFieldMap($fieldValues, $fieldMap); | ||
| $apiResponse = $this->insertCard($finalData); | ||
|
|
||
| $responseType = $apiResponse->id ? 'success' : 'error'; | ||
| LogHandler::save($this->_integrationID, ['type' => 'contact', 'type_name' => 'add-contact'], $responseType, $apiResponse); | ||
|
|
||
| if ($defaultConf->actions->tags || isset($apiResponse->id)) { | ||
| $tagResponse = $this->insertTag($apiResponse->id, $defaultConf->selectedTags); | ||
| } | ||
| $reponseType = HttpHelper::$responseCode === 200 ? 'success' : 'error'; | ||
|
Comment on lines
145
to
+147
|
||
|
|
||
| if (!(isset($apiResponse->id))) { | ||
| LogHandler::save($this->_integrationID, ['type' => 'contact', 'type_name' => 'add-contact'], 'error', $apiResponse); | ||
| } else { | ||
| LogHandler::save($this->_integrationID, ['type' => 'record', 'type_name' => 'add-contact'], 'success', $apiResponse); | ||
| LogHandler::save($this->_integrationID, ['type' => 'record', 'type_name' => 'add-tags'], $reponseType, $tagResponse); | ||
|
Comment on lines
+147
to
+149
Comment on lines
145
to
+149
Comment on lines
+147
to
+149
|
||
| } | ||
|
Comment on lines
+142
to
150
|
||
|
|
||
| return $apiResponse; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| import { useState } from 'react' | ||
| import 'react-multiple-select-dropdown-lite/dist/index.css' | ||
| import { useNavigate, useParams } from 'react-router-dom' | ||
| import BackIcn from '../../../Icons/BackIcn' | ||
| import { __ } from '../../../Utils/i18nwrap' | ||
| import SnackMsg from '../../Utilities/SnackMsg' | ||
| import { saveIntegConfig } from '../IntegrationHelpers/IntegrationHelpers' | ||
| import IntegrationStepThree from '../IntegrationHelpers/IntegrationStepThree' | ||
| import CreatorLmsAuthorization from './CreatorLmsAuthorization' | ||
| import { checkMappedFields } from './CreatorLmsCommonFunc' | ||
| import CreatorLmsIntegLayout from './CreatorLmsIntegLayout' | ||
|
|
||
| export default function CreatorLms({ formFields, setFlow, flow, allIntegURL }) { | ||
| const navigate = useNavigate() | ||
| const { formID } = useParams() | ||
| const [isLoading, setIsLoading] = useState(false) | ||
| const [step, setStep] = useState(1) | ||
| const [snack, setSnackbar] = useState({ show: false }) | ||
| const [creatorLmsConf, setCreatorLmsConf] = useState({ | ||
| name: 'Creator LMS', | ||
| type: 'CreatorLms', | ||
| field_map: [{ formField: '', creatorLmsField: '' }], | ||
| actions: {}, | ||
| mainAction: '' | ||
| }) | ||
|
|
||
| const nextPage = val => { | ||
| setTimeout(() => { | ||
| document.getElementById('btcd-settings-wrp').scrollTop = 0 | ||
| }, 300) | ||
|
|
||
| if (val === 3) { | ||
| if (!checkMappedFields(creatorLmsConf)) { | ||
| setSnackbar({ | ||
| show: true, | ||
| msg: __('Please map all required fields to continue.', 'bit-integrations') | ||
| }) | ||
| return | ||
| } | ||
|
|
||
| if (creatorLmsConf.name !== '' && creatorLmsConf.field_map.length > 0) { | ||
| setStep(val) | ||
| } | ||
| } else { | ||
| setStep(val) | ||
| } | ||
| } | ||
|
|
||
| return ( | ||
| <div> | ||
| <SnackMsg snack={snack} setSnackbar={setSnackbar} /> | ||
| <div className="txt-center mt-2">{/* <Steps step={3} active={step} /> */}</div> | ||
|
|
||
| {/* STEP 1 */} | ||
| <CreatorLmsAuthorization | ||
| formID={formID} | ||
| creatorLmsConf={creatorLmsConf} | ||
| setCreatorLmsConf={setCreatorLmsConf} | ||
| step={step} | ||
| nextPage={nextPage} | ||
| isLoading={isLoading} | ||
| setIsLoading={setIsLoading} | ||
| setSnackbar={setSnackbar} | ||
| /> | ||
|
|
||
| {/* STEP 2 */} | ||
| <div | ||
| className="btcd-stp-page" | ||
| style={{ | ||
| width: step === 2 && 900, | ||
| height: step === 2 && 'auto', | ||
| minHeight: step === 2 && `${500}px` | ||
| }}> | ||
| <CreatorLmsIntegLayout | ||
| formID={formID} | ||
| formFields={formFields} | ||
| creatorLmsConf={creatorLmsConf} | ||
| setCreatorLmsConf={setCreatorLmsConf} | ||
| setSnackbar={setSnackbar} | ||
| setIsLoading={setIsLoading} | ||
| isLoading={isLoading} | ||
| /> | ||
| <br /> | ||
| <br /> | ||
| <br /> | ||
|
RishadAlam marked this conversation as resolved.
|
||
| <button | ||
| onClick={() => nextPage(3)} | ||
| disabled={!checkMappedFields(creatorLmsConf)} | ||
| className="btn f-right btcd-btn-lg purple sh-sm flx" | ||
| type="button"> | ||
| {__('Next', 'bit-integrations')} | ||
| <BackIcn className="ml-1 rev-icn" /> | ||
| </button> | ||
| </div> | ||
|
|
||
| {/* STEP 3 */} | ||
| <IntegrationStepThree | ||
| step={step} | ||
| saveConfig={() => | ||
| saveIntegConfig(flow, setFlow, allIntegURL, creatorLmsConf, navigate, '', '', setIsLoading) | ||
| } | ||
| isLoading={isLoading} | ||
| /> | ||
| </div> | ||
| ) | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.