@kirill.konshin/react 0.0.3 → 0.0.4

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.
@@ -12,14 +12,19 @@ transforming...
12
12
  rendering chunks...
13
13
 
14
14
  [vite:dts] Start generate declaration files...
15
- dist/index.js 0.67 kB map: 0.10 kB
16
- dist/apiCall.js 0.69 kB │ map: 1.45 kB
17
- dist/useFetcher.js 1.18 kB │ map: 2.62 kB
18
- dist/keyboard.js 1.27 kB │ map: 2.81 kB
19
- dist/form/client.js 1.58 kB │ map: 3.88 kB
20
- dist/useFetch.js 2.04 kB │ map: 5.62 kB
21
- dist/form/form.js 2.89 kB │ map: 7.94 kB
22
- [vite:dts] Declaration files built in 2092ms.
15
+ src/index.ts:4:15 - error TS2307: Cannot find module './useFetcher' or its corresponding type declarations.
23
16
 
24
- ✓ built in 6.76s
17
+ 4 export * from './useFetcher';
18
+    ~~~~~~~~~~~~~~
19
+
20
+ dist/index.js 0.68 kB │ map: 0.10 kB
21
+ dist/apiCall.js 0.69 kB │ map: 1.45 kB
22
+ dist/useFetchAction.js 0.79 kB │ map: 1.90 kB
23
+ dist/keyboard.js 1.27 kB │ map: 2.81 kB
24
+ dist/form/client.js 1.58 kB │ map: 3.88 kB
25
+ dist/useFetch.js 2.04 kB │ map: 5.62 kB
26
+ dist/form/form.js 2.89 kB │ map: 7.94 kB
27
+ [vite:dts] Declaration files built in 2074ms.
28
+
29
+ ✓ built in 6.65s
25
30
  Updated package.json with exports
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @kirill.konshin/react
2
2
 
3
+ ## 0.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - useFetchAction
8
+
3
9
  ## 0.0.3
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { apiCall, jsonContentType } from "./apiCall.js";
2
2
  import { HotkeysContext, HotkeysProvider, useHotkeys } from "./keyboard.js";
3
3
  import { useFetch } from "./useFetch.js";
4
- import { useFetcher } from "./useFetcher.js";
4
+ import { useFetchAction } from "./useFetchAction.js";
5
5
  import { createClient } from "./form/client.js";
6
6
  import { Field, Form, FormContext, Hint, create, isRequired, maxLength, minLength, stringRequired } from "./form/form.js";
