react-rx 1.0.0-beta.3 → 1.0.0
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/codeStyles/Project.xml +0 -6
- package/.idea/inspectionProfiles/Project_Default.xml +0 -4
- package/.idea/workspace.xml +62 -49
- package/dist/cjs/WithObservable.d.ts +3 -3
- package/dist/cjs/WithObservable.js +3 -3
- package/dist/cjs/index.d.ts +6 -2
- package/dist/cjs/index.js +18 -11
- package/dist/cjs/reactiveComponent.d.ts +6 -6
- package/dist/cjs/reactiveComponent.js +8 -26
- package/dist/cjs/useAsObservable.d.ts +9 -0
- package/dist/cjs/useAsObservable.js +31 -0
- package/dist/cjs/useIsomorphicEffect.d.ts +2 -0
- package/dist/cjs/useIsomorphicEffect.js +5 -0
- package/dist/cjs/useObservable.d.ts +6 -15
- package/dist/cjs/useObservable.js +17 -73
- 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 +7 -3
- package/dist/cjs/utils.js +29 -5
- package/dist/cjs/withPropsStream.js +3 -3
- package/dist/es2015/WithObservable.d.ts +3 -3
- package/dist/es2015/index.d.ts +6 -2
- package/dist/es2015/index.js +7 -2
- package/dist/es2015/reactiveComponent.d.ts +6 -6
- package/dist/es2015/reactiveComponent.js +9 -6
- package/dist/es2015/useAsObservable.d.ts +9 -0
- package/dist/es2015/useAsObservable.js +27 -0
- package/dist/es2015/useIsomorphicEffect.d.ts +2 -0
- package/dist/es2015/useIsomorphicEffect.js +2 -0
- package/dist/es2015/useObservable.d.ts +6 -15
- package/dist/es2015/useObservable.js +15 -46
- 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 +7 -3
- package/dist/es2015/utils.js +24 -3
- package/dist/esm/WithObservable.d.ts +3 -3
- package/dist/esm/index.d.ts +6 -2
- package/dist/esm/index.js +7 -2
- package/dist/esm/reactiveComponent.d.ts +6 -6
- package/dist/esm/reactiveComponent.js +7 -6
- package/dist/esm/useAsObservable.d.ts +9 -0
- package/dist/esm/useAsObservable.js +27 -0
- package/dist/esm/useIsomorphicEffect.d.ts +2 -0
- package/dist/esm/useIsomorphicEffect.js +2 -0
- package/dist/esm/useObservable.d.ts +6 -15
- package/dist/esm/useObservable.js +15 -48
- 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 +7 -3
- package/dist/esm/utils.js +24 -3
- package/package.json +9 -4
- package/src/WithObservable.tsx +4 -3
- package/src/index.ts +12 -12
- package/src/reactiveComponent.ts +28 -20
- package/src/useAsObservable.ts +43 -0
- package/src/useIsomorphicEffect.ts +3 -0
- package/src/useObservable.ts +36 -77
- package/src/useObservableCallback.ts +30 -0
- package/src/useWithObservable.ts +23 -0
- package/src/utils.ts +39 -3
- package/website/.babelrc +21 -0
- package/website/.prettierrc +7 -0
- package/website/README.mdx +1 -0
- package/website/package.json +84 -0
- package/website/src/@types/babel.d.ts +4 -0
- package/website/src/@types/mdx.d.ts +11 -0
- package/website/src/@types/react-css-burger.d.ts +4 -0
- package/website/src/App.tsx +68 -0
- package/website/src/components/Header.tsx +118 -0
- package/website/src/components/Link.tsx +18 -0
- package/website/src/components/LoadPage.tsx +60 -0
- package/website/src/components/Sidebar.tsx +88 -0
- package/website/src/components/logos/Github.tsx +10 -0
- package/website/src/components/logos/React.tsx +27 -0
- package/website/src/components/logos/ReactRxLogo.tsx +39 -0
- package/website/src/components/logos/RxJs.tsx +69 -0
- package/website/src/components/repl/Checkerboard.tsx +25 -0
- package/website/src/components/repl/CodeBlock.tsx +147 -0
- package/website/src/components/repl/CodeMirror.tsx +37 -0
- package/website/src/components/repl/CodeMirrorMode.tsx +67 -0
- package/website/src/components/repl/EvalCode.tsx +55 -0
- package/website/src/components/repl/Prelude.tsx +50 -0
- package/website/src/components/repl/ShowError.tsx +27 -0
- package/website/src/components/repl/codemirror-lib.ts +8 -0
- package/website/src/components/repl/codemirror-theme.css +131 -0
- package/website/src/components/repl/compile/babel.ts +21 -0
- package/website/src/components/repl/eval/evalCallback.ts +27 -0
- package/website/src/components/repl/eval/evalCode.ts +7 -0
- package/website/src/components/repl/eval/evalExpression.ts +4 -0
- package/website/src/components/repl/eval/evalReactDomRender.ts +23 -0
- package/website/src/components/repl/index.ts +1 -0
- package/website/src/components/repl/runMode.ts +42 -0
- package/website/src/datastores/location.ts +14 -0
- package/website/src/datastores/page.ts +11 -0
- package/website/src/datastores/pageTransition.ts +97 -0
- package/website/src/entries/main.css +2 -0
- package/website/src/entries/main.tsx +6 -0
- package/website/src/examples/FizzBuzz/FizzBuzzExample.tsx +39 -0
- package/website/src/examples/FizzBuzz/index.tsx +9 -0
- package/website/src/examples/_utils/globalScope.ts +45 -0
- package/website/src/examples/animation/AnimationExample.tsx +152 -0
- package/website/src/examples/animation/easings.ts +0 -0
- package/website/src/examples/animation/index.tsx +15 -0
- package/website/src/examples/context/Context.example.jsx +67 -0
- package/website/src/examples/context/index.tsx +9 -0
- package/website/src/examples/errors/Errors.example.jsx +69 -0
- package/website/src/examples/errors/index.tsx +9 -0
- package/website/src/examples/event-handlers/EventHandlersExample.tsx +48 -0
- package/website/src/examples/event-handlers/index.tsx +9 -0
- package/website/src/examples/fetch/FetchExample.jsx +43 -0
- package/website/src/examples/fetch/a.txt +1 -0
- package/website/src/examples/fetch/b.txt +1 -0
- package/website/src/examples/fetch/index.tsx +9 -0
- package/website/src/examples/form-data/FormDataExample.jsx +119 -0
- package/website/src/examples/form-data/index.tsx +12 -0
- package/website/src/examples/form-data/storage.ts +27 -0
- package/website/src/examples/forward-ref/ForwardRefExample.tsx +55 -0
- package/website/src/examples/forward-ref/index.tsx +9 -0
- package/website/src/examples/hello-world/HelloWorld.example.jsx +6 -0
- package/website/src/examples/hello-world/index.tsx +9 -0
- package/website/src/examples/hooks-interop/HooksInterop.example.tsx +42 -0
- package/website/src/examples/hooks-interop/index.tsx +9 -0
- package/website/src/examples/passthrough-props/PassThroughPropsExample.jsx +57 -0
- package/website/src/examples/passthrough-props/index.tsx +11 -0
- package/website/src/examples/reactive-state/ReactiveState.example.jsx +43 -0
- package/website/src/examples/reactive-state/index.ts +9 -0
- package/website/src/examples/readme-examples/README.mdx +0 -0
- package/website/src/examples/readme-examples/index.ts +11 -0
- package/website/src/examples/shared-state/SharedState.example.tsx +59 -0
- package/website/src/examples/shared-state/index.tsx +9 -0
- package/website/src/examples/simple/Counter.example.tsx +14 -0
- package/website/src/examples/simple/index.tsx +9 -0
- package/website/src/examples/sync/Sync.example.tsx +9 -0
- package/website/src/examples/sync/index.tsx +9 -0
- package/website/src/examples/tick/TickExample.jsx +51 -0
- package/website/src/examples/tick/index.ts +9 -0
- package/website/src/examples/todo-app/TodoApp.example.tsx +88 -0
- package/website/src/examples/todo-app/index.tsx +12 -0
- package/website/src/examples/todo-app/storage.ts +27 -0
- package/website/src/examples/use-element/UseElementExample.tsx +70 -0
- package/website/src/examples/use-element/index.tsx +9 -0
- package/website/src/examples/use-observable/search/SearchExample.tsx +82 -0
- package/website/src/examples/use-observable/search/index.tsx +8 -0
- package/website/src/examples/use-observable/use-observable/UseObservableExample.tsx +70 -0
- package/website/src/examples/use-observable/use-observable/index.tsx +9 -0
- package/website/src/index.html +10 -0
- package/website/src/mdx-components.tsx +74 -0
- package/website/src/pages/Api/Api.mdx +134 -0
- package/website/src/pages/Api/ApiPage.tsx +25 -0
- package/website/src/pages/Examples/Examples.tsx +105 -0
- package/website/src/pages/Examples/ExamplesPage.tsx +13 -0
- package/website/src/pages/Guide/Guide.mdx +275 -0
- package/website/src/pages/Guide/GuidePage.tsx +25 -0
- package/website/src/pages/Index/IndexPage.tsx +50 -0
- package/website/src/pages/Index/ReactRxReadme.md +20 -0
- package/website/src/pages/NotFound.tsx +3 -0
- package/website/src/pages/pages.ts +46 -0
- package/website/src/pages/styles.tsx +24 -0
- package/website/src/theme.ts +61 -0
- package/website/src/utils/parseCodeFenceHeader.ts +32 -0
- package/website/tsconfig.json +30 -0
- package/website/vercel.json +4 -0
- package/website/webpack/config.js +5 -0
- package/website/webpack/createConfig.js +95 -0
- package/website/webpack/mdx-toc-loader.js +38 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useObservableCallback = void 0;
|
|
4
|
+
var react_1 = require("react");
|
|
5
|
+
var observable_callback_1 = require("observable-callback");
|
|
6
|
+
var EMPTY_DEPS = [];
|
|
7
|
+
function useObservableCallback(fn, dependencies) {
|
|
8
|
+
if (dependencies === void 0) { dependencies = EMPTY_DEPS; }
|
|
9
|
+
var callbackRef = (0, react_1.useRef)();
|
|
10
|
+
if (!callbackRef.current) {
|
|
11
|
+
callbackRef.current = (0, observable_callback_1.observableCallback)();
|
|
12
|
+
}
|
|
13
|
+
var _a = callbackRef.current, calls$ = _a[0], call = _a[1];
|
|
14
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
15
|
+
var callback = (0, react_1.useCallback)(fn, dependencies);
|
|
16
|
+
(0, react_1.useEffect)(function () {
|
|
17
|
+
var subscription = calls$.pipe(callback).subscribe();
|
|
18
|
+
return function () {
|
|
19
|
+
subscription.unsubscribe();
|
|
20
|
+
};
|
|
21
|
+
}, [calls$, call, callback]);
|
|
22
|
+
return call;
|
|
23
|
+
}
|
|
24
|
+
exports.useObservableCallback = useObservableCallback;
|
|
@@ -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,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useWithObservable = void 0;
|
|
4
|
+
var useObservable_1 = require("./useObservable");
|
|
5
|
+
var useAsObservable_1 = require("./useAsObservable");
|
|
6
|
+
function useWithObservable(value, operator) {
|
|
7
|
+
return operator
|
|
8
|
+
? (0, useObservable_1.useObservable)((0, useAsObservable_1.useAsObservable)(value, operator))
|
|
9
|
+
: (0, useObservable_1.useObservable)((0, useAsObservable_1.useAsObservable)(value));
|
|
10
|
+
}
|
|
11
|
+
exports.useWithObservable = useWithObservable;
|
package/dist/cjs/utils.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare
|
|
1
|
+
import { Observable, OperatorFunction } from 'rxjs';
|
|
2
|
+
import { Dispatch, SetStateAction, Context } from 'react';
|
|
3
|
+
export declare function observeState<T>(initial: T | (() => T)): [Observable<T>, Dispatch<SetStateAction<T>>];
|
|
4
|
+
export declare function observeCallback<T>(): [Observable<T>, (arg: T) => void];
|
|
5
|
+
export declare function observeCallback<T, K>(operator: OperatorFunction<T, K>): [Observable<K>, (arg: T) => void];
|
|
6
|
+
export declare function observeContext<T>(context: Context<T>): Observable<T>;
|
|
7
|
+
export declare function observeElement<T>(): [Observable<T | null>, (el: T | null) => void];
|
package/dist/cjs/utils.js
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.observeElement = exports.observeContext = exports.observeCallback = exports.observeState = void 0;
|
|
4
|
+
var useAsObservable_1 = require("./useAsObservable");
|
|
4
5
|
var observable_callback_1 = require("observable-callback");
|
|
5
6
|
var operators_1 = require("rxjs/operators");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
var react_1 = require("react");
|
|
8
|
+
var createState = function (initialState) { return (0, observable_callback_1.observableCallback)((0, operators_1.startWith)(initialState)); };
|
|
9
|
+
function observeState(initial) {
|
|
10
|
+
var _a = (0, react_1.useState)(initial), value = _a[0], update = _a[1];
|
|
11
|
+
return [(0, useAsObservable_1.useAsObservable)(value), update];
|
|
12
|
+
}
|
|
13
|
+
exports.observeState = observeState;
|
|
14
|
+
function observeCallback(operator) {
|
|
15
|
+
var ref = (0, react_1.useRef)();
|
|
16
|
+
if (!ref.current) {
|
|
17
|
+
ref.current = operator ? (0, observable_callback_1.observableCallback)(operator) : (0, observable_callback_1.observableCallback)();
|
|
18
|
+
}
|
|
19
|
+
return ref.current;
|
|
20
|
+
}
|
|
21
|
+
exports.observeCallback = observeCallback;
|
|
22
|
+
function observeContext(context) {
|
|
23
|
+
return (0, useAsObservable_1.useAsObservable)((0, react_1.useContext)(context));
|
|
24
|
+
}
|
|
25
|
+
exports.observeContext = observeContext;
|
|
26
|
+
function observeElement() {
|
|
27
|
+
var ref = (0, react_1.useRef)();
|
|
28
|
+
if (!ref.current) {
|
|
29
|
+
ref.current = createState(null);
|
|
30
|
+
}
|
|
31
|
+
return ref.current;
|
|
32
|
+
}
|
|
33
|
+
exports.observeElement = observeElement;
|
|
@@ -39,13 +39,13 @@ var reactiveComponent_1 = require("./reactiveComponent");
|
|
|
39
39
|
* @deprecated Use reactiveComponent instead
|
|
40
40
|
*/
|
|
41
41
|
function withPropsStream(observableOrFactory, TargetComponent) {
|
|
42
|
-
var ComposedComponent = reactiveComponent_1.reactiveComponent(function (sourceProps$) {
|
|
42
|
+
var ComposedComponent = (0, reactiveComponent_1.reactiveComponent)(function (sourceProps$) {
|
|
43
43
|
var targetProps$ = typeof observableOrFactory === 'function'
|
|
44
44
|
? observableOrFactory(sourceProps$)
|
|
45
45
|
: observableOrFactory;
|
|
46
|
-
return targetProps$.pipe(operators_1.map(function (props) { return React.createElement(TargetComponent, __assign({}, props)); }));
|
|
46
|
+
return targetProps$.pipe((0, operators_1.map)(function (props) { return React.createElement(TargetComponent, __assign({}, props)); }));
|
|
47
47
|
});
|
|
48
|
-
ComposedComponent.displayName = displayName_1.wrapDisplayName(TargetComponent, 'withPropsStream');
|
|
48
|
+
ComposedComponent.displayName = (0, displayName_1.wrapDisplayName)(TargetComponent, 'withPropsStream');
|
|
49
49
|
return ComposedComponent;
|
|
50
50
|
}
|
|
51
51
|
exports.withPropsStream = withPropsStream;
|
|
@@ -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/es2015/index.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
2
|
+
export { observeState, observeCallback, observeContext, observeElement } from './utils';
|
|
3
|
+
export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
|
|
4
|
+
export { observableCallback } from 'observable-callback';
|
|
5
|
+
export { useObservable, useMemoObservable } from './useObservable';
|
|
6
|
+
export { useAsObservable } from './useAsObservable';
|
|
7
|
+
export { useObservableCallback } from './useObservableCallback';
|
package/dist/es2015/index.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
// Main package exports
|
|
2
2
|
export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
3
|
+
export { observeState, observeCallback, observeContext, observeElement } from './utils';
|
|
4
|
+
export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
|
|
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,14 +1,17 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { wrapDisplayName } from './displayName';
|
|
3
|
-
import {
|
|
2
|
+
import { useAsObservable } from './useAsObservable';
|
|
3
|
+
import { useObservable } from './useObservable';
|
|
4
|
+
import { createElement, Fragment, useRef, forwardRef as reactForwardRef, } from 'react';
|
|
4
5
|
function fromComponent(component) {
|
|
5
|
-
const wrappedComponent = (props) =>
|
|
6
|
+
const wrappedComponent = (props) => {
|
|
7
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props))).current));
|
|
8
|
+
};
|
|
6
9
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
7
10
|
return wrappedComponent;
|
|
8
11
|
}
|
|
9
12
|
function fromObservable(input$) {
|
|
10
13
|
return function ReactiveComponent() {
|
|
11
|
-
return
|
|
14
|
+
return createElement(Fragment, null, useObservable(input$));
|
|
12
15
|
};
|
|
13
16
|
}
|
|
14
17
|
export function reactiveComponent(observableOrComponent) {
|
|
@@ -17,8 +20,8 @@ export function reactiveComponent(observableOrComponent) {
|
|
|
17
20
|
: fromObservable(observableOrComponent);
|
|
18
21
|
}
|
|
19
22
|
export function forwardRef(component) {
|
|
20
|
-
const wrappedComponent =
|
|
21
|
-
return
|
|
23
|
+
const wrappedComponent = reactForwardRef((props, ref) => {
|
|
24
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props), ref)).current));
|
|
22
25
|
});
|
|
23
26
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
24
27
|
return wrappedComponent;
|
|
@@ -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 useAsObservable<T>(value: T): Observable<T>;
|
|
9
|
+
export declare function useAsObservable<T, K>(value: T, operator: (input: Observable<T>) => Observable<K>): Observable<K>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
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();
|
|
8
|
+
if (!observableRef.current) {
|
|
9
|
+
const observable = subjectRef.current.asObservable();
|
|
10
|
+
observableRef.current = operator ? observable.pipe(operator) : observable;
|
|
11
|
+
}
|
|
12
|
+
useIsomorphicEffect(() => {
|
|
13
|
+
if (isInitial.current) {
|
|
14
|
+
isInitial.current = false;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// emit only on update
|
|
18
|
+
subjectRef.current.next(value);
|
|
19
|
+
}
|
|
20
|
+
}, [value]);
|
|
21
|
+
useIsomorphicEffect(() => {
|
|
22
|
+
return () => {
|
|
23
|
+
return subjectRef.current.complete();
|
|
24
|
+
};
|
|
25
|
+
}, []);
|
|
26
|
+
return observableRef.current;
|
|
27
|
+
}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function useObservable<T>(observable
|
|
6
|
-
export declare function useObservable<T>(observable
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function
|
|
9
|
-
export declare function useObservableContext<T>(context: React.Context<T>): Observable<T>;
|
|
10
|
-
declare type ObservableEventTuple<Event> = [Observable<Event>, (event: Event) => void];
|
|
11
|
-
export declare function useObservableEvent<Event>(): ObservableEventTuple<Event>;
|
|
12
|
-
export declare function useObservableElement<Element extends HTMLElement>(): [
|
|
13
|
-
Observable<Element | null>,
|
|
14
|
-
(el: Element | null) => void
|
|
15
|
-
];
|
|
16
|
-
export {};
|
|
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,37 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { createEventHandler } from './utils';
|
|
4
|
-
export function toObservable(value, setup) {
|
|
5
|
-
const isInitial = React.useRef(true);
|
|
6
|
-
const subject = React.useRef(new BehaviorSubject(value));
|
|
7
|
-
React.useEffect(() => {
|
|
8
|
-
if (isInitial.current) {
|
|
9
|
-
isInitial.current = false;
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
// emit only on update
|
|
13
|
-
subject.current.next(value);
|
|
14
|
-
}
|
|
15
|
-
}, [value]);
|
|
16
|
-
React.useEffect(() => {
|
|
17
|
-
return () => {
|
|
18
|
-
return subject.current.complete();
|
|
19
|
-
};
|
|
20
|
-
}, []);
|
|
21
|
-
const observable = subject.current.asObservable();
|
|
22
|
-
return setup ? setup(observable) : observable;
|
|
23
|
-
}
|
|
24
|
-
const isCallable = (val) => typeof val === 'function';
|
|
1
|
+
import { useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { useIsomorphicEffect } from './useIsomorphicEffect';
|
|
25
3
|
function getValue(value) {
|
|
26
|
-
return
|
|
4
|
+
return typeof value === 'function' ? value() : value;
|
|
27
5
|
}
|
|
28
|
-
export function useObservable(observable
|
|
29
|
-
const subscription =
|
|
30
|
-
const isInitial =
|
|
31
|
-
const [value, setState] =
|
|
6
|
+
export function useObservable(observable, initialValue) {
|
|
7
|
+
const subscription = useRef();
|
|
8
|
+
const isInitial = useRef(true);
|
|
9
|
+
const [value, setState] = useState(() => {
|
|
32
10
|
let isSync = true;
|
|
33
11
|
let syncVal = getValue(initialValue);
|
|
34
|
-
subscription.current = observable
|
|
12
|
+
subscription.current = observable.subscribe(nextVal => {
|
|
35
13
|
if (isSync) {
|
|
36
14
|
syncVal = nextVal;
|
|
37
15
|
}
|
|
@@ -42,30 +20,21 @@ export function useObservable(observable$, initialValue) {
|
|
|
42
20
|
isSync = false;
|
|
43
21
|
return syncVal;
|
|
44
22
|
});
|
|
45
|
-
|
|
46
|
-
// when the observable
|
|
23
|
+
useIsomorphicEffect(() => {
|
|
24
|
+
// when the observable changes after initial (possibly sync render)
|
|
47
25
|
if (!isInitial.current) {
|
|
48
|
-
subscription.current = observable
|
|
26
|
+
subscription.current = observable.subscribe(nextVal => setState(nextVal));
|
|
49
27
|
}
|
|
50
28
|
isInitial.current = false;
|
|
51
29
|
return () => {
|
|
52
30
|
if (subscription.current) {
|
|
53
31
|
subscription.current.unsubscribe();
|
|
32
|
+
subscription.current = undefined;
|
|
54
33
|
}
|
|
55
34
|
};
|
|
56
|
-
}, [observable
|
|
35
|
+
}, [observable]);
|
|
57
36
|
return value;
|
|
58
37
|
}
|
|
59
|
-
export function
|
|
60
|
-
|
|
61
|
-
return [toObservable(value), update];
|
|
62
|
-
}
|
|
63
|
-
export function useObservableContext(context) {
|
|
64
|
-
return toObservable(React.useContext(context));
|
|
65
|
-
}
|
|
66
|
-
export function useObservableEvent() {
|
|
67
|
-
return React.useMemo(createEventHandler, []);
|
|
68
|
-
}
|
|
69
|
-
export function useObservableElement() {
|
|
70
|
-
return useObservableState(null);
|
|
38
|
+
export function useMemoObservable(observableOrFactory, deps, initialValue) {
|
|
39
|
+
return useObservable(useMemo(() => getValue(observableOrFactory), deps), initialValue);
|
|
71
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,3 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare
|
|
1
|
+
import { Observable, OperatorFunction } from 'rxjs';
|
|
2
|
+
import { Dispatch, SetStateAction, Context } from 'react';
|
|
3
|
+
export declare function observeState<T>(initial: T | (() => T)): [Observable<T>, Dispatch<SetStateAction<T>>];
|
|
4
|
+
export declare function observeCallback<T>(): [Observable<T>, (arg: T) => void];
|
|
5
|
+
export declare function observeCallback<T, K>(operator: OperatorFunction<T, K>): [Observable<K>, (arg: T) => void];
|
|
6
|
+
export declare function observeContext<T>(context: Context<T>): Observable<T>;
|
|
7
|
+
export declare function observeElement<T>(): [Observable<T | null>, (el: T | null) => void];
|
package/dist/es2015/utils.js
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
|
+
import { useAsObservable } from './useAsObservable';
|
|
1
2
|
import { observableCallback } from 'observable-callback';
|
|
2
3
|
import { startWith } from 'rxjs/operators';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export
|
|
4
|
+
import { useContext, useRef, useState } from 'react';
|
|
5
|
+
const createState = (initialState) => observableCallback(startWith(initialState));
|
|
6
|
+
export function observeState(initial) {
|
|
7
|
+
const [value, update] = useState(initial);
|
|
8
|
+
return [useAsObservable(value), update];
|
|
9
|
+
}
|
|
10
|
+
export function observeCallback(operator) {
|
|
11
|
+
const ref = useRef();
|
|
12
|
+
if (!ref.current) {
|
|
13
|
+
ref.current = operator ? observableCallback(operator) : observableCallback();
|
|
14
|
+
}
|
|
15
|
+
return ref.current;
|
|
16
|
+
}
|
|
17
|
+
export function observeContext(context) {
|
|
18
|
+
return useAsObservable(useContext(context));
|
|
19
|
+
}
|
|
20
|
+
export function observeElement() {
|
|
21
|
+
const ref = useRef();
|
|
22
|
+
if (!ref.current) {
|
|
23
|
+
ref.current = createState(null);
|
|
24
|
+
}
|
|
25
|
+
return ref.current;
|
|
26
|
+
}
|
|
@@ -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,3 +1,7 @@
|
|
|
1
1
|
export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
2
|
+
export { observeState, observeCallback, observeContext, observeElement } from './utils';
|
|
3
|
+
export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
|
|
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,4 +1,9 @@
|
|
|
1
1
|
// Main package exports
|
|
2
2
|
export { reactiveComponent, reactiveComponent as rxComponent, forwardRef } from './reactiveComponent';
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
3
|
+
export { observeState, observeCallback, observeContext, observeElement } from './utils';
|
|
4
|
+
export { observeState as state, observeCallback as handler, observeContext as context, observeElement as elementRef, } from './utils';
|
|
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,16 +1,17 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { wrapDisplayName } from './displayName';
|
|
3
|
-
import {
|
|
2
|
+
import { useAsObservable } from './useAsObservable';
|
|
3
|
+
import { useObservable } from './useObservable';
|
|
4
|
+
import { createElement, Fragment, useRef, forwardRef as reactForwardRef, } from 'react';
|
|
4
5
|
function fromComponent(component) {
|
|
5
6
|
var wrappedComponent = function (props) {
|
|
6
|
-
return
|
|
7
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props))).current));
|
|
7
8
|
};
|
|
8
9
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
9
10
|
return wrappedComponent;
|
|
10
11
|
}
|
|
11
12
|
function fromObservable(input$) {
|
|
12
13
|
return function ReactiveComponent() {
|
|
13
|
-
return
|
|
14
|
+
return createElement(Fragment, null, useObservable(input$));
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
17
|
export function reactiveComponent(observableOrComponent) {
|
|
@@ -19,8 +20,8 @@ export function reactiveComponent(observableOrComponent) {
|
|
|
19
20
|
: fromObservable(observableOrComponent);
|
|
20
21
|
}
|
|
21
22
|
export function forwardRef(component) {
|
|
22
|
-
var wrappedComponent =
|
|
23
|
-
return
|
|
23
|
+
var wrappedComponent = reactForwardRef(function (props, ref) {
|
|
24
|
+
return createElement(Fragment, null, useObservable(useRef(component(useAsObservable(props), ref)).current));
|
|
24
25
|
});
|
|
25
26
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent');
|
|
26
27
|
return wrappedComponent;
|
|
@@ -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 useAsObservable<T>(value: T): Observable<T>;
|
|
9
|
+
export declare function useAsObservable<T, K>(value: T, operator: (input: Observable<T>) => Observable<K>): Observable<K>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
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();
|
|
8
|
+
if (!observableRef.current) {
|
|
9
|
+
var observable = subjectRef.current.asObservable();
|
|
10
|
+
observableRef.current = operator ? observable.pipe(operator) : observable;
|
|
11
|
+
}
|
|
12
|
+
useIsomorphicEffect(function () {
|
|
13
|
+
if (isInitial.current) {
|
|
14
|
+
isInitial.current = false;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// emit only on update
|
|
18
|
+
subjectRef.current.next(value);
|
|
19
|
+
}
|
|
20
|
+
}, [value]);
|
|
21
|
+
useIsomorphicEffect(function () {
|
|
22
|
+
return function () {
|
|
23
|
+
return subjectRef.current.complete();
|
|
24
|
+
};
|
|
25
|
+
}, []);
|
|
26
|
+
return observableRef.current;
|
|
27
|
+
}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
1
|
import { Observable } from 'rxjs';
|
|
3
|
-
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function useObservable<T>(observable
|
|
6
|
-
export declare function useObservable<T>(observable
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function
|
|
9
|
-
export declare function useObservableContext<T>(context: React.Context<T>): Observable<T>;
|
|
10
|
-
declare type ObservableEventTuple<Event> = [Observable<Event>, (event: Event) => void];
|
|
11
|
-
export declare function useObservableEvent<Event>(): ObservableEventTuple<Event>;
|
|
12
|
-
export declare function useObservableElement<Element extends HTMLElement>(): [
|
|
13
|
-
Observable<Element | null>,
|
|
14
|
-
(el: Element | null) => void
|
|
15
|
-
];
|
|
16
|
-
export {};
|
|
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;
|