awai-react 0.0.1-alpha-7 → 0.0.1-alpha-8

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.js CHANGED
@@ -18,9 +18,12 @@ const useAsyncStateValue = (readable) => {
18
18
  readable.events.rejected.abortable(abortController),
19
19
  readable.events.requested.abortable(abortController)
20
20
  ]);
21
- if (mounted) {
21
+ const newAsync = readable.getAsync();
22
+ const isChanged = newAsync.error !== state.error || newAsync.isLoading !== state.isLoading || newAsync.value !== state.value;
23
+ if (isChanged && mounted) {
22
24
  setState(readable.getAsync());
23
25
  }
26
+ } catch {
24
27
  } finally {
25
28
  abortController.abort();
26
29
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/useAsyncStateValue.ts","../src/useSetState.ts","../src/useStateValue.ts","../src/useState.ts"],"sourcesContent":["import type { InferReadableType, ReadableAsyncState, AsyncValue } from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useAsyncStateValue = <T extends ReadableAsyncState<any>, V = InferReadableType<T>>(\n readable: T,\n): AsyncValue<V> => {\n const [state, setState] = useState<AsyncValue<V>>(readable.getAsync);\n\n useEffect(() => {\n let mounted = true;\n let abortController: AbortController;\n\n setState(readable.getAsync());\n\n (async () => {\n while (mounted) {\n abortController = new AbortController();\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n try {\n await Promise.any([\n readable.events.fulfilled.abortable(abortController),\n readable.events.rejected.abortable(abortController),\n readable.events.requested.abortable(abortController),\n ]);\n\n if (mounted) {\n setState(readable.getAsync());\n }\n } finally {\n abortController.abort();\n }\n }\n })();\n\n return () => {\n mounted = false;\n abortController?.abort();\n };\n }, [readable]);\n\n return state;\n};\n\nexport default useAsyncStateValue;\n","import type { WritableAsyncState, WritableState } from 'awai';\n\nconst useSetState = <Q extends WritableState<T> | WritableAsyncState<T>, T = any>(\n writable: Q,\n): Q['set'] => {\n return writable.set;\n};\n\nexport default useSetState;\n","import {\n type InferReadableType,\n type ReadableAsyncState,\n type ReadableState,\n isReadableAsyncState,\n} from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useStateValue = <T extends ReadableState<any> | ReadableAsyncState<any>>(\n readable: T,\n): InferReadableType<T> => {\n const [state, setState] = useState<T | undefined>(readable.get);\n\n if (isReadableAsyncState(readable) && readable.get() === undefined) {\n throw new Promise((resolve) => readable.events.changed.then(resolve));\n }\n\n useEffect(() => {\n let mounted = true;\n\n setState(readable.get());\n\n (async () => {\n while (mounted) {\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n const newValue = await readable.events.changed;\n if (mounted) {\n setState(newValue);\n }\n }\n })();\n\n return () => {\n mounted = false;\n };\n }, [readable]);\n\n return state as InferReadableType<T>;\n};\n\nexport default useStateValue;\n","import type { AsyncSetter, AsyncState, Setter, State } from 'awai';\n\nimport useSetState from './useSetState';\nimport useStateValue from './useStateValue';\n\ntype Return<T> = T extends State<infer U>\n ? [U, Setter<U>]\n : T extends AsyncState<infer V>\n ? [V, AsyncSetter<V>]\n : never;\n\nfunction useState<T>(state: State<T>): Return<State<T>>;\nfunction useState<T>(state: AsyncState<T>): Return<AsyncState<T>>;\nfunction useState<T>(state: State<T> | AsyncState<T>) {\n const value = useStateValue(state);\n const setValue = useSetState(state);\n\n return [value, setValue];\n}\n\nexport default useState;\n"],"names":["useState","useEffect","isReadableAsyncState"],"mappings":";;;;;AAGM,MAAA,kBAAA,GAAqB,CACzB,QACkB,KAAA;AAClB,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,cAAA,CAAwB,SAAS,QAAQ,CAAA,CAAA;AAEnE,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AACd,IAAI,IAAA,eAAA,CAAA;AAEJ,IAAS,QAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAE5B,IAAA,CAAC,YAAY;AACX,MAAA,OAAO,OAAS,EAAA;AACd,QAAA,eAAA,GAAkB,IAAI,eAAgB,EAAA,CAAA;AAKtC,QAAI,IAAA;AACF,UAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,YAChB,QAAS,CAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,YACnD,QAAS,CAAA,MAAA,CAAO,QAAS,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,YAClD,QAAS,CAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,WACpD,CAAA,CAAA;AAED,UAAA,IAAI,OAAS,EAAA;AACX,YAAS,QAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,WAC9B;AAAA,SACA,SAAA;AACA,UAAA,eAAA,CAAgB,KAAM,EAAA,CAAA;AAAA,SACxB;AAAA,OACF;AAAA,KACC,GAAA,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA,CAAA;AACV,MAAA,eAAA,EAAiB,KAAM,EAAA,CAAA;AAAA,KACzB,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAO,OAAA,KAAA,CAAA;AACT;;AC1CM,MAAA,WAAA,GAAc,CAClB,QACa,KAAA;AACb,EAAA,OAAO,QAAS,CAAA,GAAA,CAAA;AAClB;;ACEM,MAAA,aAAA,GAAgB,CACpB,QACyB,KAAA;AACzB,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAD,cAAA,CAAwB,SAAS,GAAG,CAAA,CAAA;AAE9D,EAAA,IAAIE,0BAAqB,QAAQ,CAAA,IAAK,QAAS,CAAA,GAAA,OAAU,KAAW,CAAA,EAAA;AAClE,IAAM,MAAA,IAAI,QAAQ,CAAC,OAAA,KAAY,SAAS,MAAO,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAO,CAAC,CAAA,CAAA;AAAA,GACtE;AAEA,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AAEd,IAAS,QAAA,CAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AAEvB,IAAA,CAAC,YAAY;AACX,MAAA,OAAO,OAAS,EAAA;AAKd,QAAM,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,MAAO,CAAA,OAAA,CAAA;AACvC,QAAA,IAAI,OAAS,EAAA;AACX,UAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,SACnB;AAAA,OACF;AAAA,KACC,GAAA,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA,CAAA;AAAA,KACZ,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAO,OAAA,KAAA,CAAA;AACT;;AC5BA,SAAS,SAAY,KAAiC,EAAA;AACpD,EAAM,MAAA,KAAA,GAAQ,cAAc,KAAK,CAAA,CAAA;AACjC,EAAM,MAAA,QAAA,GAAW,YAAY,KAAK,CAAA,CAAA;AAElC,EAAO,OAAA,CAAC,OAAO,QAAQ,CAAA,CAAA;AACzB;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/useAsyncStateValue.ts","../src/useSetState.ts","../src/useStateValue.ts","../src/useState.ts"],"sourcesContent":["import type { InferReadableType, ReadableAsyncState, AsyncValue } from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useAsyncStateValue = <T extends ReadableAsyncState<any>, V = InferReadableType<T>>(\n readable: T,\n): AsyncValue<V> => {\n const [state, setState] = useState<AsyncValue<V>>(readable.getAsync);\n\n useEffect(() => {\n let mounted = true;\n let abortController: AbortController;\n\n setState(readable.getAsync());\n\n (async () => {\n while (mounted) {\n abortController = new AbortController();\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n try {\n await Promise.any([\n readable.events.fulfilled.abortable(abortController),\n readable.events.rejected.abortable(abortController),\n readable.events.requested.abortable(abortController),\n ]);\n\n const newAsync = readable.getAsync();\n const isChanged =\n newAsync.error !== state.error ||\n newAsync.isLoading !== state.isLoading ||\n newAsync.value !== state.value;\n\n if (isChanged && mounted) {\n setState(readable.getAsync());\n }\n } catch {\n } finally {\n abortController.abort();\n }\n }\n })();\n\n return () => {\n mounted = false;\n abortController?.abort();\n };\n }, [readable]);\n\n return state;\n};\n\nexport default useAsyncStateValue;\n","import type { WritableAsyncState, WritableState } from 'awai';\n\nconst useSetState = <Q extends WritableState<T> | WritableAsyncState<T>, T = any>(\n writable: Q,\n): Q['set'] => {\n return writable.set;\n};\n\nexport default useSetState;\n","import {\n type InferReadableType,\n type ReadableAsyncState,\n type ReadableState,\n isReadableAsyncState,\n} from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useStateValue = <T extends ReadableState<any> | ReadableAsyncState<any>>(\n readable: T,\n): InferReadableType<T> => {\n const [state, setState] = useState<T | undefined>(readable.get);\n\n if (isReadableAsyncState(readable) && readable.get() === undefined) {\n throw new Promise((resolve) => readable.events.changed.then(resolve));\n }\n\n useEffect(() => {\n let mounted = true;\n\n setState(readable.get());\n\n (async () => {\n while (mounted) {\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n const newValue = await readable.events.changed;\n if (mounted) {\n setState(newValue);\n }\n }\n })();\n\n return () => {\n mounted = false;\n };\n }, [readable]);\n\n return state as InferReadableType<T>;\n};\n\nexport default useStateValue;\n","import type { AsyncSetter, AsyncState, Setter, State } from 'awai';\n\nimport useSetState from './useSetState';\nimport useStateValue from './useStateValue';\n\ntype Return<T> = T extends State<infer U>\n ? [U, Setter<U>]\n : T extends AsyncState<infer V>\n ? [V, AsyncSetter<V>]\n : never;\n\nfunction useState<T>(state: State<T>): Return<State<T>>;\nfunction useState<T>(state: AsyncState<T>): Return<AsyncState<T>>;\nfunction useState<T>(state: State<T> | AsyncState<T>) {\n const value = useStateValue(state);\n const setValue = useSetState(state);\n\n return [value, setValue];\n}\n\nexport default useState;\n"],"names":["useState","useEffect","isReadableAsyncState"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -16,9 +16,12 @@ const useAsyncStateValue = (readable) => {
16
16
  readable.events.rejected.abortable(abortController),
17
17
  readable.events.requested.abortable(abortController)
18
18
  ]);
