extra-react-hooks 0.8.13 → 0.9.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/README.md +17 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/strict-context.d.ts +6 -0
- package/lib/strict-context.js +12 -0
- package/lib/strict-context.js.map +1 -0
- package/lib/use-debounce.js +1 -1
- package/lib/use-debounce.js.map +1 -1
- package/lib/use-effect-async.js +1 -2
- package/lib/use-effect-async.js.map +1 -1
- package/lib/use-iife-async.js.map +1 -1
- package/lib/use-multiple-selection.d.ts +1 -1
- package/lib/use-multiple-selection.js +1 -1
- package/lib/use-multiple-selection.js.map +1 -1
- package/lib/use-number-input.js +1 -1
- package/lib/use-number-input.js.map +1 -1
- package/lib/use-promise.d.ts +1 -0
- package/lib/use-promise.js +21 -0
- package/lib/use-promise.js.map +1 -0
- package/lib/use-single-selection.d.ts +1 -1
- package/lib/use-single-selection.js +1 -1
- package/lib/use-single-selection.js.map +1 -1
- package/package.json +33 -38
- package/src/index.ts +2 -0
- package/src/strict-context.ts +17 -0
- package/src/use-debounce.ts +1 -1
- package/src/use-effect-async.ts +2 -2
- package/src/use-iife-async.ts +1 -0
- package/src/use-number-input.ts +1 -1
- package/src/use-promise.ts +29 -0
package/README.md
CHANGED
|
@@ -257,3 +257,20 @@ function useDerivedState<T>(value: T): [
|
|
|
257
257
|
, setDerivedState: (newDerivedState: T) => void
|
|
258
258
|
]
|
|
259
259
|
```
|
|
260
|
+
|
|
261
|
+
### usePromise
|
|
262
|
+
```ts
|
|
263
|
+
function usePromise<T>(promise: PromiseLike<T>): T | undefined
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Similar to `use(promise)`,
|
|
267
|
+
but it also works in environments without `<Suspense>` or server components.
|
|
268
|
+
Errors thrown can be caught by error boundaries.
|
|
269
|
+
|
|
270
|
+
### Strict Context
|
|
271
|
+
```ts
|
|
272
|
+
type StrictContext<T> = Context<T | typeof dummy>
|
|
273
|
+
|
|
274
|
+
function createStrictContext<T>(): StrictContext<T>
|
|
275
|
+
function useStrictContext<T>(context: StrictContext<T>): T
|
|
276
|
+
```
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -27,4 +27,6 @@ export * from './use-debounce.js';
|
|
|
27
27
|
export * from './use-number-input.js';
|
|
28
28
|
export * from './use-media-query.js';
|
|
29
29
|
export * from './use-derived-state.js';
|
|
30
|
+
export * from './/use-promise.js';
|
|
31
|
+
export * from './strict-context.js';
|
|
30
32
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mCAAmC,CAAA;AACjD,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,2BAA2B,CAAA;AACzC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,sBAAsB,CAAA;AACpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,mCAAmC,CAAA;AACjD,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Context } from 'react';
|
|
2
|
+
export type StrictContext<T> = Context<T | typeof dummy>;
|
|
3
|
+
declare const dummy: unique symbol;
|
|
4
|
+
export declare function createStrictContext<T>(): StrictContext<T>;
|
|
5
|
+
export declare function useStrictContext<T>(context: StrictContext<T>): T;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useContext, createContext } from 'react';
|
|
2
|
+
import { assert } from '@blackglory/prelude';
|
|
3
|
+
const dummy = Symbol();
|
|
4
|
+
export function createStrictContext() {
|
|
5
|
+
return createContext(dummy);
|
|
6
|
+
}
|
|
7
|
+
export function useStrictContext(context) {
|
|
8
|
+
const value = useContext(context);
|
|
9
|
+
assert(value !== dummy, 'This context cannot be used outside of a provider');
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=strict-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-context.js","sourceRoot":"","sources":["../src/strict-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAW,aAAa,EAAE,MAAM,OAAO,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAI5C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAA;AAEtB,MAAM,UAAU,mBAAmB;IACjC,OAAO,aAAa,CAAmB,KAAK,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAI,OAAyB;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACjC,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,mDAAmD,CAAC,CAAA;IAE5E,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/lib/use-debounce.js
CHANGED
package/lib/use-debounce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounce.js","sourceRoot":"","sources":["../src/use-debounce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"use-debounce.js","sourceRoot":"","sources":["../src/use-debounce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,UAAU,WAAW,CACzB,EAA2B,EAC3B,OAAe,EACf,IAA2B;IAE3B,MAAM,KAAK,GAAG,MAAM,CAA0B,EAAE,CAAC,CAAA;IACjD,MAAM,gBAAgB,GAAG,MAAM,CAAa,SAAS,CAAC,CAAA;IAEtD,OAAO,CAAC,GAAG,EAAE;QACX,KAAK,CAAC,OAAO,GAAG,EAAE,CAAA;IACpB,CAAC,EAAE,IAAI,CAAC,CAAA;IAER,OAAO,CAAC,GAAG,IAAU,EAAQ,EAAE;;QAC7B,MAAA,gBAAgB,CAAC,OAAO,gEAAI,CAAA;QAE5B,gBAAgB,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE;YAClD,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;YAEtB,gBAAgB,CAAC,OAAO,GAAG,SAAS,CAAA;QACtC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC"}
|
package/lib/use-effect-async.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { useEffect } from 'react';
|
|
2
|
-
import { go, pass } from '@blackglory/prelude';
|
|
2
|
+
import { go, pass, CustomError } from '@blackglory/prelude';
|
|
3
3
|
import { AbortController } from 'extra-abort';
|
|
4
|
-
import { CustomError } from '@blackglory/errors';
|
|
5
4
|
class InternalAbortError extends CustomError {
|
|
6
5
|
}
|
|
7
6
|
export function useEffectAsync(effect, deps) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-effect-async.js","sourceRoot":"","sources":["../src/use-effect-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"use-effect-async.js","sourceRoot":"","sources":["../src/use-effect-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,kBAAmB,SAAQ,WAAW;CAAG;AAE/C,MAAM,UAAU,cAAc,CAC5B,MAAkD,EAClD,IAA2B;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QAExC,EAAE,CAAC,KAAK,IAAI,EAAE;YACZ,IAAI,CAAC;gBACH,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;gBAElC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YACjC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;oBACtC,IAAI,EAAE,CAAA;gBACR,CAAC;qBAAM,CAAC;oBAEN,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAA;IACzD,CAAC,EAAE,IAAI,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-iife-async.js","sourceRoot":"","sources":["../src/use-iife-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,kBAAmB,SAAQ,WAAW;CAAG;AAE/C,MAAM,UAAU,YAAY,CAC1B,IAAgD,EAChD,IAA2B;IAE3B,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QAExC,EAAE,CAAC,KAAK,IAAI,EAAE;YACZ,IAAI,CAAC;gBACH,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;gBAElC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;oBACtC,IAAI,EAAE,CAAA;gBACR,CAAC;qBAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"use-iife-async.js","sourceRoot":"","sources":["../src/use-iife-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,kBAAmB,SAAQ,WAAW;CAAG;AAE/C,MAAM,UAAU,YAAY,CAC1B,IAAgD,EAChD,IAA2B;IAE3B,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QAExC,EAAE,CAAC,KAAK,IAAI,EAAE;YACZ,IAAI,CAAC;gBACH,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;gBAElC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YAC/B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;oBACtC,IAAI,EAAE,CAAA;gBACR,CAAC;qBAAM,CAAC;oBAEN,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAA;IACzD,CAAC,EAAE,IAAI,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NonEmptyArray } from '@blackglory/prelude';
|
|
2
|
-
import { IOptionState } from
|
|
2
|
+
import { IOptionState } from './types.js';
|
|
3
3
|
export declare function useMultipleSelection<T>(options: NonEmptyArray<T>, defaultSelectedIndexes?: number[]): {
|
|
4
4
|
selectedIndexes: number[];
|
|
5
5
|
optionStates: IOptionState[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useMemo, useCallback } from 'react';
|
|
2
2
|
import { assert, toArray } from '@blackglory/prelude';
|
|
3
|
-
import { useIIFE } from
|
|
3
|
+
import { useIIFE } from './use-iife.js';
|
|
4
4
|
export function useMultipleSelection(options, defaultSelectedIndexes = []) {
|
|
5
5
|
useIIFE(() => {
|
|
6
6
|
for (const index of defaultSelectedIndexes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-multiple-selection.js","sourceRoot":"","sources":["../src/use-multiple-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAiB,MAAM,qBAAqB,CAAA;AAEpE,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use-multiple-selection.js","sourceRoot":"","sources":["../src/use-multiple-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAiB,MAAM,qBAAqB,CAAA;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,MAAM,UAAU,oBAAoB,CAClC,OAAyB,EACzB,yBAAmC,EAAE;IAQrC,OAAO,CAAC,GAAG,EAAE;QACX,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;YAC3C,MAAM,CACJ,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,EACpC,0FAA0F,CAC3F,CAAA;QACH,CAAC;IACH,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAE5B,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAEvF,OAAO;QACL,eAAe,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;QAC3E,YAAY,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACrE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/B,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;KACpC,CAAA;IAED,SAAS,kBAAkB;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;YAClC,OAAO,EAAE,QAAQ,EAAE,CAAA;QACrB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,UAAU,CAAC,KAAa;QAC/B,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;IAED,SAAS,MAAM,CAAC,KAAa;QAC3B,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,CAAA;QACf,CAAC;IACH,CAAC;IAED,SAAS,MAAM,CAAC,KAAa;QAC3B,kBAAkB,CAAC,eAAe,CAAC,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAA;YACvC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACjB,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,QAAQ,CAAC,KAAa;QAC7B,kBAAkB,CAAC,eAAe,CAAC,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAA;YACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACpB,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
|
package/lib/use-number-input.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isntNaN } from '
|
|
1
|
+
import { isntNaN } from '@blackglory/prelude';
|
|
2
2
|
import { useDerivedState } from './use-derived-state.js';
|
|
3
3
|
export function useNumberInput({ value, lazy, onChange }) {
|
|
4
4
|
const [displayValue, setDisplayValue] = useDerivedState(value.toString());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-number-input.js","sourceRoot":"","sources":["../src/use-number-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"use-number-input.js","sourceRoot":"","sources":["../src/use-number-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAQrD;IASC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,eAAe,CAAS,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEjF,OAAO;QACL,aAAa;YACX,OAAO;gBACL,IAAI,EAAE,QAAQ;gBAId,KAAK,EAAE,YAAY;gBAGnB,QAAQ,CAAC,CAAC;oBACR,IAAI,IAAI,EAAE,CAAC;wBACT,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;wBAEzB,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBACjC,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;4BAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAA;4BAEvC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gCAC5C,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;4BAC3B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,CAAC;oBACN,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;wBAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAA;wBAEvC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;4BAC5C,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;4BAEpC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;wBAC1B,CAAC;6BAAM,CAAC;4BACN,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;4BAEjC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;wBACvB,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;wBAEjC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;oBACvB,CAAC;gBACH,CAAC;aACF,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function usePromise<T>(promise: PromiseLike<T>): T | undefined;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { withAbortSignal } from 'extra-abort';
|
|
3
|
+
import { isntUndefined, getErrorResultPromise } from '@blackglory/prelude';
|
|
4
|
+
import { useEffectAsync } from './use-effect-async.js';
|
|
5
|
+
export function usePromise(promise) {
|
|
6
|
+
const [result, setResult] = useState();
|
|
7
|
+
useEffectAsync(async (signal) => {
|
|
8
|
+
setResult(undefined);
|
|
9
|
+
const [error, result] = await withAbortSignal(signal, () => getErrorResultPromise(promise));
|
|
10
|
+
setResult(() => {
|
|
11
|
+
if (isntUndefined(error)) {
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}, [promise]);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=use-promise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-promise.js","sourceRoot":"","sources":["../src/use-promise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,UAAU,UAAU,CAAI,OAAuB;IACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAK,CAAA;IAGzC,cAAc,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE;QAC5B,SAAS,CAAC,SAAS,CAAC,CAAA;QAEpB,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,eAAe,CAC3C,MAAM,EACN,GAAG,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CACrC,CAAA;QAED,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAEzB,MAAM,KAAK,CAAA;YACb,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NonEmptyArray } from '@blackglory/prelude';
|
|
2
|
-
import { IOptionState } from
|
|
2
|
+
import { IOptionState } from './types.js';
|
|
3
3
|
export declare function useSingleSelection<T>(options: NonEmptyArray<T>, defaultSelectedIndex: number): {
|
|
4
4
|
selectedIndex: number;
|
|
5
5
|
optionStates: IOptionState[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useMemo, useCallback } from 'react';
|
|
2
2
|
import { assert } from '@blackglory/prelude';
|
|
3
|
-
import { useIIFE } from
|
|
3
|
+
import { useIIFE } from './use-iife.js';
|
|
4
4
|
export function useSingleSelection(options, defaultSelectedIndex) {
|
|
5
5
|
useIIFE(() => {
|
|
6
6
|
assert(defaultSelectedIndex >= 0 && defaultSelectedIndex < options.length, 'The parameter defaultSelectedIndex must be in the range of 0 to values.length');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-single-selection.js","sourceRoot":"","sources":["../src/use-single-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use-single-selection.js","sourceRoot":"","sources":["../src/use-single-selection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,MAAM,UAAU,kBAAkB,CAChC,OAAyB,EACzB,oBAA4B;IAM5B,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,CACJ,oBAAoB,IAAI,CAAC,IAAI,oBAAoB,GAAG,OAAO,CAAC,MAAM,EAClE,+EAA+E,CAChF,CAAA;IACH,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAA;IAE1B,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IAExE,OAAO;QACL,aAAa;QACb,YAAY,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;KAChC,CAAA;IAED,SAAS,kBAAkB;QACzB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAChC,QAAQ,EAAE,KAAK,KAAK,aAAa;SAClC,CAAC,CAAC,CAAA;IACL,CAAC;IAED,SAAS,MAAM,CAAC,KAAa;QAC3B,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "extra-react-hooks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"files": [
|
|
@@ -12,66 +12,61 @@
|
|
|
12
12
|
"types": "lib/index.d.ts",
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"engines": {
|
|
15
|
-
"node": ">=
|
|
15
|
+
"node": ">=22"
|
|
16
16
|
},
|
|
17
17
|
"repository": "git@github.com:BlackGlory/extra-react-hooks.git",
|
|
18
18
|
"author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
|
|
19
19
|
"license": "MIT",
|
|
20
20
|
"scripts": {
|
|
21
|
-
"prepare": "ts-patch install -s",
|
|
22
21
|
"lint": "eslint --quiet src __tests__",
|
|
23
22
|
"test": "vitest --run",
|
|
24
|
-
"prepublishOnly": "run-s
|
|
23
|
+
"prepublishOnly": "run-s clean build",
|
|
25
24
|
"clean": "rimraf lib",
|
|
26
|
-
"build": "tsc --project tsconfig.build.json --
|
|
25
|
+
"build": "tsc --project tsconfig.build.json && tsc-alias --project tsconfig.build.json",
|
|
27
26
|
"release": "standard-version"
|
|
28
27
|
},
|
|
29
28
|
"husky": {
|
|
30
29
|
"hooks": {
|
|
31
|
-
"pre-commit": "run-s
|
|
30
|
+
"pre-commit": "run-s clean lint build test",
|
|
32
31
|
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
|
|
33
32
|
}
|
|
34
33
|
},
|
|
35
34
|
"devDependencies": {
|
|
36
|
-
"@blackglory/wait-for": "^0.
|
|
37
|
-
"@commitlint/cli": "^
|
|
38
|
-
"@commitlint/config-conventional": "^
|
|
39
|
-
"@eslint/js": "^
|
|
40
|
-
"@testing-library/dom": "^10.4.
|
|
41
|
-
"@testing-library/react": "^16.
|
|
42
|
-
"@testing-library/user-event": "^14.6.
|
|
43
|
-
"@types/react": "^19.0
|
|
44
|
-
"@vitejs/plugin-react": "^
|
|
45
|
-
"@vitest/browser": "^
|
|
46
|
-
"eslint": "^
|
|
47
|
-
"eslint-plugin-react": "^7.37.
|
|
48
|
-
"eslint-plugin-react-hooks": "^
|
|
35
|
+
"@blackglory/wait-for": "^0.8.5",
|
|
36
|
+
"@commitlint/cli": "^21.2.4",
|
|
37
|
+
"@commitlint/config-conventional": "^21.2.4",
|
|
38
|
+
"@eslint/js": "^10.0.1",
|
|
39
|
+
"@testing-library/dom": "^10.4.2",
|
|
40
|
+
"@testing-library/react": "^16.3.3",
|
|
41
|
+
"@testing-library/user-event": "^14.6.8",
|
|
42
|
+
"@types/react": "^19.3.0",
|
|
43
|
+
"@vitejs/plugin-react": "^6.1.2",
|
|
44
|
+
"@vitest/browser-playwright": "^5.0.5",
|
|
45
|
+
"eslint": "^10.13.0",
|
|
46
|
+
"eslint-plugin-react": "^7.37.5",
|
|
47
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
49
48
|
"husky": "4",
|
|
50
49
|
"npm-run-all": "^4.1.5",
|
|
51
|
-
"playwright": "^1.
|
|
52
|
-
"react": "^19.
|
|
53
|
-
"react-dom": "^19.
|
|
54
|
-
"react-
|
|
55
|
-
"
|
|
56
|
-
"rimraf": "^
|
|
50
|
+
"playwright": "^1.64.1",
|
|
51
|
+
"react": "^19.3.1",
|
|
52
|
+
"react-dom": "^19.3.1",
|
|
53
|
+
"react-error-boundary": "^6.1.6",
|
|
54
|
+
"react-test-renderer": "^19.3.1",
|
|
55
|
+
"rimraf": "^6.1.3",
|
|
57
56
|
"standard-version": "^9.3.2",
|
|
58
|
-
"
|
|
57
|
+
"tsc-alias": "^1.9.9",
|
|
59
58
|
"tslib": "^2.8.1",
|
|
60
|
-
"typescript": "
|
|
61
|
-
"typescript-eslint": "^8.
|
|
62
|
-
"
|
|
63
|
-
"vite": "^6.
|
|
64
|
-
"
|
|
65
|
-
"vitest": "^3.0.9"
|
|
59
|
+
"typescript": "6",
|
|
60
|
+
"typescript-eslint": "^8.72.0",
|
|
61
|
+
"vite": "^8.3.5",
|
|
62
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
63
|
+
"vitest": "^5.0.5"
|
|
66
64
|
},
|
|
67
65
|
"dependencies": {
|
|
68
|
-
"@blackglory/
|
|
69
|
-
"
|
|
70
|
-
"extra-abort": "^0.4.0",
|
|
66
|
+
"@blackglory/prelude": "^0.5.0",
|
|
67
|
+
"extra-abort": "^0.5.1",
|
|
71
68
|
"extra-fsm": "^0.2.1",
|
|
72
|
-
"
|
|
73
|
-
"extra-utils": "^5.17.0",
|
|
74
|
-
"rxjs": "^7.8.1"
|
|
69
|
+
"rxjs": "^7.8.2"
|
|
75
70
|
},
|
|
76
71
|
"peerDependencies": {
|
|
77
72
|
"react": "^19"
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useContext, Context, createContext } from 'react'
|
|
2
|
+
import { assert } from '@blackglory/prelude'
|
|
3
|
+
|
|
4
|
+
export type StrictContext<T> = Context<T | typeof dummy>
|
|
5
|
+
|
|
6
|
+
const dummy = Symbol()
|
|
7
|
+
|
|
8
|
+
export function createStrictContext<T>(): StrictContext<T> {
|
|
9
|
+
return createContext<T | typeof dummy>(dummy)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function useStrictContext<T>(context: StrictContext<T>): T {
|
|
13
|
+
const value = useContext(context)
|
|
14
|
+
assert(value !== dummy, 'This context cannot be used outside of a provider')
|
|
15
|
+
|
|
16
|
+
return value
|
|
17
|
+
}
|
package/src/use-debounce.ts
CHANGED
package/src/use-effect-async.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { useEffect } from 'react'
|
|
2
|
-
import { go, pass } from '@blackglory/prelude'
|
|
2
|
+
import { go, pass, CustomError } from '@blackglory/prelude'
|
|
3
3
|
import { AbortController } from 'extra-abort'
|
|
4
|
-
import { CustomError } from '@blackglory/errors'
|
|
5
4
|
|
|
6
5
|
class InternalAbortError extends CustomError {}
|
|
7
6
|
|
|
@@ -21,6 +20,7 @@ export function useEffectAsync(
|
|
|
21
20
|
if (err instanceof InternalAbortError) {
|
|
22
21
|
pass()
|
|
23
22
|
} else {
|
|
23
|
+
// 预期effect会捕获自身产生的错误, 如果未能捕获, 则让程序崩溃.
|
|
24
24
|
throw err
|
|
25
25
|
}
|
|
26
26
|
}
|
package/src/use-iife-async.ts
CHANGED
package/src/use-number-input.ts
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import { withAbortSignal } from 'extra-abort'
|
|
3
|
+
import { isntUndefined, getErrorResultPromise } from '@blackglory/prelude'
|
|
4
|
+
import { useEffectAsync } from './use-effect-async.js'
|
|
5
|
+
|
|
6
|
+
export function usePromise<T>(promise: PromiseLike<T>): T | undefined {
|
|
7
|
+
const [result, setResult] = useState<T>()
|
|
8
|
+
|
|
9
|
+
// React强制要求状态更新不能发生在组件加载时, 因此不能使用`useIIFEAsync()`.
|
|
10
|
+
useEffectAsync(async signal => {
|
|
11
|
+
setResult(undefined)
|
|
12
|
+
|
|
13
|
+
const [error, result] = await withAbortSignal(
|
|
14
|
+
signal
|
|
15
|
+
, () => getErrorResultPromise(promise)
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
setResult(() => {
|
|
19
|
+
if (isntUndefined(error)) {
|
|
20
|
+
// 将异步错误转变为同步错误.
|
|
21
|
+
throw error
|
|
22
|
+
} else {
|
|
23
|
+
return result
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
}, [promise])
|
|
27
|
+
|
|
28
|
+
return result
|
|
29
|
+
}
|