@codeleap/hooks 7.0.1 → 7.1.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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/useComponentTestId.js +2 -2
- package/dist/useComponentTestId.js.map +1 -1
- package/dist/useConditionalState.js +3 -3
- package/dist/useConditionalState.js.map +1 -1
- package/dist/useGuardedAsyncCallback.d.ts +31 -0
- package/dist/useGuardedAsyncCallback.d.ts.map +1 -0
- package/dist/useGuardedAsyncCallback.js +38 -0
- package/dist/useGuardedAsyncCallback.js.map +1 -0
- package/dist/useId.js +1 -2
- package/dist/useId.js.map +1 -1
- package/dist/usePlaces.js +18 -29
- package/dist/usePlaces.js.map +1 -1
- package/dist/usePlacesAutocompleteUtils.js +5 -5
- package/dist/usePlacesAutocompleteUtils.js.map +1 -1
- package/dist/usePromise.js +11 -22
- package/dist/usePromise.js.map +1 -1
- package/dist/useSearch/index.js +15 -26
- package/dist/useSearch/index.js.map +1 -1
- package/dist/useUncontrolled.js +1 -2
- package/dist/useUncontrolled.js.map +1 -1
- package/package.json +8 -8
- package/src/index.ts +1 -0
- package/src/useGuardedAsyncCallback.ts +43 -0
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export * from './useDebounceCallback';
|
|
|
24
24
|
export * from './useDerivedRef';
|
|
25
25
|
export * from './useDerivedState';
|
|
26
26
|
export * from './useFilteredList';
|
|
27
|
+
export * from './useGuardedAsyncCallback';
|
|
27
28
|
export * from './useLazyStore';
|
|
28
29
|
export * from './useStableReference';
|
|
29
30
|
export * from './useOptions';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACX,MAAM,OAAO,CAAA;AAEd,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,SAAS,CAAA;AACvB,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAE/B,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,GACX,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACX,MAAM,OAAO,CAAA;AAEd,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,SAAS,CAAA;AACvB,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAE/B,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,GACX,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,7 @@ export * from './useDebounceCallback';
|
|
|
24
24
|
export * from './useDerivedRef';
|
|
25
25
|
export * from './useDerivedState';
|
|
26
26
|
export * from './useFilteredList';
|
|
27
|
+
export * from './useGuardedAsyncCallback';
|
|
27
28
|
export * from './useLazyStore';
|
|
28
29
|
export * from './useStableReference';
|
|
29
30
|
export * from './useOptions';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,GACX,MAAM,OAAO,CAAA;AAEd,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,SAAS,CAAA;AACvB,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAE/B,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,GACX,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,GACX,MAAM,OAAO,CAAA;AAEd,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,SAAS,CAAA;AACvB,cAAc,uBAAuB,CAAA;AACrC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAE/B,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,GACX,CAAA"}
|
|
@@ -22,9 +22,9 @@ const normalizeDebugName = (debugName) => {
|
|
|
22
22
|
return debugName.trim().replace(/\s+/g, '-').toLowerCase();
|
|
23
23
|
};
|
|
24
24
|
const generateComponentTestId = (componentName, props, keys) => {
|
|
25
|
-
const hasDebugName = typeof
|
|
25
|
+
const hasDebugName = typeof props?.debugName === 'string';
|
|
26
26
|
if (hasDebugName)
|
|
27
|
-
return `${componentName}:${normalizeDebugName(props
|
|
27
|
+
return `${componentName}:${normalizeDebugName(props?.debugName)}`;
|
|
28
28
|
const extractedProps = normalizeProps(props, keys);
|
|
29
29
|
return `${componentName}:${simpleHash(JSON.stringify(extractedProps))}`;
|
|
30
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComponentTestId.js","sourceRoot":"","sources":["../src/useComponentTestId.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAU,EAAE;IACzC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC7C,IAAI,IAAI,CAAC,CAAA;IACX,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAsB,KAAQ,EAAE,IAAoB,EAAc,EAAE;IACzF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC9B,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAC/F,CAAA;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAgB,CAAC,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE;IAC/C,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;AAC5D,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAsB,aAAqB,EAAE,KAAQ,EAAE,IAAoB,EAAE,EAAE;IAC7G,MAAM,YAAY,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"useComponentTestId.js","sourceRoot":"","sources":["../src/useComponentTestId.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAExC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAU,EAAE;IACzC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC7C,IAAI,IAAI,CAAC,CAAA;IACX,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAsB,KAAQ,EAAE,IAAoB,EAAc,EAAE;IACzF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC9B,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAC/F,CAAA;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAgB,CAAC,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE;IAC/C,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;AAC5D,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAsB,aAAqB,EAAE,KAAQ,EAAE,IAAoB,EAAE,EAAE;IAC7G,MAAM,YAAY,GAAG,OAAO,KAAK,EAAE,SAAS,KAAK,QAAQ,CAAA;IACzD,IAAI,YAAY;QAAE,OAAO,GAAG,aAAa,IAAI,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAA;IACnF,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAClD,OAAO,GAAG,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,CAAA;AACzE,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,SAAc,EACd,KAAQ,EACR,IAAoB,EACpB,EAAE;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,uBAAuB,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAC3F,OAAO,SAAS,CAAC,OAAO,CAAA;AAC1B,CAAC,CAAA"}
|
|
@@ -12,9 +12,9 @@ import { useBooleanToggle } from './useBooleanToggle';
|
|
|
12
12
|
* const [value, setValue] = useConditionalState(undefined, undefined, { initialValue: 'default' })
|
|
13
13
|
*/
|
|
14
14
|
export const useConditionalState = (value, setter, options = {}) => {
|
|
15
|
-
const state =
|
|
16
|
-
? useBooleanToggle(options
|
|
17
|
-
: useState(options
|
|
15
|
+
const state = options?.isBooleanToggle
|
|
16
|
+
? useBooleanToggle(options?.initialValue)
|
|
17
|
+
: useState(options?.initialValue);
|
|
18
18
|
if (typeof value !== 'undefined' && typeof setter === 'function') {
|
|
19
19
|
return [value, setter];
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConditionalState.js","sourceRoot":"","sources":["../src/useConditionalState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA4B,MAAM,OAAO,CAAA;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AASrD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAoB,EACpB,MAAmB,EACnB,UAAyC,EAAE,EACzB,EAAE;IACpB,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"useConditionalState.js","sourceRoot":"","sources":["../src/useConditionalState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA4B,MAAM,OAAO,CAAA;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AASrD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAoB,EACpB,MAAmB,EACnB,UAAyC,EAAE,EACzB,EAAE;IACpB,MAAM,KAAK,GAAG,OAAO,EAAE,eAAe;QACpC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAuB,CAAC;QACpD,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAEnC,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACjE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,KAAoC,CAAA;AAC7C,CAAC,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type DependencyList } from "react";
|
|
2
|
+
export type GuardedResult<T> = {
|
|
3
|
+
dropped: true;
|
|
4
|
+
} | {
|
|
5
|
+
dropped: false;
|
|
6
|
+
result: T;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Returns a stable callback that silently drops invocations while a previous
|
|
10
|
+
* call is still in flight, preventing overlapping async executions.
|
|
11
|
+
*
|
|
12
|
+
* @typeParam T - The resolved return type of the async callback.
|
|
13
|
+
* @param cb - The async function to guard. Only one instance runs at a time.
|
|
14
|
+
* @param deps - Dependency list, same semantics as `useCallback`.
|
|
15
|
+
* @returns A callback that resolves to `{ dropped: true }` if a call was
|
|
16
|
+
* already in progress, or `{ dropped: false, result: T }` on completion.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const save = useGuardedAsyncCallback(async () => {
|
|
21
|
+
* return await api.saveForm(formData);
|
|
22
|
+
* }, [formData]);
|
|
23
|
+
*
|
|
24
|
+
* const handleClick = async () => {
|
|
25
|
+
* const res = await save();
|
|
26
|
+
* if (!res.dropped) showToast("Saved!");
|
|
27
|
+
* };
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function useGuardedAsyncCallback<T>(cb: () => Promise<T>, deps: DependencyList): () => Promise<GuardedResult<T>>;
|
|
31
|
+
//# sourceMappingURL=useGuardedAsyncCallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGuardedAsyncCallback.d.ts","sourceRoot":"","sources":["../src/useGuardedAsyncCallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjE,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC;AAEjF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,cAAc,GACnB,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAajC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useCallback, useRef } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Returns a stable callback that silently drops invocations while a previous
|
|
4
|
+
* call is still in flight, preventing overlapping async executions.
|
|
5
|
+
*
|
|
6
|
+
* @typeParam T - The resolved return type of the async callback.
|
|
7
|
+
* @param cb - The async function to guard. Only one instance runs at a time.
|
|
8
|
+
* @param deps - Dependency list, same semantics as `useCallback`.
|
|
9
|
+
* @returns A callback that resolves to `{ dropped: true }` if a call was
|
|
10
|
+
* already in progress, or `{ dropped: false, result: T }` on completion.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* const save = useGuardedAsyncCallback(async () => {
|
|
15
|
+
* return await api.saveForm(formData);
|
|
16
|
+
* }, [formData]);
|
|
17
|
+
*
|
|
18
|
+
* const handleClick = async () => {
|
|
19
|
+
* const res = await save();
|
|
20
|
+
* if (!res.dropped) showToast("Saved!");
|
|
21
|
+
* };
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export function useGuardedAsyncCallback(cb, deps) {
|
|
25
|
+
const running = useRef(false);
|
|
26
|
+
return useCallback(async () => {
|
|
27
|
+
if (running.current)
|
|
28
|
+
return { dropped: true };
|
|
29
|
+
running.current = true;
|
|
30
|
+
try {
|
|
31
|
+
return { dropped: false, result: await cb() };
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
running.current = false;
|
|
35
|
+
}
|
|
36
|
+
}, deps);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=useGuardedAsyncCallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGuardedAsyncCallback.js","sourceRoot":"","sources":["../src/useGuardedAsyncCallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAuB,MAAM,OAAO,CAAC;AAIjE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,uBAAuB,CACrC,EAAoB,EACpB,IAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,WAAW,CAAC,KAAK,IAAI,EAAE;QAC5B,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE9C,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAChD,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC"}
|
package/dist/useId.js
CHANGED
|
@@ -7,9 +7,8 @@ import { useRef, useId as _useId } from 'react';
|
|
|
7
7
|
* const id = useId() // Returns generated ID like ':r1:'
|
|
8
8
|
*/
|
|
9
9
|
export function useId(id) {
|
|
10
|
-
var _a;
|
|
11
10
|
const defaultId = _useId();
|
|
12
11
|
const idRef = useRef(id);
|
|
13
|
-
return
|
|
12
|
+
return idRef.current ?? defaultId;
|
|
14
13
|
}
|
|
15
14
|
//# sourceMappingURL=useId.js.map
|
package/dist/useId.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useId.js","sourceRoot":"","sources":["../src/useId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,OAAO,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAI,EAAM
|
|
1
|
+
{"version":3,"file":"useId.js","sourceRoot":"","sources":["../src/useId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,OAAO,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAI,EAAM;IAC7B,MAAM,SAAS,GAAG,MAAM,EAAE,CAAA;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IAExB,OAAO,KAAK,CAAC,OAAO,IAAI,SAAS,CAAA;AACnC,CAAC"}
|
package/dist/usePlaces.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import axios from 'axios';
|
|
11
2
|
import { useQuery } from '@tanstack/react-query';
|
|
12
3
|
const BASE_URL = 'https://maps.googleapis.com/maps/api/place/autocomplete/json';
|
|
@@ -16,42 +7,40 @@ const latLngRegex = /^-?\d+(\.\d+)?,-?\d+(\.\d+)?$/;
|
|
|
16
7
|
/**
|
|
17
8
|
* Retrieves detailed information for a specific Google Place.
|
|
18
9
|
*/
|
|
19
|
-
export const retrievePlaceDetails = (placeId, apiKey) =>
|
|
20
|
-
|
|
21
|
-
const response = yield axios.get(BASE_URL_DETAILS, {
|
|
10
|
+
export const retrievePlaceDetails = async (placeId, apiKey) => {
|
|
11
|
+
const response = await axios.get(BASE_URL_DETAILS, {
|
|
22
12
|
params: {
|
|
23
13
|
place_id: placeId,
|
|
24
14
|
key: apiKey,
|
|
25
15
|
},
|
|
26
16
|
});
|
|
27
|
-
return
|
|
28
|
-
}
|
|
17
|
+
return response?.data?.result;
|
|
18
|
+
};
|
|
29
19
|
/**
|
|
30
20
|
* Retrieves places from Google Places API or Geocoding API.
|
|
31
21
|
* Supports both text search and lat/lng coordinates.
|
|
32
22
|
*/
|
|
33
|
-
export const retrievePlaces = (params) =>
|
|
34
|
-
var _a, _b, _c, _d, _e;
|
|
23
|
+
export const retrievePlaces = async (params) => {
|
|
35
24
|
let response;
|
|
36
|
-
const inputWithoutSpaces =
|
|
37
|
-
const isLatLng = latLngRegex
|
|
25
|
+
const inputWithoutSpaces = params?.input?.replace(/\s/g, '') ?? '';
|
|
26
|
+
const isLatLng = latLngRegex?.test(inputWithoutSpaces);
|
|
38
27
|
if (isLatLng) {
|
|
39
|
-
response =
|
|
28
|
+
response = await axios?.get(BASE_URL_GEOCODING, { params: { latlng: params?.input, key: params?.key } });
|
|
40
29
|
}
|
|
41
30
|
else {
|
|
42
|
-
response =
|
|
31
|
+
response = await axios?.get(BASE_URL, { params });
|
|
43
32
|
}
|
|
44
|
-
let places =
|
|
45
|
-
if (params
|
|
46
|
-
const apiKey =
|
|
47
|
-
places =
|
|
48
|
-
const placeId = place
|
|
49
|
-
const details =
|
|
50
|
-
return
|
|
51
|
-
}))
|
|
33
|
+
let places = response?.data?.results || response?.data?.predictions;
|
|
34
|
+
if (params?.showDetails) {
|
|
35
|
+
const apiKey = params?.key ?? '';
|
|
36
|
+
places = await Promise.all(places?.map(async (place) => {
|
|
37
|
+
const placeId = place?.place_id;
|
|
38
|
+
const details = await retrievePlaceDetails(placeId, apiKey);
|
|
39
|
+
return { ...place, details };
|
|
40
|
+
}));
|
|
52
41
|
}
|
|
53
42
|
return places;
|
|
54
|
-
}
|
|
43
|
+
};
|
|
55
44
|
/**
|
|
56
45
|
* Hook that fetches Google Places using React Query.
|
|
57
46
|
* Automatically handles caching and refetching.
|
package/dist/usePlaces.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePlaces.js","sourceRoot":"","sources":["../src/usePlaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePlaces.js","sourceRoot":"","sources":["../src/usePlaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,MAAM,QAAQ,GAAG,8DAA8D,CAAA;AAC/E,MAAM,gBAAgB,GAAG,yDAAyD,CAAA;AAClF,MAAM,kBAAkB,GAAG,mDAAmD,CAAA;AAE9E,MAAM,WAAW,GAAG,+BAA+B,CAAA;AAQnD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAe,EAAE,MAAc,EAAE,EAAE;IAC5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE;QACjD,MAAM,EAAE;YACN,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,MAAM;SACZ;KACF,CAAC,CAAA;IAEF,OAAO,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAA;AAC/B,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IACrD,IAAI,QAAQ,CAAA;IACZ,MAAM,kBAAkB,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;IAClE,MAAM,QAAQ,GAAG,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAEtD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAC1G,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,IAAI,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAA;IAEnE,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,CAAA;QAChC,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CACxB,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,KAAU,EAAE,EAAE;YAC/B,MAAM,OAAO,GAAG,KAAK,EAAE,QAAQ,CAAA;YAC/B,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC3D,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAA;QAC9B,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAID;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,EAAE;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;KACtC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
|
@@ -24,7 +24,7 @@ export const usePlacesAutocompleteUtils = (props) => {
|
|
|
24
24
|
const handleChangeAddress = (address) => {
|
|
25
25
|
setAddress(address);
|
|
26
26
|
if (TypeGuards.isNil(debounce)) {
|
|
27
|
-
onValueChange
|
|
27
|
+
onValueChange?.(address);
|
|
28
28
|
setTimeout(() => setIsTyping(false), 250);
|
|
29
29
|
}
|
|
30
30
|
else {
|
|
@@ -33,18 +33,18 @@ export const usePlacesAutocompleteUtils = (props) => {
|
|
|
33
33
|
setSearchTimeout.current = null;
|
|
34
34
|
}
|
|
35
35
|
setSearchTimeout.current = setTimeout(() => {
|
|
36
|
-
onValueChange
|
|
36
|
+
onValueChange?.(address);
|
|
37
37
|
setIsTyping(false);
|
|
38
|
-
}, debounce
|
|
38
|
+
}, debounce ?? 0);
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
const handlePressAddress = (address, item) => {
|
|
42
42
|
setAddress(address);
|
|
43
|
-
onPress
|
|
43
|
+
onPress?.(address, item);
|
|
44
44
|
};
|
|
45
45
|
const handleClearAddress = () => {
|
|
46
46
|
setAddress('');
|
|
47
|
-
onValueChange
|
|
47
|
+
onValueChange?.('');
|
|
48
48
|
};
|
|
49
49
|
return {
|
|
50
50
|
handleChangeAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePlacesAutocompleteUtils.js","sourceRoot":"","sources":["../src/usePlacesAutocompleteUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAQ5C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAgC,KAAyC,EAAE,EAAE;IACrH,MAAM,EACJ,QAAQ,GAAG,GAAG,EACd,aAAa,EACb,OAAO,GACR,GAAG,KAAK,CAAA;IAET,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAErD,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAuC,IAAI,CAAC,CAAA;IAEjF,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,EAAE;QAC9C,UAAU,CAAC,OAAO,CAAC,CAAA;QAEnB,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,aAAa,
|
|
1
|
+
{"version":3,"file":"usePlacesAutocompleteUtils.js","sourceRoot":"","sources":["../src/usePlacesAutocompleteUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAQ5C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAgC,KAAyC,EAAE,EAAE;IACrH,MAAM,EACJ,QAAQ,GAAG,GAAG,EACd,aAAa,EACb,OAAO,GACR,GAAG,KAAK,CAAA;IAET,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAErD,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAuC,IAAI,CAAC,CAAA;IAEjF,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,EAAE;QAC9C,UAAU,CAAC,OAAO,CAAC,CAAA;QAEnB,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,aAAa,EAAE,CAAC,OAAO,CAAC,CAAA;YACxB,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;QAC3C,CAAC;aAAM,CAAC;YACN,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;gBACtC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAA;YACjC,CAAC;YAED,gBAAgB,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBACzC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAA;gBACxB,WAAW,CAAC,KAAK,CAAC,CAAA;YACpB,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAA;QACnB,CAAC;IACH,CAAC,CAAA;IAED,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAE,IAAO,EAAE,EAAE;QACtD,UAAU,CAAC,OAAO,CAAC,CAAA;QACnB,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC1B,CAAC,CAAA;IAED,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,UAAU,CAAC,EAAE,CAAC,CAAA;QACd,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;IACrB,CAAC,CAAA;IAED,OAAO;QACL,mBAAmB;QACnB,kBAAkB;QAClB,kBAAkB;QAClB,OAAO;QACP,QAAQ;QACR,WAAW;KACZ,CAAA;AACH,CAAC,CAAA"}
|
package/dist/usePromise.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { useRef } from 'react';
|
|
11
2
|
import { TypeGuards } from '@codeleap/types';
|
|
12
3
|
/**
|
|
@@ -26,30 +17,28 @@ export const usePromise = (options) => {
|
|
|
26
17
|
const rejectRef = useRef(null);
|
|
27
18
|
const resolveRef = useRef(null);
|
|
28
19
|
const timeoutRef = useRef(null);
|
|
29
|
-
const reject = (err) =>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
(_b = options === null || options === void 0 ? void 0 : options.onReject) === null || _b === void 0 ? void 0 : _b.call(options, err);
|
|
20
|
+
const reject = async (err) => {
|
|
21
|
+
await rejectRef.current?.(err);
|
|
22
|
+
options?.onReject?.(err);
|
|
33
23
|
if (timeoutRef.current)
|
|
34
24
|
clearTimeout(timeoutRef.current);
|
|
35
25
|
rejectRef.current = null;
|
|
36
|
-
}
|
|
37
|
-
const resolve = (value) =>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
(_b = options === null || options === void 0 ? void 0 : options.onResolve) === null || _b === void 0 ? void 0 : _b.call(options, value);
|
|
26
|
+
};
|
|
27
|
+
const resolve = async (value) => {
|
|
28
|
+
await resolveRef.current?.(value);
|
|
29
|
+
options?.onResolve?.(value);
|
|
41
30
|
if (timeoutRef.current)
|
|
42
31
|
clearTimeout(timeoutRef.current);
|
|
43
32
|
resolveRef.current = null;
|
|
44
|
-
}
|
|
33
|
+
};
|
|
45
34
|
const _await = () => {
|
|
46
35
|
return new Promise((resolve, reject) => {
|
|
47
36
|
rejectRef.current = reject;
|
|
48
37
|
resolveRef.current = resolve;
|
|
49
|
-
if (TypeGuards.isNumber(options
|
|
38
|
+
if (TypeGuards.isNumber(options?.timeout) && options?.timeout > 0) {
|
|
50
39
|
timeoutRef.current = setTimeout(() => {
|
|
51
|
-
reject(new Error(`usePromise: ${
|
|
52
|
-
}, options
|
|
40
|
+
reject(new Error(`usePromise: ${options?.debugName || ''} timed out after ${options?.timeout}ms`));
|
|
41
|
+
}, options?.timeout);
|
|
53
42
|
}
|
|
54
43
|
});
|
|
55
44
|
};
|
package/dist/usePromise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePromise.js","sourceRoot":"","sources":["../src/usePromise.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePromise.js","sourceRoot":"","sources":["../src/usePromise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAe,MAAM,iBAAiB,CAAA;AASzD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAU,OAA8B,EAAE,EAAE;IACpE,MAAM,SAAS,GAAG,MAAM,CAAc,IAAI,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAe,IAAI,CAAC,CAAA;IAC7C,MAAM,UAAU,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAA;IAErE,MAAM,MAAM,GAAG,KAAK,EAAE,GAAQ,EAAE,EAAE;QAChC,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA;QAC9B,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,UAAU,CAAC,OAAO;YAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACxD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAA;IAC1B,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,KAAK,EAAE,KAAQ,EAAE,EAAE;QACjC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;QACjC,OAAO,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,CAAA;QAC3B,IAAI,UAAU,CAAC,OAAO;YAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACxD,UAAU,CAAC,OAAO,GAAG,IAAI,CAAA;IAC3B,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;YAC1B,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;YAC5B,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,CAAC;gBAClE,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBACnC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,OAAO,EAAE,SAAS,IAAI,EAAE,oBAAoB,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,CAAA;gBACpG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YACtB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,MAAM;KACP,CAAA;AACH,CAAC,CAAA"}
|
package/dist/useSearch/index.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { useState } from 'react';
|
|
11
2
|
import { useBooleanToggle } from '../useBooleanToggle';
|
|
12
3
|
import { TypeGuards } from '@codeleap/types';
|
|
@@ -27,7 +18,7 @@ import { TypeGuards } from '@codeleap/types';
|
|
|
27
18
|
* search.load()
|
|
28
19
|
*/
|
|
29
20
|
export function useSearch(props) {
|
|
30
|
-
const { value, multiple, options, filterItems, debugName, defaultOptions, loadOptions, onLoadOptionsError, } =
|
|
21
|
+
const { value, multiple, options, filterItems, debugName, defaultOptions, loadOptions, onLoadOptionsError, } = { ...props };
|
|
31
22
|
const [loading, setLoading] = useBooleanToggle(false);
|
|
32
23
|
const isValueArray = TypeGuards.isArray(value) && multiple;
|
|
33
24
|
const [labelOptions, setLabelOptions] = useState(() => {
|
|
@@ -42,30 +33,28 @@ export function useSearch(props) {
|
|
|
42
33
|
});
|
|
43
34
|
const [filteredOptions, setFilteredOptions] = useState(defaultOptions);
|
|
44
35
|
const [, setSearchInput] = useState('');
|
|
45
|
-
function load() {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
setLoading(false);
|
|
56
|
-
});
|
|
36
|
+
async function load() {
|
|
37
|
+
setLoading(true);
|
|
38
|
+
try {
|
|
39
|
+
const options = await loadOptions('');
|
|
40
|
+
setFilteredOptions(options);
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
onLoadOptionsError(e);
|
|
44
|
+
}
|
|
45
|
+
setLoading(false);
|
|
57
46
|
}
|
|
58
|
-
const onChangeSearch = (searchValue) =>
|
|
47
|
+
const onChangeSearch = async (searchValue) => {
|
|
59
48
|
setSearchInput(searchValue);
|
|
60
49
|
if (!!loadOptions) {
|
|
61
50
|
setLoading(true);
|
|
62
51
|
try {
|
|
63
|
-
const _opts =
|
|
52
|
+
const _opts = await loadOptions(searchValue);
|
|
64
53
|
setFilteredOptions(_opts);
|
|
65
54
|
}
|
|
66
55
|
catch (e) {
|
|
67
56
|
console.error(`Error loading select options [${debugName}], e`);
|
|
68
|
-
onLoadOptionsError
|
|
57
|
+
onLoadOptionsError?.(e);
|
|
69
58
|
}
|
|
70
59
|
setTimeout(() => {
|
|
71
60
|
setLoading(false);
|
|
@@ -74,7 +63,7 @@ export function useSearch(props) {
|
|
|
74
63
|
}
|
|
75
64
|
const _opts = filterItems(searchValue, options);
|
|
76
65
|
setFilteredOptions(_opts);
|
|
77
|
-
}
|
|
66
|
+
};
|
|
78
67
|
return { loading, setLoading, labelOptions, setLabelOptions, filteredOptions, load, onChangeSearch };
|
|
79
68
|
}
|
|
80
69
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/useSearch/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/useSearch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS,CAAkE,KAAgC;IACzH,MAAM,EACJ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,SAAS,EACT,cAAc,EAEd,WAAW,EACX,kBAAkB,GACnB,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;IAEhB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAA;IAC1D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QACpD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QAC5D,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;QAE3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;IACtE,MAAM,CAAC,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAEvC,KAAK,UAAU,IAAI;QACjB,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAA;YACrC,kBAAkB,CAAC,OAAO,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,kBAAkB,CAAC,CAAC,CAAC,CAAA;QACvB,CAAC;QACD,UAAU,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,EAAE,WAAkB,EAAE,EAAE;QAClD,cAAc,CAAC,WAAW,CAAC,CAAA;QAE3B,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAA;gBAC5C,kBAAkB,CAAC,KAAK,CAAC,CAAA;YAC3B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,iCAAiC,SAAS,MAAM,CAAC,CAAA;gBAC/D,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAA;YACzB,CAAC;YACD,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC,EAAE,CAAC,CAAC,CAAA;YACL,OAAM;QACR,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAC/C,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;AACtG,CAAC"}
|
package/dist/useUncontrolled.js
CHANGED
|
@@ -12,7 +12,6 @@ import { useEffect, useRef, useState } from 'react';
|
|
|
12
12
|
* })
|
|
13
13
|
*/
|
|
14
14
|
export function useUncontrolled({ value, defaultValue, finalValue, rule, onChange, onValueUpdate, }) {
|
|
15
|
-
var _a;
|
|
16
15
|
// determine, whether new props indicate controlled state
|
|
17
16
|
const shouldBeControlled = rule(value);
|
|
18
17
|
// initialize state
|
|
@@ -20,7 +19,7 @@ export function useUncontrolled({ value, defaultValue, finalValue, rule, onChang
|
|
|
20
19
|
const initialValue = rule(defaultValue) ? defaultValue : finalValue;
|
|
21
20
|
const [uncontrolledValue, setUncontrolledValue] = useState(initialValue);
|
|
22
21
|
// compute effective value
|
|
23
|
-
let effectiveValue = (
|
|
22
|
+
let effectiveValue = (shouldBeControlled ? value : uncontrolledValue) ?? null;
|
|
24
23
|
if (!shouldBeControlled && modeRef.current === 'controlled') {
|
|
25
24
|
// We are transitioning from controlled to uncontrolled
|
|
26
25
|
// this transition is special as it happens when clearing out
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUncontrolled.js","sourceRoot":"","sources":["../src/useUncontrolled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAanD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAI,EACjC,KAAK,EACL,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,aAAa,GACU
|
|
1
|
+
{"version":3,"file":"useUncontrolled.js","sourceRoot":"","sources":["../src/useUncontrolled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAanD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAI,EACjC,KAAK,EACL,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,aAAa,GACU;IACvB,yDAAyD;IACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IAEtC,mBAAmB;IACnB,MAAM,OAAO,GAAG,MAAM,CAAmB,SAAS,CAAC,CAAA;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAA;IACnE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;IAExE,0BAA0B;IAC1B,IAAI,cAAc,GAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAA;IAEvF,IAAI,CAAC,kBAAkB,IAAI,OAAO,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QAC5D,uDAAuD;QACvD,6DAA6D;QAC7D,iEAAiE;QACjE,EAAE;QACF,4DAA4D;QAC5D,+DAA+D;QAC/D,sDAAsD;QACtD,wDAAwD;QACxD,EAAE;QACF,qEAAqE;QAErE,cAAc,GAAG,UAAU,CAAA;IAC7B,CAAC;IAED,OAAO,CAAC,OAAO,GAAG,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAA;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAA;IAE5B,MAAM,YAAY,GAAG,CAAC,SAAmB,EAAE,EAAE;QAC3C,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAA;QAErD,4DAA4D;QAC5D,8CAA8C;QAC9C,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,oBAAoB,CAAC,SAAS,CAAC,CAAA;QACjC,CAAC;IACH,CAAC,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,oBAAoB,CAAC,cAAc,CAAC,CAAA;QACtC,CAAC;QACD,OAAO,aAAa,KAAK,UAAU,IAAI,aAAa,CAAC,cAAc,CAAC,CAAA;IACtE,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAA;IAE1B,OAAO,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC,OAAO,CAAU,CAAA;AACjE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codeleap/hooks",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.1.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"directory": "packages/hooks"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@codeleap/config": "7.0.
|
|
26
|
-
"@codeleap/types": "7.0.
|
|
27
|
-
"@codeleap/utils": "7.0.
|
|
28
|
-
"@codeleap/logger": "7.0.
|
|
25
|
+
"@codeleap/config": "7.0.2",
|
|
26
|
+
"@codeleap/types": "7.0.2",
|
|
27
|
+
"@codeleap/utils": "7.0.2",
|
|
28
|
+
"@codeleap/logger": "7.0.2",
|
|
29
29
|
"ts-node-dev": "1.1.8"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
"typecheck": "bun tsc --noEmit -p ./tsconfig.json"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@codeleap/types": "7.0.
|
|
37
|
-
"@codeleap/utils": "7.0.
|
|
38
|
-
"@codeleap/logger": "7.0.
|
|
36
|
+
"@codeleap/types": "7.0.2",
|
|
37
|
+
"@codeleap/utils": "7.0.2",
|
|
38
|
+
"@codeleap/logger": "7.0.2",
|
|
39
39
|
"axios": "^1.7.9",
|
|
40
40
|
"typescript": "6.0.3",
|
|
41
41
|
"react": "19.1.0",
|
package/src/index.ts
CHANGED
|
@@ -36,6 +36,7 @@ export * from './useDebounceCallback'
|
|
|
36
36
|
export * from './useDerivedRef'
|
|
37
37
|
export * from './useDerivedState'
|
|
38
38
|
export * from './useFilteredList'
|
|
39
|
+
export * from './useGuardedAsyncCallback'
|
|
39
40
|
export * from './useLazyStore'
|
|
40
41
|
export * from './useStableReference'
|
|
41
42
|
export * from './useOptions'
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useCallback, useRef, type DependencyList } from "react";
|
|
2
|
+
|
|
3
|
+
export type GuardedResult<T> = { dropped: true } | { dropped: false; result: T };
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns a stable callback that silently drops invocations while a previous
|
|
7
|
+
* call is still in flight, preventing overlapping async executions.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam T - The resolved return type of the async callback.
|
|
10
|
+
* @param cb - The async function to guard. Only one instance runs at a time.
|
|
11
|
+
* @param deps - Dependency list, same semantics as `useCallback`.
|
|
12
|
+
* @returns A callback that resolves to `{ dropped: true }` if a call was
|
|
13
|
+
* already in progress, or `{ dropped: false, result: T }` on completion.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const save = useGuardedAsyncCallback(async () => {
|
|
18
|
+
* return await api.saveForm(formData);
|
|
19
|
+
* }, [formData]);
|
|
20
|
+
*
|
|
21
|
+
* const handleClick = async () => {
|
|
22
|
+
* const res = await save();
|
|
23
|
+
* if (!res.dropped) showToast("Saved!");
|
|
24
|
+
* };
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function useGuardedAsyncCallback<T>(
|
|
28
|
+
cb: () => Promise<T>,
|
|
29
|
+
deps: DependencyList
|
|
30
|
+
): () => Promise<GuardedResult<T>> {
|
|
31
|
+
const running = useRef(false);
|
|
32
|
+
|
|
33
|
+
return useCallback(async () => {
|
|
34
|
+
if (running.current) return { dropped: true };
|
|
35
|
+
|
|
36
|
+
running.current = true;
|
|
37
|
+
try {
|
|
38
|
+
return { dropped: false, result: await cb() };
|
|
39
|
+
} finally {
|
|
40
|
+
running.current = false;
|
|
41
|
+
}
|
|
42
|
+
}, deps);
|
|
43
|
+
}
|