@apia/util 1.0.4 → 2.0.0
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/dist/animate/index.d.ts +4 -0
- package/dist/animate/index.d.ts.map +1 -0
- package/dist/animate/index.js +24 -0
- package/dist/animate/index.js.map +1 -0
- package/dist/array/arrayOrArray.d.ts +4 -0
- package/dist/array/arrayOrArray.d.ts.map +1 -0
- package/dist/array/arrayOrArray.js +8 -0
- package/dist/array/arrayOrArray.js.map +1 -0
- package/dist/array/getIndex.d.ts +14 -0
- package/dist/array/getIndex.d.ts.map +1 -0
- package/dist/array/getIndex.js +12 -0
- package/dist/array/getIndex.js.map +1 -0
- package/dist/crypto/decrypt.d.ts +4 -0
- package/dist/crypto/decrypt.d.ts.map +1 -0
- package/dist/crypto/decrypt.js +16 -0
- package/dist/crypto/decrypt.js.map +1 -0
- package/dist/crypto/encrypt.d.ts +4 -0
- package/dist/crypto/encrypt.d.ts.map +1 -0
- package/dist/crypto/encrypt.js +13 -0
- package/dist/crypto/encrypt.js.map +1 -0
- package/dist/crypto/generateKey.js +11 -0
- package/dist/crypto/generateKey.js.map +1 -0
- package/dist/date/apiaDateToStandarFormat.d.ts +4 -0
- package/dist/date/apiaDateToStandarFormat.d.ts.map +1 -0
- package/dist/date/apiaDateToStandarFormat.js +12 -0
- package/dist/date/apiaDateToStandarFormat.js.map +1 -0
- package/dist/date/dateToApiaFormat.d.ts +4 -0
- package/dist/date/dateToApiaFormat.d.ts.map +1 -0
- package/dist/date/dateToApiaFormat.js +9 -0
- package/dist/date/dateToApiaFormat.js.map +1 -0
- package/dist/date/getDateFormat.d.ts +11 -0
- package/dist/date/getDateFormat.d.ts.map +1 -0
- package/dist/date/getDateFormat.js +20 -0
- package/dist/date/getDateFormat.js.map +1 -0
- package/dist/debug/debugDispatcher.d.ts +32 -0
- package/dist/debug/debugDispatcher.d.ts.map +1 -0
- package/dist/debug/debugDispatcher.js +72 -0
- package/dist/debug/debugDispatcher.js.map +1 -0
- package/dist/debug/shortcutController.d.ts +57 -0
- package/dist/debug/shortcutController.d.ts.map +1 -0
- package/dist/debug/shortcutController.js +152 -0
- package/dist/debug/shortcutController.js.map +1 -0
- package/dist/documents/downloadStringAsDoc.d.ts +8 -0
- package/dist/documents/downloadStringAsDoc.d.ts.map +1 -0
- package/dist/documents/downloadStringAsDoc.js +12 -0
- package/dist/documents/downloadStringAsDoc.js.map +1 -0
- package/dist/documents/downloadUrl.d.ts +20 -0
- package/dist/documents/downloadUrl.d.ts.map +1 -0
- package/dist/documents/downloadUrl.js +18 -0
- package/dist/documents/downloadUrl.js.map +1 -0
- package/dist/documents/openAndReadFile.d.ts +4 -0
- package/dist/documents/openAndReadFile.d.ts.map +1 -0
- package/dist/documents/openAndReadFile.js +29 -0
- package/dist/documents/openAndReadFile.js.map +1 -0
- package/dist/dom/autoDisconnectMutationObserver.d.ts +17 -0
- package/dist/dom/autoDisconnectMutationObserver.d.ts.map +1 -0
- package/dist/dom/autoDisconnectMutationObserver.js +35 -0
- package/dist/dom/autoDisconnectMutationObserver.js.map +1 -0
- package/dist/dom/customEvents.d.ts +40 -0
- package/dist/dom/customEvents.d.ts.map +1 -0
- package/dist/dom/customEvents.js +34 -0
- package/dist/dom/customEvents.js.map +1 -0
- package/dist/dom/enableChildrenFocus.d.ts +18 -0
- package/dist/dom/enableChildrenFocus.d.ts.map +1 -0
- package/dist/dom/enableChildrenFocus.js +26 -0
- package/dist/dom/enableChildrenFocus.js.map +1 -0
- package/dist/dom/findOffsetRelativeToScrollParent.d.ts +7 -0
- package/dist/dom/findOffsetRelativeToScrollParent.d.ts.map +1 -0
- package/dist/dom/findOffsetRelativeToScrollParent.js +19 -0
- package/dist/dom/findOffsetRelativeToScrollParent.js.map +1 -0
- package/dist/dom/findScrollContainer.d.ts +8 -0
- package/dist/dom/findScrollContainer.d.ts.map +1 -0
- package/dist/dom/findScrollContainer.js +9 -0
- package/dist/dom/findScrollContainer.js.map +1 -0
- package/dist/dom/getFocusSelector.d.ts +25 -0
- package/dist/dom/getFocusSelector.d.ts.map +1 -0
- package/dist/dom/getFocusSelector.js +30 -0
- package/dist/dom/getFocusSelector.js.map +1 -0
- package/dist/dom/getSpecificParent.d.ts +23 -0
- package/dist/dom/getSpecificParent.d.ts.map +1 -0
- package/dist/dom/getSpecificParent.js +19 -0
- package/dist/dom/getSpecificParent.js.map +1 -0
- package/dist/dom/isChild.d.ts +13 -0
- package/dist/dom/isChild.d.ts.map +1 -0
- package/dist/dom/isChild.js +8 -0
- package/dist/dom/isChild.js.map +1 -0
- package/dist/dom/scrollParentIntoElement.d.ts +9 -0
- package/dist/dom/scrollParentIntoElement.d.ts.map +1 -0
- package/dist/dom/scrollParentIntoElement.js +24 -0
- package/dist/dom/scrollParentIntoElement.js.map +1 -0
- package/dist/dom/url.d.ts +18 -0
- package/dist/dom/url.d.ts.map +1 -0
- package/dist/dom/url.js +52 -0
- package/dist/dom/url.js.map +1 -0
- package/dist/dom/usePanAndZoom.d.ts +14 -0
- package/dist/dom/usePanAndZoom.d.ts.map +1 -0
- package/dist/dom/usePanAndZoom.js +111 -0
- package/dist/dom/usePanAndZoom.js.map +1 -0
- package/dist/encoding/index.d.ts +8 -0
- package/dist/encoding/index.d.ts.map +1 -0
- package/dist/encoding/index.js +12 -0
- package/dist/encoding/index.js.map +1 -0
- package/dist/events/BouncingEmitter.d.ts +67 -0
- package/dist/events/BouncingEmitter.d.ts.map +1 -0
- package/dist/events/BouncingEmitter.js +72 -0
- package/dist/events/BouncingEmitter.js.map +1 -0
- package/dist/events/EventEmitter.d.ts +47 -0
- package/dist/events/EventEmitter.d.ts.map +1 -0
- package/dist/events/EventEmitter.js +75 -0
- package/dist/events/EventEmitter.js.map +1 -0
- package/dist/events/StatefulEmitter.d.ts +44 -0
- package/dist/events/StatefulEmitter.d.ts.map +1 -0
- package/dist/events/StatefulEmitter.js +57 -0
- package/dist/events/StatefulEmitter.js.map +1 -0
- package/dist/events/types.d.ts +29 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/focus/focusController.d.ts +108 -0
- package/dist/focus/focusController.d.ts.map +1 -0
- package/dist/focus/focusController.js +295 -0
- package/dist/focus/focusController.js.map +1 -0
- package/dist/focus/globalFocus.d.ts +24 -0
- package/dist/focus/globalFocus.d.ts.map +1 -0
- package/dist/focus/globalFocus.js +87 -0
- package/dist/focus/globalFocus.js.map +1 -0
- package/dist/history/History.d.ts +81 -0
- package/dist/history/History.d.ts.map +1 -0
- package/dist/history/History.js +122 -0
- package/dist/history/History.js.map +1 -0
- package/dist/hooks/useCombinedRefs.d.ts +18 -0
- package/dist/hooks/useCombinedRefs.d.ts.map +1 -0
- package/dist/hooks/useCombinedRefs.js +20 -0
- package/dist/hooks/useCombinedRefs.js.map +1 -0
- package/dist/hooks/useDebouncedCallback.d.ts +7 -0
- package/dist/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/hooks/useDebouncedCallback.js +21 -0
- package/dist/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/hooks/useLatest.d.ts +13 -0
- package/dist/hooks/useLatest.d.ts.map +1 -0
- package/dist/hooks/useLatest.js +10 -0
- package/dist/hooks/useLatest.js.map +1 -0
- package/dist/hooks/useMount.d.ts +6 -0
- package/dist/hooks/useMount.d.ts.map +1 -0
- package/dist/hooks/useMount.js +14 -0
- package/dist/hooks/useMount.js.map +1 -0
- package/dist/hooks/usePrevious.d.ts +6 -0
- package/dist/hooks/usePrevious.d.ts.map +1 -0
- package/dist/hooks/usePrevious.js +12 -0
- package/dist/hooks/usePrevious.js.map +1 -0
- package/dist/hooks/useShallowMemo.d.ts +9 -0
- package/dist/hooks/useShallowMemo.d.ts.map +1 -0
- package/dist/hooks/useShallowMemo.js +42 -0
- package/dist/hooks/useShallowMemo.js.map +1 -0
- package/dist/hooks/useStateRef.d.ts +10 -0
- package/dist/hooks/useStateRef.d.ts.map +1 -0
- package/dist/hooks/useStateRef.js +11 -0
- package/dist/hooks/useStateRef.js.map +1 -0
- package/dist/hooks/useSubscription.d.ts +31 -0
- package/dist/hooks/useSubscription.d.ts.map +1 -0
- package/dist/hooks/useSubscription.js +21 -0
- package/dist/hooks/useSubscription.js.map +1 -0
- package/dist/hooks/useUnmount.d.ts +4 -0
- package/dist/hooks/useUnmount.d.ts.map +1 -0
- package/dist/hooks/useUnmount.js +10 -0
- package/dist/hooks/useUnmount.js.map +1 -0
- package/dist/hooks/useUpdateEffect.d.ts +10 -0
- package/dist/hooks/useUpdateEffect.d.ts.map +1 -0
- package/dist/hooks/useUpdateEffect.js +16 -0
- package/dist/hooks/useUpdateEffect.js.map +1 -0
- package/dist/imperative/makeImperativeComponent.d.ts +56 -0
- package/dist/imperative/makeImperativeComponent.d.ts.map +1 -0
- package/dist/imperative/makeImperativeComponent.js +48 -0
- package/dist/imperative/makeImperativeComponent.js.map +1 -0
- package/dist/imperative/makeSingleImperativeComponent.d.ts +15 -0
- package/dist/imperative/makeSingleImperativeComponent.d.ts.map +1 -0
- package/dist/imperative/makeSingleImperativeComponent.js +31 -0
- package/dist/imperative/makeSingleImperativeComponent.js.map +1 -0
- package/dist/imperative/types.d.ts +22 -0
- package/dist/imperative/types.d.ts.map +1 -0
- package/dist/imperative/types.js +8 -0
- package/dist/imperative/types.js.map +1 -0
- package/dist/imperative/useImperativeComponentEvents.d.ts +6 -0
- package/dist/imperative/useImperativeComponentEvents.d.ts.map +1 -0
- package/dist/imperative/useImperativeComponentEvents.js +35 -0
- package/dist/imperative/useImperativeComponentEvents.js.map +1 -0
- package/dist/imperative/useImperativeIdentifierContext.d.ts +14 -0
- package/dist/imperative/useImperativeIdentifierContext.d.ts.map +1 -0
- package/dist/imperative/useImperativeIdentifierContext.js +10 -0
- package/dist/imperative/useImperativeIdentifierContext.js.map +1 -0
- package/dist/index.d.ts +69 -1777
- package/dist/index.js +63 -2659
- package/dist/index.js.map +1 -1
- package/dist/labels/formatMessage.d.ts +19 -0
- package/dist/labels/formatMessage.d.ts.map +1 -0
- package/dist/labels/formatMessage.js +13 -0
- package/dist/labels/formatMessage.js.map +1 -0
- package/dist/labels/getLabel.d.ts +34 -0
- package/dist/labels/getLabel.d.ts.map +1 -0
- package/dist/labels/getLabel.js +18 -0
- package/dist/labels/getLabel.js.map +1 -0
- package/dist/number/index.d.ts +29 -0
- package/dist/number/index.d.ts.map +1 -0
- package/dist/number/index.js +43 -0
- package/dist/number/index.js.map +1 -0
- package/dist/objects/getValueByPath.d.ts +23 -0
- package/dist/objects/getValueByPath.d.ts.map +1 -0
- package/dist/objects/getValueByPath.js +19 -0
- package/dist/objects/getValueByPath.js.map +1 -0
- package/dist/objects/setValueByPath.d.ts +33 -0
- package/dist/objects/setValueByPath.d.ts.map +1 -0
- package/dist/objects/setValueByPath.js +35 -0
- package/dist/objects/setValueByPath.js.map +1 -0
- package/dist/propsStore/propsStore.d.ts +42 -0
- package/dist/propsStore/propsStore.d.ts.map +1 -0
- package/dist/propsStore/propsStore.js +157 -0
- package/dist/propsStore/propsStore.js.map +1 -0
- package/dist/propsStore/types.d.ts +24 -0
- package/dist/propsStore/types.d.ts.map +1 -0
- package/dist/propsStore/usePropsSelector.d.ts +67 -0
- package/dist/propsStore/usePropsSelector.d.ts.map +1 -0
- package/dist/propsStore/usePropsSelector.js +92 -0
- package/dist/propsStore/usePropsSelector.js.map +1 -0
- package/dist/screenLock/screenLocker.d.ts +60 -0
- package/dist/screenLock/screenLocker.d.ts.map +1 -0
- package/dist/screenLock/screenLocker.js +95 -0
- package/dist/screenLock/screenLocker.js.map +1 -0
- package/dist/states/useDebouncedState.d.ts +10 -0
- package/dist/states/useDebouncedState.d.ts.map +1 -0
- package/dist/states/useDebouncedState.js +22 -0
- package/dist/states/useDebouncedState.js.map +1 -0
- package/dist/states/useDomState.d.ts +86 -0
- package/dist/states/useDomState.d.ts.map +1 -0
- package/dist/states/useDomState.js +35 -0
- package/dist/states/useDomState.js.map +1 -0
- package/dist/storage/StatefulStore.d.ts +205 -0
- package/dist/storage/StatefulStore.d.ts.map +1 -0
- package/dist/storage/StatefulStore.js +301 -0
- package/dist/storage/StatefulStore.js.map +1 -0
- package/dist/storage/persistentStorage.d.ts +12 -0
- package/dist/storage/persistentStorage.d.ts.map +1 -0
- package/dist/storage/persistentStorage.js +28 -0
- package/dist/storage/persistentStorage.js.map +1 -0
- package/dist/storage/useLocalStorage.d.ts +7 -0
- package/dist/storage/useLocalStorage.d.ts.map +1 -0
- package/dist/storage/useLocalStorage.js +40 -0
- package/dist/storage/useLocalStorage.js.map +1 -0
- package/dist/string/alignment.d.ts +25 -0
- package/dist/string/alignment.d.ts.map +1 -0
- package/dist/string/alignment.js +26 -0
- package/dist/string/alignment.js.map +1 -0
- package/dist/string/ucfirst.d.ts +4 -0
- package/dist/string/ucfirst.d.ts.map +1 -0
- package/dist/string/ucfirst.js +6 -0
- package/dist/string/ucfirst.js.map +1 -0
- package/dist/typeGuards/toBoolean.d.ts +26 -0
- package/dist/typeGuards/toBoolean.d.ts.map +1 -0
- package/dist/typeGuards/toBoolean.js +11 -0
- package/dist/typeGuards/toBoolean.js.map +1 -0
- package/dist/types/apia/common.d.ts +114 -0
- package/dist/types/apia/common.d.ts.map +1 -0
- package/dist/types/apia/date.d.ts +4 -0
- package/dist/types/apia/date.d.ts.map +1 -0
- package/dist/types/apia/forms.d.ts +221 -0
- package/dist/types/apia/forms.d.ts.map +1 -0
- package/dist/types/misc.d.ts +9 -0
- package/dist/types/misc.d.ts.map +1 -0
- package/dist/xml/parseXmlAsync.d.ts +4 -0
- package/dist/xml/parseXmlAsync.d.ts.map +1 -0
- package/dist/xml/parseXmlAsync.js +58 -0
- package/dist/xml/parseXmlAsync.js.map +1 -0
- package/package.json +24 -35
- package/LICENSE.md +0 -21
- package/README.md +0 -18
- package/cleanDist.json +0 -3
- package/entries.json +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React__default, { useRef } from 'react';
|
|
2
|
+
import { propsStore, PropsSelectorUndefinedObject } from './propsStore.js';
|
|
3
|
+
|
|
4
|
+
const defaultComparator = (a, b) => {
|
|
5
|
+
return a === b;
|
|
6
|
+
};
|
|
7
|
+
function getDefaultSelector() {
|
|
8
|
+
return (current) => {
|
|
9
|
+
return current;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function isPropsConfigurationObject(value) {
|
|
13
|
+
return typeof value === "object" && value && ("selector" in value || "comparator" in value || "initialValue" in value);
|
|
14
|
+
}
|
|
15
|
+
function usePropsSelector(fieldId, par1, par2, par3) {
|
|
16
|
+
const selector = React__default.useMemo(
|
|
17
|
+
() => {
|
|
18
|
+
return isPropsConfigurationObject(par1) ? par1.selector : par1;
|
|
19
|
+
},
|
|
20
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
21
|
+
[]
|
|
22
|
+
);
|
|
23
|
+
const comparator = React__default.useMemo(
|
|
24
|
+
() => {
|
|
25
|
+
return isPropsConfigurationObject(par1) ? par1.comparator : par2;
|
|
26
|
+
},
|
|
27
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
|
+
[]
|
|
29
|
+
);
|
|
30
|
+
const initialValue = React__default.useMemo(
|
|
31
|
+
() => {
|
|
32
|
+
return isPropsConfigurationObject(par1) ? par1.initialValue : void 0;
|
|
33
|
+
},
|
|
34
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
35
|
+
[]
|
|
36
|
+
);
|
|
37
|
+
const actualPropsStore = React__default.useMemo(
|
|
38
|
+
() => {
|
|
39
|
+
return par3 ?? (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ?? propsStore;
|
|
40
|
+
},
|
|
41
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
42
|
+
[
|
|
43
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
44
|
+
par3 ?? (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ?? propsStore
|
|
45
|
+
]
|
|
46
|
+
);
|
|
47
|
+
const getCurrentProps = React__default.useCallback(() => {
|
|
48
|
+
const currentProps = actualPropsStore.getFieldProps(fieldId);
|
|
49
|
+
const willSetInitialValue = currentProps !== void 0 && initialValue !== void 0;
|
|
50
|
+
if (willSetInitialValue) {
|
|
51
|
+
actualPropsStore.updateField(
|
|
52
|
+
fieldId,
|
|
53
|
+
initialValue
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return (selector ?? getDefaultSelector())(
|
|
57
|
+
currentProps ?? PropsSelectorUndefinedObject
|
|
58
|
+
);
|
|
59
|
+
}, []);
|
|
60
|
+
const [props, setProps] = React__default.useState(getCurrentProps);
|
|
61
|
+
const prevProps = useRef(props);
|
|
62
|
+
const prevFieldId = useRef(fieldId);
|
|
63
|
+
React__default.useEffect(() => {
|
|
64
|
+
const unsuscribe = actualPropsStore.suscribe(
|
|
65
|
+
fieldId,
|
|
66
|
+
(newProps, isUrgent) => {
|
|
67
|
+
const newSelectedProps = (selector ?? getDefaultSelector())(
|
|
68
|
+
newProps
|
|
69
|
+
);
|
|
70
|
+
if (!(comparator ?? defaultComparator)(
|
|
71
|
+
prevProps.current,
|
|
72
|
+
newSelectedProps
|
|
73
|
+
) || prevFieldId.current !== fieldId) {
|
|
74
|
+
if (isUrgent)
|
|
75
|
+
setProps(newSelectedProps);
|
|
76
|
+
else
|
|
77
|
+
React__default.startTransition(() => {
|
|
78
|
+
setProps(newSelectedProps);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
prevProps.current = newSelectedProps;
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
return () => {
|
|
85
|
+
unsuscribe();
|
|
86
|
+
};
|
|
87
|
+
}, [fieldId, actualPropsStore, selector, comparator]);
|
|
88
|
+
return props;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export { isPropsConfigurationObject, usePropsSelector };
|
|
92
|
+
//# sourceMappingURL=usePropsSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePropsSelector.js","sources":["../../src/propsStore/usePropsSelector.ts"],"sourcesContent":["import React, { useRef } from 'react';\nimport {\n PropsSelectorUndefinedObject,\n propsStore,\n PropsStore,\n} from './propsStore';\nimport {\n TProperties,\n TPropsComparator,\n TPropsConfiguration,\n TPropsSelector,\n} from './types';\nimport { TId } from '../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst defaultComparator: TPropsComparator<any> = (a, b) => {\n return a === b;\n};\nfunction getDefaultSelector<Selected, PropsType = TProperties>() {\n return (current: PropsType) => {\n return current as unknown as Selected;\n };\n}\n\nexport function isPropsConfigurationObject<\n Selected,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n value?:\n | TPropsSelector<Selected, PropsType>\n | TPropsConfiguration<Selected, PropsType>,\n): value is TPropsConfiguration<Selected, PropsType> {\n return (\n typeof value === 'object' &&\n value &&\n ('selector' in value || 'comparator' in value || 'initialValue' in value)\n );\n}\n\n/**\n *\n * Este hook permite escuchar los cambios en las propiedades\n * de un campo en particular.\n *\n * @param configuration\n * Este objeto permite pasar las siguientes propiedades para ser\n * determinar el comportamiento del hook:\n *\n * **selector:** La función selectora es una función equivalente\n * a la que se utiliza en el useAppSelector de redux. Con ella\n * se puede seleccionar una porción de las props, evitando\n * re-renderizados innecesarios. Esto se debe a que el renderizado\n * solamente ocurrirá cuando la función selectora devuelva un valor\n * que sea distinto del anterior.\n *\n * El concepto de distinto es: si existe una función comparadora,\n * se determinará mediante la ejecución de dicha función, a la que\n * se le pasan como parámetros el objeto anterior y el nuevo.\n *\n * En caso de que no haya función comparadora, se comparará que\n * las props seleccionadas y las nuevas sean exactamente las mismas\n * (la referencia al mismo objeto).\n *\n * **comparator:** La función comparadora de la que estamos\n * hablando.\n *\n * **initialValue:** Un valor para setearlo al inicio, el mismo\n * solamente será seteado en caso de que ya no exista un valor\n * en el store.\n * @returns\n */\nexport function usePropsSelector<\n Selected = TProperties,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n fieldId: TId,\n configuration?: TPropsConfiguration<Selected, PropsType>,\n): Selected;\n/**\n *\n * Este hook permite escuchar los cambios en las propiedades\n * de un campo en particular.\n *\n * @param selector La función selectora es una función equivalente\n * a la que se utiliza en el useAppSelector de redux. Con ella\n * se puede seleccionar una porción de las props, evitando\n * re-renderizados innecesarios. Esto se debe a que el renderizado\n * solamente ocurrirá cuando la función selectora devuelva un valor\n * que sea distinto del anterior.\n *\n * El concepto de distinto es: si existe una función comparadora,\n * se determinará mediante la ejecución de dicha función, a la que\n * se le pasan como parámetros el objeto anterior y el nuevo.\n *\n * En caso de que no haya función comparadora, se comparará que\n * las props seleccionadas y las nuevas sean exactamente las mismas\n * (la referencia al mismo objeto).\n *\n * @param comparator La función comparadora de la que estamos\n * hablando.\n *\n * @returns\n */\nexport function usePropsSelector<\n Selected = TProperties,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n fieldId: TId,\n selector?:\n | TPropsSelector<Selected, PropsType>\n | TPropsConfiguration<Selected, PropsType>,\n comparator?: TPropsComparator<Selected>,\n anotherPropsStore?: PropsStore<PropsType>,\n): Selected;\nexport function usePropsSelector<\n Selected = TProperties,\n PropsType extends Record<string, unknown> = TProperties,\n>(\n fieldId: TId,\n par1?:\n | TPropsSelector<Selected, PropsType>\n | TPropsConfiguration<Selected, PropsType>,\n par2?: TPropsComparator<Selected>,\n par3?: PropsStore<PropsType>,\n): Selected {\n const selector = React.useMemo(\n () => {\n return isPropsConfigurationObject(par1) ? par1.selector : par1;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const comparator = React.useMemo(\n () => {\n return isPropsConfigurationObject(par1) ? par1.comparator : par2;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const initialValue = React.useMemo(\n () => {\n return isPropsConfigurationObject(par1) ? par1.initialValue : undefined;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n const actualPropsStore = React.useMemo(\n () => {\n return (\n par3 ??\n (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ??\n propsStore\n );\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // eslint-disable-next-line react-hooks/exhaustive-deps\n par3 ??\n (isPropsConfigurationObject(par1) ? par1.propsStore : propsStore) ??\n propsStore,\n ],\n );\n\n const getCurrentProps = React.useCallback(() => {\n const currentProps = actualPropsStore.getFieldProps<PropsType>(fieldId);\n const willSetInitialValue =\n currentProps !== undefined && initialValue !== undefined;\n if (willSetInitialValue) {\n actualPropsStore.updateField(\n fieldId,\n initialValue as unknown as TProperties,\n );\n }\n return (selector ?? getDefaultSelector())(\n currentProps ?? (PropsSelectorUndefinedObject as PropsType),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [props, setProps] = React.useState<Selected>(getCurrentProps);\n\n const prevProps = useRef(props);\n const prevFieldId = useRef(fieldId);\n\n React.useEffect(() => {\n const unsuscribe = actualPropsStore.suscribe(\n fieldId,\n (newProps, isUrgent) => {\n const newSelectedProps = (selector ?? getDefaultSelector())(\n newProps as unknown as PropsType,\n );\n\n if (\n !(comparator ?? defaultComparator)(\n prevProps.current,\n newSelectedProps,\n ) ||\n prevFieldId.current !== fieldId\n ) {\n if (isUrgent) setProps(newSelectedProps);\n else\n React.startTransition(() => {\n setProps(newSelectedProps);\n });\n }\n prevProps.current = newSelectedProps;\n },\n );\n\n return () => {\n unsuscribe();\n };\n }, [fieldId, actualPropsStore, selector, comparator]);\n\n return props;\n}\n"],"names":["React"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EventEmitter } from '../events/EventEmitter.js';
|
|
2
|
+
|
|
3
|
+
declare class ScreenLocker extends EventEmitter<{
|
|
4
|
+
forcedStateChange: {
|
|
5
|
+
hasReleasedFirstTime: boolean;
|
|
6
|
+
isForced: boolean;
|
|
7
|
+
};
|
|
8
|
+
lockStateChange: {
|
|
9
|
+
hasReleasedFirstTime: boolean;
|
|
10
|
+
isLocked: boolean;
|
|
11
|
+
lockName: string;
|
|
12
|
+
};
|
|
13
|
+
releaseForFirstTime: null;
|
|
14
|
+
ready: null;
|
|
15
|
+
}> {
|
|
16
|
+
#private;
|
|
17
|
+
get hasReleasedFirstTime(): boolean;
|
|
18
|
+
get isForced(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Permite saber si un bloqueo determinado está activo o si la clase tiene
|
|
21
|
+
* forceLock activo.
|
|
22
|
+
*/
|
|
23
|
+
isLocked(lockName?: string): boolean;
|
|
24
|
+
constructor();
|
|
25
|
+
lock(lockName?: string): void;
|
|
26
|
+
unlock(lockName?: string): void;
|
|
27
|
+
force(): void;
|
|
28
|
+
releaseForced(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Esta clase no implementa ninguna funcionalidad de bloqueo, sino solamente se
|
|
32
|
+
* encarga de la lógica y de los eventos.
|
|
33
|
+
*
|
|
34
|
+
* El concepto es que hay n niveles de bloqueo y además existe el bloqueo
|
|
35
|
+
* forzado. Cada uno de los niveles recibe un nombre, por defecto se realizan
|
|
36
|
+
* operaciones contra el bloque 'common' si no se pasa ninguno, pero
|
|
37
|
+
* podría utilizarse cualquier otro. Esto es así con el fin de implementar
|
|
38
|
+
* varios bloqueos en la misma clase, ejemplos: el bloqueo común, el bloqueo
|
|
39
|
+
* lineal de las tablas, bloque con pantalla blanca en el inicio de formularios,
|
|
40
|
+
* o cualquier otro que se desee. Para los bloqueos estándar se utilizan los
|
|
41
|
+
* métodos lock y unlock.
|
|
42
|
+
*
|
|
43
|
+
* El bloqueo forzado por otra parte es un estado general que se puede alterar
|
|
44
|
+
* mediante los métodos force y releaseForced. Cada vez que se bloquee o
|
|
45
|
+
* desbloquee la pantalla, se lanzará un evento lockStateChange sin lockName y
|
|
46
|
+
* con forced = true.
|
|
47
|
+
*
|
|
48
|
+
* Además, provee un evento para saber cuándo se desbloquea la pantalla
|
|
49
|
+
* efectivamente por primera vez para cada tipo de bloqueo. Es posible a su vez
|
|
50
|
+
* resetear la clase para que este evento sea lanzado nuevamente en el próximo
|
|
51
|
+
* desbloqueo mediante resetRefreshFirstTime.
|
|
52
|
+
*
|
|
53
|
+
* El evento releasForFirstTime se dispara únicamente para el bloqueo 'common'.
|
|
54
|
+
* Esto es así ya que sino podría dar lugar a confusión en situaciones donde no
|
|
55
|
+
* se controle el nombre del bloqueo.
|
|
56
|
+
*/
|
|
57
|
+
declare const screenLocker: ScreenLocker;
|
|
58
|
+
|
|
59
|
+
export { screenLocker };
|
|
60
|
+
//# sourceMappingURL=screenLocker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenLocker.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { EventEmitter } from '../events/EventEmitter.js';
|
|
2
|
+
|
|
3
|
+
var __accessCheck = (obj, member, msg) => {
|
|
4
|
+
if (!member.has(obj))
|
|
5
|
+
throw TypeError("Cannot " + msg);
|
|
6
|
+
};
|
|
7
|
+
var __privateGet = (obj, member, getter) => {
|
|
8
|
+
__accessCheck(obj, member, "read from private field");
|
|
9
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
10
|
+
};
|
|
11
|
+
var __privateAdd = (obj, member, value) => {
|
|
12
|
+
if (member.has(obj))
|
|
13
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
14
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
15
|
+
};
|
|
16
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
17
|
+
__accessCheck(obj, member, "write to private field");
|
|
18
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
var __privateMethod = (obj, member, method) => {
|
|
22
|
+
__accessCheck(obj, member, "access private method");
|
|
23
|
+
return method;
|
|
24
|
+
};
|
|
25
|
+
var _hasReleasedFirstTime, _wasReleasedFirstTime, _isForced, _locks, _shoutLockState, shoutLockState_fn;
|
|
26
|
+
class ScreenLocker extends EventEmitter {
|
|
27
|
+
constructor() {
|
|
28
|
+
super();
|
|
29
|
+
__privateAdd(this, _shoutLockState);
|
|
30
|
+
__privateAdd(this, _hasReleasedFirstTime, false);
|
|
31
|
+
__privateAdd(this, _wasReleasedFirstTime, false);
|
|
32
|
+
__privateAdd(this, _isForced, false);
|
|
33
|
+
__privateAdd(this, _locks, {
|
|
34
|
+
common: false
|
|
35
|
+
});
|
|
36
|
+
this.emit("ready", null);
|
|
37
|
+
}
|
|
38
|
+
get hasReleasedFirstTime() {
|
|
39
|
+
return __privateGet(this, _hasReleasedFirstTime);
|
|
40
|
+
}
|
|
41
|
+
get isForced() {
|
|
42
|
+
return __privateGet(this, _isForced);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Permite saber si un bloqueo determinado está activo o si la clase tiene
|
|
46
|
+
* forceLock activo.
|
|
47
|
+
*/
|
|
48
|
+
isLocked(lockName = "common") {
|
|
49
|
+
return __privateGet(this, _locks)[lockName] || __privateGet(this, _isForced);
|
|
50
|
+
}
|
|
51
|
+
lock(lockName = "common") {
|
|
52
|
+
__privateGet(this, _locks)[lockName] = true;
|
|
53
|
+
__privateMethod(this, _shoutLockState, shoutLockState_fn).call(this, lockName);
|
|
54
|
+
}
|
|
55
|
+
unlock(lockName = "common") {
|
|
56
|
+
if (lockName === "common")
|
|
57
|
+
__privateSet(this, _hasReleasedFirstTime, true);
|
|
58
|
+
__privateGet(this, _locks)[lockName] = false;
|
|
59
|
+
__privateMethod(this, _shoutLockState, shoutLockState_fn).call(this, lockName);
|
|
60
|
+
}
|
|
61
|
+
force() {
|
|
62
|
+
__privateSet(this, _isForced, true);
|
|
63
|
+
__privateMethod(this, _shoutLockState, shoutLockState_fn).call(this);
|
|
64
|
+
}
|
|
65
|
+
releaseForced() {
|
|
66
|
+
__privateSet(this, _isForced, false);
|
|
67
|
+
__privateMethod(this, _shoutLockState, shoutLockState_fn).call(this);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
_hasReleasedFirstTime = new WeakMap();
|
|
71
|
+
_wasReleasedFirstTime = new WeakMap();
|
|
72
|
+
_isForced = new WeakMap();
|
|
73
|
+
_locks = new WeakMap();
|
|
74
|
+
_shoutLockState = new WeakSet();
|
|
75
|
+
shoutLockState_fn = function(lockName) {
|
|
76
|
+
if (__privateGet(this, _isForced) || lockName === void 0) {
|
|
77
|
+
this.emit("forcedStateChange", {
|
|
78
|
+
isForced: __privateGet(this, _isForced),
|
|
79
|
+
hasReleasedFirstTime: __privateGet(this, _hasReleasedFirstTime)
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
if (lockName === "common" && !__privateGet(this, _wasReleasedFirstTime) && __privateGet(this, _hasReleasedFirstTime)) {
|
|
83
|
+
this.emit("releaseForFirstTime", null);
|
|
84
|
+
}
|
|
85
|
+
this.emit("lockStateChange", {
|
|
86
|
+
lockName,
|
|
87
|
+
hasReleasedFirstTime: __privateGet(this, _hasReleasedFirstTime),
|
|
88
|
+
isLocked: __privateGet(this, _locks)[lockName]
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const screenLocker = new ScreenLocker();
|
|
93
|
+
|
|
94
|
+
export { screenLocker };
|
|
95
|
+
//# sourceMappingURL=screenLocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenLocker.js","sources":["../../src/screenLock/screenLocker.ts"],"sourcesContent":["import { EventEmitter } from '../events/EventEmitter';\nclass ScreenLocker extends EventEmitter<{\n forcedStateChange: {\n hasReleasedFirstTime: boolean;\n isForced: boolean;\n };\n lockStateChange: {\n hasReleasedFirstTime: boolean;\n isLocked: boolean;\n lockName: string;\n };\n releaseForFirstTime: null;\n ready: null;\n}> {\n #hasReleasedFirstTime = false;\n\n #wasReleasedFirstTime = false;\n\n #isForced = false;\n\n #locks: Record<string, boolean> = {\n common: false,\n };\n\n get hasReleasedFirstTime() {\n return this.#hasReleasedFirstTime;\n }\n\n get isForced() {\n return this.#isForced;\n }\n\n /**\n * Permite saber si un bloqueo determinado está activo o si la clase tiene\n * forceLock activo.\n */\n isLocked(lockName = 'common') {\n return this.#locks[lockName] || this.#isForced;\n }\n\n constructor() {\n super();\n\n this.emit('ready', null);\n }\n\n #shoutLockState(lockName?: string) {\n if (this.#isForced || lockName === undefined) {\n this.emit('forcedStateChange', {\n isForced: this.#isForced,\n hasReleasedFirstTime: this.#hasReleasedFirstTime,\n });\n } else {\n if (\n lockName === 'common' &&\n !this.#wasReleasedFirstTime &&\n this.#hasReleasedFirstTime\n ) {\n this.emit('releaseForFirstTime', null);\n }\n\n this.emit('lockStateChange', {\n lockName,\n hasReleasedFirstTime: this.#hasReleasedFirstTime,\n isLocked: this.#locks[lockName],\n });\n }\n }\n\n lock(lockName = 'common') {\n this.#locks[lockName] = true;\n this.#shoutLockState(lockName);\n }\n\n unlock(lockName = 'common') {\n if (lockName === 'common') this.#hasReleasedFirstTime = true;\n this.#locks[lockName] = false;\n this.#shoutLockState(lockName);\n }\n\n force() {\n this.#isForced = true;\n this.#shoutLockState();\n }\n\n releaseForced() {\n this.#isForced = false;\n this.#shoutLockState();\n }\n}\n\n/**\n * Esta clase no implementa ninguna funcionalidad de bloqueo, sino solamente se\n * encarga de la lógica y de los eventos.\n *\n * El concepto es que hay n niveles de bloqueo y además existe el bloqueo\n * forzado. Cada uno de los niveles recibe un nombre, por defecto se realizan\n * operaciones contra el bloque 'common' si no se pasa ninguno, pero\n * podría utilizarse cualquier otro. Esto es así con el fin de implementar\n * varios bloqueos en la misma clase, ejemplos: el bloqueo común, el bloqueo\n * lineal de las tablas, bloque con pantalla blanca en el inicio de formularios,\n * o cualquier otro que se desee. Para los bloqueos estándar se utilizan los\n * métodos lock y unlock.\n *\n * El bloqueo forzado por otra parte es un estado general que se puede alterar\n * mediante los métodos force y releaseForced. Cada vez que se bloquee o\n * desbloquee la pantalla, se lanzará un evento lockStateChange sin lockName y\n * con forced = true.\n *\n * Además, provee un evento para saber cuándo se desbloquea la pantalla\n * efectivamente por primera vez para cada tipo de bloqueo. Es posible a su vez\n * resetear la clase para que este evento sea lanzado nuevamente en el próximo\n * desbloqueo mediante resetRefreshFirstTime.\n *\n * El evento releasForFirstTime se dispara únicamente para el bloqueo 'common'.\n * Esto es así ya que sino podría dar lugar a confusión en situaciones donde no\n * se controle el nombre del bloqueo.\n */\nconst screenLocker = new ScreenLocker();\n\nexport { screenLocker };\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SetStateAction } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Permite manejar un estado que se actualizará únicamente siguiendo el
|
|
5
|
+
* comportamiento esperado de un debounce
|
|
6
|
+
*/
|
|
7
|
+
declare function useDebouncedState<T>(timeout: number, initialState?: T): [T | undefined, (state: SetStateAction<T>, immediate?: boolean) => unknown];
|
|
8
|
+
|
|
9
|
+
export { useDebouncedState };
|
|
10
|
+
//# sourceMappingURL=useDebouncedState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedState.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useState, useRef, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
function useDebouncedState(timeout, initialState) {
|
|
4
|
+
const [state, innerSetState] = useState(initialState);
|
|
5
|
+
const t = useRef(-1);
|
|
6
|
+
const setState = useCallback(
|
|
7
|
+
(newState, immediate) => {
|
|
8
|
+
clearTimeout(t.current);
|
|
9
|
+
if (immediate)
|
|
10
|
+
innerSetState(newState);
|
|
11
|
+
else
|
|
12
|
+
t.current = setTimeout(() => {
|
|
13
|
+
innerSetState(newState);
|
|
14
|
+
}, timeout);
|
|
15
|
+
},
|
|
16
|
+
[timeout]
|
|
17
|
+
);
|
|
18
|
+
return [state, setState];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { useDebouncedState };
|
|
22
|
+
//# sourceMappingURL=useDebouncedState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedState.js","sources":["../../src/states/useDebouncedState.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SetStateAction, useCallback, useRef } from 'react';\nimport { useState } from 'react';\n\n/**\n * Permite manejar un estado que se actualizará únicamente siguiendo el\n * comportamiento esperado de un debounce\n */\nexport function useDebouncedState<T>(\n timeout: number,\n initialState?: T,\n): [T | undefined, (state: SetStateAction<T>, immediate?: boolean) => unknown] {\n const [state, innerSetState] = useState<T>(initialState as T);\n\n const t = useRef<number>(-1);\n\n const setState = useCallback<\n (state: SetStateAction<T>, immediate?: boolean) => unknown\n >(\n (newState, immediate?: boolean) => {\n clearTimeout(t.current);\n\n if (immediate) innerSetState(newState);\n else\n t.current = setTimeout(() => {\n innerSetState(newState);\n }, timeout) as any;\n },\n [timeout],\n );\n\n return [state, setState];\n}\n"],"names":[],"mappings":";;AAQgB,SAAA,iBAAA,CACd,SACA,YAC6E,EAAA;AAC7E,EAAA,MAAM,CAAC,KAAA,EAAO,aAAa,CAAA,GAAI,SAAY,YAAiB,CAAA,CAAA;AAE5D,EAAM,MAAA,CAAA,GAAI,OAAe,CAAE,CAAA,CAAA,CAAA;AAE3B,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IAGf,CAAC,UAAU,SAAwB,KAAA;AACjC,MAAA,YAAA,CAAa,EAAE,OAAO,CAAA,CAAA;AAEtB,MAAI,IAAA,SAAA;AAAW,QAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAAA;AAEnC,QAAE,CAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AAC3B,UAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAAA,WACrB,OAAO,CAAA,CAAA;AAAA,KACd;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAO,OAAA,CAAC,OAAO,QAAQ,CAAA,CAAA;AACzB;;;;"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* El hook useDomState permite aplicar propiedades a un
|
|
5
|
+
* elemento del DOM de la forma más eficiente posible.
|
|
6
|
+
*
|
|
7
|
+
* Este hook no permite el uso de sx ya que por las características
|
|
8
|
+
* del sx, el re-renderizado es necesario.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
*
|
|
12
|
+
*
|
|
13
|
+
* const TestComponent = () => {
|
|
14
|
+
const { domProps, setDomProps } = useDomState<BoxProps>({
|
|
15
|
+
style: {
|
|
16
|
+
position: 'fixed',
|
|
17
|
+
left: 0,
|
|
18
|
+
top: 0,
|
|
19
|
+
width: '150px',
|
|
20
|
+
height: '150px',
|
|
21
|
+
backgroundColor: '#ccc',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const initialPosition = React.useRef({ boxX: 0, boxY: 0, x: 0, y: 0 });
|
|
25
|
+
const isDragging = React.useRef(false);
|
|
26
|
+
const [state, setState] = React.useState(1);
|
|
27
|
+
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
const move = (ev: MouseEvent) => {
|
|
30
|
+
if (isDragging.current) {
|
|
31
|
+
const moveX = ev.clientX - initialPosition.current.x;
|
|
32
|
+
const moveY = ev.clientY - initialPosition.current.y;
|
|
33
|
+
const newLeft = initialPosition.current.boxX + moveX;
|
|
34
|
+
const newTop = initialPosition.current.boxY + moveY;
|
|
35
|
+
setDomProps({
|
|
36
|
+
style: {
|
|
37
|
+
left: `${newLeft}px`,
|
|
38
|
+
top: `${newTop}px`,
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const removeSuscription = () => {
|
|
45
|
+
isDragging.current = false;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
document.addEventListener('mousemove', move);
|
|
49
|
+
document.addEventListener('mouseup', removeSuscription);
|
|
50
|
+
|
|
51
|
+
return () => {
|
|
52
|
+
document.removeEventListener('mousemove', move);
|
|
53
|
+
document.removeEventListener('mouseup', removeSuscription);
|
|
54
|
+
};
|
|
55
|
+
}, [setDomProps]);
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<Box
|
|
59
|
+
{...domProps}
|
|
60
|
+
onMouseDown={(ev) => {
|
|
61
|
+
initialPosition.current = {
|
|
62
|
+
boxX: Number.parseInt(domProps.style?.left as string, 10),
|
|
63
|
+
boxY: Number.parseInt(domProps.style?.top as string, 10),
|
|
64
|
+
x: ev.clientX,
|
|
65
|
+
y: ev.clientY,
|
|
66
|
+
};
|
|
67
|
+
isDragging.current = true;
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
Esta caja es arrastrable. Renderizados: {state}
|
|
71
|
+
<Button onClick={() => setState((current) => current + 1)}>
|
|
72
|
+
Renderizar
|
|
73
|
+
</Button>
|
|
74
|
+
</Box>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
*/
|
|
78
|
+
declare function useDomState<T extends HTMLAttributes<HTMLElement>>(initialDomProps?: T): {
|
|
79
|
+
domProps: T & {
|
|
80
|
+
ref: (el: HTMLElement) => void;
|
|
81
|
+
};
|
|
82
|
+
setDomProps: ({ style, ...newDomProps }: Partial<T>) => void;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { useDomState };
|
|
86
|
+
//# sourceMappingURL=useDomState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDomState.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
|
|
3
|
+
function assignProps(el, { style, ...props }) {
|
|
4
|
+
if (style) {
|
|
5
|
+
Object.entries(style).forEach(([name, value]) => {
|
|
6
|
+
el.style[name] = value;
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
Object.assign(el, props);
|
|
10
|
+
}
|
|
11
|
+
function useDomState(initialDomProps) {
|
|
12
|
+
const domProps = React__default.useRef({
|
|
13
|
+
...initialDomProps ?? {},
|
|
14
|
+
ref: React__default.useCallback((el) => {
|
|
15
|
+
ref.current = el;
|
|
16
|
+
assignProps(ref.current, domProps.current);
|
|
17
|
+
}, [])
|
|
18
|
+
});
|
|
19
|
+
const ref = React__default.useRef(null);
|
|
20
|
+
return {
|
|
21
|
+
domProps: domProps.current,
|
|
22
|
+
setDomProps: React__default.useCallback(({ style, ...newDomProps }) => {
|
|
23
|
+
if (style) {
|
|
24
|
+
const newStyles = { ...domProps.current.style, ...style };
|
|
25
|
+
domProps.current.style = newStyles;
|
|
26
|
+
}
|
|
27
|
+
Object.assign(domProps.current, newDomProps);
|
|
28
|
+
if (ref.current)
|
|
29
|
+
assignProps(ref.current, domProps.current);
|
|
30
|
+
}, [])
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { useDomState };
|
|
35
|
+
//# sourceMappingURL=useDomState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDomState.js","sources":["../../src/states/useDomState.tsx"],"sourcesContent":["import React, { HTMLAttributes, HTMLProps } from 'react';\n\nfunction assignProps<T extends HTMLProps<HTMLElement>>(\n el: HTMLElement,\n { style, ...props }: T,\n) {\n if (style) {\n Object.entries(style).forEach(([name, value]) => {\n // eslint-disable-next-line no-param-reassign, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n (el as any).style[name] = value;\n });\n }\n Object.assign(el, props);\n}\n\n/**\n * El hook useDomState permite aplicar propiedades a un\n * elemento del DOM de la forma más eficiente posible.\n *\n * Este hook no permite el uso de sx ya que por las características\n * del sx, el re-renderizado es necesario.\n *\n * @example\n *\n *\n * const TestComponent = () => {\n const { domProps, setDomProps } = useDomState<BoxProps>({\n style: {\n position: 'fixed',\n left: 0,\n top: 0,\n width: '150px',\n height: '150px',\n backgroundColor: '#ccc',\n },\n });\n const initialPosition = React.useRef({ boxX: 0, boxY: 0, x: 0, y: 0 });\n const isDragging = React.useRef(false);\n const [state, setState] = React.useState(1);\n\n React.useEffect(() => {\n const move = (ev: MouseEvent) => {\n if (isDragging.current) {\n const moveX = ev.clientX - initialPosition.current.x;\n const moveY = ev.clientY - initialPosition.current.y;\n const newLeft = initialPosition.current.boxX + moveX;\n const newTop = initialPosition.current.boxY + moveY;\n setDomProps({\n style: {\n left: `${newLeft}px`,\n top: `${newTop}px`,\n },\n });\n }\n };\n\n const removeSuscription = () => {\n isDragging.current = false;\n };\n\n document.addEventListener('mousemove', move);\n document.addEventListener('mouseup', removeSuscription);\n\n return () => {\n document.removeEventListener('mousemove', move);\n document.removeEventListener('mouseup', removeSuscription);\n };\n }, [setDomProps]);\n\n return (\n <Box\n {...domProps}\n onMouseDown={(ev) => {\n initialPosition.current = {\n boxX: Number.parseInt(domProps.style?.left as string, 10),\n boxY: Number.parseInt(domProps.style?.top as string, 10),\n x: ev.clientX,\n y: ev.clientY,\n };\n isDragging.current = true;\n }}\n >\n Esta caja es arrastrable. Renderizados: {state}\n <Button onClick={() => setState((current) => current + 1)}>\n Renderizar\n </Button>\n </Box>\n );\n};\n */\nexport function useDomState<T extends HTMLAttributes<HTMLElement>>(\n initialDomProps?: T,\n) {\n const domProps = React.useRef<T & { ref: (el: HTMLElement) => void }>({\n ...(initialDomProps ?? ({} as T)),\n ref: React.useCallback((el: HTMLElement) => {\n ref.current = el;\n assignProps(ref.current, domProps.current);\n }, []),\n });\n const ref = React.useRef<HTMLElement | null>(null);\n return {\n domProps: domProps.current,\n setDomProps: React.useCallback(({ style, ...newDomProps }: Partial<T>) => {\n if (style) {\n const newStyles = { ...domProps.current.style, ...style };\n domProps.current.style = newStyles;\n }\n Object.assign(domProps.current, newDomProps);\n if (ref.current) assignProps(ref.current, domProps.current);\n }, []),\n };\n}\n"],"names":["React"],"mappings":";;AAEA,SAAS,YACP,EACA,EAAA,EAAE,KAAO,EAAA,GAAG,OACZ,EAAA;AACA,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AAE/C,MAAC,EAAA,CAAW,KAAM,CAAA,IAAI,CAAI,GAAA,KAAA,CAAA;AAAA,KAC3B,CAAA,CAAA;AAAA,GACH;AACA,EAAO,MAAA,CAAA,MAAA,CAAO,IAAI,KAAK,CAAA,CAAA;AACzB,CAAA;AA6EO,SAAS,YACd,eACA,EAAA;AACA,EAAM,MAAA,QAAA,GAAWA,eAAM,MAA+C,CAAA;AAAA,IACpE,GAAI,mBAAoB,EAAC;AAAA,IACzB,GAAK,EAAAA,cAAA,CAAM,WAAY,CAAA,CAAC,EAAoB,KAAA;AAC1C,MAAA,GAAA,CAAI,OAAU,GAAA,EAAA,CAAA;AACd,MAAY,WAAA,CAAA,GAAA,CAAI,OAAS,EAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,KAC3C,EAAG,EAAE,CAAA;AAAA,GACN,CAAA,CAAA;AACD,EAAM,MAAA,GAAA,GAAMA,cAAM,CAAA,MAAA,CAA2B,IAAI,CAAA,CAAA;AACjD,EAAO,OAAA;AAAA,IACL,UAAU,QAAS,CAAA,OAAA;AAAA,IACnB,WAAA,EAAaA,eAAM,WAAY,CAAA,CAAC,EAAE,KAAO,EAAA,GAAG,aAA8B,KAAA;AACxE,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,MAAM,YAAY,EAAE,GAAG,SAAS,OAAQ,CAAA,KAAA,EAAO,GAAG,KAAM,EAAA,CAAA;AACxD,QAAA,QAAA,CAAS,QAAQ,KAAQ,GAAA,SAAA,CAAA;AAAA,OAC3B;AACA,MAAO,MAAA,CAAA,MAAA,CAAO,QAAS,CAAA,OAAA,EAAS,WAAW,CAAA,CAAA;AAC3C,MAAA,IAAI,GAAI,CAAA,OAAA;AAAS,QAAY,WAAA,CAAA,GAAA,CAAI,OAAS,EAAA,QAAA,CAAS,OAAO,CAAA,CAAA;AAAA,KAC5D,EAAG,EAAE,CAAA;AAAA,GACP,CAAA;AACF;;;;"}
|