7
7
  export {
@@ -20,7 +20,7 @@ export {
20
20
  minLength,
21
21
  stringRequired,
22
22
  useFetch,
23
- useFetcher,
23
+ useFetchAction,
24
24
  useHotkeys
25
25
  };
26
26
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @param {(state: Awaited<R>, payload?: any) => Promise<R> | R} action
3
+ * @param {R} defaultValue
4
+ * @param {boolean} fetchOnMount
5
+ * @param {string} permalink
6
+ * @returns {[R, (payload?: P) => Promise<R> | R, boolean]}>
7
+ */
8
+ export declare function useFetchAction<S, P = undefined>(action: (state: Awaited<S>, payload?: P) => S | Promise<S>, defaultValue: Awaited<S>, { fetchOnMount, permalink, }?: {
9
+ fetchOnMount?: boolean;
10
+ permalink?: string;
11
+ }): [S, (payload: P) => void, boolean];
12
+ //# sourceMappingURL=useFetchAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetchAction.d.ts","sourceRoot":"","sources":["../src/useFetchAction.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC1D,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EACxB,EACI,YAAoB,EACpB,SAAqB,GACxB,GAAE;IACC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACjB,GACP,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,CAoBpC"}
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { useActionState, useState, useCallback, startTransition, useEffect } from "react";
3
+ function useFetchAction(action, defaultValue, {
4
+ fetchOnMount = false,
5
+ permalink = void 0
6
+ } = {}) {
7
+ const [data, dispatchAction, isPending] = useActionState(action, defaultValue, permalink);
8
+ const [loading, setLoading] = useState(fetchOnMount);
9
+ const dispatch = useCallback(
10
+ (payload) => {
11
+ startTransition(() => {
12
+ dispatchAction(payload);
13
+ setLoading(false);
14
+ });
15
+ },
16
+ [dispatchAction]
17
+ );
18
+ useEffect(() => {
19
+ if (!fetchOnMount || !loading) return;
20
+ dispatch(void 0);
21
+ }, [fetchOnMount, dispatch, loading]);
22
+ return [data, dispatch, isPending || loading];
23
+ }
24
+ export {
25
+ useFetchAction
26
+ };
27
+ //# sourceMappingURL=useFetchAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetchAction.js","sources":["../src/useFetchAction.ts"],"sourcesContent":["'use client';\n\nimport { useActionState, useCallback, useEffect, useState, startTransition } from 'react';\n\n/**\n * @param {(state: Awaited<R>, payload?: any) => Promise<R> | R} action\n * @param {R} defaultValue\n * @param {boolean} fetchOnMount\n * @param {string} permalink\n * @returns {[R, (payload?: P) => Promise<R> | R, boolean]}>\n */\nexport function useFetchAction<S, P = undefined>(\n action: (state: Awaited<S>, payload?: P) => S | Promise<S>,\n defaultValue: Awaited<S>,\n {\n fetchOnMount = false,\n permalink = undefined,\n }: {\n fetchOnMount?: boolean;\n permalink?: string;\n } = {},\n): [S, (payload: P) => void, boolean] {\n const [data, dispatchAction, isPending] = useActionState<S, P | undefined>(action, defaultValue, permalink);\n const [loading, setLoading] = useState(fetchOnMount);\n\n const dispatch = useCallback(\n (payload?: P) => {\n startTransition(() => {\n dispatchAction(payload);\n setLoading(false);\n });\n },\n [dispatchAction],\n );\n\n useEffect(() => {\n if (!fetchOnMount || !loading) return;\n dispatch(undefined);\n }, [fetchOnMount, dispatch, loading]);\n\n return [data, dispatch, isPending || loading];\n}\n"],"names":[],"mappings":";;AAWO,SAAS,eACZ,QACA,cACA;AAAA,EACI,eAAe;AAAA,EACf,YAAY;AAChB,IAGI,IAC8B;AAClC,QAAM,CAAC,MAAM,gBAAgB,SAAS,IAAI,eAAiC,QAAQ,cAAc,SAAS;AAC1G,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,YAAY;AAEnD,QAAM,WAAW;AAAA,IACb,CAAC,YAAgB;AACb,sBAAgB,MAAM;AAClB,uBAAe,OAAO;AACtB,mBAAW,KAAK;AAAA,MACpB,CAAC;AAAA,IACL;AAAA,IACA,CAAC,cAAc;AAAA,EAAA;AAGnB,YAAU,MAAM;AACZ,QAAI,CAAC,gBAAgB,CAAC,QAAS;AAC/B,aAAS,MAAS;AAAA,EACtB,GAAG,CAAC,cAAc,UAAU,OAAO,CAAC;AAEpC,SAAO,CAAC,MAAM,UAAU,aAAa,OAAO;AAChD;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kirill.konshin/react",
3
3
  "description": "Utilities",
4
- "version": "0.0.3",
4
+ "version": "0.0.4",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "----- BUILD -----": "",
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from './apiCall';
2
2
  export * from './keyboard';
3
3
  export * from './useFetch';
4
- export * from './useFetcher';
4
+ export * from './useFetchAction';
5
5
  export * from './form';
@@ -0,0 +1,42 @@
1
+ 'use client';
2
+
3
+ import { useActionState, useCallback, useEffect, useState, startTransition } from 'react';
4
+
5
+ /**
6
+ * @param {(state: Awaited<R>, payload?: any) => Promise<R> | R} action
7
+ * @param {R} defaultValue
8
+ * @param {boolean} fetchOnMount
9
+ * @param {string} permalink
10
+ * @returns {[R, (payload?: P) => Promise<R> | R, boolean]}>
11
+ */
12
+ export function useFetchAction<S, P = undefined>(
13
+ action: (state: Awaited<S>, payload?: P) => S | Promise<S>,
14
+ defaultValue: Awaited<S>,
15
+ {
16
+ fetchOnMount = false,
17
+ permalink = undefined,
18
+ }: {
19
+ fetchOnMount?: boolean;
20
+ permalink?: string;
21
+ } = {},
22
+ ): [S, (payload: P) => void, boolean] {
23
+ const [data, dispatchAction, isPending] = useActionState<S, P | undefined>(action, defaultValue, permalink);
24
+ const [loading, setLoading] = useState(fetchOnMount);
25
+
26
+ const dispatch = useCallback(
27
+ (payload?: P) => {
28
+ startTransition(() => {
29
+ dispatchAction(payload);
30
+ setLoading(false);
31
+ });
32
+ },
33
+ [dispatchAction],
34
+ );
35
+
36
+ useEffect(() => {
37
+ if (!fetchOnMount || !loading) return;
38
+ dispatch(undefined);
39
+ }, [fetchOnMount, dispatch, loading]);
40
+
41
+ return [data, dispatch, isPending || loading];
42
+ }
@@ -1,10 +0,0 @@
1
- export declare function useFetcher<T = any>(cb: any, { fetchOnMount, onError }?: {
2
- fetchOnMount?: boolean;
3
- onError?: (e: Error) => void;
4
- }): {
5
- loading: boolean;
6
- error: Error | null;
7
- data: T | null;
8
- trigger: (...args: any[]) => Promise<any>;
9
- };
10
- //# sourceMappingURL=useFetcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFetcher.d.ts","sourceRoot":"","sources":["../src/useFetcher.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAC9B,EAAE,EAAE,GAAG,EAEP,EAAE,YAAoB,EAAE,OAAO,EAAE,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO,GACjG;IACC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC7C,CA0CA"}
@@ -1,43 +0,0 @@
1
- import { useState, useRef, useCallback, useEffect } from "react";
2
- function useFetcher(cb, { fetchOnMount = false, onError } = {}) {
3
- const [loading, setLoading] = useState(fetchOnMount);
4
- const [error, setError] = useState(null);
5
- const [data, setData] = useState(null);
6
- const isMounted = useRef(false);
7
- const trigger = useCallback(
8
- async (...args) => {
9
- try {
10
- setLoading(true);
11
- setError(null);
12
- const res = await cb(args);
13
- if (!isMounted.current) return;
14
- setData(res);
15
- return res;
16
- } catch (e) {
17
- console.error("Fetch failed", e);
18
- if (!isMounted.current) return;
19
- setError(e);
20
- onError?.(e);
21
- } finally {
22
- if (isMounted.current) setLoading(false);
23
- }
24
- },
25
- [cb, onError]
26
- );
27
- useEffect(() => {
28
- if (fetchOnMount) {
29
- trigger().catch((e) => console.error("Fetch on mount failed", e));
30
- }
31
- }, [fetchOnMount, cb, trigger]);
32
- useEffect(() => {
33
- isMounted.current = true;
34
- return () => {
35
- isMounted.current = false;
36
- };
37
- });
38
- return { loading, error, data, trigger };
39
- }
40
- export {
41
- useFetcher
42
- };
43
- //# sourceMappingURL=useFetcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFetcher.js","sources":["../src/useFetcher.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useFetcher<T = any>(\n cb: any,\n\n { fetchOnMount = false, onError }: { fetchOnMount?: boolean; onError?: (e: Error) => void } = {},\n): {\n loading: boolean;\n error: Error | null;\n data: T | null;\n trigger: (...args: any[]) => Promise<any>;\n} {\n const [loading, setLoading] = useState(fetchOnMount);\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<T | null>(null);\n\n const isMounted = useRef(false);\n\n const trigger = useCallback(\n async (...args: any[]): Promise<any> => {\n try {\n setLoading(true);\n setError(null);\n const res = await cb(args);\n if (!isMounted.current) return;\n setData(res);\n return res;\n } catch (e) {\n console.error('Fetch failed', e);\n if (!isMounted.current) return;\n setError(e);\n (onError as any)?.(e);\n } finally {\n if (isMounted.current) setLoading(false);\n }\n },\n [cb, onError],\n );\n\n useEffect(() => {\n if (fetchOnMount) {\n trigger().catch((e) => console.error('Fetch on mount failed', e)); // catch actually will never happen\n }\n }, [fetchOnMount, cb, trigger]);\n\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n });\n\n return { loading, error, data, trigger };\n}\n"],"names":[],"mappings":";AAEO,SAAS,WACZ,IAEA,EAAE,eAAe,OAAO,QAAA,IAAsE,IAMhG;AACE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,YAAY;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AACrD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAmB,IAAI;AAE/C,QAAM,YAAY,OAAO,KAAK;AAE9B,QAAM,UAAU;AAAA,IACZ,UAAU,SAA8B;AACpC,UAAI;AACA,mBAAW,IAAI;AACf,iBAAS,IAAI;AACb,cAAM,MAAM,MAAM,GAAG,IAAI;AACzB,YAAI,CAAC,UAAU,QAAS;AACxB,gBAAQ,GAAG;AACX,eAAO;AAAA,MACX,SAAS,GAAG;AACR,gBAAQ,MAAM,gBAAgB,CAAC;AAC/B,YAAI,CAAC,UAAU,QAAS;AACxB,iBAAS,CAAC;AACT,kBAAkB,CAAC;AAAA,MACxB,UAAA;AACI,YAAI,UAAU,QAAS,YAAW,KAAK;AAAA,MAC3C;AAAA,IACJ;AAAA,IACA,CAAC,IAAI,OAAO;AAAA,EAAA;AAGhB,YAAU,MAAM;AACZ,QAAI,cAAc;AACd,cAAA,EAAU,MAAM,CAAC,MAAM,QAAQ,MAAM,yBAAyB,CAAC,CAAC;AAAA,IACpE;AAAA,EACJ,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC;AAE9B,YAAU,MAAM;AACZ,cAAU,UAAU;AACpB,WAAO,MAAM;AACT,gBAAU,UAAU;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,SAAO,EAAE,SAAS,OAAO,MAAM,QAAA;AACnC;"}
package/src/useFetcher.ts DELETED
@@ -1,54 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState } from 'react';
2
-
3
- export function useFetcher<T = any>(
4
- cb: any,
5
-
6
- { fetchOnMount = false, onError }: { fetchOnMount?: boolean; onError?: (e: Error) => void } = {},
7
- ): {
8
- loading: boolean;
9
- error: Error | null;
10
- data: T | null;
11
- trigger: (...args: any[]) => Promise<any>;
12
- } {
13
- const [loading, setLoading] = useState(fetchOnMount);
14
- const [error, setError] = useState<Error | null>(null);
15
- const [data, setData] = useState<T | null>(null);
16
-
17
- const isMounted = useRef(false);
18
-
19
- const trigger = useCallback(
20
- async (...args: any[]): Promise<any> => {
21
- try {
22
- setLoading(true);
23
- setError(null);
24
- const res = await cb(args);
25
- if (!isMounted.current) return;
26
- setData(res);
27
- return res;
28
- } catch (e) {
29
- console.error('Fetch failed', e);
30
- if (!isMounted.current) return;
31
- setError(e);
32
- (onError as any)?.(e);
33
- } finally {
34
- if (isMounted.current) setLoading(false);
35
- }
36
- },
37
- [cb, onError],
38
- );
39
-
40
- useEffect(() => {
41
- if (fetchOnMount) {
42
- trigger().catch((e) => console.error('Fetch on mount failed', e)); // catch actually will never happen
43
- }
44
- }, [fetchOnMount, cb, trigger]);
45
-
46
- useEffect(() => {
47
- isMounted.current = true;
48
- return () => {
49
- isMounted.current = false;
50
- };
51
- });
52
-
53
- return { loading, error, data, trigger };
54
- }