view/adminhtml/web/js/lib/fbe.js (293 lines of code) (raw):
/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the code directory.
 */
'use strict';
var React = require('./react');
var ReactDOM = require('./react-dom');
var IEOverlay = require('./IEOverlay');
var FBModal = require('./Modal');
var FBUtils = require('./utils');
var jQuery = (function (jQuery) {
  if (jQuery && typeof jQuery === 'function') {
    return jQuery;
  } else {
    console.error('window.jQuery is not valid or loaded, please check your magento 2 installation!');
    // if jQuery is not there, we return a dummy jQuery obejct with ajax,
    // so it will not break our following code
    return {
      ajax: function () {
      }
    };
  }
})(window.jQuery);
var ajaxify = function (url) {
  return url + '?isAjax=true';
};
var ajaxParam = function (params) {
  if (window.FORM_KEY) {
    params.form_key = window.FORM_KEY;
  }
  return params;
};
var FBEFlowContainer = React.createClass({
    getDefaultProps: function() {
        console.log("init props installed "+window.facebookBusinessExtensionConfig.installed);
        return {
            installed: window.facebookBusinessExtensionConfig.installed
        };
    },
    getInitialState: function() {
        console.log("change state");
        return {installed: this.props.installed};
    },
  bindMessageEvents: function bindMessageEvents() {
    var _this = this;
    if (FBUtils.isIE() && window.MessageChannel) {
      // do nothing, wait for our messaging utils to be ready
    } else {
      window.addEventListener('message', function (event) {
        var origin = event.origin || event.originalEvent.origin;
        if (FBUtils.urlFromSameDomain(origin, window.facebookBusinessExtensionConfig.popupOrigin)) {
          // Make ajax calls to store data from fblogin and fb installs
          _this.consoleLog("Message from fblogin ");
          _this.saveFBLoginData(event.data);
        }
      }, false);
    }
  },
  saveFBLoginData: function saveFBLoginData(data) {
    var _this = this;
    if (data) {
      var responseObj = JSON.parse(data);
      _this.consoleLog("Response from fb login -- " + responseObj);
      var accessToken = responseObj.access_token;
      var success = responseObj.success;
      var pixelId = responseObj.pixel_id;
      var profiles = responseObj.profiles;
      var catalogId = responseObj.catalog_id;
      if(success) {
        let action = responseObj.action;
        if(action != null && action === 'delete') {
          // Delete asset ids stored in db instance.
          _this.consoleLog("Successfully uninstalled FBE");
            _this.deleteFBAssets();
        }else if(action != null && action === 'create') {
          _this.savePixelId(pixelId);
          _this.saveAccessToken(accessToken);
          _this.saveProfilesData(profiles);
          _this.saveAAMSettings(pixelId);
          _this.pushFeed(accessToken, catalogId);
          _this.setState({installed: 'true'});
        }
      }else {
        _this.consoleLog("No response received after setup");
      }
    }
  },
  savePixelId: function savePixelId(pixelId) {
    var _this = this;
    if (!pixelId) {
      console.error('Facebook Business Extension Error: got no pixel_id');
      return;
    }
    jQuery.ajax({
      type: 'post',
      url: ajaxify(window.facebookBusinessExtensionConfig.setPixelId),
      async : false,
      data: ajaxParam({
        pixelId: pixelId,
      }),
      success: function onSuccess(data, _textStatus, _jqXHR) {
        var response = data;
        let msg = '';
        if (response.success) {
          _this.setState({pixelId: response.pixelId});
          msg = "The Meta Pixel with ID: " + response.pixelId + " is now installed on your website.";
        } else {
          msg = "There was a problem saving the pixel. Please try again";
        }
        _this.consoleLog(msg);
      },
      error: function () {
        console.error('There was a problem saving the pixel with id', pixelId);
      }
    });
  },
  saveAccessToken: function saveAccessToken(accessToken) {
    var _this = this;
    if (!accessToken) {
      console.error('Facebook Business Extension Error: got no access token');
      return;
    }
    jQuery.ajax({
      type: 'post',
      url: ajaxify(window.facebookBusinessExtensionConfig.setAccessToken),
        async : false,
        data: ajaxParam({
        accessToken: accessToken,
      }),
      success: function onSuccess(data, _textStatus, _jqXHR) {
        _this.consoleLog('Access token saved successfully');
      },
      error: function () {
        console.error('There was an error saving access token');
      }
    });
  },
  saveProfilesData: function saveProfilesData(profiles) {
    var _this = this;
    if (!profiles) {
      console.error('Facebook Business Extension Error: got no profiles data');
      return;
    }
    jQuery.ajax({
      type: 'post',
      url: ajaxify(window.facebookBusinessExtensionConfig.setProfilesData),
        async : false,
        data: ajaxParam({
        profiles: JSON.stringify(profiles),
      }),
      success: function onSuccess(data, _textStatus, _jqXHR) {
        _this.consoleLog('set profiles data ' +  data.profiles);
      },
      error: function () {
        console.error('There was problem saving profiles data', profiles);
      }
    });
  },
  saveAAMSettings: function saveAAMSettings(pixelId){
    var _this = this;
      jQuery.ajax({
      'type': 'post',
      url: ajaxify(window.facebookBusinessExtensionConfig.setAAMSettings),
      async : false,
      data: ajaxParam({
        pixelId: pixelId,
      }),
      success: function onSuccess(data, _textStatus, _jqXHR) {
        if(data.success){
          _this.consoleLog('AAM settings successfully saved '+data.settings);
        }
        else{
          _this.consoleLog('AAM settings could not be read for the given pixel');
        }
      },
      error: function (){
        _this.consoleLog('There was an error retrieving AAM settings');
      }
    });
  },
  pushFeed: function pushFeed(accessToken, catalogId) {
    var _this = this;
      if (!accessToken) {
      console.error('Facebook Business Extension Error: got no access token to push product feed');
      return;
    }
    jQuery.ajax({
      type: 'post',
      url: ajaxify(window.facebookBusinessExtensionConfig.setFeedPush),
        async : false,
        data: ajaxParam({
        accessToken: accessToken,
        externalBusinessId: window.facebookBusinessExtensionConfig.externalBusinessId,
        catalogId: catalogId,
      }),
      success: function onSuccess(data, _textStatus, _jqXHR) {
        if(data.success) {
          _this.consoleLog('Feed push successful');
        }
      },
      error: function() {
        console.error('There was problem pushing data feed');
      }
    });
  },
  deleteFBAssets: function deleteFBAssets() {
    var _this = this;
      jQuery.ajax({
      type: 'delete',
      url: ajaxify(window.facebookBusinessExtensionConfig.deleteConfigKeys),
      success: function onSuccess(data, _textStatus, _jqXHR) {
        let msg = '';
        if(data.success) {
          msg = data.message;
        }else {
          msg = data.error_message;
        }
        _this.consoleLog(msg);
        _this.setState({installed: 'false'});
      },
      error: function() {
        console.error('There was a problem deleting the connection, Please try again.');
      }
    });
  },
  componentDidMount: function componentDidMount() {
    this.bindMessageEvents();
  },
  consoleLog: function consoleLog(message) {
    if(window.facebookBusinessExtensionConfig.debug) {
      console.log(message);
    }
  },
  queryParams: function queryParams() {
    return 'app_id='+window.facebookBusinessExtensionConfig.appId +
            '&timezone='+window.facebookBusinessExtensionConfig.timeZone+
            '&external_business_id='+window.facebookBusinessExtensionConfig.externalBusinessId+
            '&installed='+this.state.installed+
            '&system_user_name='+window.facebookBusinessExtensionConfig.systemUserName+
            '&business_vertical='+window.facebookBusinessExtensionConfig.businessVertical+
            '&channel='+window.facebookBusinessExtensionConfig.channel+
            '¤cy='+ window.facebookBusinessExtensionConfig.currency +
            '&business_name='+ window.facebookBusinessExtensionConfig.businessName;
  },
  render: function render() {
    var _this = this;
    try {
      _this.consoleLog("query params --"+_this.queryParams());
      return React.createElement(
        'iframe',
        {
          src:window.facebookBusinessExtensionConfig.fbeLoginUrl + _this.queryParams(),
          style: {border:'none',width:'1100px',height:'700px'}
        }
      );
    } catch (err) {
      console.error(err);
    }
  }
});
// Render
ReactDOM.render(
  React.createElement(FBEFlowContainer, null),
  document.getElementById('fbe-iframe')
);
// Code to display the above container.
var displayFBModal = function displayFBModal() {
  if (FBUtils.isIE()) {
    IEOverlay().render();
  }
  var QueryString = function () {
    // This function is anonymous, is executed immediately and
    // the return value is assigned to QueryString!
    var query_string = {};
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i = 0; i < vars.length; i++) {
      var pair = vars[i].split("=");
      // If first entry with this name
      if (typeof query_string[pair[0]] === "undefined") {
        query_string[pair[0]] = decodeURIComponent(pair[1]);
        // If second entry with this name
      } else if (typeof query_string[pair[0]] === "string") {
        var arr = [query_string[pair[0]], decodeURIComponent(pair[1])];
        query_string[pair[0]] = arr;
        // If third or later entry with this name
      } else {
        query_string[pair[0]].push(decodeURIComponent(pair[1]));
      }
    }
    return query_string;
  }();
  if (QueryString.p) {
    window.facebookBusinessExtensionConfig.popupOrigin = QueryString.p;
  }
};
(function main() {
  // Logic for when to display the container.
  if (document.readyState === 'interactive') {
    // in case the document is already rendered
    displayFBModal();
  } else if (document.addEventListener) {
    // modern browsers
    document.addEventListener('DOMContentLoaded', displayFBModal);
  } else {
    document.attachEvent('onreadystatechange', function () {
      // IE <= 8
      if (document.readyState === 'complete') {
        displayFBModal();
      }
    });
  }
})();