UNPKG

@reaqtive/q

Version:

A react library to connect React to the QIX engine and to Qlik Capability APIs

200 lines (171 loc) 6.21 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread")); var _react = require("react"); var _index = require("../index"); const getQField = async (qDoc, qFieldName, qState) => { try { const qField = await qDoc.getField(qFieldName, qState); return qField; } catch (err) { return err; } }; const setAlwaysOneSelected = async (qField, defaultValue) => { // console.log('setting always 1 selected') try { const defaultSelected = await qField.select(defaultValue); if (!(defaultSelected instanceof Error)) { const result = await qField.setNxProperties({ "qOneAndOnlyOne": true }); return result; } } catch (err) { console.log(err); return err; } }; const removeAlwaysOneSelected = async qField => { try { const result = await qField.setNxProperties({ "qOneAndOnlyOne": false }); return result; } catch (err) { console.log(err); return err; } }; const initialState = { qField: null, qError: false, qErrorCounter: 0, maxErrorCounter: 10, rqtvMessage: null, qErrorObject: null, qLoading: true }; const qFieldReducer = (state, action) => { switch (action.type) { case 'error': return state.maxErrorCounter >= state.qErrorCounter ? (0, _objectSpread2.default)({}, initialState, { qErrorCounter: state.qErrorCounter + 1 }) : (0, _objectSpread2.default)({}, initialState, { qError: true, qErrorField: action.qErrorField, rqtvMessage: 'error getting field' }); case 'successField': return action.isAlwaysOneSelected ? (0, _objectSpread2.default)({}, initialState, { qErrorCounter: 0, qLoading: true, qField: action.qField }) : (0, _objectSpread2.default)({}, initialState, { qErrorCounter: 0, qLoading: false, qField: action.qField }); case 'reloadField': return (0, _objectSpread2.default)({}, initialState); case 'successNxProps': return (0, _objectSpread2.default)({}, state, { qErrorCounter: 0, qLoading: false }); default: throw new Error(); } }; /** * @typedef {object} qfieldHandler - the object returned by useQLayoutReducer * @property {boolean} qLoading - if true the the handler is still waiting for response from the qlik server * @property {boolean} qError - if true there was an error retrieving the qField from the engine * @property {object} qField - the object returned from the server to interact with the field */ /** * @typedef {function} hook * @type {function} */ /** *@function useQFieldReducer *@description a hook to retrieve a field from qDoc. if provided a defaulta value it selecte the value when it mounts and set the field to always one selected if isAlwaysOneSelected is set to true *@kind hook *@param {string} qFieldName - the name of the field *@param {string} [qState] - the the alternate state the field will be linked to *@param {boolean} [isAlwaysOneSelected=false] - flag to set isAlwaysOneSelected *@param {string} [defaultValue] - the defaultValue to be selected before setting isAlwaysOneSelected to true *@param {boolean} [resetOnUnmount] - if set to true it set isAlwaysOneSelected to false when unmount *@return {qfieldHandler} the handler of the qlik field */ const useQFieldReducer = (qFieldName, qState, isAlwaysOneSelected, defaultValue, resetOnUnmount = true) => { const qDocHandler = (0, _react.useContext)(_index.QDoc); const qDoc = qDocHandler.qDoc; const _useReducer = (0, _react.useReducer)(qFieldReducer, initialState), _useReducer2 = (0, _slicedToArray2.default)(_useReducer, 2), qPromiseHandler = _useReducer2[0], dispatch = _useReducer2[1]; const qField = qPromiseHandler.qField, qLoading = qPromiseHandler.qLoading, qError = qPromiseHandler.qError, errorCounter = qPromiseHandler.errorCounter; (0, _react.useEffect)(() => { let isSubscribed = true; const runEffect = async () => { const result = await getQField(qDoc, qFieldName, qState); return result instanceof Error ? dispatch({ type: 'error', qError: result }) : isSubscribed === true && dispatch({ type: 'successField', qField: result, isAlwaysOneSelected: isAlwaysOneSelected }); }; qDoc && qFieldName && runEffect(); return () => isSubscribed = false; }, [qDoc, qFieldName, qState]); // 11/11/2020 --> Previous remove alwaysOneSelected on unMount which was runninng even if the component was not unMounted // it can be removed if it no counter effects are found // useEffect(()=>{ // return () => { // const onUnmount = async()=>{ // const result = await removeAlwaysOneSelected(qField) // } // qField&&qField.removeAllListeners() // if(resetOnUnmount===true&&qField&&isAlwaysOneSelected===true){ // onUnmount() // } // } // },[qField, qLoading, qError, errorCounter]) (0, _react.useEffect)(() => { const runEffect = async () => { if (qField !== null && isAlwaysOneSelected === true) { const result = await setAlwaysOneSelected(qField, defaultValue); return result instanceof Error ? dispatch({ type: 'error', qError: result }) : dispatch({ type: 'successNxProps' }); } }; runEffect(); return () => { const onUnmount = async () => { const result = await removeAlwaysOneSelected(qField); }; qField && qField.removeAllListeners(); if (resetOnUnmount === true && qField && isAlwaysOneSelected === true) { onUnmount(); } }; }, [qField, isAlwaysOneSelected]); return (0, _objectSpread2.default)({}, qPromiseHandler); }; var _default = useQFieldReducer; exports.default = _default;