/*
* License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt
*/
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import {get,isArray,isElement,isEmpty,isString} from 'lodash';
import {logErrorWithPrefix, isDebug} from '../util/WebUtil.js';
import {dispatchAddActionWatcher, dispatchCancelActionWatcher} from '../core/MasterSaga.js';
import {uniqueID} from '../util/WebUtil';
// NOTE
// NOTE
//------------------------------------------------------------------------------------------
// Anything that is exported here becomes part of the lowlevel API
// It should have a jsdoc
//------------------------------------------------------------------------------------------
// NOTE
// NOTE
/**
* @public
*/
export {fetchUrl, getBoolean, toBoolean, isDebug} from '../util/WebUtil.js';
export {ServerParams} from '../data/ServerParams.js';
export {getWsConnId, getWsChannel} from '../core/AppDataCntlr.js';
export {startAsAppFromApi, getVersion} from '../Firefly.js';
/**
* show a debug message if debugging is enabled
* @param {String|Error} msg any number of messages
* @public
* @func debug
* @memberof firefly.util
*
*/
export function debug(...msg) {
if (isDebug() && !isEmpty(msg)) {
logErrorWithPrefix('Firefly:', ...msg);
}
}
/**
*
* @param {string|Object} div a div element or a string id of the div element
* @param {Object} Component a react component
* @param {Object} [props] props for the react component
* @public
* @function renderDOM
* @memberof firefly.util
*/
export function renderDOM(div, Component, props) {
const divElement= isString(div) ? document.getElementById(div) : div;
if (!isElement(divElement)) debug(`the div element ${isString(div)?div:''} is not defined in the html` );
if (!Component) debug('Component must be defined');
divElement.classList.add('rootStyle');
const renderStuff= (
<Component {...props} />
);
ReactDOM.render(renderStuff,divElement);
}
/**
*
* removed the rendered element
*/
/**
* @param {string|Object} div a div element or a string id of the div element
* @public
* @function unrenderDOM
* @memberof firefly.util
*/
export function unrenderDOM(div) {
const divElement= isString(div) ? document.getElementById(div) : div;
ReactDOM.unmountComponentAtNode(divElement);
}
/**
* @summary Add a listener to any action type
* @param {string} actionType a string or an array of strings. Each string is an action constant from firefly.action.type
* @param {function} callBack the call back will be called with three parameters: action object, state object, and extraData
* If it returns true the listener will be removed.
* @param {object} extraData an object with data to send to the callback, can be anything
*
* @return {function} a function that will remove the listener
* @public
* @func addActionListener
* @memberof firefly.util
*/
export function addActionListener(actionType,callBack, extraData) {
if (!isArray(actionType) && !isString(actionType)) {
throw 'actionType must be a string or an array of strings';
}
// @callback {actionWatcherCallback}
const wrapperCallback = (action, cancelSelf, params, dispatch, getState) => {
if (callBack(action, getState(), params)) {
cancelSelf();
}
};
const id = uniqueID();
const actions = isArray(actionType) ? actionType : [actionType];
dispatchAddActionWatcher({id, actions, callback: wrapperCallback, params: extraData});
return (() => dispatchCancelActionWatcher(id));
}