react-rx 1.0.0-beta.4 → 1.0.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/.idea/vcs.xml +0 -3
- package/.idea/workspace.xml +18 -15
- package/dist/cjs/WithObservable.d.ts +3 -3
- package/dist/cjs/WithObservable.js +3 -3
- package/dist/cjs/index.d.ts +3 -2
- package/dist/cjs/index.js +9 -6
- package/dist/cjs/reactiveComponent.d.ts +6 -6
- package/dist/cjs/reactiveComponent.js +7 -26
- package/dist/cjs/useAsObservable.d.ts +1 -0
- package/dist/cjs/useAsObservable.js +10 -33
- package/dist/cjs/useIsomorphicEffect.d.ts +2 -0
- package/dist/cjs/useIsomorphicEffect.js +5 -0
- package/dist/cjs/useObservable.d.ts +6 -6
- package/dist/cjs/useObservable.js +8 -26
- package/dist/cjs/useObservableCallback.d.ts +3 -0
- package/dist/cjs/useObservableCallback.js +24 -0
- package/dist/cjs/useWithObservable.d.ts +9 -0
- package/dist/cjs/useWithObservable.js +11 -0
- package/dist/cjs/utils.d.ts +3 -3
- package/dist/cjs/utils.js +8 -27
- package/dist/cjs/withPropsStream.js +3 -3
- package/dist/es2015/WithObservable.d.ts +3 -3
- package/dist/es2015/index.d.ts +3 -2
- package/dist/es2015/index.js +4 -2
- package/dist/es2015/reactiveComponent.d.ts +6 -6
- package/dist/es2015/reactiveComponent.js +5 -5
- package/dist/es2015/useAsObservable.d.ts +1 -0
- package/dist/es2015/useAsObservable.js +10 -14
- package/dist/es2015/useIsomorphicEffect.d.ts +2 -0
- package/dist/es2015/useIsomorphicEffect.js +2 -0
- package/dist/es2015/useObservable.d.ts +6 -6
- package/dist/es2015/useObservable.js +8 -7
- package/dist/es2015/useObservableCallback.d.ts +3 -0
- package/dist/es2015/useObservableCallback.js +19 -0
- package/dist/es2015/useWithObservable.d.ts +9 -0
- package/dist/es2015/useWithObservable.js +7 -0
- package/dist/es2015/utils.d.ts +3 -3
- package/dist/es2015/utils.js +5 -5
- package/dist/esm/WithObservable.d.ts +3 -3
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.js +4 -2
- package/dist/esm/reactiveComponent.d.ts +6 -6
- package/dist/esm/reactiveComponent.js +5 -5
- package/dist/esm/useAsObservable.d.ts +1 -0
- package/dist/esm/useAsObservable.js +10 -14
- package/dist/esm/useIsomorphicEffect.d.ts +2 -0
- package/dist/esm/useIsomorphicEffect.js +2 -0
- package/dist/esm/useObservable.d.ts +6 -6
- package/dist/esm/useObservable.js +8 -7
- package/dist/esm/useObservableCallback.d.ts +3 -0
- package/dist/esm/useObservableCallback.js +20 -0
- package/dist/esm/useWithObservable.d.ts +9 -0
- package/dist/esm/useWithObservable.js +7 -0
- package/dist/esm/utils.d.ts +3 -3
- package/dist/esm/utils.js +5 -5
- package/package.json +3 -3
- package/src/WithObservable.tsx +4 -3
- package/src/index.ts +5 -4
- package/src/reactiveComponent.ts +24 -18
- package/src/useAsObservable.ts +18 -8
- package/src/useIsomorphicEffect.ts +3 -0
- package/src/useObservable.ts +17 -19
- package/src/useObservableCallback.ts +30 -0
- package/src/useWithObservable.ts +23 -0
- package/src/utils.ts +8 -8
- package/jest.config.js +0 -5
- package/website/.babelrc +0 -21
- package/website/.prettierrc +0 -7
- package/website/README.mdx +0 -1
- package/website/package.json +0 -84
- package/website/src/@types/babel.d.ts +0 -4
- package/website/src/@types/mdx.d.ts +0 -11
- package/website/src/@types/react-css-burger.d.ts +0 -4
- package/website/src/App.tsx +0 -68
- package/website/src/components/Header.tsx +0 -118
- package/website/src/components/Link.tsx +0 -18
- package/website/src/components/LoadPage.tsx +0 -60
- package/website/src/components/Sidebar.tsx +0 -88
- package/website/src/components/logos/Github.tsx +0 -10
- package/website/src/components/logos/React.tsx +0 -27
- package/website/src/components/logos/ReactRxLogo.tsx +0 -39
- package/website/src/components/logos/RxJs.tsx +0 -69
- package/website/src/components/repl/Checkerboard.tsx +0 -25
- package/website/src/components/repl/CodeBlock.tsx +0 -147
- package/website/src/components/repl/CodeMirror.tsx +0 -37
- package/website/src/components/repl/CodeMirrorMode.tsx +0 -67
- package/website/src/components/repl/EvalCode.tsx +0 -55
- package/website/src/components/repl/Prelude.tsx +0 -50
- package/website/src/components/repl/ShowError.tsx +0 -27
- package/website/src/components/repl/codemirror-lib.ts +0 -8
- package/website/src/components/repl/codemirror-theme.css +0 -131
- package/website/src/components/repl/compile/babel.ts +0 -21
- package/website/src/components/repl/eval/evalCallback.ts +0 -27
- package/website/src/components/repl/eval/evalCode.ts +0 -7
- package/website/src/components/repl/eval/evalExpression.ts +0 -4
- package/website/src/components/repl/eval/evalReactDomRender.ts +0 -23
- package/website/src/components/repl/index.ts +0 -1
- package/website/src/components/repl/runMode.ts +0 -42
- package/website/src/datastores/location.ts +0 -14
- package/website/src/datastores/page.ts +0 -11
- package/website/src/datastores/pageTransition.ts +0 -97
- package/website/src/entries/main.css +0 -2
- package/website/src/entries/main.tsx +0 -6
- package/website/src/examples/FizzBuzz/FizzBuzzExample.tsx +0 -39
- package/website/src/examples/FizzBuzz/index.tsx +0 -9
- package/website/src/examples/_utils/globalScope.ts +0 -45
- package/website/src/examples/animation/AnimationExample.tsx +0 -152
- package/website/src/examples/animation/easings.ts +0 -0
- package/website/src/examples/animation/index.tsx +0 -15
- package/website/src/examples/context/Context.example.jsx +0 -67
- package/website/src/examples/context/index.tsx +0 -9
- package/website/src/examples/errors/Errors.example.jsx +0 -69
- package/website/src/examples/errors/index.tsx +0 -9
- package/website/src/examples/event-handlers/EventHandlersExample.tsx +0 -48
- package/website/src/examples/event-handlers/index.tsx +0 -9
- package/website/src/examples/fetch/FetchExample.jsx +0 -43
- package/website/src/examples/fetch/a.txt +0 -1
- package/website/src/examples/fetch/b.txt +0 -1
- package/website/src/examples/fetch/index.tsx +0 -9
- package/website/src/examples/form-data/FormDataExample.jsx +0 -119
- package/website/src/examples/form-data/index.tsx +0 -12
- package/website/src/examples/form-data/storage.ts +0 -27
- package/website/src/examples/forward-ref/ForwardRefExample.tsx +0 -55
- package/website/src/examples/forward-ref/index.tsx +0 -9
- package/website/src/examples/hello-world/HelloWorld.example.jsx +0 -6
- package/website/src/examples/hello-world/index.tsx +0 -9
- package/website/src/examples/hooks-interop/HooksInterop.example.tsx +0 -42
- package/website/src/examples/hooks-interop/index.tsx +0 -9
- package/website/src/examples/passthrough-props/PassThroughPropsExample.jsx +0 -57
- package/website/src/examples/passthrough-props/index.tsx +0 -11
- package/website/src/examples/reactive-state/ReactiveState.example.jsx +0 -43
- package/website/src/examples/reactive-state/index.ts +0 -9
- package/website/src/examples/readme-examples/README.mdx +0 -0
- package/website/src/examples/readme-examples/index.ts +0 -11
- package/website/src/examples/shared-state/SharedState.example.tsx +0 -59
- package/website/src/examples/shared-state/index.tsx +0 -9
- package/website/src/examples/simple/Counter.example.tsx +0 -14
- package/website/src/examples/simple/index.tsx +0 -9
- package/website/src/examples/sync/Sync.example.tsx +0 -9
- package/website/src/examples/sync/index.tsx +0 -9
- package/website/src/examples/tick/TickExample.jsx +0 -51
- package/website/src/examples/tick/index.ts +0 -9
- package/website/src/examples/todo-app/TodoApp.example.tsx +0 -88
- package/website/src/examples/todo-app/index.tsx +0 -12
- package/website/src/examples/todo-app/storage.ts +0 -27
- package/website/src/examples/use-element/UseElementExample.tsx +0 -70
- package/website/src/examples/use-element/index.tsx +0 -9
- package/website/src/examples/use-observable/search/SearchExample.tsx +0 -82
- package/website/src/examples/use-observable/search/index.tsx +0 -8
- package/website/src/examples/use-observable/use-observable/UseObservableExample.tsx +0 -70
- package/website/src/examples/use-observable/use-observable/index.tsx +0 -9
- package/website/src/index.html +0 -10
- package/website/src/mdx-components.tsx +0 -74
- package/website/src/pages/Api/Api.mdx +0 -134
- package/website/src/pages/Api/ApiPage.tsx +0 -25
- package/website/src/pages/Examples/Examples.tsx +0 -105
- package/website/src/pages/Examples/ExamplesPage.tsx +0 -13
- package/website/src/pages/Guide/Guide.mdx +0 -275
- package/website/src/pages/Guide/GuidePage.tsx +0 -25
- package/website/src/pages/Index/IndexPage.tsx +0 -50
- package/website/src/pages/Index/ReactRxReadme.md +0 -20
- package/website/src/pages/NotFound.tsx +0 -3
- package/website/src/pages/pages.ts +0 -46
- package/website/src/pages/styles.tsx +0 -24
- package/website/src/theme.ts +0 -61
- package/website/src/utils/parseCodeFenceHeader.ts +0 -32
- package/website/tsconfig.json +0 -30
- package/website/vercel.json +0 -4
- package/website/webpack/config.js +0 -5
- package/website/webpack/createConfig.js +0 -95
- package/website/webpack/mdx-toc-loader.js +0 -38
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export declare function reactiveComponent<Props>(
|
|
6
|
-
declare
|
|
7
|
-
|
|
2
|
+
import { FunctionComponent, ReactNode, Ref } from 'react';
|
|
3
|
+
declare type Component<Props> = (input$: Observable<Props>) => Observable<ReactNode>;
|
|
4
|
+
export declare function reactiveComponent<Props>(observable: Observable<Props>): FunctionComponent<{}>;
|
|
5
|
+
export declare function reactiveComponent<Props>(component: Component<Props>): FunctionComponent<Props>;
|
|
6
|
+
declare type ForwardRefComponent<RefType, Props> = (input$: Observable<Props>, ref: Ref<RefType>) => Observable<ReactNode>;
|
|
7
|
+
export declare function forwardRef<RefType, Props = {}>(component: ForwardRefComponent<RefType, Props>): import("react").ForwardRefExoticComponent<import("react").PropsWithoutRef<Props> & import("react").RefAttributes<RefType>>;
|
|
8
8
|
export {};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { wrapDisplayName } from './displayName';
|
|
3
2
|
import { useAsObservable } from './useAsObservable';
|
|
4
3
|
import { useObservable } from './useObservable';
|
|
4
|
+
import { createElement, Fragment, useRef, forwardRef as reactForwardRef, } from 'react';
|
|
5
5
|
function fromComponent(component) {
|
|
6
6
|
const wrappedComponent = (props) => {
|
|
7
|
-
return
|
|
7
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props))).current));
|
|
8
8
|
};
|
|
9
9
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
10
10
|
return wrappedComponent;
|
|
11
11
|
}
|
|
12
12
|
function fromObservable(input$) {
|
|
13
13
|
return function ReactiveComponent() {
|
|
14
|
-
return
|
|
14
|
+
return createElement(Fragment, null, useObservable(input$));
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
export function reactiveComponent(observableOrComponent) {
|
|
@@ -20,8 +20,8 @@ export function reactiveComponent(observableOrComponent) {
|
|
|
20
20
|
: fromObservable(observableOrComponent);
|
|
21
21
|
}
|
|
22
22
|
export function forwardRef(component) {
|
|
23
|
-
const wrappedComponent =
|
|
24
|
-
return
|
|
23
|
+
const wrappedComponent = reactForwardRef((props, ref) => {
|
|
24
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props), ref)).current));
|
|
25
25
|
});
|
|
26
26
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
27
27
|
return wrappedComponent;
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import { BehaviorSubject } from 'rxjs';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*/
|
|
9
|
-
export function useAsObservable(value) {
|
|
10
|
-
const isInitial = React.useRef(true);
|
|
11
|
-
const subjectRef = React.useRef(new BehaviorSubject(value));
|
|
12
|
-
const observableRef = React.useRef();
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { useIsomorphicEffect } from './useIsomorphicEffect';
|
|
4
|
+
export function useAsObservable(value, operator) {
|
|
5
|
+
const isInitial = useRef(true);
|
|
6
|
+
const subjectRef = useRef(new BehaviorSubject(value));
|
|
7
|
+
const observableRef = useRef();
|
|
13
8
|
if (!observableRef.current) {
|
|
14
|
-
|
|
9
|
+
const observable = subjectRef.current.asObservable();
|
|
10
|
+
observableRef.current = operator ? observable.pipe(operator) : observable;
|
|
15
11
|
}
|
|
16
|
-
|
|
12
|
+
useIsomorphicEffect(() => {
|
|
17
13
|
if (isInitial.current) {
|
|
18
14
|
isInitial.current = false;
|
|
19
15
|
}
|
|
@@ -22,7 +18,7 @@ export function useAsObservable(value) {
|
|
|
22
18
|
subjectRef.current.next(value);
|
|
23
19
|
}
|
|
24
20
|
}, [value]);
|
|
25
|
-
|
|
21
|
+
useIsomorphicEffect(() => {
|
|
26
22
|
return () => {
|
|
27
23
|
return subjectRef.current.complete();
|
|
28
24
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
export declare function useObservable<T>(observable
|
|
5
|
-
export declare function useObservable<T>(observable
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps:
|
|
2
|
+
import { DependencyList } from 'react';
|
|
3
|
+
export declare function useObservable<T>(observable: Observable<T>): T | undefined;
|
|
4
|
+
export declare function useObservable<T>(observable: Observable<T>, initialValue: T): T;
|
|
5
|
+
export declare function useObservable<T>(observable: Observable<T>, initialValue: () => T): T;
|
|
6
|
+
export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList): T | undefined;
|
|
7
|
+
export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList, initialValue: T | (() => T)): T;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { useIsomorphicEffect } from './useIsomorphicEffect';
|
|
2
3
|
function getValue(value) {
|
|
3
4
|
return typeof value === 'function' ? value() : value;
|
|
4
5
|
}
|
|
5
6
|
export function useObservable(observable, initialValue) {
|
|
6
|
-
const subscription =
|
|
7
|
-
const isInitial =
|
|
8
|
-
const [value, setState] =
|
|
7
|
+
const subscription = useRef();
|
|
8
|
+
const isInitial = useRef(true);
|
|
9
|
+
const [value, setState] = useState(() => {
|
|
9
10
|
let isSync = true;
|
|
10
11
|
let syncVal = getValue(initialValue);
|
|
11
12
|
subscription.current = observable.subscribe(nextVal => {
|
|
@@ -19,8 +20,8 @@ export function useObservable(observable, initialValue) {
|
|
|
19
20
|
isSync = false;
|
|
20
21
|
return syncVal;
|
|
21
22
|
});
|
|
22
|
-
|
|
23
|
-
// when the observable
|
|
23
|
+
useIsomorphicEffect(() => {
|
|
24
|
+
// when the observable changes after initial (possibly sync render)
|
|
24
25
|
if (!isInitial.current) {
|
|
25
26
|
subscription.current = observable.subscribe(nextVal => setState(nextVal));
|
|
26
27
|
}
|
|
@@ -35,5 +36,5 @@ export function useObservable(observable, initialValue) {
|
|
|
35
36
|
return value;
|
|
36
37
|
}
|
|
37
38
|
export function useMemoObservable(observableOrFactory, deps, initialValue) {
|
|
38
|
-
return useObservable(
|
|
39
|
+
return useObservable(useMemo(() => getValue(observableOrFactory), deps), initialValue);
|
|
39
40
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import { observableCallback } from 'observable-callback';
|
|
3
|
+
const EMPTY_DEPS = [];
|
|
4
|
+
export function useObservableCallback(fn, dependencies = EMPTY_DEPS) {
|
|
5
|
+
const callbackRef = useRef();
|
|
6
|
+
if (!callbackRef.current) {
|
|
7
|
+
callbackRef.current = observableCallback();
|
|
8
|
+
}
|
|
9
|
+
const [calls$, call] = callbackRef.current;
|
|
10
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
11
|
+
const callback = useCallback(fn, dependencies);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const subscription = calls$.pipe(callback).subscribe();
|
|
14
|
+
return () => {
|
|
15
|
+
subscription.unsubscribe();
|
|
16
|
+
};
|
|
17
|
+
}, [calls$, call, callback]);
|
|
18
|
+
return call;
|
|
19
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* React hook to convert any props or state value into an observable
|
|
4
|
+
* Returns an observable representing updates to any React value (props, state or any other calculated value)
|
|
5
|
+
* Note: the returned observable is the same instance throughout the component lifecycle
|
|
6
|
+
* @param value
|
|
7
|
+
*/
|
|
8
|
+
export declare function useWithObservable<T>(value: T): T | undefined;
|
|
9
|
+
export declare function useWithObservable<T, K>(value: T, operator: (input: Observable<T>) => Observable<K>): K | undefined;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { useObservable } from './useObservable';
|
|
2
|
+
import { useAsObservable } from './useAsObservable';
|
|
3
|
+
export function useWithObservable(value, operator) {
|
|
4
|
+
return operator
|
|
5
|
+
? useObservable(useAsObservable(value, operator))
|
|
6
|
+
: useObservable(useAsObservable(value));
|
|
7
|
+
}
|
package/dist/es2015/utils.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Observable, OperatorFunction } from 'rxjs';
|
|
2
|
-
import
|
|
3
|
-
export declare function observeState<T>(initial: T | (() => T)): [Observable<T>,
|
|
2
|
+
import { Dispatch, SetStateAction, Context } from 'react';
|
|
3
|
+
export declare function observeState<T>(initial: T | (() => T)): [Observable<T>, Dispatch<SetStateAction<T>>];
|
|
4
4
|
export declare function observeCallback<T>(): [Observable<T>, (arg: T) => void];
|
|
5
5
|
export declare function observeCallback<T, K>(operator: OperatorFunction<T, K>): [Observable<K>, (arg: T) => void];
|
|
6
|
-
export declare function observeContext<T>(context:
|
|
6
|
+
export declare function observeContext<T>(context: Context<T>): Observable<T>;
|
|
7
7
|
export declare function observeElement<T>(): [Observable<T | null>, (el: T | null) => void];
|
package/dist/es2015/utils.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { useAsObservable } from './useAsObservable';
|
|
3
2
|
import { observableCallback } from 'observable-callback';
|
|
4
3
|
import { startWith } from 'rxjs/operators';
|
|
4
|
+
import { useContext, useRef, useState } from 'react';
|
|
5
5
|
const createState = (initialState) => observableCallback(startWith(initialState));
|
|
6
6
|
export function observeState(initial) {
|
|
7
|
-
const [value, update] =
|
|
7
|
+
const [value, update] = useState(initial);
|
|
8
8
|
return [useAsObservable(value), update];
|
|
9
9
|
}
|
|
10
10
|
export function observeCallback(operator) {
|
|
11
|
-
const ref =
|
|
11
|
+
const ref = useRef();
|
|
12
12
|
if (!ref.current) {
|
|
13
13
|
ref.current = operator ? observableCallback(operator) : observableCallback();
|
|
14
14
|
}
|
|
15
15
|
return ref.current;
|
|
16
16
|
}
|
|
17
17
|
export function observeContext(context) {
|
|
18
|
-
return useAsObservable(
|
|
18
|
+
return useAsObservable(useContext(context));
|
|
19
19
|
}
|
|
20
20
|
export function observeElement() {
|
|
21
|
-
const ref =
|
|
21
|
+
const ref = useRef();
|
|
22
22
|
if (!ref.current) {
|
|
23
23
|
ref.current = createState(null);
|
|
24
24
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
2
|
+
import { ComponentType, ReactNode } from 'react';
|
|
3
3
|
interface Props<T> {
|
|
4
4
|
observable: Observable<T>;
|
|
5
|
-
children: (value: T) =>
|
|
5
|
+
children: (value: T) => ReactNode;
|
|
6
6
|
}
|
|
7
|
-
declare type ObservableComponent<T> =
|
|
7
|
+
declare type ObservableComponent<T> = ComponentType<Props<T>>;
|
|
8
8
|
/**
|
|
9
9
|
* @deprecated Use the useObservable hook instead
|
|
10
10
|
*/
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
|
|
2
|
-
export { useObservable, useMemoObservable } from './useObservable';
|
|
3
|
-
export { useAsObservable } from './useAsObservable';
|
|
4
2
|
export { observeState, observeCallback, observeContext, observeElement } from './utils';
|
|
5
3
|
export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
|
|
6
4
|
export { observableCallback } from 'observable-callback';
|
|
5
|
+
export { useObservable, useMemoObservable } from './useObservable';
|
|
6
|
+
export { useAsObservable } from './useAsObservable';
|
|
7
|
+
export { useObservableCallback } from './useObservableCallback';
|
package/dist/esm/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// Main package exports
|
|
2
2
|
export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
|
|
3
|
-
export { useObservable, useMemoObservable } from './useObservable';
|
|
4
|
-
export { useAsObservable } from './useAsObservable';
|
|
5
3
|
export { observeState, observeCallback, observeContext, observeElement } from './utils';
|
|
6
4
|
export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
|
|
7
5
|
export { observableCallback } from 'observable-callback';
|
|
6
|
+
// hooks
|
|
7
|
+
export { useObservable, useMemoObservable } from './useObservable';
|
|
8
|
+
export { useAsObservable } from './useAsObservable';
|
|
9
|
+
export { useObservableCallback } from './useObservableCallback';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export declare function reactiveComponent<Props>(
|
|
6
|
-
declare
|
|
7
|
-
|
|
2
|
+
import { FunctionComponent, ReactNode, Ref } from 'react';
|
|
3
|
+
declare type Component<Props> = (input$: Observable<Props>) => Observable<ReactNode>;
|
|
4
|
+
export declare function reactiveComponent<Props>(observable: Observable<Props>): FunctionComponent<{}>;
|
|
5
|
+
export declare function reactiveComponent<Props>(component: Component<Props>): FunctionComponent<Props>;
|
|
6
|
+
declare type ForwardRefComponent<RefType, Props> = (input$: Observable<Props>, ref: Ref<RefType>) => Observable<ReactNode>;
|
|
7
|
+
export declare function forwardRef<RefType, Props = {}>(component: ForwardRefComponent<RefType, Props>): import("react").ForwardRefExoticComponent<import("react").PropsWithoutRef<Props> & import("react").RefAttributes<RefType>>;
|
|
8
8
|
export {};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { wrapDisplayName } from './displayName';
|
|
3
2
|
import { useAsObservable } from './useAsObservable';
|
|
4
3
|
import { useObservable } from './useObservable';
|
|
4
|
+
import { createElement, Fragment, useRef, forwardRef as reactForwardRef, } from 'react';
|
|
5
5
|
function fromComponent(component) {
|
|
6
6
|
var wrappedComponent = function (props) {
|
|
7
|
-
return
|
|
7
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props))).current));
|
|
8
8
|
};
|
|
9
9
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
10
10
|
return wrappedComponent;
|
|
11
11
|
}
|
|
12
12
|
function fromObservable(input$) {
|
|
13
13
|
return function ReactiveComponent() {
|
|
14
|
-
return
|
|
14
|
+
return createElement(Fragment, null, useObservable(input$));
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
export function reactiveComponent(observableOrComponent) {
|
|
@@ -20,8 +20,8 @@ export function reactiveComponent(observableOrComponent) {
|
|
|
20
20
|
: fromObservable(observableOrComponent);
|
|
21
21
|
}
|
|
22
22
|
export function forwardRef(component) {
|
|
23
|
-
var wrappedComponent =
|
|
24
|
-
return
|
|
23
|
+
var wrappedComponent = reactForwardRef(function (props, ref) {
|
|
24
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props), ref)).current));
|
|
25
25
|
});
|
|
26
26
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
27
27
|
return wrappedComponent;
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import { BehaviorSubject } from 'rxjs';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*/
|
|
9
|
-
export function useAsObservable(value) {
|
|
10
|
-
var isInitial = React.useRef(true);
|
|
11
|
-
var subjectRef = React.useRef(new BehaviorSubject(value));
|
|
12
|
-
var observableRef = React.useRef();
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { useIsomorphicEffect } from './useIsomorphicEffect';
|
|
4
|
+
export function useAsObservable(value, operator) {
|
|
5
|
+
var isInitial = useRef(true);
|
|
6
|
+
var subjectRef = useRef(new BehaviorSubject(value));
|
|
7
|
+
var observableRef = useRef();
|
|
13
8
|
if (!observableRef.current) {
|
|
14
|
-
|
|
9
|
+
var observable = subjectRef.current.asObservable();
|
|
10
|
+
observableRef.current = operator ? observable.pipe(operator) : observable;
|
|
15
11
|
}
|
|
16
|
-
|
|
12
|
+
useIsomorphicEffect(function () {
|
|
17
13
|
if (isInitial.current) {
|
|
18
14
|
isInitial.current = false;
|
|
19
15
|
}
|
|
@@ -22,7 +18,7 @@ export function useAsObservable(value) {
|
|
|
22
18
|
subjectRef.current.next(value);
|
|
23
19
|
}
|
|
24
20
|
}, [value]);
|
|
25
|
-
|
|
21
|
+
useIsomorphicEffect(function () {
|
|
26
22
|
return function () {
|
|
27
23
|
return subjectRef.current.complete();
|
|
28
24
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
export declare function useObservable<T>(observable
|
|
5
|
-
export declare function useObservable<T>(observable
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps:
|
|
2
|
+
import { DependencyList } from 'react';
|
|
3
|
+
export declare function useObservable<T>(observable: Observable<T>): T | undefined;
|
|
4
|
+
export declare function useObservable<T>(observable: Observable<T>, initialValue: T): T;
|
|
5
|
+
export declare function useObservable<T>(observable: Observable<T>, initialValue: () => T): T;
|
|
6
|
+
export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList): T | undefined;
|
|
7
|
+
export declare function useMemoObservable<T>(observableOrFactory: Observable<T> | (() => Observable<T>), deps: DependencyList, initialValue: T | (() => T)): T;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { useIsomorphicEffect } from './useIsomorphicEffect';
|
|
2
3
|
function getValue(value) {
|
|
3
4
|
return typeof value === 'function' ? value() : value;
|
|
4
5
|
}
|
|
5
6
|
export function useObservable(observable, initialValue) {
|
|
6
|
-
var subscription =
|
|
7
|
-
var isInitial =
|
|
8
|
-
var _a =
|
|
7
|
+
var subscription = useRef();
|
|
8
|
+
var isInitial = useRef(true);
|
|
9
|
+
var _a = useState(function () {
|
|
9
10
|
var isSync = true;
|
|
10
11
|
var syncVal = getValue(initialValue);
|
|
11
12
|
subscription.current = observable.subscribe(function (nextVal) {
|
|
@@ -19,8 +20,8 @@ export function useObservable(observable, initialValue) {
|
|
|
19
20
|
isSync = false;
|
|
20
21
|
return syncVal;
|
|
21
22
|
}), value = _a[0], setState = _a[1];
|
|
22
|
-
|
|
23
|
-
// when the observable
|
|
23
|
+
useIsomorphicEffect(function () {
|
|
24
|
+
// when the observable changes after initial (possibly sync render)
|
|
24
25
|
if (!isInitial.current) {
|
|
25
26
|
subscription.current = observable.subscribe(function (nextVal) { return setState(nextVal); });
|
|
26
27
|
}
|
|
@@ -35,5 +36,5 @@ export function useObservable(observable, initialValue) {
|
|
|
35
36
|
return value;
|
|
36
37
|
}
|
|
37
38
|
export function useMemoObservable(observableOrFactory, deps, initialValue) {
|
|
38
|
-
return useObservable(
|
|
39
|
+
return useObservable(useMemo(function () { return getValue(observableOrFactory); }, deps), initialValue);
|
|
39
40
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import { observableCallback } from 'observable-callback';
|
|
3
|
+
var EMPTY_DEPS = [];
|
|
4
|
+
export function useObservableCallback(fn, dependencies) {
|
|
5
|
+
if (dependencies === void 0) { dependencies = EMPTY_DEPS; }
|
|
6
|
+
var callbackRef = useRef();
|
|
7
|
+
if (!callbackRef.current) {
|
|
8
|
+
callbackRef.current = observableCallback();
|
|
9
|
+
}
|
|
10
|
+
var _a = callbackRef.current, calls$ = _a[0], call = _a[1];
|
|
11
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
12
|
+
var callback = useCallback(fn, dependencies);
|
|
13
|
+
useEffect(function () {
|
|
14
|
+
var subscription = calls$.pipe(callback).subscribe();
|
|
15
|
+
return function () {
|
|
16
|
+
subscription.unsubscribe();
|
|
17
|
+
};
|
|
18
|
+
}, [calls$, call, callback]);
|
|
19
|
+
return call;
|
|
20
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* React hook to convert any props or state value into an observable
|
|
4
|
+
* Returns an observable representing updates to any React value (props, state or any other calculated value)
|
|
5
|
+
* Note: the returned observable is the same instance throughout the component lifecycle
|
|
6
|
+
* @param value
|
|
7
|
+
*/
|
|
8
|
+
export declare function useWithObservable<T>(value: T): T | undefined;
|
|
9
|
+
export declare function useWithObservable<T, K>(value: T, operator: (input: Observable<T>) => Observable<K>): K | undefined;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { useObservable } from './useObservable';
|
|
2
|
+
import { useAsObservable } from './useAsObservable';
|
|
3
|
+
export function useWithObservable(value, operator) {
|
|
4
|
+
return operator
|
|
5
|
+
? useObservable(useAsObservable(value, operator))
|
|
6
|
+
: useObservable(useAsObservable(value));
|
|
7
|
+
}
|
package/dist/esm/utils.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Observable, OperatorFunction } from 'rxjs';
|
|
2
|
-
import
|
|
3
|
-
export declare function observeState<T>(initial: T | (() => T)): [Observable<T>,
|
|
2
|
+
import { Dispatch, SetStateAction, Context } from 'react';
|
|
3
|
+
export declare function observeState<T>(initial: T | (() => T)): [Observable<T>, Dispatch<SetStateAction<T>>];
|
|
4
4
|
export declare function observeCallback<T>(): [Observable<T>, (arg: T) => void];
|
|
5
5
|
export declare function observeCallback<T, K>(operator: OperatorFunction<T, K>): [Observable<K>, (arg: T) => void];
|
|
6
|
-
export declare function observeContext<T>(context:
|
|
6
|
+
export declare function observeContext<T>(context: Context<T>): Observable<T>;
|
|
7
7
|
export declare function observeElement<T>(): [Observable<T | null>, (el: T | null) => void];
|
package/dist/esm/utils.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { useAsObservable } from './useAsObservable';
|
|
3
2
|
import { observableCallback } from 'observable-callback';
|
|
4
3
|
import { startWith } from 'rxjs/operators';
|
|
4
|
+
import { useContext, useRef, useState } from 'react';
|
|
5
5
|
var createState = function (initialState) { return observableCallback(startWith(initialState)); };
|
|
6
6
|
export function observeState(initial) {
|
|
7
|
-
var _a =
|
|
7
|
+
var _a = useState(initial), value = _a[0], update = _a[1];
|
|
8
8
|
return [useAsObservable(value), update];
|
|
9
9
|
}
|
|
10
10
|
export function observeCallback(operator) {
|
|
11
|
-
var ref =
|
|
11
|
+
var ref = useRef();
|
|
12
12
|
if (!ref.current) {
|
|
13
13
|
ref.current = operator ? observableCallback(operator) : observableCallback();
|
|
14
14
|
}
|
|
15
15
|
return ref.current;
|
|
16
16
|
}
|
|
17
17
|
export function observeContext(context) {
|
|
18
|
-
return useAsObservable(
|
|
18
|
+
return useAsObservable(useContext(context));
|
|
19
19
|
}
|
|
20
20
|
export function observeElement() {
|
|
21
|
-
var ref =
|
|
21
|
+
var ref = useRef();
|
|
22
22
|
if (!ref.current) {
|
|
23
23
|
ref.current = createState(null);
|
|
24
24
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-rx",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "React + RxJS = <3",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"types": "dist/cjs/index.d.ts",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"observable-callback": "^1.0.1"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"react": "
|
|
29
|
-
"rxjs": "^6"
|
|
28
|
+
"react": "^16.8 || ^17",
|
|
29
|
+
"rxjs": "^6.5 || ^7"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@testing-library/dom": "^7.29.6",
|
package/src/WithObservable.tsx
CHANGED
|
@@ -2,20 +2,21 @@ import * as React from 'react'
|
|
|
2
2
|
import {Observable} from 'rxjs'
|
|
3
3
|
import {distinctUntilChanged, map, switchMap} from 'rxjs/operators'
|
|
4
4
|
import {reactiveComponent} from './reactiveComponent'
|
|
5
|
+
import {ComponentType, ReactNode} from 'react'
|
|
5
6
|
|
|
6
7
|
interface Props<T> {
|
|
7
8
|
observable: Observable<T>
|
|
8
|
-
children: (value: T) =>
|
|
9
|
+
children: (value: T) => ReactNode
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
type ObservableComponent<T> =
|
|
12
|
+
type ObservableComponent<T> = ComponentType<Props<T>>
|
|
12
13
|
|
|
13
14
|
function createWithObservable<T>(): ObservableComponent<T> {
|
|
14
15
|
return reactiveComponent((props$: Observable<Props<T>>) =>
|
|
15
16
|
props$.pipe(
|
|
16
17
|
distinctUntilChanged((props, prevProps) => props.observable === prevProps.observable),
|
|
17
18
|
switchMap(
|
|
18
|
-
(props): Observable<
|
|
19
|
+
(props): Observable<ReactNode> =>
|
|
19
20
|
props.observable.pipe(map((observableValue: T) => props.children(observableValue))),
|
|
20
21
|
),
|
|
21
22
|
),
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
// Main package exports
|
|
2
2
|
export {reactiveComponent, reactiveComponent as rxComponent, forwardRef} from './reactiveComponent'
|
|
3
|
-
|
|
4
|
-
export {useObservable, useMemoObservable} from './useObservable'
|
|
5
|
-
|
|
6
|
-
export {useAsObservable} from './useAsObservable'
|
|
7
3
|
export {observeState, observeCallback, observeContext, observeElement} from './utils'
|
|
8
4
|
export {
|
|
9
5
|
observeState as state,
|
|
@@ -12,3 +8,8 @@ export {
|
|
|
12
8
|
observeElement as elementRef,
|
|
13
9
|
} from './utils'
|
|
14
10
|
export {observableCallback} from 'observable-callback'
|
|
11
|
+
|
|
12
|
+
// hooks
|
|
13
|
+
export {useObservable, useMemoObservable} from './useObservable'
|
|
14
|
+
export {useAsObservable} from './useAsObservable'
|
|
15
|
+
export {useObservableCallback} from './useObservableCallback'
|