react-dyn-tabs
Version:
React dynamic tabs with full API
93 lines • 3.83 kB
JavaScript
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
/* eslint react/prop-types: 0 */
import React, { useState, useReducer, useLayoutEffect, useRef } from 'react';
function useDynamicTabs(getDeps, options, modules) {
if (options === void 0) {
options = {};
}
var _getDeps = getDeps(),
reducer = _getDeps.reducer,
getApiInstance = _getDeps.getApiInstance,
ApiContext = _getDeps.ApiContext,
StateContext = _getDeps.StateContext,
ForceUpdateContext = _getDeps.ForceUpdateContext,
Components = _getDeps.Components;
var ref = useRef(null);
if (ref.current === null) {
ref.current = {
Components: _extends({}, Components),
TabListComponent: null,
PanelListComponent: null
};
ref.current.api = getApiInstance(options, modules, ref.current.Components);
}
var api = ref.current.api,
_ref = ref.current,
_useReducer = useReducer(reducer, api.optionsManager.initialState),
state = _useReducer[0],
dispatch = _useReducer[1],
_useState = useState({}),
flushState = _useState[0],
setFlushState = _useState[1];
api.updateStateRef(state, dispatch).updateFlushState(setFlushState);
useLayoutEffect(function () {
api.updateState(state);
}, [state]);
useLayoutEffect(function () {
api.trigger('onLoad', api.userProxy);
return function () {
api.trigger('onDestroy', api.userProxy);
};
}, []);
useLayoutEffect(function () {
api.trigger('onInit', api.userProxy);
});
useLayoutEffect(function () {
api.trigger('_onReady', api.userProxy);
}, []);
useLayoutEffect(function () {
var oldState = api.previousState,
_api$helper$getArrays = api.helper.getArraysDiff(state.openTabIDs, oldState.openTabIDs),
openedTabIDs = _api$helper$getArrays[0],
closedTabIDs = _api$helper$getArrays[1],
isSwitched = oldState.selectedTabID !== state.selectedTabID;
api.onChange({
newState: state,
oldState: oldState,
closedTabIDs: closedTabIDs,
openedTabIDs: openedTabIDs,
isSwitched: isSwitched
});
}, [state]);
useLayoutEffect(function () {
api.trigger('_onFlushEffects', api.userProxy, function () {
return [{
currentData: api.getData(),
instance: api.userProxy
}];
});
}, [flushState]);
if (!_ref.TabListComponent) _ref.TabListComponent = function TabListComponent(props) {
if (props === void 0) {
props = {};
}
return /*#__PURE__*/React.createElement(ApiContext.Provider, {
value: api
}, /*#__PURE__*/React.createElement(StateContext.Provider, {
value: api.stateRef
}, /*#__PURE__*/React.createElement(ForceUpdateContext.Provider, {
value: api.forceUpdateState
}, /*#__PURE__*/React.createElement(_ref.Components.TablistView, null, /*#__PURE__*/React.createElement(_ref.Components.TablistContainer, null, /*#__PURE__*/React.createElement(_ref.Components.TablistOverflow, null, /*#__PURE__*/React.createElement(_ref.Components.TabList, props))), props.children))));
};
if (!_ref.PanelListCompoent) _ref.PanelListCompoent = function PanelListCompoent(props) {
return /*#__PURE__*/React.createElement(ApiContext.Provider, {
value: api
}, /*#__PURE__*/React.createElement(StateContext.Provider, {
value: api.stateRef
}, /*#__PURE__*/React.createElement(ForceUpdateContext.Provider, {
value: api.forceUpdateState
}, /*#__PURE__*/React.createElement(Components.PanelList, props, "props.children"))));
};
return [_ref.TabListComponent, _ref.PanelListCompoent, api.ready];
}
export default useDynamicTabs;