@statx/react
Advanced tools
+12
-4
@@ -1,4 +0,12 @@ | ||
| import type { ReactElement, ReactNode } from 'react'; | ||
| import type { PublicState } from '@statx/core'; | ||
| export declare const useStatx: <T extends unknown>(state: PublicState<T>) => T; | ||
| export declare const useSXComponent: <T extends unknown>(state: PublicState<T>, f?: ((value: T) => ReactNode) | undefined) => ReactElement; | ||
| import type { ReactNode } from 'react'; | ||
| import type { State, Computed } from '@statx/core'; | ||
| type Props = Record<string, unknown>; | ||
| type ConvertedRecord<T extends Props> = { | ||
| [K in keyof T]: State<T[K]>; | ||
| }; | ||
| export declare const statxComponent: <T extends Props, K = ConvertedRecord<T>>(initFn: (state: K) => () => ReactNode, name?: string) => (props: Props) => import("react").CElement<{ | ||
| fn: () => Computed<unknown>; | ||
| }, import("react").Component<{ | ||
| fn: () => Computed<unknown>; | ||
| }, any, any>>; | ||
| export {}; |
+38
-24
@@ -1,27 +0,41 @@ | ||
| import { Fragment, useMemo, createElement, useEffect, useState } from 'react'; | ||
| export const useStatx = (state) => { | ||
| const [inner, setInner] = useState(state()); | ||
| useEffect(() => { | ||
| return state.subscribe(setInner); | ||
| }, []); | ||
| return inner; | ||
| import { createElement, PureComponent } from 'react'; | ||
| import { computed, state } from '@statx/core'; | ||
| class StatxComponent extends PureComponent { | ||
| unsub; | ||
| componentWillUnmount() { | ||
| this.unsub?.(); | ||
| } | ||
| componentDidMount() { | ||
| this.unsub = this.props.fn?.().subscribe(() => this.forceUpdate()); | ||
| } | ||
| render() { | ||
| return this.props.fn()(); | ||
| } | ||
| } | ||
| const setStateProps = (newProps, stateProps) => { | ||
| Object.entries(newProps).map((item) => { | ||
| if (item[0] in stateProps) { | ||
| stateProps[item[0]].set(item[1]); | ||
| } | ||
| else { | ||
| stateProps[item[0]] = state(item[1]); | ||
| } | ||
| }); | ||
| }; | ||
| export const useSXComponent = (state, f) => { | ||
| return useMemo(() => { | ||
| return createElement(() => { | ||
| const res = useStatx(state); | ||
| if (!res) { | ||
| return null; | ||
| } | ||
| if (f) { | ||
| const mappedResult = f(res); | ||
| return createElement(Fragment, {}, mappedResult); | ||
| } | ||
| if (typeof res === 'object') { | ||
| return createElement(Fragment, {}, JSON.stringify(res)); | ||
| } | ||
| return createElement(Fragment, {}, res.toString()); | ||
| }); | ||
| }, []); | ||
| export const statxComponent = (initFn, name) => { | ||
| let computedFn; | ||
| let inited = false; | ||
| const stateProps = {}; | ||
| const statxElement = createElement(StatxComponent, { | ||
| fn: () => computedFn, | ||
| }); | ||
| return (props) => { | ||
| setStateProps(props, stateProps); | ||
| if (!inited) { | ||
| computedFn = computed(initFn(stateProps), { name: `${name}.render` }); | ||
| inited = true; | ||
| } | ||
| return statxElement; | ||
| }; | ||
| }; | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AAG3E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAsB,KAAqB,EAAK,EAAE;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAI,KAAK,EAAE,CAAC,CAAA;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAqB,EACrB,CAA2B,EACb,EAAE;IAChB,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,OAAO,aAAa,CAAC,GAAG,EAAE;YACxB,MAAM,GAAG,GAAG,QAAQ,CAAI,KAAK,CAAC,CAAA;YAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,IAAI,CAAA;YACb,CAAC;YACD,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC3B,OAAO,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,CAAC,CAAA;YAClD,CAAC;YACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;YACzD,CAAC;YACD,OAAO,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAA"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,OAAO,CAAA;AAElD,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,aAAa,CAAA;AAS3C,MAAM,cAAmE,SAAQ,aAAmB;IAC1F,KAAK,CAAa;IAC1B,oBAAoB;QAClB,IAAI,CAAC,KAAK,EAAE,EAAE,CAAA;IAChB,CAAC;IACD,iBAAiB;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,MAAM,aAAa,GAAG,CAAC,QAAe,EAAE,UAAkB,EAAE,EAAE;IAC5D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACtC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,MAAqC,EACrC,IAAa,EACb,EAAE;IACF,IAAI,UAA6B,CAAA;IACjC,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,UAAU,GAAG,EAAO,CAAA;IAC1B,MAAM,YAAY,GAAG,aAAa,CAAC,cAAqB,EAAE;QACxD,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU;KACrB,CAAC,CAAA;IAEF,OAAO,CAAC,KAAY,EAAE,EAAE;QACtB,aAAa,CAAC,KAAK,EAAE,UAAoB,CAAC,CAAA;QAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAC,IAAI,EAAE,GAAG,IAAI,SAAS,EAAC,CAAC,CAAA;YACnE,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;QAED,OAAO,YAAY,CAAA;IACrB,CAAC,CAAA;AACH,CAAC,CAAA"} |
+3
-3
| { | ||
| "name": "@statx/react", | ||
| "version": "1.15.1", | ||
| "version": "1.15.2", | ||
| "private": false, | ||
@@ -53,3 +53,3 @@ "description": "Extry tiny smart statx manager", | ||
| "dependencies": { | ||
| "@statx/core": "^1.15.1" | ||
| "@statx/core": "^1.15.2" | ||
| }, | ||
@@ -69,3 +69,3 @@ "peerDependencies": { | ||
| }, | ||
| "gitHead": "8032cbbc175aade084789299df965673d922a2bb", | ||
| "gitHead": "a29e4c0753050c90c3c8783d37f9ae84191c00db", | ||
| "devDependencies": { | ||
@@ -72,0 +72,0 @@ "@types/react-dom": "^18.0.0", |
10237
8.93%194
12.79%Updated