@startlibs/core 1.0.7 → 1.2.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/SlotFill.mjs +232 -0
- package/lib/SlotFill.mjs.map +1 -0
- package/lib/StartlibsProvider.mjs +62 -0
- package/lib/StartlibsProvider.mjs.map +1 -0
- package/lib/hocs/WithLazyResource.mjs +74 -0
- package/lib/hocs/WithLazyResource.mjs.map +1 -0
- package/lib/hocs/WithRef.mjs +20 -0
- package/lib/hocs/WithRef.mjs.map +1 -0
- package/lib/hocs/consumes.mjs +22 -0
- package/lib/hocs/consumes.mjs.map +1 -0
- package/lib/hocs/withDialogError.mjs +22 -0
- package/lib/hocs/withDialogError.mjs.map +1 -0
- package/lib/hocs/withGroupEvent.mjs +45 -0
- package/lib/hocs/withGroupEvent.mjs.map +1 -0
- package/lib/hooks/WithConstant.mjs +13 -0
- package/lib/hooks/WithConstant.mjs.map +1 -0
- package/lib/hooks/WithEffect.mjs +12 -0
- package/lib/hooks/WithEffect.mjs.map +1 -0
- package/lib/hooks/useAsyncEffect.mjs +14 -0
- package/lib/hooks/useAsyncEffect.mjs.map +1 -0
- package/lib/hooks/useCallState.mjs +21 -0
- package/lib/hooks/useCallState.mjs.map +1 -0
- package/lib/hooks/useCallbackStable.mjs +17 -0
- package/lib/hooks/useCallbackStable.mjs.map +1 -0
- package/lib/hooks/useConstant.mjs +21 -0
- package/lib/hooks/useConstant.mjs.map +1 -0
- package/lib/hooks/useConsumerCatalog.mjs +25 -0
- package/lib/hooks/useConsumerCatalog.mjs.map +1 -0
- package/lib/hooks/useEnsureRef.mjs +9 -0
- package/lib/hooks/useEnsureRef.mjs.map +1 -0
- package/lib/hooks/useForceUpdate.mjs +28 -0
- package/lib/hooks/useForceUpdate.mjs.map +1 -0
- package/lib/hooks/useIsUnmounted.mjs +15 -0
- package/lib/hooks/useIsUnmounted.mjs.map +1 -0
- package/lib/hooks/usePopupToggle.mjs +33 -0
- package/lib/hooks/usePopupToggle.mjs.map +1 -0
- package/lib/hooks/usePrevious.mjs +28 -0
- package/lib/hooks/usePrevious.mjs.map +1 -0
- package/lib/hooks/useRecycleFocus.mjs +36 -0
- package/lib/hooks/useRecycleFocus.mjs.map +1 -0
- package/lib/hooks/useRefMemo.mjs +13 -0
- package/lib/hooks/useRefMemo.mjs.map +1 -0
- package/lib/hooks/useRefState.mjs +29 -0
- package/lib/hooks/useRefState.mjs.map +1 -0
- package/lib/hooks/useSignal.mjs +271 -0
- package/lib/hooks/useSignal.mjs.map +1 -0
- package/lib/hooks/useTitle.mjs +17 -0
- package/lib/hooks/useTitle.mjs.map +1 -0
- package/lib/hooks/useToggle.mjs +152 -0
- package/lib/hooks/useToggle.mjs.map +1 -0
- package/lib/hooks/useUpdateEffect.mjs +15 -0
- package/lib/hooks/useUpdateEffect.mjs.map +1 -0
- package/lib/hooks/useUpdateOnResize.mjs +18 -0
- package/lib/hooks/useUpdateOnResize.mjs.map +1 -0
- package/lib/hooks/useWithTransition.mjs +18 -0
- package/lib/hooks/useWithTransition.mjs.map +1 -0
- package/lib/hooks/willUseLayers.mjs +55 -0
- package/lib/hooks/willUseLayers.mjs.map +1 -0
- package/lib/hooks/willUseSharedCallback.mjs +70 -0
- package/lib/hooks/willUseSharedCallback.mjs.map +1 -0
- package/lib/hooks/willUseSharedState.mjs +41 -0
- package/lib/hooks/willUseSharedState.mjs.map +1 -0
- package/lib/hooks/willUseSpreadState.mjs +119 -0
- package/lib/hooks/willUseSpreadState.mjs.map +1 -0
- package/lib/index.cjs +1474 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.mjs +33 -0
- package/lib/index.mjs.map +1 -0
- package/lib-yak/SlotFill.mjs +230 -0
- package/lib-yak/SlotFill.mjs.map +1 -0
- package/lib-yak/StartlibsProvider.mjs +62 -0
- package/lib-yak/StartlibsProvider.mjs.map +1 -0
- package/lib-yak/hocs/WithLazyResource.mjs +74 -0
- package/lib-yak/hocs/WithLazyResource.mjs.map +1 -0
- package/lib-yak/hocs/WithRef.mjs +20 -0
- package/lib-yak/hocs/WithRef.mjs.map +1 -0
- package/lib-yak/hocs/consumes.mjs +22 -0
- package/lib-yak/hocs/consumes.mjs.map +1 -0
- package/lib-yak/hocs/withDialogError.mjs +22 -0
- package/lib-yak/hocs/withDialogError.mjs.map +1 -0
- package/lib-yak/hocs/withGroupEvent.mjs +45 -0
- package/lib-yak/hocs/withGroupEvent.mjs.map +1 -0
- package/lib-yak/hooks/WithConstant.mjs +13 -0
- package/lib-yak/hooks/WithConstant.mjs.map +1 -0
- package/lib-yak/hooks/WithEffect.mjs +12 -0
- package/lib-yak/hooks/WithEffect.mjs.map +1 -0
- package/lib-yak/hooks/useAsyncEffect.mjs +14 -0
- package/lib-yak/hooks/useAsyncEffect.mjs.map +1 -0
- package/lib-yak/hooks/useCallState.mjs +21 -0
- package/lib-yak/hooks/useCallState.mjs.map +1 -0
- package/lib-yak/hooks/useCallbackStable.mjs +17 -0
- package/lib-yak/hooks/useCallbackStable.mjs.map +1 -0
- package/lib-yak/hooks/useConstant.mjs +21 -0
- package/lib-yak/hooks/useConstant.mjs.map +1 -0
- package/lib-yak/hooks/useConsumerCatalog.mjs +25 -0
- package/lib-yak/hooks/useConsumerCatalog.mjs.map +1 -0
- package/lib-yak/hooks/useEnsureRef.mjs +9 -0
- package/lib-yak/hooks/useEnsureRef.mjs.map +1 -0
- package/lib-yak/hooks/useForceUpdate.mjs +28 -0
- package/lib-yak/hooks/useForceUpdate.mjs.map +1 -0
- package/lib-yak/hooks/useIsUnmounted.mjs +15 -0
- package/lib-yak/hooks/useIsUnmounted.mjs.map +1 -0
- package/lib-yak/hooks/usePopupToggle.mjs +33 -0
- package/lib-yak/hooks/usePopupToggle.mjs.map +1 -0
- package/lib-yak/hooks/usePrevious.mjs +28 -0
- package/lib-yak/hooks/usePrevious.mjs.map +1 -0
- package/lib-yak/hooks/useRecycleFocus.mjs +34 -0
- package/lib-yak/hooks/useRecycleFocus.mjs.map +1 -0
- package/lib-yak/hooks/useRefMemo.mjs +13 -0
- package/lib-yak/hooks/useRefMemo.mjs.map +1 -0
- package/lib-yak/hooks/useRefState.mjs +29 -0
- package/lib-yak/hooks/useRefState.mjs.map +1 -0
- package/lib-yak/hooks/useSignal.mjs +271 -0
- package/lib-yak/hooks/useSignal.mjs.map +1 -0
- package/lib-yak/hooks/useTitle.mjs +17 -0
- package/lib-yak/hooks/useTitle.mjs.map +1 -0
- package/lib-yak/hooks/useToggle.mjs +152 -0
- package/lib-yak/hooks/useToggle.mjs.map +1 -0
- package/lib-yak/hooks/useUpdateEffect.mjs +15 -0
- package/lib-yak/hooks/useUpdateEffect.mjs.map +1 -0
- package/lib-yak/hooks/useUpdateOnResize.mjs +18 -0
- package/lib-yak/hooks/useUpdateOnResize.mjs.map +1 -0
- package/lib-yak/hooks/useWithTransition.mjs +18 -0
- package/lib-yak/hooks/useWithTransition.mjs.map +1 -0
- package/lib-yak/hooks/willUseLayers.mjs +55 -0
- package/lib-yak/hooks/willUseLayers.mjs.map +1 -0
- package/lib-yak/hooks/willUseSharedCallback.mjs +70 -0
- package/lib-yak/hooks/willUseSharedCallback.mjs.map +1 -0
- package/lib-yak/hooks/willUseSharedState.mjs +41 -0
- package/lib-yak/hooks/willUseSharedState.mjs.map +1 -0
- package/lib-yak/hooks/willUseSpreadState.mjs +119 -0
- package/lib-yak/hooks/willUseSpreadState.mjs.map +1 -0
- package/lib-yak/index.mjs +33 -0
- package/lib-yak/index.mjs.map +1 -0
- package/package.json +53 -30
- package/src/SlotFill.jsx +166 -0
- package/src/StartlibsProvider.jsx +62 -0
- package/src/hocs/WithLazyResource.jsx +32 -0
- package/src/hocs/WithRef.js +20 -0
- package/src/hocs/Wrapper.jsx +40 -0
- package/src/hocs/consumes.jsx +16 -0
- package/src/hocs/withDialogError.jsx +16 -0
- package/src/hocs/withGroupEvent.jsx +43 -0
- package/src/hooks/WithConstant.jsx +7 -0
- package/src/hooks/WithEffect.jsx +6 -0
- package/src/hooks/useAsyncEffect.jsx +11 -0
- package/src/hooks/useCallState.js +15 -0
- package/src/hooks/useCallbackStable.jsx +12 -0
- package/src/hooks/useConstant.js +20 -0
- package/src/hooks/useConsumerCatalog.jsx +21 -0
- package/src/hooks/useEnsureRef.js +6 -0
- package/src/hooks/useForceUpdate.jsx +16 -0
- package/src/hooks/useIsUnmounted.jsx +12 -0
- package/src/hooks/usePopupToggle.js +30 -0
- package/src/hooks/usePrevious.jsx +27 -0
- package/src/hooks/useRecycleFocus.jsx +26 -0
- package/src/hooks/useRefMemo.jsx +10 -0
- package/src/hooks/useRefState.js +26 -0
- package/src/hooks/useSignal.jsx +193 -0
- package/src/hooks/useTitle.jsx +12 -0
- package/src/hooks/useToggle.js +126 -0
- package/src/hooks/useUpdateEffect.js +14 -0
- package/src/hooks/useUpdateOnResize.jsx +14 -0
- package/src/hooks/useWithTransition.jsx +14 -0
- package/src/hooks/willUseLayers.jsx +42 -0
- package/src/hooks/willUseSharedCallback.jsx +60 -0
- package/src/hooks/willUseSharedState.jsx +34 -0
- package/src/hooks/willUseSpreadState.jsx +103 -0
- package/src/index.js +32 -0
- package/.babelrc +0 -27
- package/lib/index.js +0 -1921
- package/rollup.config.js +0 -53
- package/yarn-error.log +0 -3374
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
|
+
import { callIfFunction } from '@startlibs/utils';
|
|
3
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
4
|
+
import { willUseSharedCallback } from './willUseSharedCallback.mjs';
|
|
5
|
+
|
|
6
|
+
const willUseLayers = function () {
|
|
7
|
+
let useEffect = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : React.useEffect;
|
|
8
|
+
const _willUseSharedCallbac = willUseSharedCallback(useEffect),
|
|
9
|
+
_willUseSharedCallbac2 = _slicedToArray(_willUseSharedCallbac, 3),
|
|
10
|
+
useRegisterSharedCallback = _willUseSharedCallbac2[0],
|
|
11
|
+
callGroup = _willUseSharedCallbac2[1],
|
|
12
|
+
getSize = _willUseSharedCallbac2[2];
|
|
13
|
+
const useLayer = function () {
|
|
14
|
+
let _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
15
|
+
onFirst = _ref.onFirst,
|
|
16
|
+
onEmpty = _ref.onEmpty,
|
|
17
|
+
onTop = _ref.onTop,
|
|
18
|
+
onRemove = _ref.onRemove;
|
|
19
|
+
let listener = arguments.length > 1 ? arguments[1] : undefined;
|
|
20
|
+
const resetIndex = useCallback(() => {
|
|
21
|
+
setIndex(getIndex());
|
|
22
|
+
if (getIndex() + 1 === getSize()) {
|
|
23
|
+
callIfFunction(onTop, getIndex);
|
|
24
|
+
}
|
|
25
|
+
}, []);
|
|
26
|
+
const getIndex = useRegisterSharedCallback(resetIndex, listener);
|
|
27
|
+
const _useState = useState(getIndex()),
|
|
28
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
29
|
+
index = _useState2[0],
|
|
30
|
+
setIndex = _useState2[1];
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (getIndex() === 0) {
|
|
33
|
+
callIfFunction(onFirst);
|
|
34
|
+
}
|
|
35
|
+
resetIndex();
|
|
36
|
+
return () => {
|
|
37
|
+
callIfFunction(onRemove, getSize());
|
|
38
|
+
if (getSize() === 0) {
|
|
39
|
+
callIfFunction(onEmpty);
|
|
40
|
+
}
|
|
41
|
+
callGroup();
|
|
42
|
+
};
|
|
43
|
+
}, []);
|
|
44
|
+
return [index, {
|
|
45
|
+
isFirst: () => getIndex() === 1,
|
|
46
|
+
isTop: () => getIndex() === getSize() - 1,
|
|
47
|
+
isEmpty: () => getSize() === 0,
|
|
48
|
+
getSize: () => getSize()
|
|
49
|
+
}];
|
|
50
|
+
};
|
|
51
|
+
return [useLayer, getSize];
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export { willUseLayers };
|
|
55
|
+
//# sourceMappingURL=willUseLayers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"willUseLayers.mjs","sources":["../../src/hooks/willUseLayers.jsx"],"sourcesContent":["import React, {useState, useCallback} from 'react'\nimport {willUseSharedCallback} from './willUseSharedCallback'\nimport {callIfFunction} from '@startlibs/utils'\n\n\nexport const willUseLayers = (useEffect = React.useEffect) => {\n const [useRegisterSharedCallback,callGroup,getSize] = willUseSharedCallback(useEffect)\n const useLayer = ({onFirst, onEmpty, onTop, onRemove} = {}, listener) => {\n\n const resetIndex = useCallback(() => {\n setIndex(getIndex())\n if (getIndex()+1 === getSize()) {\n callIfFunction(onTop,getIndex)\n }\n },[])\n\n const getIndex = useRegisterSharedCallback(resetIndex, listener)\n const [index,setIndex] = useState(getIndex())\n\n useEffect(() => {\n if (getIndex() === 0) {\n callIfFunction(onFirst)\n }\n resetIndex()\n return () => {\n callIfFunction(onRemove,getSize())\n if (getSize() === 0) {\n callIfFunction(onEmpty)\n }\n callGroup()\n }\n },[])\n\n return [index,{\n isFirst: ()=> getIndex() === 1,\n isTop: () => getIndex() === getSize()-1,\n isEmpty: () => getSize() === 0,\n getSize: () => getSize()\n }]\n }\n return [useLayer,getSize]\n}"],"names":["willUseLayers","useEffect","arguments","length","undefined","React","_willUseSharedCallbac","willUseSharedCallback","_willUseSharedCallbac2","_slicedToArray","useRegisterSharedCallback","callGroup","getSize","useLayer","_ref","onFirst","onEmpty","onTop","onRemove","listener","resetIndex","useCallback","setIndex","getIndex","callIfFunction","_useState","useState","_useState2","index","isFirst","isTop","isEmpty"],"mappings":";;;;;MAKaA,aAAa,GAAG,YAAiC;EAAA,IAAhCC,SAAS,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGG,KAAK,CAACJ,SAAS;EACvD,MAAAK,qBAAA,GAAsDC,qBAAqB,CAACN,SAAS,CAAC;IAAAO,sBAAA,GAAAC,cAAA,CAAAH,qBAAA;IAA/EI,yBAAyB,GAAAF,sBAAA;IAACG,SAAS,GAAAH,sBAAA;IAACI,OAAO,GAAAJ,sBAAA;EAClD,MAAMK,QAAQ,GAAG,YAAwD;IAAA,IAAAC,IAAA,GAAAZ,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAjB,EAAE;MAAvCa,OAAO,GAAAD,IAAA,CAAPC,OAAO;MAAEC,OAAO,GAAAF,IAAA,CAAPE,OAAO;MAAEC,KAAK,GAAAH,IAAA,CAALG,KAAK;MAAEC,QAAQ,GAAAJ,IAAA,CAARI,QAAQ;IAAA,IAAQC,QAAQ,GAAAjB,SAAA,CAAAC,MAAA,OAAAD,SAAA,MAAAE,SAAA;IAElE,MAAMgB,UAAU,GAAGC,WAAW,CAAC,MAAM;MACnCC,QAAQ,CAACC,QAAQ,EAAE,CAAC;MACpB,IAAIA,QAAQ,EAAE,GAAC,CAAC,KAAKX,OAAO,EAAE,EAAE;QAC9BY,cAAc,CAACP,KAAK,EAACM,QAAQ,CAAC;;KAEjC,EAAC,EAAE,CAAC;IAEL,MAAMA,QAAQ,GAAGb,yBAAyB,CAACU,UAAU,EAAED,QAAQ,CAAC;IAChE,MAAAM,SAAA,GAAyBC,QAAQ,CAACH,QAAQ,EAAE,CAAC;MAAAI,UAAA,GAAAlB,cAAA,CAAAgB,SAAA;MAAtCG,KAAK,GAAAD,UAAA;MAACL,QAAQ,GAAAK,UAAA;IAErB1B,SAAS,CAAC,MAAM;MACd,IAAIsB,QAAQ,EAAE,KAAK,CAAC,EAAE;QACpBC,cAAc,CAACT,OAAO,CAAC;;MAEzBK,UAAU,EAAE;MACZ,OAAO,MAAM;QACXI,cAAc,CAACN,QAAQ,EAACN,OAAO,EAAE,CAAC;QAClC,IAAIA,OAAO,EAAE,KAAK,CAAC,EAAE;UACnBY,cAAc,CAACR,OAAO,CAAC;;QAEzBL,SAAS,EAAE;OACZ;KACF,EAAC,EAAE,CAAC;IAEL,OAAO,CAACiB,KAAK,EAAC;MACZC,OAAO,EAAEA,MAAKN,QAAQ,EAAE,KAAK,CAAC;MAC9BO,KAAK,EAAEA,MAAMP,QAAQ,EAAE,KAAKX,OAAO,EAAE,GAAC,CAAC;MACvCmB,OAAO,EAAEA,MAAMnB,OAAO,EAAE,KAAK,CAAC;MAC9BA,OAAO,EAAEA,MAAMA,OAAO;KACvB,CAAC;GACH;EACD,OAAO,CAACC,QAAQ,EAACD,OAAO,CAAC;AAC3B;;;;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React, { useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
const callList = function (list, firstArg) {
|
|
4
|
+
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
5
|
+
args[_key - 2] = arguments[_key];
|
|
6
|
+
}
|
|
7
|
+
return list.map(_ref => {
|
|
8
|
+
let current = _ref.current;
|
|
9
|
+
return typeof firstArg === 'function' ? firstArg(current) : current(firstArg, ...args);
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
const willUseSharedCallback = function () {
|
|
13
|
+
let useEffect = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : React.useEffect;
|
|
14
|
+
let mountedCallbacks = [];
|
|
15
|
+
let listenerCallbacks = [];
|
|
16
|
+
const remove = ref => mountedCallbacks = mountedCallbacks.filter(_ => _ !== ref);
|
|
17
|
+
const add = ref => mountedCallbacks = mountedCallbacks.concat([ref]);
|
|
18
|
+
const get = () => mountedCallbacks;
|
|
19
|
+
const removeListener = ref => listenerCallbacks = listenerCallbacks.filter(_ => _ !== ref);
|
|
20
|
+
const addListener = ref => listenerCallbacks = listenerCallbacks.concat([ref]);
|
|
21
|
+
const getListeners = ref => listenerCallbacks;
|
|
22
|
+
const lastCall = {
|
|
23
|
+
current: null,
|
|
24
|
+
index: 0
|
|
25
|
+
};
|
|
26
|
+
const call = function () {
|
|
27
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
28
|
+
args[_key2] = arguments[_key2];
|
|
29
|
+
}
|
|
30
|
+
const resp = callList(get(), ...args);
|
|
31
|
+
callList(getListeners(), ...args);
|
|
32
|
+
lastCall.current = args;
|
|
33
|
+
lastCall.index++;
|
|
34
|
+
return resp;
|
|
35
|
+
};
|
|
36
|
+
const getSize = () => get().length;
|
|
37
|
+
const useRegister = function (callback) {
|
|
38
|
+
let listener = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
39
|
+
const ref = useRef(callback);
|
|
40
|
+
if (ref.current !== callback) {
|
|
41
|
+
ref.current = callback;
|
|
42
|
+
}
|
|
43
|
+
const lastCallIndex = lastCall.index;
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!ref.current) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (listener) {
|
|
49
|
+
addListener(ref);
|
|
50
|
+
} else {
|
|
51
|
+
add(ref);
|
|
52
|
+
if (lastCallIndex !== lastCall.index && lastCall.current) {
|
|
53
|
+
callList([ref], ...lastCall.current);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return () => {
|
|
57
|
+
if (listener) {
|
|
58
|
+
removeListener(ref);
|
|
59
|
+
} else {
|
|
60
|
+
remove(ref);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}, []);
|
|
64
|
+
return () => get().indexOf(ref);
|
|
65
|
+
};
|
|
66
|
+
return [useRegister, call, getSize];
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { willUseSharedCallback };
|
|
70
|
+
//# sourceMappingURL=willUseSharedCallback.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"willUseSharedCallback.mjs","sources":["../../src/hooks/willUseSharedCallback.jsx"],"sourcesContent":["import React, {useRef} from 'react'\n\n\nconst callList = (list, firstArg, ...args) => list.map(({current}) => typeof firstArg === 'function' ? firstArg(current) : current(firstArg,...args))\n\nexport const willUseSharedCallback = (useEffect = React.useEffect) => {\n let mountedCallbacks = []\n let listenerCallbacks = []\n const remove = (ref) => mountedCallbacks = mountedCallbacks.filter(_ => _ !== ref)\n const add = (ref) => mountedCallbacks = mountedCallbacks.concat([ref])\n const get = () => mountedCallbacks\n\n const removeListener = (ref) => listenerCallbacks = listenerCallbacks.filter(_ => _ !== ref)\n const addListener = (ref) => listenerCallbacks = listenerCallbacks.concat([ref])\n const getListeners = (ref) => listenerCallbacks\n\n const lastCall = {current:null,index:0}\n\n const call = (...args) => {\n const resp = callList(get(), ...args)\n callList(getListeners(), ...args)\n lastCall.current = args\n lastCall.index++\n return resp\n }\n const getSize = () => get().length\n\n const useRegister = (callback, listener = false) => {\n const ref = useRef(callback)\n if (ref.current !== callback) {\n ref.current = callback\n }\n const lastCallIndex = lastCall.index\n useEffect(() => {\n if (!ref.current) { return }\n if (listener) {\n addListener(ref)\n } else {\n add(ref)\n if (lastCallIndex !== lastCall.index && lastCall.current) {\n callList([ref],...lastCall.current)\n }\n }\n return () => {\n if (listener) {\n removeListener(ref)\n } else {\n remove(ref)\n }\n }\n }, [])\n return () => get().indexOf(ref)\n }\n\n return [\n useRegister,\n call,\n getSize\n ]\n}"],"names":["callList","list","firstArg","_len","arguments","length","args","Array","_key","map","_ref","current","willUseSharedCallback","useEffect","undefined","React","mountedCallbacks","listenerCallbacks","remove","ref","filter","_","add","concat","get","removeListener","addListener","getListeners","lastCall","index","call","_len2","_key2","resp","getSize","useRegister","callback","listener","useRef","lastCallIndex","indexOf"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { ifUndefined, callIfFunction } from '@startlibs/utils';
|
|
3
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
4
|
+
import { willUseSharedCallback } from './willUseSharedCallback.mjs';
|
|
5
|
+
|
|
6
|
+
const notDefined = {};
|
|
7
|
+
const willUseSharedState = initialValue => {
|
|
8
|
+
const _willUseSharedCallbac = willUseSharedCallback(),
|
|
9
|
+
_willUseSharedCallbac2 = _slicedToArray(_willUseSharedCallbac, 3),
|
|
10
|
+
useRegisterGroupCallback = _willUseSharedCallbac2[0],
|
|
11
|
+
callGroup = _willUseSharedCallbac2[1],
|
|
12
|
+
getSize = _willUseSharedCallbac2[2];
|
|
13
|
+
let sharedValue = ifUndefined(initialValue, notDefined);
|
|
14
|
+
const setGroupState = newValue => {
|
|
15
|
+
sharedValue = callIfFunction(newValue, sharedValue);
|
|
16
|
+
callGroup(sharedValue);
|
|
17
|
+
};
|
|
18
|
+
const refState = () => {
|
|
19
|
+
useRegisterGroupCallback();
|
|
20
|
+
return [() => sharedValue, setGroupState];
|
|
21
|
+
};
|
|
22
|
+
const valueState = defaultValue => {
|
|
23
|
+
const prevValue = sharedValue !== notDefined ? sharedValue : defaultValue;
|
|
24
|
+
if (prevValue === defaultValue) {
|
|
25
|
+
sharedValue = defaultValue;
|
|
26
|
+
}
|
|
27
|
+
const _useState = useState(prevValue),
|
|
28
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
29
|
+
value = _useState2[0],
|
|
30
|
+
setValue = _useState2[1];
|
|
31
|
+
useRegisterGroupCallback(setValue);
|
|
32
|
+
return [value, setGroupState];
|
|
33
|
+
};
|
|
34
|
+
const clear = () => {
|
|
35
|
+
sharedValue = notDefined;
|
|
36
|
+
};
|
|
37
|
+
return [valueState, refState, setGroupState, () => sharedValue, clear];
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export { willUseSharedState };
|
|
41
|
+
//# sourceMappingURL=willUseSharedState.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"willUseSharedState.mjs","sources":["../../src/hooks/willUseSharedState.jsx"],"sourcesContent":["import React, {useState} from 'react'\nimport {callIfFunction, ifUndefined} from '@startlibs/utils'\nimport {willUseSharedCallback} from './willUseSharedCallback'\n\nconst notDefined = {}\n\nexport const willUseSharedState = (initialValue) => {\n const [useRegisterGroupCallback,callGroup,getSize] = willUseSharedCallback()\n let sharedValue = ifUndefined(initialValue,notDefined)\n\n const setGroupState = (newValue) => {\n sharedValue = callIfFunction(newValue,sharedValue)\n callGroup(sharedValue)\n }\n\n const refState = () => {\n useRegisterGroupCallback()\n return [()=>sharedValue,setGroupState]\n }\n\n const valueState = (defaultValue) => {\n const prevValue = sharedValue !== notDefined ? sharedValue : defaultValue\n if (prevValue === defaultValue) {\n sharedValue = defaultValue\n }\n const [value, setValue] = useState(prevValue)\n useRegisterGroupCallback(setValue)\n return [value,setGroupState]\n }\n const clear = () => {\n sharedValue = notDefined\n }\n return [valueState,refState,setGroupState,()=>sharedValue,clear]\n}"],"names":["notDefined","willUseSharedState","initialValue","_willUseSharedCallbac","willUseSharedCallback","_willUseSharedCallbac2","_slicedToArray","useRegisterGroupCallback","callGroup","getSize","sharedValue","ifUndefined","setGroupState","newValue","callIfFunction","refState","valueState","defaultValue","prevValue","_useState","useState","_useState2","value","setValue","clear"],"mappings":";;;;;AAIA,MAAMA,UAAU,GAAG,EAAE;MAERC,kBAAkB,GAAIC,YAAY,IAAK;EAClD,MAAAC,qBAAA,GAAqDC,qBAAqB,EAAE;IAAAC,sBAAA,GAAAC,cAAA,CAAAH,qBAAA;IAArEI,wBAAwB,GAAAF,sBAAA;IAACG,SAAS,GAAAH,sBAAA;IAACI,OAAO,GAAAJ,sBAAA;EACjD,IAAIK,WAAW,GAAGC,WAAW,CAACT,YAAY,EAACF,UAAU,CAAC;EAEtD,MAAMY,aAAa,GAAIC,QAAQ,IAAK;IAClCH,WAAW,GAAGI,cAAc,CAACD,QAAQ,EAACH,WAAW,CAAC;IAClDF,SAAS,CAACE,WAAW,CAAC;GACvB;EAED,MAAMK,QAAQ,GAAGA,MAAM;IACrBR,wBAAwB,EAAE;IAC1B,OAAO,CAAC,MAAIG,WAAW,EAACE,aAAa,CAAC;GACvC;EAED,MAAMI,UAAU,GAAIC,YAAY,IAAK;IACnC,MAAMC,SAAS,GAAGR,WAAW,KAAKV,UAAU,GAAGU,WAAW,GAAGO,YAAY;IACzE,IAAIC,SAAS,KAAKD,YAAY,EAAE;MAC9BP,WAAW,GAAGO,YAAY;;IAE5B,MAAAE,SAAA,GAA0BC,QAAQ,CAACF,SAAS,CAAC;MAAAG,UAAA,GAAAf,cAAA,CAAAa,SAAA;MAAtCG,KAAK,GAAAD,UAAA;MAAEE,QAAQ,GAAAF,UAAA;IACtBd,wBAAwB,CAACgB,QAAQ,CAAC;IAClC,OAAO,CAACD,KAAK,EAACV,aAAa,CAAC;GAC7B;EACD,MAAMY,KAAK,GAAGA,MAAM;IAClBd,WAAW,GAAGV,UAAU;GACzB;EACD,OAAO,CAACgB,UAAU,EAACD,QAAQ,EAACH,aAAa,EAAC,MAAIF,WAAW,EAACc,KAAK,CAAC;AAClE;;;;"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useContext, useState, useCallback } from 'react';
|
|
2
|
+
import { formatPath, _s } from '@startlibs/utils';
|
|
3
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
4
|
+
import _set from 'lodash/fp/set';
|
|
5
|
+
import _update from 'lodash/fp/update';
|
|
6
|
+
import { useIsUnmounted } from './useIsUnmounted.mjs';
|
|
7
|
+
import { useRefState } from './useRefState.mjs';
|
|
8
|
+
import _isFunction from 'lodash/fp/isFunction';
|
|
9
|
+
import _get from 'lodash/fp/get';
|
|
10
|
+
import _isArray from 'lodash/fp/isArray';
|
|
11
|
+
import _isString from 'lodash/fp/isString';
|
|
12
|
+
import { useConsumerCatalog, useCatalogManager } from './useConsumerCatalog.mjs';
|
|
13
|
+
|
|
14
|
+
const updateAllInputsState = (inputs, values) => {
|
|
15
|
+
const deferedUndefined = [];
|
|
16
|
+
inputs.forEach(input => {
|
|
17
|
+
const _input = _slicedToArray(input, 2),
|
|
18
|
+
setValue = _input[0],
|
|
19
|
+
selector = _input[1];
|
|
20
|
+
const newValue = selector(values);
|
|
21
|
+
if (newValue === undefined) {
|
|
22
|
+
deferedUndefined.push([setValue, newValue]);
|
|
23
|
+
} else {
|
|
24
|
+
setValue(newValue);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
deferedUndefined.forEach(_ref => {
|
|
28
|
+
let _ref2 = _slicedToArray(_ref, 2),
|
|
29
|
+
set = _ref2[0],
|
|
30
|
+
value = _ref2[1];
|
|
31
|
+
return set(value);
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
const pathSelector = path => _s.get(path || []);
|
|
35
|
+
const parsePathOrSelector = pathOrSelector => {
|
|
36
|
+
const isNotSelector = typeof pathOrSelector !== 'function';
|
|
37
|
+
if (isNotSelector) {
|
|
38
|
+
return [formatPath(pathOrSelector), pathSelector(pathOrSelector)];
|
|
39
|
+
} else {
|
|
40
|
+
return ['', pathOrSelector];
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const willUseSpreadState = function (defaultContextValue) {
|
|
44
|
+
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
45
|
+
const Context = /*#__PURE__*/React.createContext(defaultContextValue);
|
|
46
|
+
const EMPTY_GLOBAL = {};
|
|
47
|
+
let prevInitState = EMPTY_GLOBAL;
|
|
48
|
+
let globalState = EMPTY_GLOBAL;
|
|
49
|
+
const getGlobalState = key => _isString(key) || _isArray(key) ? _get(key, globalState) : globalState;
|
|
50
|
+
const useProvideSpreadState = (initState, setCallback) => {
|
|
51
|
+
const _useConsumerCatalog = useConsumerCatalog(input => updateAllInputsState([input], state.get())),
|
|
52
|
+
_useConsumerCatalog2 = _slicedToArray(_useConsumerCatalog, 2),
|
|
53
|
+
consumerList = _useConsumerCatalog2[0],
|
|
54
|
+
manager = _useConsumerCatalog2[1];
|
|
55
|
+
const state = useRefState(initState, setCallback);
|
|
56
|
+
if (options.initRefCheck) {
|
|
57
|
+
if (prevInitState !== initState) {
|
|
58
|
+
globalState = initState;
|
|
59
|
+
}
|
|
60
|
+
prevInitState = initState;
|
|
61
|
+
}
|
|
62
|
+
if (globalState === EMPTY_GLOBAL) {
|
|
63
|
+
globalState = initState;
|
|
64
|
+
}
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
globalState = state.get();
|
|
67
|
+
}, []);
|
|
68
|
+
const setState = (newState, fastPath, config) => {
|
|
69
|
+
// console.log("Fastpath noop:"+fastPath)
|
|
70
|
+
state.set(newState, config);
|
|
71
|
+
globalState = state.get();
|
|
72
|
+
updateAllInputsState(consumerList(), state.get());
|
|
73
|
+
};
|
|
74
|
+
const contextValue = useMemo(() => [state.get, setState, manager], []);
|
|
75
|
+
return [Context.Provider, contextValue, [state.get, setState]];
|
|
76
|
+
};
|
|
77
|
+
const useSpreadState = (pathOrSelector, inputs) => {
|
|
78
|
+
const _useContext = useContext(Context),
|
|
79
|
+
_useContext2 = _slicedToArray(_useContext, 3),
|
|
80
|
+
getSpreadState = _useContext2[0],
|
|
81
|
+
setSpreadState = _useContext2[1],
|
|
82
|
+
manager = _useContext2[2];
|
|
83
|
+
const _parsePathOrSelector = parsePathOrSelector(pathOrSelector),
|
|
84
|
+
_parsePathOrSelector2 = _slicedToArray(_parsePathOrSelector, 2),
|
|
85
|
+
path = _parsePathOrSelector2[0],
|
|
86
|
+
selector = _parsePathOrSelector2[1];
|
|
87
|
+
const pathOrInput = [path] || inputs || [];
|
|
88
|
+
const _useState = useState(selector(getSpreadState())),
|
|
89
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
90
|
+
value = _useState2[0],
|
|
91
|
+
setValue = _useState2[1];
|
|
92
|
+
const isUnmounted = useIsUnmounted();
|
|
93
|
+
const currentPath = useRefState(path);
|
|
94
|
+
if (path !== currentPath.get()) {
|
|
95
|
+
/* when path changes, the consumerCatalogCallback will update the new value
|
|
96
|
+
* another solution would be to call setValue here directly
|
|
97
|
+
* the return value will still be the old, but will be changed before render, just like getDerivedStateFromProps
|
|
98
|
+
*
|
|
99
|
+
* if there's a need for the return value to be the same, the value or, if enters here new value,
|
|
100
|
+
* can be returned in an temp variable
|
|
101
|
+
* */
|
|
102
|
+
currentPath.set(path);
|
|
103
|
+
}
|
|
104
|
+
const input = useMemo(() => [v => {
|
|
105
|
+
/* noop for elements that may be unregistered while looping through consumerList */
|
|
106
|
+
if (path === currentPath.get() && !isUnmounted()) {
|
|
107
|
+
setValue(v);
|
|
108
|
+
}
|
|
109
|
+
}, selector], pathOrInput);
|
|
110
|
+
useCatalogManager(manager, input);
|
|
111
|
+
const setState = useCallback(v => setSpreadState((_isFunction(v) ? pathOrSelector === undefined ? () => v : _update : _set)(path, v), path), pathOrInput);
|
|
112
|
+
const getValue = () => selector(getGlobalState());
|
|
113
|
+
return [value, setState, getValue];
|
|
114
|
+
};
|
|
115
|
+
return [useProvideSpreadState, useSpreadState, Context, getGlobalState];
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export { willUseSpreadState };
|
|
119
|
+
//# sourceMappingURL=willUseSpreadState.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"willUseSpreadState.mjs","sources":["../../src/hooks/willUseSpreadState.jsx"],"sourcesContent":["import React, {useCallback, useContext, useEffect, useMemo, useState} from 'react'\nimport {_s, formatPath} from '@startlibs/utils'\nimport _ from 'lodash/fp'\nimport {useCatalogManager, useConsumerCatalog} from './useConsumerCatalog'\nimport {useIsUnmounted} from './useIsUnmounted'\nimport {useRefState} from './useRefState'\n\nconst updateAllInputsState = (inputs, values) => {\n const deferedUndefined = []\n inputs.forEach((input) => {\n const [setValue, selector] = input\n const newValue = selector(values)\n if (newValue === undefined) {\n deferedUndefined.push([setValue,newValue])\n } else {\n setValue(newValue)\n }\n })\n deferedUndefined.forEach(([set,value])=> set(value))\n}\n\nconst pathSelector = (path) => _s.get(path || [])\nconst parsePathOrSelector = (pathOrSelector) => {\n const isNotSelector = typeof pathOrSelector !== 'function'\n if (isNotSelector) {\n return [formatPath(pathOrSelector), pathSelector(pathOrSelector)]\n } else {\n return ['', pathOrSelector]\n }\n}\nexport const willUseSpreadState = (defaultContextValue,options = {}) => {\n\n const Context = React.createContext(defaultContextValue)\n const EMPTY_GLOBAL = {}\n let prevInitState = EMPTY_GLOBAL\n let globalState = EMPTY_GLOBAL\n const getGlobalState = (key) => _.isString(key) || _.isArray(key) ? _.get(key,globalState) : globalState\n\n const useProvideSpreadState = (initState, setCallback) => {\n const [consumerList, manager] = useConsumerCatalog((input) => updateAllInputsState([input], state.get()))\n const state = useRefState(initState, setCallback)\n\n if (options.initRefCheck) {\n if (prevInitState !== initState) {\n globalState = initState\n }\n prevInitState = initState\n }\n\n if (globalState === EMPTY_GLOBAL) {\n globalState = initState\n }\n useEffect(() => {\n globalState = state.get()\n },[])\n\n const setState = (newState, fastPath, config) => {\n // console.log(\"Fastpath noop:\"+fastPath)\n state.set(newState, config)\n globalState = state.get()\n updateAllInputsState(consumerList(), state.get())\n }\n const contextValue = useMemo(() => [state.get, setState, manager], [])\n\n return [Context.Provider, contextValue, [state.get, setState]]\n }\n\n const useSpreadState = (pathOrSelector, inputs) => {\n const [getSpreadState, setSpreadState, manager] = useContext(Context)\n const [path, selector] = parsePathOrSelector(pathOrSelector)\n const pathOrInput = [path] || inputs || []\n const [value, setValue] = useState(selector(getSpreadState()))\n\n const isUnmounted = useIsUnmounted()\n\n const currentPath = useRefState(path)\n if (path !== currentPath.get()) {\n /* when path changes, the consumerCatalogCallback will update the new value\n * another solution would be to call setValue here directly\n * the return value will still be the old, but will be changed before render, just like getDerivedStateFromProps\n *\n * if there's a need for the return value to be the same, the value or, if enters here new value,\n * can be returned in an temp variable\n * */\n currentPath.set(path)\n }\n\n const input = useMemo(() => [(v) => {\n /* noop for elements that may be unregistered while looping through consumerList */\n if (path === currentPath.get() && !isUnmounted()) {\n setValue(v)\n }\n }, selector], pathOrInput)\n\n useCatalogManager(manager, input)\n const setState = useCallback((v) => setSpreadState((_.isFunction(v) ? (pathOrSelector === undefined ? () => v : _.update) : _.set)(path, v), path), pathOrInput)\n const getValue = () => selector(getGlobalState())\n return [value, setState, getValue]\n }\n\n\n return [useProvideSpreadState, useSpreadState, Context, getGlobalState]\n}"],"names":["updateAllInputsState","inputs","values","deferedUndefined","forEach","input","_input","_slicedToArray","setValue","selector","newValue","undefined","push","_ref","_ref2","set","value","pathSelector","path","_s","get","parsePathOrSelector","pathOrSelector","isNotSelector","formatPath","willUseSpreadState","defaultContextValue","options","arguments","length","Context","React","createContext","EMPTY_GLOBAL","prevInitState","globalState","getGlobalState","key","_isString","_isArray","_get","useProvideSpreadState","initState","setCallback","_useConsumerCatalog","useConsumerCatalog","state","_useConsumerCatalog2","consumerList","manager","useRefState","initRefCheck","useEffect","setState","newState","fastPath","config","contextValue","useMemo","Provider","useSpreadState","_useContext","useContext","_useContext2","getSpreadState","setSpreadState","_parsePathOrSelector","_parsePathOrSelector2","pathOrInput","_useState","useState","_useState2","isUnmounted","useIsUnmounted","currentPath","v","useCatalogManager","useCallback","_isFunction","_update","_set","getValue"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export { useConstant, useLazyConstant } from './hooks/useConstant.mjs';
|
|
2
|
+
export { willUseSharedCallback } from './hooks/willUseSharedCallback.mjs';
|
|
3
|
+
export { willUseSharedState } from './hooks/willUseSharedState.mjs';
|
|
4
|
+
export { Fill, Slot, SlotContext, SlotProvider, useFill, useHiddenFill } from './SlotFill.mjs';
|
|
5
|
+
export { useCallState } from './hooks/useCallState.mjs';
|
|
6
|
+
export { useIsUnmounted } from './hooks/useIsUnmounted.mjs';
|
|
7
|
+
export { useRefState } from './hooks/useRefState.mjs';
|
|
8
|
+
export { useRefToggle, useToggle } from './hooks/useToggle.mjs';
|
|
9
|
+
export { clearPopups, usePopupToggle } from './hooks/usePopupToggle.mjs';
|
|
10
|
+
export { PopupContext, StartlibsConsumer, StartlibsContext, StartlibsMetacontext, StartlibsProvider } from './StartlibsProvider.mjs';
|
|
11
|
+
export { willUseLayers } from './hooks/willUseLayers.mjs';
|
|
12
|
+
export { useCatalogManager, useConsumerCatalog } from './hooks/useConsumerCatalog.mjs';
|
|
13
|
+
export { willUseSpreadState } from './hooks/willUseSpreadState.mjs';
|
|
14
|
+
export { consumes } from './hocs/consumes.mjs';
|
|
15
|
+
export { withDialogError } from './hocs/withDialogError.mjs';
|
|
16
|
+
export { GroupEventFactory, withGroupEvent } from './hocs/withGroupEvent.mjs';
|
|
17
|
+
export { WithRef } from './hocs/WithRef.mjs';
|
|
18
|
+
export { WithLazyPlaceholder, WithLazyResource } from './hocs/WithLazyResource.mjs';
|
|
19
|
+
export { useCallbackStable } from './hooks/useCallbackStable.mjs';
|
|
20
|
+
export { WithEffect } from './hooks/WithEffect.mjs';
|
|
21
|
+
export { useTitle } from './hooks/useTitle.mjs';
|
|
22
|
+
export { useRecycleFocus } from './hooks/useRecycleFocus.mjs';
|
|
23
|
+
export { usePrevious, usePreviousForEffect, usePreviousUnique } from './hooks/usePrevious.mjs';
|
|
24
|
+
export { useEnsureRef } from './hooks/useEnsureRef.mjs';
|
|
25
|
+
export { useForceUpdate, willUseForceUpdate } from './hooks/useForceUpdate.mjs';
|
|
26
|
+
export { useUpdateOnResize } from './hooks/useUpdateOnResize.mjs';
|
|
27
|
+
export { useAsyncEffect } from './hooks/useAsyncEffect.mjs';
|
|
28
|
+
export { useUpdateEffect } from './hooks/useUpdateEffect.mjs';
|
|
29
|
+
export { useRefMemo } from './hooks/useRefMemo.mjs';
|
|
30
|
+
export { createLazyStatefulContext, createSelectableContext, createSelfStatefulContext, createStatefulContext, createTriggerUpdateContext, useUpdateSignal } from './hooks/useSignal.mjs';
|
|
31
|
+
export { WithConstant } from './hooks/WithConstant.mjs';
|
|
32
|
+
export { useWithTransition } from './hooks/useWithTransition.mjs';
|
|
33
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,49 +1,57 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@startlibs/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.2.0-rc.1",
|
|
4
4
|
"description": "Startlibs Core",
|
|
5
|
-
"main": "lib/index.
|
|
5
|
+
"main": "lib/index.cjs",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"source": "./src/index.js",
|
|
9
|
+
"yak": "./lib-yak/index.mjs",
|
|
10
|
+
"require": "./lib/index.cjs",
|
|
11
|
+
"import": "./lib/index.mjs",
|
|
12
|
+
"default": "./lib/index.mjs"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json",
|
|
15
|
+
"./*": {
|
|
16
|
+
"yak": "./lib-yak/*.mjs",
|
|
17
|
+
"import": "./lib/*.mjs"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
6
20
|
"sideEffects": false,
|
|
7
|
-
"source":
|
|
21
|
+
"source": "./src/index.js",
|
|
8
22
|
"peerDependencies": {
|
|
9
23
|
"@startlibs/utils": "*",
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"react
|
|
13
|
-
"
|
|
24
|
+
"@yak/react": "10.0.0",
|
|
25
|
+
"lodash": "^4.17.21",
|
|
26
|
+
"react": ">=16.8",
|
|
27
|
+
"react-dom": ">=16.8",
|
|
28
|
+
"styled-components": ">=5"
|
|
29
|
+
},
|
|
30
|
+
"peerDependenciesMeta": {
|
|
31
|
+
"@yak/react": {
|
|
32
|
+
"optional": true
|
|
33
|
+
}
|
|
14
34
|
},
|
|
15
35
|
"devDependencies": {
|
|
16
|
-
"@babel/core": "^7.
|
|
17
|
-
"@babel/plugin-
|
|
18
|
-
"@babel/
|
|
19
|
-
"@babel/
|
|
20
|
-
"@babel/
|
|
21
|
-
"@babel/plugin-proposal-logical-assignment-operators": "^7.20.7",
|
|
22
|
-
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
|
|
23
|
-
"@babel/plugin-proposal-object-rest-spread": "^7.2.0",
|
|
24
|
-
"@babel/plugin-proposal-optional-chaining": "^7.12.0",
|
|
25
|
-
"@babel/plugin-proposal-throw-expressions": "^7.2.0",
|
|
26
|
-
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
|
|
27
|
-
"@babel/plugin-syntax-import-meta": "^7.2.0",
|
|
28
|
-
"@babel/plugin-transform-runtime": "^7.2.0",
|
|
29
|
-
"@babel/plugin-transform-spread": "^7.2.0",
|
|
30
|
-
"@babel/preset-env": "^7.2.0",
|
|
31
|
-
"@babel/preset-flow": "^7.0.0",
|
|
32
|
-
"@babel/preset-react": "^7.0.0",
|
|
33
|
-
"@rollup/plugin-alias": "^5.1.1",
|
|
36
|
+
"@babel/core": "^7.26.0",
|
|
37
|
+
"@babel/plugin-transform-runtime": "^7.26.0",
|
|
38
|
+
"@babel/preset-env": "^7.26.0",
|
|
39
|
+
"@babel/preset-flow": "^7.25.0",
|
|
40
|
+
"@babel/preset-react": "^7.26.0",
|
|
34
41
|
"babel-plugin-lodash": "^3.3.4",
|
|
35
42
|
"babel-plugin-macros": "^2.4.2",
|
|
36
43
|
"babel-plugin-styled-components": "^1.10.0",
|
|
37
|
-
"
|
|
38
|
-
"rollup": "^2.
|
|
44
|
+
"lodash": "^4.17.21",
|
|
45
|
+
"rollup": "^2.79.2",
|
|
39
46
|
"rollup-plugin-auto-external": "^2.0.0",
|
|
40
47
|
"rollup-plugin-babel": "^4.0.3",
|
|
41
48
|
"rollup-plugin-commonjs": "^9.2.0",
|
|
42
|
-
"rollup-plugin-node-resolve": "^3.4.0"
|
|
49
|
+
"rollup-plugin-node-resolve": "^3.4.0",
|
|
50
|
+
"styled-components": "^5.3.11"
|
|
43
51
|
},
|
|
44
52
|
"scripts": {
|
|
45
53
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
46
|
-
"build": "rollup -c"
|
|
54
|
+
"build": "rollup -c && rollup -c --environment YAK"
|
|
47
55
|
},
|
|
48
56
|
"repository": {
|
|
49
57
|
"type": "git",
|
|
@@ -72,6 +80,21 @@
|
|
|
72
80
|
}
|
|
73
81
|
},
|
|
74
82
|
"dependencies": {
|
|
83
|
+
"@babel/runtime": "^7.20.0",
|
|
75
84
|
"mitt": "^1.1.2"
|
|
76
|
-
}
|
|
85
|
+
},
|
|
86
|
+
"files": [
|
|
87
|
+
"lib",
|
|
88
|
+
"lib-yak",
|
|
89
|
+
"src"
|
|
90
|
+
],
|
|
91
|
+
"module": "lib/index.mjs",
|
|
92
|
+
"browserslist": [
|
|
93
|
+
"chrome >= 61",
|
|
94
|
+
"edge >= 79",
|
|
95
|
+
"firefox >= 60",
|
|
96
|
+
"safari >= 11",
|
|
97
|
+
"ios_saf >= 11",
|
|
98
|
+
"samsung >= 8.2"
|
|
99
|
+
]
|
|
77
100
|
}
|
package/src/SlotFill.jsx
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import React, {useContext, useEffect, useLayoutEffect, useMemo, useRef} from 'react'
|
|
2
|
+
import ReactDOM from 'react-dom'
|
|
3
|
+
import styled from 'styled-components'
|
|
4
|
+
import _ from 'lodash/fp'
|
|
5
|
+
import {_s, callIfFunction} from '@startlibs/utils'
|
|
6
|
+
import {useConstant} from './hooks/useConstant'
|
|
7
|
+
import {willUseSharedState} from './hooks/willUseSharedState'
|
|
8
|
+
|
|
9
|
+
export const SlotContext = React.createContext(new Map())
|
|
10
|
+
const [useFillHookState, useFillHookStateRef] = willUseSharedState()
|
|
11
|
+
const [useHiddenFillHookState, useHiddenFillHookStateRef] = willUseSharedState()
|
|
12
|
+
|
|
13
|
+
const DEFAULT_CONTEXT = new Map()
|
|
14
|
+
|
|
15
|
+
export const SlotProvider = ({children}) => {
|
|
16
|
+
|
|
17
|
+
return <SlotContext.Provider value={DEFAULT_CONTEXT}>
|
|
18
|
+
{children}
|
|
19
|
+
<React.Suspense fallback={null}><FillHooks/></React.Suspense>
|
|
20
|
+
<HiddenFillHooks/>
|
|
21
|
+
</SlotContext.Provider>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const Slot = ({name,children,...rest}) => {
|
|
25
|
+
|
|
26
|
+
const ref = useRef()
|
|
27
|
+
const slotInfo = useConstant({ref})
|
|
28
|
+
|
|
29
|
+
const slots = useContext(SlotContext)
|
|
30
|
+
|
|
31
|
+
useLayoutEffect(() => {
|
|
32
|
+
const previous = slots.get(name)
|
|
33
|
+
const updates = previous?.updates || []
|
|
34
|
+
if (previous?.children) {
|
|
35
|
+
// reparent
|
|
36
|
+
}
|
|
37
|
+
slots.set(name,_.flow(
|
|
38
|
+
_.update('infos',_.union([slotInfo]))
|
|
39
|
+
)(previous))
|
|
40
|
+
updates.forEach(v => v({}))
|
|
41
|
+
return () => {
|
|
42
|
+
const previous = slots.get(name)
|
|
43
|
+
previous.infos = _.without([slotInfo],previous.infos)
|
|
44
|
+
if (!previous.infos?.length && !previous.updates?.length) {
|
|
45
|
+
slots.delete(name)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}, [name])
|
|
49
|
+
|
|
50
|
+
return children
|
|
51
|
+
? <>
|
|
52
|
+
<div data-id={name} {...rest} ref={ref}/>
|
|
53
|
+
{React.Children.map(children,c => React.cloneElement(c,{...c.props,name,stack:Number.MIN_SAFE_INTEGER}))}
|
|
54
|
+
</>
|
|
55
|
+
: <div data-id={name} {...rest} ref={ref}/>
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const Invisible = styled.div`display:none`
|
|
60
|
+
|
|
61
|
+
const FillBeforeFlip = ({name, children, slot}) => {
|
|
62
|
+
const slots = useContext(SlotContext)
|
|
63
|
+
const ref = useRef()
|
|
64
|
+
useLayoutEffect(() => {
|
|
65
|
+
const infos = slots.get(name)?.infos || []
|
|
66
|
+
const mounted = _.flatMap(({ref}) => ref?.current,infos)
|
|
67
|
+
const clones = []
|
|
68
|
+
const getClone = () => {
|
|
69
|
+
const cloned = ref.current.cloneNode(true)
|
|
70
|
+
cloned.className = 'JS-fill-flip'
|
|
71
|
+
clones.push(cloned)
|
|
72
|
+
return cloned
|
|
73
|
+
}
|
|
74
|
+
mounted.map(_ => _.appendChild(getClone()))
|
|
75
|
+
return () => {
|
|
76
|
+
clones.forEach(el => el.remove())
|
|
77
|
+
}
|
|
78
|
+
},[])
|
|
79
|
+
return <Invisible ref={ref}>{children}</Invisible>
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const useFillState = (name,stack) => {
|
|
83
|
+
const forceUpdate = React.useState(false)[1];
|
|
84
|
+
const slots = useContext(SlotContext)
|
|
85
|
+
const renderSlot = slots.get(name)
|
|
86
|
+
const maxStack = _.max(renderSlot?.stacks)
|
|
87
|
+
const onStack = !_.isFinite(maxStack) || maxStack === stack
|
|
88
|
+
useLayoutEffect(() => {
|
|
89
|
+
|
|
90
|
+
const slot = slots.get(name)
|
|
91
|
+
const updatedSlot = _.flow(
|
|
92
|
+
_.update('updates',_.union([forceUpdate])),
|
|
93
|
+
_.update('stacks',_.union([stack])),
|
|
94
|
+
)(slot)
|
|
95
|
+
slots.set(name, updatedSlot)
|
|
96
|
+
updatedSlot.updates.forEach(v => v({}))
|
|
97
|
+
return () => {
|
|
98
|
+
const previous = slots.get(name)
|
|
99
|
+
const index = previous.updates.indexOf(forceUpdate)
|
|
100
|
+
const next = _.flow(
|
|
101
|
+
_.update('updates',_s.removeAt(index)),
|
|
102
|
+
_.update('stacks',_s.removeAt(index))
|
|
103
|
+
)(previous)
|
|
104
|
+
slots.set(name,next)
|
|
105
|
+
next.updates.forEach(v => v({}))
|
|
106
|
+
}
|
|
107
|
+
},[])
|
|
108
|
+
|
|
109
|
+
return [renderSlot,onStack]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
export const Fill = ({name, children, stack = 0, mountBeforeFlip}) => {
|
|
114
|
+
const [slot,onStack] = useFillState(name,stack)
|
|
115
|
+
if (slot?.infos && onStack) {
|
|
116
|
+
return slot?.infos.map((info) => info.ref?.current && ReactDOM.createPortal(callIfFunction(children,info),info.ref.current))
|
|
117
|
+
} else if (mountBeforeFlip) {
|
|
118
|
+
return <FillBeforeFlip name={name} slot={slot}>{children}</FillBeforeFlip>
|
|
119
|
+
} else {
|
|
120
|
+
return null
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
const FillHooks = ({}) => {
|
|
126
|
+
const [hooked] = useFillHookState({})
|
|
127
|
+
return Object.entries(hooked)
|
|
128
|
+
.map(([name, childs]) => childs.map(({children}, i) => <Fill key={name + i} name={name}>{children}</Fill>))
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let uid = 0
|
|
132
|
+
export const useFill = (name, children, inputs) => {
|
|
133
|
+
const [, set] = useFillHookStateRef()
|
|
134
|
+
const key = useRef(uid++)
|
|
135
|
+
useLayoutEffect(() => {
|
|
136
|
+
if (children) {
|
|
137
|
+
set(_.update([name], (list = []) => {
|
|
138
|
+
const index = _.findIndex(['key',key.current],list)
|
|
139
|
+
const value = {children,key:key.current}
|
|
140
|
+
if (index >= 0 ) {
|
|
141
|
+
return _.set([index],value,list)
|
|
142
|
+
} else {
|
|
143
|
+
return list.concat(value)
|
|
144
|
+
}
|
|
145
|
+
} ))
|
|
146
|
+
} else {
|
|
147
|
+
set(_.update([name], _.differenceBy('key',_, [{children,key:key.current}])))
|
|
148
|
+
}
|
|
149
|
+
}, inputs || children)
|
|
150
|
+
|
|
151
|
+
useLayoutEffect(() =>
|
|
152
|
+
() => set(_.update([name], _.differenceBy('key',_, [{key:key.current}])))
|
|
153
|
+
,[])
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const HiddenFillHooks = ({}) => {
|
|
157
|
+
const [hookedChildren] = useHiddenFillHookState({})
|
|
158
|
+
return <div>{Object.values(hookedChildren)}</div>
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export const useHiddenFill = (children, inputs) => {
|
|
162
|
+
const [, set] = useHiddenFillHookStateRef()
|
|
163
|
+
const [uid] = useMemo(()=>_.uniqueId(""),[])
|
|
164
|
+
set(_.set([uid], children ? React.cloneElement(children,{key:uid}) : null))
|
|
165
|
+
useEffect(()=> () => set(_.unset([uid])),[])
|
|
166
|
+
}
|