19
- if (mounted) {
19
+ const newAsync = readable.getAsync();
20
+ const isChanged = newAsync.error !== state.error || newAsync.isLoading !== state.isLoading || newAsync.value !== state.value;
21
+ if (isChanged && mounted) {
20
22
  setState(readable.getAsync());
21
23
  }
24
+ } catch {
22
25
  } finally {
23
26
  abortController.abort();
24
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/useAsyncStateValue.ts","../src/useSetState.ts","../src/useStateValue.ts","../src/useState.ts"],"sourcesContent":["import type { InferReadableType, ReadableAsyncState, AsyncValue } from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useAsyncStateValue = <T extends ReadableAsyncState<any>, V = InferReadableType<T>>(\n readable: T,\n): AsyncValue<V> => {\n const [state, setState] = useState<AsyncValue<V>>(readable.getAsync);\n\n useEffect(() => {\n let mounted = true;\n let abortController: AbortController;\n\n setState(readable.getAsync());\n\n (async () => {\n while (mounted) {\n abortController = new AbortController();\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n try {\n await Promise.any([\n readable.events.fulfilled.abortable(abortController),\n readable.events.rejected.abortable(abortController),\n readable.events.requested.abortable(abortController),\n ]);\n\n if (mounted) {\n setState(readable.getAsync());\n }\n } finally {\n abortController.abort();\n }\n }\n })();\n\n return () => {\n mounted = false;\n abortController?.abort();\n };\n }, [readable]);\n\n return state;\n};\n\nexport default useAsyncStateValue;\n","import type { WritableAsyncState, WritableState } from 'awai';\n\nconst useSetState = <Q extends WritableState<T> | WritableAsyncState<T>, T = any>(\n writable: Q,\n): Q['set'] => {\n return writable.set;\n};\n\nexport default useSetState;\n","import {\n type InferReadableType,\n type ReadableAsyncState,\n type ReadableState,\n isReadableAsyncState,\n} from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useStateValue = <T extends ReadableState<any> | ReadableAsyncState<any>>(\n readable: T,\n): InferReadableType<T> => {\n const [state, setState] = useState<T | undefined>(readable.get);\n\n if (isReadableAsyncState(readable) && readable.get() === undefined) {\n throw new Promise((resolve) => readable.events.changed.then(resolve));\n }\n\n useEffect(() => {\n let mounted = true;\n\n setState(readable.get());\n\n (async () => {\n while (mounted) {\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n const newValue = await readable.events.changed;\n if (mounted) {\n setState(newValue);\n }\n }\n })();\n\n return () => {\n mounted = false;\n };\n }, [readable]);\n\n return state as InferReadableType<T>;\n};\n\nexport default useStateValue;\n","import type { AsyncSetter, AsyncState, Setter, State } from 'awai';\n\nimport useSetState from './useSetState';\nimport useStateValue from './useStateValue';\n\ntype Return<T> = T extends State<infer U>\n ? [U, Setter<U>]\n : T extends AsyncState<infer V>\n ? [V, AsyncSetter<V>]\n : never;\n\nfunction useState<T>(state: State<T>): Return<State<T>>;\nfunction useState<T>(state: AsyncState<T>): Return<AsyncState<T>>;\nfunction useState<T>(state: State<T> | AsyncState<T>) {\n const value = useStateValue(state);\n const setValue = useSetState(state);\n\n return [value, setValue];\n}\n\nexport default useState;\n"],"names":["useState"],"mappings":";;;AAGM,MAAA,kBAAA,GAAqB,CACzB,QACkB,KAAA;AAClB,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,UAAA,CAAwB,SAAS,QAAQ,CAAA,CAAA;AAEnE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AACd,IAAI,IAAA,eAAA,CAAA;AAEJ,IAAS,QAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAE5B,IAAA,CAAC,YAAY;AACX,MAAA,OAAO,OAAS,EAAA;AACd,QAAA,eAAA,GAAkB,IAAI,eAAgB,EAAA,CAAA;AAKtC,QAAI,IAAA;AACF,UAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,YAChB,QAAS,CAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,YACnD,QAAS,CAAA,MAAA,CAAO,QAAS,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,YAClD,QAAS,CAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,WACpD,CAAA,CAAA;AAED,UAAA,IAAI,OAAS,EAAA;AACX,YAAS,QAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,WAC9B;AAAA,SACA,SAAA;AACA,UAAA,eAAA,CAAgB,KAAM,EAAA,CAAA;AAAA,SACxB;AAAA,OACF;AAAA,KACC,GAAA,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA,CAAA;AACV,MAAA,eAAA,EAAiB,KAAM,EAAA,CAAA;AAAA,KACzB,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAO,OAAA,KAAA,CAAA;AACT;;AC1CM,MAAA,WAAA,GAAc,CAClB,QACa,KAAA;AACb,EAAA,OAAO,QAAS,CAAA,GAAA,CAAA;AAClB;;ACEM,MAAA,aAAA,GAAgB,CACpB,QACyB,KAAA;AACzB,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,UAAA,CAAwB,SAAS,GAAG,CAAA,CAAA;AAE9D,EAAA,IAAI,qBAAqB,QAAQ,CAAA,IAAK,QAAS,CAAA,GAAA,OAAU,KAAW,CAAA,EAAA;AAClE,IAAM,MAAA,IAAI,QAAQ,CAAC,OAAA,KAAY,SAAS,MAAO,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAO,CAAC,CAAA,CAAA;AAAA,GACtE;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AAEd,IAAS,QAAA,CAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AAEvB,IAAA,CAAC,YAAY;AACX,MAAA,OAAO,OAAS,EAAA;AAKd,QAAM,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,MAAO,CAAA,OAAA,CAAA;AACvC,QAAA,IAAI,OAAS,EAAA;AACX,UAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,SACnB;AAAA,OACF;AAAA,KACC,GAAA,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA,CAAA;AAAA,KACZ,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAO,OAAA,KAAA,CAAA;AACT;;AC5BA,SAAS,SAAY,KAAiC,EAAA;AACpD,EAAM,MAAA,KAAA,GAAQ,cAAc,KAAK,CAAA,CAAA;AACjC,EAAM,MAAA,QAAA,GAAW,YAAY,KAAK,CAAA,CAAA;AAElC,EAAO,OAAA,CAAC,OAAO,QAAQ,CAAA,CAAA;AACzB;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/useAsyncStateValue.ts","../src/useSetState.ts","../src/useStateValue.ts","../src/useState.ts"],"sourcesContent":["import type { InferReadableType, ReadableAsyncState, AsyncValue } from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useAsyncStateValue = <T extends ReadableAsyncState<any>, V = InferReadableType<T>>(\n readable: T,\n): AsyncValue<V> => {\n const [state, setState] = useState<AsyncValue<V>>(readable.getAsync);\n\n useEffect(() => {\n let mounted = true;\n let abortController: AbortController;\n\n setState(readable.getAsync());\n\n (async () => {\n while (mounted) {\n abortController = new AbortController();\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n try {\n await Promise.any([\n readable.events.fulfilled.abortable(abortController),\n readable.events.rejected.abortable(abortController),\n readable.events.requested.abortable(abortController),\n ]);\n\n const newAsync = readable.getAsync();\n const isChanged =\n newAsync.error !== state.error ||\n newAsync.isLoading !== state.isLoading ||\n newAsync.value !== state.value;\n\n if (isChanged && mounted) {\n setState(readable.getAsync());\n }\n } catch {\n } finally {\n abortController.abort();\n }\n }\n })();\n\n return () => {\n mounted = false;\n abortController?.abort();\n };\n }, [readable]);\n\n return state;\n};\n\nexport default useAsyncStateValue;\n","import type { WritableAsyncState, WritableState } from 'awai';\n\nconst useSetState = <Q extends WritableState<T> | WritableAsyncState<T>, T = any>(\n writable: Q,\n): Q['set'] => {\n return writable.set;\n};\n\nexport default useSetState;\n","import {\n type InferReadableType,\n type ReadableAsyncState,\n type ReadableState,\n isReadableAsyncState,\n} from 'awai';\nimport { useEffect, useState } from 'react';\n\nconst useStateValue = <T extends ReadableState<any> | ReadableAsyncState<any>>(\n readable: T,\n): InferReadableType<T> => {\n const [state, setState] = useState<T | undefined>(readable.get);\n\n if (isReadableAsyncState(readable) && readable.get() === undefined) {\n throw new Promise((resolve) => readable.events.changed.then(resolve));\n }\n\n useEffect(() => {\n let mounted = true;\n\n setState(readable.get());\n\n (async () => {\n while (mounted) {\n /**\n * @todo Cleanup on unmount\n * @url https://github.com/yuriyyakym/awai/issues/1\n */\n const newValue = await readable.events.changed;\n if (mounted) {\n setState(newValue);\n }\n }\n })();\n\n return () => {\n mounted = false;\n };\n }, [readable]);\n\n return state as InferReadableType<T>;\n};\n\nexport default useStateValue;\n","import type { AsyncSetter, AsyncState, Setter, State } from 'awai';\n\nimport useSetState from './useSetState';\nimport useStateValue from './useStateValue';\n\ntype Return<T> = T extends State<infer U>\n ? [U, Setter<U>]\n : T extends AsyncState<infer V>\n ? [V, AsyncSetter<V>]\n : never;\n\nfunction useState<T>(state: State<T>): Return<State<T>>;\nfunction useState<T>(state: AsyncState<T>): Return<AsyncState<T>>;\nfunction useState<T>(state: State<T> | AsyncState<T>) {\n const value = useStateValue(state);\n const setValue = useSetState(state);\n\n return [value, setValue];\n}\n\nexport default useState;\n"],"names":["useState"],"mappings":";;;AAGM,MAAA,kBAAA,GAAqB,CACzB,QACkB,KAAA;AAClB,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,UAAA,CAAwB,SAAS,QAAQ,CAAA,CAAA;AAEnE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AACd,IAAI,IAAA,eAAA,CAAA;AAEJ,IAAS,QAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAE5B,IAAA,CAAC,YAAY;AACX,MAAA,OAAO,OAAS,EAAA;AACd,QAAA,eAAA,GAAkB,IAAI,eAAgB,EAAA,CAAA;AAKtC,QAAI,IAAA;AACF,UAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,YAChB,QAAS,CAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,YACnD,QAAS,CAAA,MAAA,CAAO,QAAS,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,YAClD,QAAS,CAAA,MAAA,CAAO,SAAU,CAAA,SAAA,CAAU,eAAe,CAAA;AAAA,WACpD,CAAA,CAAA;AAED,UAAM,MAAA,QAAA,GAAW,SAAS,QAAS,EAAA,CAAA;AACnC,UAAM,MAAA,SAAA,GACJ,QAAS,CAAA,KAAA,KAAU,KAAM,CAAA,KAAA,IACzB,QAAS,CAAA,SAAA,KAAc,KAAM,CAAA,SAAA,IAC7B,QAAS,CAAA,KAAA,KAAU,KAAM,CAAA,KAAA,CAAA;AAE3B,UAAA,IAAI,aAAa,OAAS,EAAA;AACxB,YAAS,QAAA,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,WAC9B;AAAA,SACM,CAAA,MAAA;AAAA,SACN,SAAA;AACA,UAAA,eAAA,CAAgB,KAAM,EAAA,CAAA;AAAA,SACxB;AAAA,OACF;AAAA,KACC,GAAA,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA,CAAA;AACV,MAAA,eAAA,EAAiB,KAAM,EAAA,CAAA;AAAA,KACzB,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAO,OAAA,KAAA,CAAA;AACT;;ACjDM,MAAA,WAAA,GAAc,CAClB,QACa,KAAA;AACb,EAAA,OAAO,QAAS,CAAA,GAAA,CAAA;AAClB;;ACEM,MAAA,aAAA,GAAgB,CACpB,QACyB,KAAA;AACzB,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,UAAA,CAAwB,SAAS,GAAG,CAAA,CAAA;AAE9D,EAAA,IAAI,qBAAqB,QAAQ,CAAA,IAAK,QAAS,CAAA,GAAA,OAAU,KAAW,CAAA,EAAA;AAClE,IAAM,MAAA,IAAI,QAAQ,CAAC,OAAA,KAAY,SAAS,MAAO,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAO,CAAC,CAAA,CAAA;AAAA,GACtE;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA,CAAA;AAEd,IAAS,QAAA,CAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AAEvB,IAAA,CAAC,YAAY;AACX,MAAA,OAAO,OAAS,EAAA;AAKd,QAAM,MAAA,QAAA,GAAW,MAAM,QAAA,CAAS,MAAO,CAAA,OAAA,CAAA;AACvC,QAAA,IAAI,OAAS,EAAA;AACX,UAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,SACnB;AAAA,OACF;AAAA,KACC,GAAA,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA,CAAA;AAAA,KACZ,CAAA;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAO,OAAA,KAAA,CAAA;AACT;;AC5BA,SAAS,SAAY,KAAiC,EAAA;AACpD,EAAM,MAAA,KAAA,GAAQ,cAAc,KAAK,CAAA,CAAA;AACjC,EAAM,MAAA,QAAA,GAAW,YAAY,KAAK,CAAA,CAAA;AAElC,EAAO,OAAA,CAAC,OAAO,QAAQ,CAAA,CAAA;AACzB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awai-react",
3
- "version": "v0.0.1-alpha-7",
3
+ "version": "v0.0.1-alpha-8",
4
4
  "author": "Yuriy Yakym",
5
5
  "description": "React hooks for Awai integration",
6
6
  "license": "MIT",