@ekz/react-utils 1.0.1 → 1.0.2
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/cjs/browser/index.d.ts +1 -0
- package/lib/cjs/browser/index.js +6 -0
- package/lib/cjs/browser/index.js.map +1 -0
- package/lib/cjs/browser/useWindowFocusDetection.d.ts +1 -0
- package/lib/cjs/browser/useWindowFocusDetection.js +17 -0
- package/lib/cjs/browser/useWindowFocusDetection.js.map +1 -0
- package/lib/cjs/effects/index.d.ts +3 -0
- package/lib/cjs/effects/index.js +10 -0
- package/lib/cjs/effects/index.js.map +1 -0
- package/lib/cjs/effects/useDebouncedEffect.d.ts +2 -0
- package/lib/cjs/effects/useDebouncedEffect.js +13 -0
- package/lib/cjs/effects/useDebouncedEffect.js.map +1 -0
- package/lib/cjs/effects/useEffectOnUpdate.d.ts +2 -0
- package/lib/cjs/effects/useEffectOnUpdate.js +16 -0
- package/lib/cjs/effects/useEffectOnUpdate.js.map +1 -0
- package/lib/cjs/effects/useRefresh.d.ts +3 -0
- package/lib/cjs/effects/useRefresh.js +11 -0
- package/lib/cjs/effects/useRefresh.js.map +1 -0
- package/lib/cjs/hooks/index.d.ts +1 -0
- package/lib/cjs/hooks/index.js +6 -0
- package/lib/cjs/hooks/index.js.map +1 -0
- package/lib/cjs/hooks/useToggle.d.ts +9 -0
- package/lib/cjs/hooks/useToggle.js +13 -0
- package/lib/cjs/hooks/useToggle.js.map +1 -0
- package/lib/cjs/index.d.ts +7 -0
- package/lib/cjs/index.js +11 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/storage/backends.d.ts +20 -0
- package/lib/cjs/storage/backends.js +32 -0
- package/lib/cjs/storage/backends.js.map +1 -0
- package/lib/cjs/storage/index.d.ts +18 -0
- package/lib/cjs/storage/index.js +37 -0
- package/lib/cjs/storage/index.js.map +1 -0
- package/lib/cjs/storage/services.d.ts +20 -0
- package/lib/cjs/storage/services.js +70 -0
- package/lib/cjs/storage/services.js.map +1 -0
- package/lib/cjs/time/datetime.d.ts +9 -0
- package/lib/cjs/time/datetime.js +19 -0
- package/lib/cjs/time/datetime.js.map +1 -0
- package/lib/cjs/time/index.d.ts +2 -0
- package/lib/cjs/time/index.js +8 -0
- package/lib/cjs/time/index.js.map +1 -0
- package/lib/cjs/time/useClock.d.ts +11 -0
- package/lib/cjs/time/useClock.js +23 -0
- package/lib/cjs/time/useClock.js.map +1 -0
- package/lib/cjs/timers/index.d.ts +2 -0
- package/lib/cjs/timers/index.js +9 -0
- package/lib/cjs/timers/index.js.map +1 -0
- package/lib/cjs/timers/useDebounce.d.ts +1 -0
- package/lib/cjs/timers/useDebounce.js +16 -0
- package/lib/cjs/timers/useDebounce.js.map +1 -0
- package/lib/cjs/timers/useTimer.d.ts +13 -0
- package/lib/cjs/timers/useTimer.js +44 -0
- package/lib/cjs/timers/useTimer.js.map +1 -0
- package/lib/cjs/ts/index.d.ts +1 -0
- package/lib/cjs/ts/index.js +6 -0
- package/lib/cjs/ts/index.js.map +1 -0
- package/lib/cjs/ts/unreachable.d.ts +1 -0
- package/lib/cjs/ts/unreachable.js +7 -0
- package/lib/cjs/ts/unreachable.js.map +1 -0
- package/lib/esm/browser/index.d.ts +1 -0
- package/lib/esm/browser/index.js +2 -0
- package/lib/esm/browser/index.js.map +1 -0
- package/lib/esm/browser/useWindowFocusDetection.d.ts +1 -0
- package/lib/esm/browser/useWindowFocusDetection.js +13 -0
- package/lib/esm/browser/useWindowFocusDetection.js.map +1 -0
- package/lib/esm/effects/index.d.ts +3 -0
- package/lib/esm/effects/index.js +4 -0
- package/lib/esm/effects/index.js.map +1 -0
- package/lib/esm/effects/useDebouncedEffect.d.ts +2 -0
- package/lib/esm/effects/useDebouncedEffect.js +9 -0
- package/lib/esm/effects/useDebouncedEffect.js.map +1 -0
- package/lib/esm/effects/useEffectOnUpdate.d.ts +2 -0
- package/lib/esm/effects/useEffectOnUpdate.js +12 -0
- package/lib/esm/effects/useEffectOnUpdate.js.map +1 -0
- package/lib/esm/effects/useRefresh.d.ts +3 -0
- package/lib/esm/effects/useRefresh.js +7 -0
- package/lib/esm/effects/useRefresh.js.map +1 -0
- package/lib/esm/hooks/index.d.ts +1 -0
- package/lib/esm/hooks/index.js +2 -0
- package/lib/esm/hooks/index.js.map +1 -0
- package/lib/esm/hooks/useToggle.d.ts +9 -0
- package/lib/esm/hooks/useToggle.js +9 -0
- package/lib/esm/hooks/useToggle.js.map +1 -0
- package/lib/esm/index.d.ts +7 -0
- package/lib/esm/index.js +8 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/storage/backends.d.ts +20 -0
- package/lib/esm/storage/backends.js +27 -0
- package/lib/esm/storage/backends.js.map +1 -0
- package/lib/esm/storage/index.d.ts +18 -0
- package/lib/esm/storage/index.js +30 -0
- package/lib/esm/storage/index.js.map +1 -0
- package/lib/esm/storage/services.d.ts +20 -0
- package/lib/esm/storage/services.js +64 -0
- package/lib/esm/storage/services.js.map +1 -0
- package/lib/esm/time/datetime.d.ts +9 -0
- package/lib/esm/time/datetime.js +16 -0
- package/lib/esm/time/datetime.js.map +1 -0
- package/lib/esm/time/index.d.ts +2 -0
- package/lib/esm/time/index.js +3 -0
- package/lib/esm/time/index.js.map +1 -0
- package/lib/esm/time/useClock.d.ts +11 -0
- package/lib/esm/time/useClock.js +18 -0
- package/lib/esm/time/useClock.js.map +1 -0
- package/lib/esm/timers/index.d.ts +2 -0
- package/lib/esm/timers/index.js +3 -0
- package/lib/esm/timers/index.js.map +1 -0
- package/lib/esm/timers/useDebounce.d.ts +1 -0
- package/lib/esm/timers/useDebounce.js +12 -0
- package/lib/esm/timers/useDebounce.js.map +1 -0
- package/lib/esm/timers/useTimer.d.ts +13 -0
- package/lib/esm/timers/useTimer.js +38 -0
- package/lib/esm/timers/useTimer.js.map +1 -0
- package/lib/esm/ts/index.d.ts +1 -0
- package/lib/esm/ts/index.js +2 -0
- package/lib/esm/ts/index.js.map +1 -0
- package/lib/esm/ts/unreachable.d.ts +1 -0
- package/lib/esm/ts/unreachable.js +4 -0
- package/lib/esm/ts/unreachable.js.map +1 -0
- package/lib/esnext/browser/index.d.ts +1 -0
- package/lib/esnext/browser/index.js +2 -0
- package/lib/esnext/browser/index.js.map +1 -0
- package/lib/esnext/browser/useWindowFocusDetection.d.ts +1 -0
- package/lib/esnext/browser/useWindowFocusDetection.js +13 -0
- package/lib/esnext/browser/useWindowFocusDetection.js.map +1 -0
- package/lib/esnext/effects/index.d.ts +3 -0
- package/lib/esnext/effects/index.js +4 -0
- package/lib/esnext/effects/index.js.map +1 -0
- package/lib/esnext/effects/useDebouncedEffect.d.ts +2 -0
- package/lib/esnext/effects/useDebouncedEffect.js +9 -0
- package/lib/esnext/effects/useDebouncedEffect.js.map +1 -0
- package/lib/esnext/effects/useEffectOnUpdate.d.ts +2 -0
- package/lib/esnext/effects/useEffectOnUpdate.js +12 -0
- package/lib/esnext/effects/useEffectOnUpdate.js.map +1 -0
- package/lib/esnext/effects/useRefresh.d.ts +3 -0
- package/lib/esnext/effects/useRefresh.js +7 -0
- package/lib/esnext/effects/useRefresh.js.map +1 -0
- package/lib/esnext/hooks/index.d.ts +1 -0
- package/lib/esnext/hooks/index.js +2 -0
- package/lib/esnext/hooks/index.js.map +1 -0
- package/lib/esnext/hooks/useToggle.d.ts +9 -0
- package/lib/esnext/hooks/useToggle.js +9 -0
- package/lib/esnext/hooks/useToggle.js.map +1 -0
- package/lib/esnext/index.d.ts +7 -0
- package/lib/esnext/index.js +8 -0
- package/lib/esnext/index.js.map +1 -0
- package/lib/esnext/storage/backends.d.ts +20 -0
- package/lib/esnext/storage/backends.js +22 -0
- package/lib/esnext/storage/backends.js.map +1 -0
- package/lib/esnext/storage/index.d.ts +18 -0
- package/lib/esnext/storage/index.js +30 -0
- package/lib/esnext/storage/index.js.map +1 -0
- package/lib/esnext/storage/services.d.ts +20 -0
- package/lib/esnext/storage/services.js +68 -0
- package/lib/esnext/storage/services.js.map +1 -0
- package/lib/esnext/time/datetime.d.ts +9 -0
- package/lib/esnext/time/datetime.js +16 -0
- package/lib/esnext/time/datetime.js.map +1 -0
- package/lib/esnext/time/index.d.ts +2 -0
- package/lib/esnext/time/index.js +3 -0
- package/lib/esnext/time/index.js.map +1 -0
- package/lib/esnext/time/useClock.d.ts +11 -0
- package/lib/esnext/time/useClock.js +18 -0
- package/lib/esnext/time/useClock.js.map +1 -0
- package/lib/esnext/timers/index.d.ts +2 -0
- package/lib/esnext/timers/index.js +3 -0
- package/lib/esnext/timers/index.js.map +1 -0
- package/lib/esnext/timers/useDebounce.d.ts +1 -0
- package/lib/esnext/timers/useDebounce.js +12 -0
- package/lib/esnext/timers/useDebounce.js.map +1 -0
- package/lib/esnext/timers/useTimer.d.ts +13 -0
- package/lib/esnext/timers/useTimer.js +38 -0
- package/lib/esnext/timers/useTimer.js.map +1 -0
- package/lib/esnext/ts/index.d.ts +1 -0
- package/lib/esnext/ts/index.js +2 -0
- package/lib/esnext/ts/index.js.map +1 -0
- package/lib/esnext/ts/unreachable.d.ts +1 -0
- package/lib/esnext/ts/unreachable.js +4 -0
- package/lib/esnext/ts/unreachable.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/web/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useWindowFocusDetection(): boolean;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export function useWindowFocusDetection() {
|
|
3
|
+
const [isVisible, setVisible] = React.useState(!document.hidden);
|
|
4
|
+
const visibilityChangeHandler = React.useCallback(() => {
|
|
5
|
+
setVisible(!document.hidden);
|
|
6
|
+
}, []);
|
|
7
|
+
React.useEffect(() => {
|
|
8
|
+
document.addEventListener('visibilitychange', visibilityChangeHandler);
|
|
9
|
+
return () => document.removeEventListener('visibilitychange', visibilityChangeHandler);
|
|
10
|
+
}, [visibilityChangeHandler]);
|
|
11
|
+
return isVisible;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=useWindowFocusDetection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWindowFocusDetection.js","sourceRoot":"","sources":["../../../src/main/web/browser/useWindowFocusDetection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,uBAAuB;IACnC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEjE,MAAM,uBAAuB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACnD,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;QACvE,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;IAC3F,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAE9B,OAAO,SAAS,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/web/effects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useTimeout } from '../timers';
|
|
3
|
+
export function useDebouncedEffect(timeoutMs, effect, dependencyList) {
|
|
4
|
+
const deps = dependencyList || [];
|
|
5
|
+
const timeout = useTimeout(timeoutMs);
|
|
6
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
7
|
+
React.useEffect(() => timeout(effect), deps);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=useDebouncedEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedEffect.js","sourceRoot":"","sources":["../../../src/main/web/effects/useDebouncedEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,UAAU,kBAAkB,CAC9B,SAAiB,EACjB,MAA4B,EAC5B,cAAqC;IAErC,MAAM,IAAI,GAAG,cAAc,IAAI,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,uDAAuD;IACvD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export function useEffectOnUpdate(effect, deps) {
|
|
3
|
+
const hasMounted = React.useRef(false);
|
|
4
|
+
React.useEffect(() => {
|
|
5
|
+
if (hasMounted.current) {
|
|
6
|
+
return effect();
|
|
7
|
+
}
|
|
8
|
+
hasMounted.current = true;
|
|
9
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
10
|
+
}, deps);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=useEffectOnUpdate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEffectOnUpdate.js","sourceRoot":"","sources":["../../../src/main/web/effects/useEffectOnUpdate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,iBAAiB,CAAC,MAA4B,EAAE,IAA2B;IACvF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,MAAM,EAAE,CAAC;QACpB,CAAC;QAED,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAE1B,uDAAuD;IAC3D,CAAC,EAAE,IAAI,CAAC,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export function useRefresh() {
|
|
3
|
+
const [token, setToken] = React.useState(0);
|
|
4
|
+
const refresh = React.useCallback(() => setToken((x) => x + 1), []);
|
|
5
|
+
return React.useMemo(() => [token, refresh], [token, refresh]);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=useRefresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRefresh.js","sourceRoot":"","sources":["../../../src/main/web/effects/useRefresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,UAAU,UAAU;IACtB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpE,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useToggle, type ToggleApi } from './useToggle';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/web/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface ToggleApi {
|
|
3
|
+
isEnabled: boolean;
|
|
4
|
+
onEnable(): void;
|
|
5
|
+
onDisable(): void;
|
|
6
|
+
onToggle(): void;
|
|
7
|
+
setEnabled: React.Dispatch<React.SetStateAction<boolean>>;
|
|
8
|
+
}
|
|
9
|
+
export declare function useToggle(initialOpen?: boolean): ToggleApi;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export function useToggle(initialOpen = false) {
|
|
3
|
+
const [isEnabled, setEnabled] = React.useState(initialOpen);
|
|
4
|
+
const onEnable = React.useCallback(() => setEnabled(true), []);
|
|
5
|
+
const onDisable = React.useCallback(() => setEnabled(false), []);
|
|
6
|
+
const onToggle = React.useCallback(() => setEnabled((isEnabled) => !isEnabled), []);
|
|
7
|
+
return React.useMemo(() => ({ isEnabled, onEnable, onDisable, onToggle, setEnabled }), [isEnabled, onEnable, onDisable, onToggle]);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=useToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToggle.js","sourceRoot":"","sources":["../../../src/main/web/hooks/useToggle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,MAAM,UAAU,SAAS,CAAC,WAAW,GAAG,KAAK;IACzC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IAEpF,OAAO,KAAK,CAAC,OAAO,CAChB,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAChE,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAC7C,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/main/web/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface StorageBackend {
|
|
2
|
+
get(): string | null;
|
|
3
|
+
set(value: string): void;
|
|
4
|
+
delete(): void;
|
|
5
|
+
}
|
|
6
|
+
declare abstract class GenericStorageBackend implements StorageBackend {
|
|
7
|
+
private key;
|
|
8
|
+
protected abstract storage: Storage;
|
|
9
|
+
constructor(key: string);
|
|
10
|
+
get(): string | null;
|
|
11
|
+
set(value: string): void;
|
|
12
|
+
delete(): void;
|
|
13
|
+
}
|
|
14
|
+
export declare class LocalStorageBackend extends GenericStorageBackend {
|
|
15
|
+
protected storage: Storage;
|
|
16
|
+
}
|
|
17
|
+
export declare class SessionStorageBackend extends GenericStorageBackend {
|
|
18
|
+
protected storage: Storage;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class GenericStorageBackend {
|
|
2
|
+
key;
|
|
3
|
+
constructor(key) {
|
|
4
|
+
this.key = key;
|
|
5
|
+
}
|
|
6
|
+
get() {
|
|
7
|
+
return this.storage.getItem(this.key);
|
|
8
|
+
}
|
|
9
|
+
set(value) {
|
|
10
|
+
this.storage.setItem(this.key, value);
|
|
11
|
+
}
|
|
12
|
+
delete() {
|
|
13
|
+
this.storage.removeItem(this.key);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class LocalStorageBackend extends GenericStorageBackend {
|
|
17
|
+
storage = localStorage;
|
|
18
|
+
}
|
|
19
|
+
export class SessionStorageBackend extends GenericStorageBackend {
|
|
20
|
+
storage = sessionStorage;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=backends.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backends.js","sourceRoot":"","sources":["../../../src/main/web/storage/backends.ts"],"names":[],"mappings":"AAMA,MAAe,qBAAqB;IAGZ;IAApB,YAAoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAEnC,GAAG;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,KAAa;QACb,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM;QACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;CACJ;AAED,MAAM,OAAO,mBAAoB,SAAQ,qBAAqB;IAChD,OAAO,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,OAAO,qBAAsB,SAAQ,qBAAqB;IAClD,OAAO,GAAG,cAAc,CAAC;CACtC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { StorageService } from './services';
|
|
3
|
+
export { StorageService };
|
|
4
|
+
export type { StorageBackend } from './backends';
|
|
5
|
+
export interface StoredValue<T> {
|
|
6
|
+
value: T;
|
|
7
|
+
set(value: T): void;
|
|
8
|
+
update: React.Dispatch<React.SetStateAction<T>>;
|
|
9
|
+
delete(): void;
|
|
10
|
+
}
|
|
11
|
+
export interface StoredValueConfig<T> {
|
|
12
|
+
defaultValue: T;
|
|
13
|
+
serialize: (value: T) => string | null;
|
|
14
|
+
deserialize: (value: string) => T;
|
|
15
|
+
}
|
|
16
|
+
export declare function useLocalStorage<T>(name: string, config: StoredValueConfig<T>): StoredValue<T>;
|
|
17
|
+
export declare function useSessionStorage<T>(name: string, config: StoredValueConfig<T>): StoredValue<T>;
|
|
18
|
+
export declare function useStoredValue<T>(service: StorageService<T>): StoredValue<T>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { StorageService, fromLocalStorage, fromSessionStorage } from './services';
|
|
3
|
+
export { StorageService };
|
|
4
|
+
export function useLocalStorage(name, config) {
|
|
5
|
+
const service = React.useMemo(() => fromLocalStorage(name, config.defaultValue, config.serialize, config.deserialize), [name, config.defaultValue, config.serialize, config.deserialize]);
|
|
6
|
+
return useStoredValue(service);
|
|
7
|
+
}
|
|
8
|
+
export function useSessionStorage(name, config) {
|
|
9
|
+
const service = React.useMemo(() => fromSessionStorage(name, config.defaultValue, config.serialize, config.deserialize), [name, config.defaultValue, config.serialize, config.deserialize]);
|
|
10
|
+
return useStoredValue(service);
|
|
11
|
+
}
|
|
12
|
+
export function useStoredValue(service) {
|
|
13
|
+
const [value, setValue] = React.useState(service.get());
|
|
14
|
+
React.useEffect(() => service.addChangeListener(setValue), [service]);
|
|
15
|
+
const set = React.useCallback((value) => {
|
|
16
|
+
service.set(value);
|
|
17
|
+
}, [service]);
|
|
18
|
+
const updateValue = React.useCallback((updater) => {
|
|
19
|
+
return typeof updater === 'function'
|
|
20
|
+
? service.update(updater)
|
|
21
|
+
: service.set(updater);
|
|
22
|
+
}, [service]);
|
|
23
|
+
const deleteValue = React.useCallback(() => {
|
|
24
|
+
service.delete();
|
|
25
|
+
}, [service]);
|
|
26
|
+
return React.useMemo(() => {
|
|
27
|
+
return { value, set, update: updateValue, delete: deleteValue };
|
|
28
|
+
}, [value, set, deleteValue, updateValue]);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/web/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,CAAC;AAgB1B,MAAM,UAAU,eAAe,CAAI,IAAY,EAAE,MAA4B;IACzE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CACzB,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,EACvF,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CACpE,CAAC;IAEF,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,IAAY,EAAE,MAA4B;IAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CACzB,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,EACzF,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,CACpE,CAAC;IAEF,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,OAA0B;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE3D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtE,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CACzB,CAAC,KAAQ,EAAE,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,EACD,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CACjC,CAAC,OAAgC,EAAE,EAAE;QACjC,OAAO,OAAO,OAAO,KAAK,UAAU;YAChC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAA0B,CAAC;YAC5C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,EACD,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACvC,OAAO,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACtB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACpE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type StorageBackend } from './backends';
|
|
2
|
+
type ChangeListener<T> = (value: T) => unknown;
|
|
3
|
+
type Unsubscribe = () => void;
|
|
4
|
+
export declare class StorageService<T> {
|
|
5
|
+
private storage;
|
|
6
|
+
private defaultValue;
|
|
7
|
+
private serialize;
|
|
8
|
+
private deserialize;
|
|
9
|
+
private changeListeners;
|
|
10
|
+
constructor(storage: StorageBackend, defaultValue: T, serialize: (value: T) => string | null, deserialize: (value: string) => T);
|
|
11
|
+
get(): T;
|
|
12
|
+
set(value: T): void;
|
|
13
|
+
update(updater: (value: T) => T): void;
|
|
14
|
+
delete(): void;
|
|
15
|
+
addChangeListener(listener: ChangeListener<T>): Unsubscribe;
|
|
16
|
+
private emitChange;
|
|
17
|
+
}
|
|
18
|
+
export declare function fromLocalStorage<T>(key: string, defaultValue: T, serialize: (value: T) => string | null, deserialize: (value: string) => T): StorageService<T>;
|
|
19
|
+
export declare function fromSessionStorage<T>(key: string, defaultValue: T, serialize: (value: T) => string | null, deserialize: (value: string) => T): StorageService<T>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { LocalStorageBackend, SessionStorageBackend } from './backends';
|
|
2
|
+
export class StorageService {
|
|
3
|
+
storage;
|
|
4
|
+
defaultValue;
|
|
5
|
+
serialize;
|
|
6
|
+
deserialize;
|
|
7
|
+
changeListeners = [];
|
|
8
|
+
constructor(storage, defaultValue, serialize, deserialize) {
|
|
9
|
+
this.storage = storage;
|
|
10
|
+
this.defaultValue = defaultValue;
|
|
11
|
+
this.serialize = serialize;
|
|
12
|
+
this.deserialize = deserialize;
|
|
13
|
+
}
|
|
14
|
+
get() {
|
|
15
|
+
const value = this.storage.get();
|
|
16
|
+
if (value == null) {
|
|
17
|
+
return this.defaultValue;
|
|
18
|
+
}
|
|
19
|
+
return this.deserialize(value);
|
|
20
|
+
}
|
|
21
|
+
set(value) {
|
|
22
|
+
const serialized = this.serialize(value);
|
|
23
|
+
if (serialized != null) {
|
|
24
|
+
this.storage.set(serialized);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.delete();
|
|
28
|
+
}
|
|
29
|
+
this.emitChange();
|
|
30
|
+
}
|
|
31
|
+
update(updater) {
|
|
32
|
+
const value = updater(this.get());
|
|
33
|
+
this.set(value);
|
|
34
|
+
this.emitChange();
|
|
35
|
+
}
|
|
36
|
+
delete() {
|
|
37
|
+
this.storage.delete();
|
|
38
|
+
this.emitChange();
|
|
39
|
+
}
|
|
40
|
+
addChangeListener(listener) {
|
|
41
|
+
const unsubscribe = () => {
|
|
42
|
+
const index = this.changeListeners.indexOf(listener);
|
|
43
|
+
if (index !== -1) {
|
|
44
|
+
this.changeListeners.splice(index, 1);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
if (this.changeListeners.indexOf(listener) === -1) {
|
|
48
|
+
this.changeListeners.push(listener);
|
|
49
|
+
listener(this.get());
|
|
50
|
+
}
|
|
51
|
+
return unsubscribe;
|
|
52
|
+
}
|
|
53
|
+
emitChange() {
|
|
54
|
+
const value = this.get();
|
|
55
|
+
this.changeListeners.forEach((listener) => {
|
|
56
|
+
listener(value);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function fromLocalStorage(key, defaultValue, serialize, deserialize) {
|
|
61
|
+
const storageBackend = new LocalStorageBackend(key);
|
|
62
|
+
return new StorageService(storageBackend, defaultValue, serialize, deserialize);
|
|
63
|
+
}
|
|
64
|
+
export function fromSessionStorage(key, defaultValue, serialize, deserialize) {
|
|
65
|
+
const storageBackend = new SessionStorageBackend(key);
|
|
66
|
+
return new StorageService(storageBackend, defaultValue, serialize, deserialize);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/main/web/storage/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
type Opaque<K, T> = T & {
|
|
3
|
+
__TYPE__: K;
|
|
4
|
+
};
|
|
5
|
+
export type ISODate = Opaque<'ISODate', string>;
|
|
6
|
+
export type DateFormat = 'DATETIME_FULL' | 'DATETIME_FULL_WITH_SECONDS' | 'DATETIME_HUGE' | 'DATETIME_HUGE_WITH_SECONDS' | 'DATETIME_MED' | 'DATETIME_MED_WITH_SECONDS' | 'DATETIME_SHORT' | 'DATETIME_SHORT_WITH_SECONDS' | 'DATE_FULL' | 'DATE_HUGE' | 'DATE_MED' | 'DATE_SHORT' | 'TIME_24_SIMPLE' | 'TIME_24_WITH_LONG_OFFSET' | 'TIME_24_WITH_SECONDS' | 'TIME_24_WITH_SHORT_OFFSET' | 'TIME_SIMPLE' | 'TIME_WITH_LONG_OFFSET' | 'TIME_WITH_SECONDS' | 'TIME_WITH_SHORT_OFFSET';
|
|
7
|
+
export type GenericDateTime = string | Date | DateTime | ISODate;
|
|
8
|
+
export declare function toDateTime(value: GenericDateTime): DateTime;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
export function toDateTime(value) {
|
|
3
|
+
if (value instanceof DateTime) {
|
|
4
|
+
return value.toUTC();
|
|
5
|
+
}
|
|
6
|
+
if (value instanceof Date) {
|
|
7
|
+
return DateTime.fromISO(value.toISOString());
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
return DateTime.fromISO(new Date(value).toISOString());
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
return DateTime.invalid(e instanceof Error ? e.message : '');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=datetime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datetime.js","sourceRoot":"","sources":["../../../src/main/web/time/datetime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AA8BjC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC7C,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/web/time/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAC;AAClD,OAAO,EAAuD,UAAU,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
export interface Clock {
|
|
3
|
+
readonly now: DateTime<true>;
|
|
4
|
+
/**
|
|
5
|
+
* Updates the current time in the given interval.
|
|
6
|
+
* @param intervalMs Interval for clock update in milliseconds. Defaults to 1000ms.
|
|
7
|
+
*/
|
|
8
|
+
tick(intervalMs?: number): () => void;
|
|
9
|
+
update(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const useClock: (tickIntervalMs?: number, locale?: string) => Clock;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DateTime } from 'luxon';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export const useClock = function useClock(tickIntervalMs, locale) {
|
|
4
|
+
const getCurrentTime = React.useCallback(() => (locale != null ? DateTime.utc().setLocale(locale) : DateTime.utc()), [locale]);
|
|
5
|
+
const [now, setNow] = React.useState(getCurrentTime);
|
|
6
|
+
const update = React.useCallback(() => setNow(getCurrentTime()), [getCurrentTime]);
|
|
7
|
+
const tick = React.useCallback((intervalMs = 1000) => {
|
|
8
|
+
const interval = setInterval(update, intervalMs);
|
|
9
|
+
return () => clearInterval(interval);
|
|
10
|
+
}, [update]);
|
|
11
|
+
React.useEffect(() => {
|
|
12
|
+
if (tickIntervalMs != null && tickIntervalMs > 0) {
|
|
13
|
+
return tick(tickIntervalMs);
|
|
14
|
+
}
|
|
15
|
+
}, [tick, tickIntervalMs]);
|
|
16
|
+
return React.useMemo(() => ({ now, tick, update }), [now, tick, update]);
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=useClock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClock.js","sourceRoot":"","sources":["../../../src/main/web/time/useClock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,QAAQ,CAAC,cAAuB,EAAE,MAAe;IAC9E,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CACpC,GAAG,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAC1E,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAEnF,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAC1B,CAAC,UAAU,GAAG,IAAI,EAAE,EAAE;QAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,EACD,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAE3B,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/web/timers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useDebounce<T>(value: T, delay: number): T;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
export function useDebounce(value, delay) {
|
|
3
|
+
const [debouncedValue, setDebouncedValue] = react.useState(value);
|
|
4
|
+
react.useEffect(() => {
|
|
5
|
+
const handler = setTimeout(() => {
|
|
6
|
+
setDebouncedValue(value);
|
|
7
|
+
}, delay);
|
|
8
|
+
return () => clearTimeout(handler);
|
|
9
|
+
}, [value, delay]);
|
|
10
|
+
return debouncedValue;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=useDebounce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebounce.js","sourceRoot":"","sources":["../../../src/main/web/timers/useDebounce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,WAAW,CAAI,KAAQ,EAAE,KAAa;IAClD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnB,OAAO,cAAc,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type MaybeCleanup = (() => void) | void;
|
|
2
|
+
interface CallbackWithCleanup {
|
|
3
|
+
(): MaybeCleanup;
|
|
4
|
+
}
|
|
5
|
+
interface TimeoutCallback {
|
|
6
|
+
(timeoutHandler: CallbackWithCleanup, timeoutDurationMs?: number): () => void;
|
|
7
|
+
cancel(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function useTimer(defaultTimeoutDurationMs?: number, timerFunction?: TimerFunction): TimeoutCallback;
|
|
10
|
+
type TimerFunction = typeof setTimeout | typeof setInterval;
|
|
11
|
+
export declare function useTimeout(defaultTimeoutDurationMs?: number): TimeoutCallback;
|
|
12
|
+
export declare function useInterval(defaultTimeoutDurationMs?: number): TimeoutCallback;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export function useTimer(defaultTimeoutDurationMs = 0, timerFunction = setTimeout) {
|
|
3
|
+
const timeoutId = React.useRef(undefined);
|
|
4
|
+
const callbackCleanup = React.useRef(undefined);
|
|
5
|
+
const clear = React.useCallback(() => {
|
|
6
|
+
if (timeoutId.current != null) {
|
|
7
|
+
if (timerFunction === setTimeout) {
|
|
8
|
+
clearTimeout(timeoutId.current);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
clearInterval(timeoutId.current);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
if (typeof callbackCleanup.current === 'function') {
|
|
15
|
+
callbackCleanup.current();
|
|
16
|
+
callbackCleanup.current = undefined;
|
|
17
|
+
}
|
|
18
|
+
}, [timerFunction]);
|
|
19
|
+
React.useEffect(() => clear, [clear]);
|
|
20
|
+
return React.useMemo(() => {
|
|
21
|
+
const runTimeout = (timeoutHandler, timeoutDurationMs = defaultTimeoutDurationMs) => {
|
|
22
|
+
clear();
|
|
23
|
+
timeoutId.current = timerFunction(() => {
|
|
24
|
+
callbackCleanup.current = timeoutHandler();
|
|
25
|
+
}, timeoutDurationMs);
|
|
26
|
+
return clear;
|
|
27
|
+
};
|
|
28
|
+
runTimeout.cancel = clear;
|
|
29
|
+
return runTimeout;
|
|
30
|
+
}, [clear, timerFunction, defaultTimeoutDurationMs]);
|
|
31
|
+
}
|
|
32
|
+
export function useTimeout(defaultTimeoutDurationMs = 0) {
|
|
33
|
+
return useTimer(defaultTimeoutDurationMs, setTimeout);
|
|
34
|
+
}
|
|
35
|
+
export function useInterval(defaultTimeoutDurationMs = 0) {
|
|
36
|
+
return useTimer(defaultTimeoutDurationMs, setInterval);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=useTimer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTimer.js","sourceRoot":"","sources":["../../../src/main/web/timers/useTimer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,MAAM,UAAU,QAAQ,CACpB,wBAAwB,GAAG,CAAC,EAC5B,gBAA+B,UAAU;IAEzC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAgC,SAAS,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAe,SAAS,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACjC,IAAI,SAAS,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC5B,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;gBAC/B,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACJ,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,eAAe,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChD,eAAe,CAAC,OAAO,EAAE,CAAC;YAC1B,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;QACxC,CAAC;IACL,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACtB,MAAM,UAAU,GAAG,CACf,cAAmC,EACnC,iBAAiB,GAAG,wBAAwB,EAChC,EAAE;YACd,KAAK,EAAE,CAAC;YACR,SAAS,CAAC,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE;gBACnC,eAAe,CAAC,OAAO,GAAG,cAAc,EAAE,CAAC;YAC/C,CAAC,EAAE,iBAAiB,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC;QAEF,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC;QAE1B,OAAO,UAAU,CAAC;IACtB,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,wBAAwB,CAAC,CAAC,CAAC;AACzD,CAAC;AAID,MAAM,UAAU,UAAU,CAAC,wBAAwB,GAAG,CAAC;IACnD,OAAO,QAAQ,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,wBAAwB,GAAG,CAAC;IACpD,OAAO,QAAQ,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { unreachable } from './unreachable';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/main/web/ts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function unreachable(value: never): never;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unreachable.js","sourceRoot":"","sources":["../../../src/main/web/ts/unreachable.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,KAAY;IACpC,MAAM,IAAI,SAAS,CAAC,iCAAiC,KAAK,GAAG,CAAC,CAAC;AACnE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ekz/react-utils",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "React hooks and utilities",
|
|
6
6
|
"homepage": "https://docs.ekz.io/react-utils/",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"@testing-library/react": "^16.3.2",
|
|
30
30
|
"@types/bluebird": "^3.5.42",
|
|
31
31
|
"@types/jest": "^30.0.0",
|
|
32
|
-
"@types/luxon": "^3.7.
|
|
32
|
+
"@types/luxon": "^3.7.2",
|
|
33
33
|
"npm-run-all": "^4.1.5",
|
|
34
34
|
"react": "^19.2.7",
|
|
35
35
|
"react-dom": "^19.2.7",
|
|
@@ -48,6 +48,6 @@
|
|
|
48
48
|
"compile:cjs": "tsc -p ./src/main/web -m commonjs --verbatimModuleSyntax false --outDir ./lib/cjs",
|
|
49
49
|
"compile:esnext": "tsc -p ./src/main/web -t esnext --outDir ./lib/esnext",
|
|
50
50
|
"dev": "yarn compile:esm --watch",
|
|
51
|
-
"
|
|
51
|
+
"prepack": "yarn clean && yarn lint && yarn compile"
|
|
52
52
|
}
|
|
53
53
|
}
|