Skip to content

Commit 3257c51

Browse files
author
Mohsen Biglari
committed
add useDynamicTab/index.js for using
createDefaultOptions.js
1 parent 5ce9d69 commit 3257c51

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/com/react-dynamic-tabs/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11

2-
import useDynamicTabs from './useDynamicTabs';
2+
import useDynamicTabs from './useDynamicTabs/index.js';
33
export default useDynamicTabs;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
2+
import React, { useReducer, useLayoutEffect, useRef } from "react";
3+
import TabList from "../tabList/tabList";
4+
import PanelList from "../panelList/panelList.js";
5+
import reducer from "../utils/stateManagement/reducer";
6+
import Api from '../utils/api';
7+
import { ApiContext, StateContext, ForceUpdateContext } from "../utils/context.js";
8+
function useDynamicTabs(options) {
9+
const ref = useRef(null);
10+
if (ref.current === null)
11+
ref.current = { api: new (Api)({ options }), TabListComponent: null, PanelListCompoent: null };
12+
const { current: { api } } = ref
13+
, _ref = ref.current
14+
, [state, dispatch] = useReducer(reducer, api.getInitialState());
15+
api.updateReducer(state, dispatch);
16+
useLayoutEffect(() => {
17+
api.trigger('onLoad', api.userProxy);
18+
return () => { api.trigger('onDestroy', api.userProxy); };
19+
}, []);
20+
useLayoutEffect(() => {
21+
api.trigger('onInit', api.userProxy);
22+
});
23+
useLayoutEffect(() => {
24+
const oldState = api.getCopyPerviousData()
25+
, [openedTabsId, closedTabsId] = api.helper.getArraysDiff(state.openTabIDs, oldState.openTabIDs)
26+
, isSwitched = oldState.selectedTabID !== state.selectedTabID;
27+
api.trigger('onChange', api.userProxy, { newState: state, oldState, closedTabsId, openedTabsId, isSwitched });
28+
}, [state]);
29+
if (!_ref.TabListComponent)
30+
_ref.TabListComponent = (props = {}) => {
31+
return (
32+
<ApiContext.Provider value={_ref.api}>
33+
<StateContext.Provider value={_ref.api.stateRef}>
34+
<ForceUpdateContext.Provider value={_ref.api.forceUpdateState}>
35+
<TabList {...props}>props.children</TabList>
36+
</ForceUpdateContext.Provider>
37+
</StateContext.Provider>
38+
</ApiContext.Provider>
39+
);
40+
};
41+
if (!_ref.PanelListCompoent)
42+
_ref.PanelListCompoent = props => (
43+
<ApiContext.Provider value={_ref.api}>
44+
<StateContext.Provider value={_ref.api.stateRef}>
45+
<ForceUpdateContext.Provider value={_ref.api.forceUpdateState}>
46+
<PanelList {...props}>props.children</PanelList>
47+
</ForceUpdateContext.Provider>
48+
</StateContext.Provider>
49+
</ApiContext.Provider>
50+
);
51+
return [_ref.TabListComponent, _ref.PanelListCompoent, _ref.api.userProxy];
52+
}
53+
export default useDynamicTabs;

0 commit comments

Comments
 (0)