JSFiddle - React, Tailwind, and code Playground

Registering and executing functions

by tonytlwu

JavaScript

var registeredFunctions= {};

// Function registration, i.e. Fliplet.Navigate.registerFunction()
function registerFunction(name, fn) {
	registeredFunctions[name] = fn;
}

// Not used
function generatePayload(payloadStr) {
  var regex = /^this\.|\[.+$/;
  
  var result;

  try {
    result = eval(payloadStr);
  } catch(e) {
    console.error(`${payloadStr} is not a valid variable`)
  }
	
  return result;
}

// Function execution, i.e. Fliplet.Navigate.runFunction()
function runFunction(fnName, context = {}) {
	if (!fnName) {
    throw new Error('Function name must be provided');
  }
  
  // var fnName = 'sendEmail'; // Extracted from jsString
  // var payload = 'this.fields.to, "Email subject here"'.split(',').map(param => param.trim()); // Extracted from jsString
  var fn = registeredFunctions[fnName];
  
  if (typeof fn !== 'function') {
    throw new Error(`${fnName} is not a registered function. You must use Fliplet.Navigate.registerFunction() to register the function before calling it.`);
  }
  
  return fn.bind(context).call(this);
  
  // fn.bind(context).call(this, ...payload.map(param => generatePayload.bind(context).call(this, param)));
}

// Function registered in custom code
registerFunction('sendEmail', function() {
  // Expects "fields" to be an available property in this
  console.log('Available variables', this);
});

// JavaScript calling string provided by Studio user in action provider
var jsString = 'sendEmail';

// Executing function from the form when user clicks on button
runFunction(jsString, {
	fields: { to: '[email protected]' }
});