react-rx 2.1.3 → 3.0.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/dist/cjs/__tests__/strictmode.test.js +19 -34
- package/dist/cjs/__tests__/useObservable.test.js +2 -2
- package/dist/cjs/index.d.ts +2 -7
- package/dist/cjs/index.js +16 -26
- package/dist/cjs/useObservable.d.ts +0 -3
- package/dist/cjs/useObservable.js +15 -9
- package/dist/cjs/{useObservableCallback.js → useObservableEvent.js} +1 -2
- package/dist/es2015/__tests__/strictmode.test.js +11 -22
- package/dist/es2015/__tests__/useObservable.test.js +2 -2
- package/dist/es2015/index.d.ts +2 -7
- package/dist/es2015/index.js +2 -9
- package/dist/es2015/useObservable.d.ts +0 -3
- package/dist/es2015/useObservable.js +14 -7
- package/dist/es2015/{useObservableCallback.js → useObservableEvent.js} +1 -2
- package/dist/esm/__tests__/strictmode.test.js +12 -27
- package/dist/esm/__tests__/useObservable.test.js +2 -2
- package/dist/esm/index.d.ts +2 -7
- package/dist/esm/index.js +2 -9
- package/dist/esm/useObservable.d.ts +0 -3
- package/dist/esm/useObservable.js +14 -7
- package/dist/esm/{useObservableCallback.js → useObservableEvent.js} +1 -2
- package/package.json +30 -29
- package/src/__tests__/strictmode.test.ts +13 -30
- package/src/__tests__/useObservable.test.tsx +3 -2
- package/src/index.ts +2 -15
- package/src/useObservable.ts +16 -24
- package/src/{useObservableCallback.ts → useObservableEvent.ts} +1 -2
- package/dist/cjs/WithObservable.d.ts +0 -12
- package/dist/cjs/WithObservable.js +0 -16
- package/dist/cjs/__tests__/useAsObservable.test.d.ts +0 -1
- package/dist/cjs/__tests__/useAsObservable.test.js +0 -77
- package/dist/cjs/displayName.d.ts +0 -1
- package/dist/cjs/displayName.js +0 -14
- package/dist/cjs/reactiveComponent.d.ts +0 -8
- package/dist/cjs/reactiveComponent.js +0 -35
- package/dist/cjs/useAsObservable.d.ts +0 -10
- package/dist/cjs/useAsObservable.js +0 -47
- package/dist/cjs/useWithObservable.d.ts +0 -9
- package/dist/cjs/useWithObservable.js +0 -11
- package/dist/cjs/utils.d.ts +0 -7
- package/dist/cjs/utils.js +0 -38
- package/dist/cjs/withPropsStream.d.ts +0 -8
- package/dist/cjs/withPropsStream.js +0 -55
- package/dist/es2015/WithObservable.d.ts +0 -12
- package/dist/es2015/WithObservable.js +0 -9
- package/dist/es2015/__tests__/useAsObservable.test.d.ts +0 -1
- package/dist/es2015/__tests__/useAsObservable.test.js +0 -72
- package/dist/es2015/displayName.d.ts +0 -1
- package/dist/es2015/displayName.js +0 -8
- package/dist/es2015/reactiveComponent.d.ts +0 -8
- package/dist/es2015/reactiveComponent.js +0 -30
- package/dist/es2015/useAsObservable.d.ts +0 -10
- package/dist/es2015/useAsObservable.js +0 -43
- package/dist/es2015/useWithObservable.d.ts +0 -9
- package/dist/es2015/useWithObservable.js +0 -7
- package/dist/es2015/utils.d.ts +0 -7
- package/dist/es2015/utils.js +0 -31
- package/dist/es2015/withPropsStream.d.ts +0 -8
- package/dist/es2015/withPropsStream.js +0 -17
- package/dist/esm/WithObservable.d.ts +0 -12
- package/dist/esm/WithObservable.js +0 -13
- package/dist/esm/__tests__/useAsObservable.test.d.ts +0 -1
- package/dist/esm/__tests__/useAsObservable.test.js +0 -72
- package/dist/esm/displayName.d.ts +0 -1
- package/dist/esm/displayName.js +0 -10
- package/dist/esm/reactiveComponent.d.ts +0 -8
- package/dist/esm/reactiveComponent.js +0 -30
- package/dist/esm/useAsObservable.d.ts +0 -10
- package/dist/esm/useAsObservable.js +0 -43
- package/dist/esm/useWithObservable.d.ts +0 -9
- package/dist/esm/useWithObservable.js +0 -7
- package/dist/esm/utils.d.ts +0 -7
- package/dist/esm/utils.js +0 -31
- package/dist/esm/withPropsStream.d.ts +0 -8
- package/dist/esm/withPropsStream.js +0 -28
- package/src/WithObservable.tsx +0 -29
- package/src/__tests__/useAsObservable.test.tsx +0 -94
- package/src/displayName.ts +0 -11
- package/src/reactiveComponent.ts +0 -63
- package/src/useAsObservable.ts +0 -66
- package/src/useWithObservable.ts +0 -24
- package/src/utils.ts +0 -48
- package/src/withPropsStream.tsx +0 -27
- /package/dist/cjs/{useObservableCallback.d.ts → useObservableEvent.d.ts} +0 -0
- /package/dist/es2015/{useObservableCallback.d.ts → useObservableEvent.d.ts} +0 -0
- /package/dist/esm/{useObservableCallback.d.ts → useObservableEvent.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-rx",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-1",
|
|
4
4
|
"description": "React + RxJS = <3",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"action",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"Bjørge Næss <bjoerge@gmail.com>",
|
|
46
46
|
"Cody Olsen <stipsan@gmail.com> (https://github.com/stipsan)"
|
|
47
47
|
],
|
|
48
|
+
"sideEffects": false,
|
|
48
49
|
"main": "dist/cjs/index.js",
|
|
49
50
|
"module": "dist/esm/index.js",
|
|
50
51
|
"types": "dist/cjs/index.d.ts",
|
|
@@ -69,42 +70,42 @@
|
|
|
69
70
|
"lint": "eslint --cache ."
|
|
70
71
|
},
|
|
71
72
|
"dependencies": {
|
|
72
|
-
"observable-callback": "^1.0.
|
|
73
|
-
"use-sync-external-store": "^1.2.0"
|
|
73
|
+
"observable-callback": "^1.0.3"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@sanity/semantic-release-preset": "^2.0.
|
|
77
|
-
"@testing-library/dom": "^8.
|
|
76
|
+
"@sanity/semantic-release-preset": "^2.0.5",
|
|
77
|
+
"@testing-library/dom": "^8.20.1",
|
|
78
78
|
"@testing-library/react": "^13.4.0",
|
|
79
|
-
"@types/jest": "^29.
|
|
80
|
-
"@types/node": "^18.
|
|
81
|
-
"@types/react": "^18.
|
|
82
|
-
"@types/react-dom": "^18.0
|
|
83
|
-
"@
|
|
84
|
-
"@typescript-eslint/
|
|
85
|
-
"
|
|
86
|
-
"eslint": "
|
|
87
|
-
"eslint-
|
|
88
|
-
"eslint-plugin-
|
|
89
|
-
"eslint-plugin-react": "^
|
|
90
|
-
"eslint-plugin-react-hooks": "
|
|
91
|
-
"
|
|
92
|
-
"jest
|
|
93
|
-
"jsdom": "^
|
|
79
|
+
"@types/jest": "^29.5.3",
|
|
80
|
+
"@types/node": "^18.17.5",
|
|
81
|
+
"@types/react": "^18.3.3",
|
|
82
|
+
"@types/react-dom": "^18.3.0",
|
|
83
|
+
"@typescript-eslint/eslint-plugin": "7.12.0",
|
|
84
|
+
"@typescript-eslint/parser": "7.12.0",
|
|
85
|
+
"eslint": "8.57.0",
|
|
86
|
+
"eslint-config-prettier": "9.1.0",
|
|
87
|
+
"eslint-plugin-prettier": "5.1.3",
|
|
88
|
+
"eslint-plugin-react": "7.34.2",
|
|
89
|
+
"eslint-plugin-react-compiler": "^0.0.0-experimental-51a85ea-20240601",
|
|
90
|
+
"eslint-plugin-react-hooks": "4.6.2",
|
|
91
|
+
"eslint-plugin-simple-import-sort": "^12.1.0",
|
|
92
|
+
"jest": "^29.6.2",
|
|
93
|
+
"jest-environment-jsdom": "^29.6.2",
|
|
94
|
+
"jsdom": "^20.0.3",
|
|
94
95
|
"npm-run-all": "^4.1.5",
|
|
95
|
-
"prettier": "^2.
|
|
96
|
-
"prettier-plugin-packagejson": "^2.
|
|
97
|
-
"react": "^18.
|
|
98
|
-
"react-dom": "^18.
|
|
99
|
-
"react-test-renderer": "^18.
|
|
96
|
+
"prettier": "^2.8.8",
|
|
97
|
+
"prettier-plugin-packagejson": "^2.4.5",
|
|
98
|
+
"react": "^18.3.1",
|
|
99
|
+
"react-dom": "^18.3.1",
|
|
100
|
+
"react-test-renderer": "^18.3.1",
|
|
100
101
|
"rimraf": "^3.0.2",
|
|
101
|
-
"rxjs": "^
|
|
102
|
-
"ts-jest": "^29.
|
|
102
|
+
"rxjs": "^7.8.1",
|
|
103
|
+
"ts-jest": "^29.1.1",
|
|
103
104
|
"typescript": "4.7.4"
|
|
104
105
|
},
|
|
105
106
|
"peerDependencies": {
|
|
106
|
-
"react": "^
|
|
107
|
-
"rxjs": "^
|
|
107
|
+
"react": "^18.3 || >=19.0.0-rc",
|
|
108
|
+
"rxjs": "^7"
|
|
108
109
|
},
|
|
109
110
|
"es2015": "dist/es2015/index.js"
|
|
110
111
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {BehaviorSubject, Observable, of} from 'rxjs'
|
|
2
|
-
import {useObservable} from '../useObservable'
|
|
3
|
-
import {createElement, Fragment, StrictMode, useEffect} from 'react'
|
|
4
1
|
import {act, render} from '@testing-library/react'
|
|
5
|
-
import {
|
|
2
|
+
import {createElement, Fragment, StrictMode, useEffect} from 'react'
|
|
3
|
+
import {BehaviorSubject, Observable} from 'rxjs'
|
|
4
|
+
|
|
5
|
+
import {useObservable} from '../useObservable'
|
|
6
6
|
|
|
7
7
|
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
|
|
8
8
|
|
|
@@ -23,7 +23,7 @@ test('Strict mode should trigger double mount effects and re-renders', async ()
|
|
|
23
23
|
return createElement(Fragment, null, observedValue)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
render(createElement(StrictMode, null, createElement(ObservableComponent)))
|
|
27
27
|
expect(mountCount).toEqual(2)
|
|
28
28
|
|
|
29
29
|
expect(returnedValues).toEqual([0, 0])
|
|
@@ -39,11 +39,14 @@ test('Strict mode should trigger double mount effects and re-renders', async ()
|
|
|
39
39
|
})
|
|
40
40
|
|
|
41
41
|
test('Strict mode should unsubscribe the source observable on unmount', () => {
|
|
42
|
-
|
|
42
|
+
const subscribed: number[] = []
|
|
43
|
+
const unsubscribed: number[] = []
|
|
44
|
+
let nextId = 0
|
|
43
45
|
const observable = new Observable(() => {
|
|
44
|
-
|
|
46
|
+
const id = nextId++
|
|
47
|
+
subscribed.push(id)
|
|
45
48
|
return () => {
|
|
46
|
-
|
|
49
|
+
unsubscribed.push(id)
|
|
47
50
|
}
|
|
48
51
|
})
|
|
49
52
|
|
|
@@ -53,27 +56,7 @@ test('Strict mode should unsubscribe the source observable on unmount', () => {
|
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
const {rerender} = render(createElement(StrictMode, null, createElement(ObservableComponent)))
|
|
56
|
-
expect(subscribed).
|
|
59
|
+
expect(subscribed).toEqual([0, 1])
|
|
57
60
|
rerender(createElement(StrictMode, null, createElement('div')))
|
|
58
|
-
expect(
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
test('useAsObservable should work in strict mode', async () => {
|
|
62
|
-
const returnedValues: unknown[] = []
|
|
63
|
-
function ObservableComponent(props: {count: number}) {
|
|
64
|
-
const count$ = useAsObservable(props.count)
|
|
65
|
-
const count = useObservable(count$)
|
|
66
|
-
returnedValues.push(count)
|
|
67
|
-
return createElement(Fragment, null, 'ok')
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const {rerender} = render(
|
|
71
|
-
createElement(StrictMode, null, createElement(ObservableComponent, {count: 0})),
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
expect(returnedValues).toEqual([0, 0])
|
|
75
|
-
|
|
76
|
-
rerender(createElement(StrictMode, null, createElement(ObservableComponent, {count: 1})))
|
|
77
|
-
|
|
78
|
-
expect(returnedValues).toEqual([0, 0, 0, 0, 1, 1])
|
|
61
|
+
expect(unsubscribed).toEqual([0, 1])
|
|
79
62
|
})
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import {act, render, renderHook} from '@testing-library/react'
|
|
2
|
-
import {
|
|
2
|
+
import {createElement, Fragment} from 'react'
|
|
3
3
|
import {asyncScheduler, Observable, of, scheduled, Subject, timer} from 'rxjs'
|
|
4
4
|
import {mapTo} from 'rxjs/operators'
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
import {useObservable} from '../useObservable'
|
|
6
7
|
|
|
7
8
|
test('should subscribe immediately on component mount and unsubscribe on component unmount', () => {
|
|
8
9
|
let subscribed = false
|
package/src/index.ts
CHANGED
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export {observeState, observeCallback, observeContext, observeElement} from './utils'
|
|
4
|
-
export {
|
|
5
|
-
observeState as state,
|
|
6
|
-
observeCallback as handler,
|
|
7
|
-
observeContext as context,
|
|
8
|
-
observeElement as elementRef,
|
|
9
|
-
} from './utils'
|
|
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'
|
|
1
|
+
export * from './useObservable'
|
|
2
|
+
export * from './useObservableEvent'
|
package/src/useObservable.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
+
import {useEffect, useMemo, useRef, useSyncExternalStore} from 'react'
|
|
1
2
|
import {Observable, Subscription} from 'rxjs'
|
|
2
|
-
import {DependencyList, useEffect, useMemo, useRef} from 'react'
|
|
3
|
-
import {useSyncExternalStore} from 'use-sync-external-store/shim'
|
|
4
3
|
import {shareReplay, tap} from 'rxjs/operators'
|
|
5
4
|
|
|
6
5
|
function getValue<T>(value: T): T extends () => infer U ? U : T {
|
|
@@ -34,10 +33,23 @@ export function useObservable<T>(observable: Observable<T>): T | undefined
|
|
|
34
33
|
export function useObservable<T>(observable: Observable<T>, initialValue: T): T
|
|
35
34
|
export function useObservable<T>(observable: Observable<T>, initialValue: () => T): T
|
|
36
35
|
export function useObservable<T>(observable: Observable<T>, initialValue?: T | (() => T)) {
|
|
36
|
+
/**
|
|
37
|
+
* Store the initialValue in a ref, as we don't want a changed `initialValue` to trigger a re-subscription.
|
|
38
|
+
* But we also don't want the initialValue to be stale if the observable changes.
|
|
39
|
+
*/
|
|
40
|
+
const initialValueRef = useRef(getValue(initialValue))
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Ensures that the initialValue is always up-to-date in case the observable changes.
|
|
44
|
+
*/
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
initialValueRef.current = getValue(initialValue)
|
|
47
|
+
}, [initialValue])
|
|
48
|
+
|
|
37
49
|
const [getSnapshot, subscribe] = useMemo<
|
|
38
50
|
[() => T, Parameters<typeof useSyncExternalStore>[0]]
|
|
39
51
|
>(() => {
|
|
40
|
-
const store = getOrCreateStore(observable,
|
|
52
|
+
const store = getOrCreateStore(observable, initialValueRef.current)
|
|
41
53
|
if (store.subscription.closed) {
|
|
42
54
|
store.subscription = store.observable.subscribe()
|
|
43
55
|
}
|
|
@@ -58,7 +70,7 @@ export function useObservable<T>(observable: Observable<T>, initialValue?: T | (
|
|
|
58
70
|
|
|
59
71
|
const shouldRestoreSubscriptionRef = useRef(false)
|
|
60
72
|
useEffect(() => {
|
|
61
|
-
const store = getOrCreateStore(observable,
|
|
73
|
+
const store = getOrCreateStore(observable, initialValueRef.current)
|
|
62
74
|
if (shouldRestoreSubscriptionRef.current) {
|
|
63
75
|
if (store.subscription.closed) {
|
|
64
76
|
store.subscription = store.observable.subscribe()
|
|
@@ -76,23 +88,3 @@ export function useObservable<T>(observable: Observable<T>, initialValue?: T | (
|
|
|
76
88
|
|
|
77
89
|
return useSyncExternalStore(subscribe, getSnapshot)
|
|
78
90
|
}
|
|
79
|
-
|
|
80
|
-
export function useMemoObservable<T>(
|
|
81
|
-
observableOrFactory: Observable<T> | (() => Observable<T>),
|
|
82
|
-
deps: DependencyList,
|
|
83
|
-
): T | undefined
|
|
84
|
-
export function useMemoObservable<T>(
|
|
85
|
-
observableOrFactory: Observable<T> | (() => Observable<T>),
|
|
86
|
-
deps: DependencyList,
|
|
87
|
-
initialValue: T | (() => T),
|
|
88
|
-
): T
|
|
89
|
-
export function useMemoObservable<T>(
|
|
90
|
-
observableOrFactory: Observable<T> | (() => Observable<T>),
|
|
91
|
-
deps: DependencyList,
|
|
92
|
-
initialValue?: T | (() => T),
|
|
93
|
-
) {
|
|
94
|
-
return useObservable(
|
|
95
|
-
useMemo(() => getValue(observableOrFactory), deps),
|
|
96
|
-
initialValue,
|
|
97
|
-
)
|
|
98
|
-
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {DependencyList, useCallback, useEffect, useRef} from 'react'
|
|
2
1
|
import {observableCallback} from 'observable-callback'
|
|
2
|
+
import {DependencyList, useCallback, useEffect, useRef} from 'react'
|
|
3
3
|
import {Observable} from 'rxjs'
|
|
4
4
|
|
|
5
5
|
const EMPTY_DEPS: DependencyList = []
|
|
@@ -16,7 +16,6 @@ export function useObservableCallback<T, U>(
|
|
|
16
16
|
|
|
17
17
|
const [calls$, call] = callbackRef.current
|
|
18
18
|
|
|
19
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
20
19
|
const callback = useCallback(fn, dependencies)
|
|
21
20
|
|
|
22
21
|
useEffect(() => {
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { ComponentType, ReactNode } from 'react';
|
|
3
|
-
interface Props<T> {
|
|
4
|
-
observable: Observable<T>;
|
|
5
|
-
children: (value: T) => ReactNode;
|
|
6
|
-
}
|
|
7
|
-
declare type ObservableComponent<T> = ComponentType<Props<T>>;
|
|
8
|
-
/**
|
|
9
|
-
* @deprecated Use the useObservable hook instead
|
|
10
|
-
*/
|
|
11
|
-
export declare const WithObservable: ObservableComponent<unknown>;
|
|
12
|
-
export {};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WithObservable = void 0;
|
|
4
|
-
var operators_1 = require("rxjs/operators");
|
|
5
|
-
var reactiveComponent_1 = require("./reactiveComponent");
|
|
6
|
-
function createWithObservable() {
|
|
7
|
-
return (0, reactiveComponent_1.reactiveComponent)(function (props$) {
|
|
8
|
-
return props$.pipe((0, operators_1.distinctUntilChanged)(function (props, prevProps) { return props.observable === prevProps.observable; }), (0, operators_1.switchMap)(function (props) {
|
|
9
|
-
return props.observable.pipe((0, operators_1.map)(function (observableValue) { return props.children(observableValue); }));
|
|
10
|
-
}));
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* @deprecated Use the useObservable hook instead
|
|
15
|
-
*/
|
|
16
|
-
exports.WithObservable = createWithObservable();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
var useAsObservable_1 = require("../useAsObservable");
|
|
7
|
-
var react_1 = __importDefault(require("react"));
|
|
8
|
-
var react_2 = require("@testing-library/react");
|
|
9
|
-
test('the returned observable should receive a new value when component is rendered with a new value', function () {
|
|
10
|
-
var receivedValues = [];
|
|
11
|
-
var _a = (0, react_2.renderHook)(function (props) {
|
|
12
|
-
var observable = (0, useAsObservable_1.useAsObservable)(props.value);
|
|
13
|
-
react_1.default.useEffect(function () {
|
|
14
|
-
var subscription = observable.subscribe(function (v) {
|
|
15
|
-
receivedValues.push(v);
|
|
16
|
-
});
|
|
17
|
-
return function () {
|
|
18
|
-
subscription.unsubscribe();
|
|
19
|
-
};
|
|
20
|
-
}, []);
|
|
21
|
-
}, { initialProps: { value: 'initial' } }), unmount = _a.unmount, rerender = _a.rerender;
|
|
22
|
-
rerender({ value: 'rerender' });
|
|
23
|
-
rerender({ value: 'rerender again' });
|
|
24
|
-
expect(receivedValues).toEqual(['initial', 'rerender', 'rerender again']);
|
|
25
|
-
unmount();
|
|
26
|
-
});
|
|
27
|
-
test('the returned observable should *not* receive a new value when component is rendered with an unchanged value', function () {
|
|
28
|
-
var receivedValues = [];
|
|
29
|
-
var _a = (0, react_2.renderHook)(function (props) {
|
|
30
|
-
var observable = (0, useAsObservable_1.useAsObservable)(props.value);
|
|
31
|
-
react_1.default.useEffect(function () {
|
|
32
|
-
var subscription = observable.subscribe(function (v) {
|
|
33
|
-
receivedValues.push(v);
|
|
34
|
-
});
|
|
35
|
-
return function () {
|
|
36
|
-
subscription.unsubscribe();
|
|
37
|
-
};
|
|
38
|
-
}, []);
|
|
39
|
-
}, { initialProps: { value: 'some value' } }), unmount = _a.unmount, rerender = _a.rerender;
|
|
40
|
-
rerender({ value: 'some value' });
|
|
41
|
-
rerender({ value: 'some value' });
|
|
42
|
-
expect(receivedValues).toEqual(['some value']);
|
|
43
|
-
unmount();
|
|
44
|
-
});
|
|
45
|
-
test('the returned observable should have the same identity across multiple re-renders/hook calls', function () {
|
|
46
|
-
var returnValues = [];
|
|
47
|
-
var _a = (0, react_2.renderHook)(function () {
|
|
48
|
-
returnValues.push((0, useAsObservable_1.useAsObservable)('render'));
|
|
49
|
-
}), unmount = _a.unmount, rerender = _a.rerender;
|
|
50
|
-
rerender();
|
|
51
|
-
rerender();
|
|
52
|
-
var initial = returnValues[0], firstRerender = returnValues[1], secondRerender = returnValues[2];
|
|
53
|
-
expect(initial).toBe(firstRerender);
|
|
54
|
-
expect(firstRerender).toBe(secondRerender);
|
|
55
|
-
unmount();
|
|
56
|
-
});
|
|
57
|
-
test('the returned observable should complete on unmount', function () {
|
|
58
|
-
var didComplete = false;
|
|
59
|
-
var _a = (0, react_2.renderHook)(function () {
|
|
60
|
-
var observable = (0, useAsObservable_1.useAsObservable)('render');
|
|
61
|
-
react_1.default.useEffect(function () {
|
|
62
|
-
var subscription = observable.subscribe({
|
|
63
|
-
complete: function () {
|
|
64
|
-
didComplete = true;
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
return function () {
|
|
68
|
-
subscription.unsubscribe();
|
|
69
|
-
};
|
|
70
|
-
}, []);
|
|
71
|
-
}), unmount = _a.unmount, rerender = _a.rerender;
|
|
72
|
-
expect(didComplete).toBe(false);
|
|
73
|
-
rerender();
|
|
74
|
-
expect(didComplete).toBe(false);
|
|
75
|
-
unmount();
|
|
76
|
-
expect(didComplete).toBe(true);
|
|
77
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const wrapDisplayName: (BaseComponent: Function, wrapperName: string) => string;
|
package/dist/cjs/displayName.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.wrapDisplayName = void 0;
|
|
4
|
-
var getDisplayName = function (Component) {
|
|
5
|
-
if (typeof Component === 'string') {
|
|
6
|
-
return Component;
|
|
7
|
-
}
|
|
8
|
-
return (Component && (Component.displayName || Component.name)) || 'Unknown';
|
|
9
|
-
};
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/ban-types
|
|
11
|
-
var wrapDisplayName = function (BaseComponent, wrapperName) {
|
|
12
|
-
return "".concat(wrapperName, "(").concat(getDisplayName(BaseComponent), ")");
|
|
13
|
-
};
|
|
14
|
-
exports.wrapDisplayName = wrapDisplayName;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
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<Props>;
|
|
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
|
-
export {};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.forwardRef = exports.reactiveComponent = void 0;
|
|
4
|
-
var displayName_1 = require("./displayName");
|
|
5
|
-
var useAsObservable_1 = require("./useAsObservable");
|
|
6
|
-
var useObservable_1 = require("./useObservable");
|
|
7
|
-
var react_1 = require("react");
|
|
8
|
-
function fromComponent(component) {
|
|
9
|
-
var wrappedComponent = function (props) {
|
|
10
|
-
return (0, react_1.createElement)(react_1.Fragment, null, (0, useObservable_1.useObservable)((0, react_1.useRef)(component((0, useAsObservable_1.useAsObservable)(props))).current));
|
|
11
|
-
};
|
|
12
|
-
wrappedComponent.displayName = (0, displayName_1.wrapDisplayName)(component, 'reactiveComponent');
|
|
13
|
-
return wrappedComponent;
|
|
14
|
-
}
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
16
|
-
function fromObservable(input$) {
|
|
17
|
-
return function ReactiveComponent() {
|
|
18
|
-
return (0, react_1.createElement)(react_1.Fragment, null, (0, useObservable_1.useObservable)(input$));
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function reactiveComponent(observableOrComponent) {
|
|
22
|
-
return typeof observableOrComponent === 'function'
|
|
23
|
-
? fromComponent(observableOrComponent)
|
|
24
|
-
: fromObservable(observableOrComponent);
|
|
25
|
-
}
|
|
26
|
-
exports.reactiveComponent = reactiveComponent;
|
|
27
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/ban-types
|
|
28
|
-
function forwardRef(component) {
|
|
29
|
-
var wrappedComponent = (0, react_1.forwardRef)(function (props, ref) {
|
|
30
|
-
return (0, react_1.createElement)(react_1.Fragment, null, (0, useObservable_1.useObservable)((0, react_1.useRef)(component((0, useAsObservable_1.useAsObservable)(props), ref)).current));
|
|
31
|
-
});
|
|
32
|
-
wrappedComponent.displayName = (0, displayName_1.wrapDisplayName)(component, 'reactiveComponent');
|
|
33
|
-
return wrappedComponent;
|
|
34
|
-
}
|
|
35
|
-
exports.forwardRef = forwardRef;
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
-
* @deprecated use an `of` operator and `useMemoObservable` instead for a faster, more robust and siimpler solution
|
|
8
|
-
*/
|
|
9
|
-
export declare function useAsObservable<T>(value: T): Observable<T>;
|
|
10
|
-
export declare function useAsObservable<T, K>(value: T, operator: (input: Observable<T>) => Observable<K>): Observable<K>;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useAsObservable = void 0;
|
|
4
|
-
var rxjs_1 = require("rxjs");
|
|
5
|
-
var react_1 = require("react");
|
|
6
|
-
var operators_1 = require("rxjs/operators");
|
|
7
|
-
function useAsObservable(value, operator) {
|
|
8
|
-
var setup = (0, react_1.useCallback)(function () {
|
|
9
|
-
var subject = new rxjs_1.BehaviorSubject(value);
|
|
10
|
-
var observable = subject.asObservable().pipe((0, operators_1.distinctUntilChanged)());
|
|
11
|
-
return [operator ? observable.pipe(operator) : observable, subject];
|
|
12
|
-
}, []);
|
|
13
|
-
var ref = (0, react_1.useRef)();
|
|
14
|
-
if (!ref.current) {
|
|
15
|
-
ref.current = setup();
|
|
16
|
-
}
|
|
17
|
-
var observable = ref.current[0];
|
|
18
|
-
(0, react_1.useEffect)(function () {
|
|
19
|
-
if (!ref.current) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
var _a = ref.current, subject = _a[1];
|
|
23
|
-
subject.next(value);
|
|
24
|
-
}, [value, ref]);
|
|
25
|
-
var shouldRestoreSubscriptionRef = (0, react_1.useRef)(false);
|
|
26
|
-
(0, react_1.useEffect)(function () {
|
|
27
|
-
if (shouldRestoreSubscriptionRef.current) {
|
|
28
|
-
if (!ref.current) {
|
|
29
|
-
ref.current = setup();
|
|
30
|
-
}
|
|
31
|
-
shouldRestoreSubscriptionRef.current = false;
|
|
32
|
-
}
|
|
33
|
-
return function () {
|
|
34
|
-
if (!ref.current) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
// React StrictMode will call effects as `setup + teardown + setup` thus we can't trust this callback as "react is about to unmount"
|
|
38
|
-
// Tracking this ref lets us set the subscription back up on the next `setup` call if needed, and if it really did unmounted then all is well
|
|
39
|
-
shouldRestoreSubscriptionRef.current = true;
|
|
40
|
-
var _a = ref.current, subject = _a[1];
|
|
41
|
-
subject.complete();
|
|
42
|
-
ref.current = undefined;
|
|
43
|
-
};
|
|
44
|
-
}, []);
|
|
45
|
-
return observable;
|
|
46
|
-
}
|
|
47
|
-
exports.useAsObservable = useAsObservable;
|
|
@@ -1,9 +0,0 @@
|
|
|
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;
|
|
@@ -1,11 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.observeElement = exports.observeContext = exports.observeCallback = exports.observeState = void 0;
|
|
4
|
-
var useAsObservable_1 = require("./useAsObservable");
|
|
5
|
-
var observable_callback_1 = require("observable-callback");
|
|
6
|
-
var operators_1 = require("rxjs/operators");
|
|
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
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
11
|
-
var _a = (0, react_1.useState)(initial), value = _a[0], update = _a[1];
|
|
12
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
13
|
-
return [(0, useAsObservable_1.useAsObservable)(value), update];
|
|
14
|
-
}
|
|
15
|
-
exports.observeState = observeState;
|
|
16
|
-
function observeCallback(operator) {
|
|
17
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
18
|
-
var ref = (0, react_1.useRef)();
|
|
19
|
-
if (!ref.current) {
|
|
20
|
-
ref.current = operator ? (0, observable_callback_1.observableCallback)(operator) : (0, observable_callback_1.observableCallback)();
|
|
21
|
-
}
|
|
22
|
-
return ref.current;
|
|
23
|
-
}
|
|
24
|
-
exports.observeCallback = observeCallback;
|
|
25
|
-
function observeContext(context) {
|
|
26
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
27
|
-
return (0, useAsObservable_1.useAsObservable)((0, react_1.useContext)(context));
|
|
28
|
-
}
|
|
29
|
-
exports.observeContext = observeContext;
|
|
30
|
-
function observeElement() {
|
|
31
|
-
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
32
|
-
var ref = (0, react_1.useRef)();
|
|
33
|
-
if (!ref.current) {
|
|
34
|
-
ref.current = createState(null);
|
|
35
|
-
}
|
|
36
|
-
return ref.current;
|
|
37
|
-
}
|
|
38
|
-
exports.observeElement = observeElement;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
declare type ObservableFactory<SourceProps, TargetProps> = (props$: Observable<SourceProps>) => Observable<TargetProps>;
|
|
4
|
-
/**
|
|
5
|
-
* @deprecated Use reactiveComponent instead
|
|
6
|
-
*/
|
|
7
|
-
export declare function withPropsStream<SourceProps, TargetProps>(observableOrFactory: Observable<TargetProps> | ObservableFactory<SourceProps, TargetProps>, TargetComponent: React.ComponentType<TargetProps>): React.FunctionComponent<SourceProps>;
|
|
8
|
-
export {};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
-
}
|
|
19
|
-
Object.defineProperty(o, k2, desc);
|
|
20
|
-
}) : (function(o, m, k, k2) {
|
|
21
|
-
if (k2 === undefined) k2 = k;
|
|
22
|
-
o[k2] = m[k];
|
|
23
|
-
}));
|
|
24
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
-
}) : function(o, v) {
|
|
27
|
-
o["default"] = v;
|
|
28
|
-
});
|
|
29
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
-
if (mod && mod.__esModule) return mod;
|
|
31
|
-
var result = {};
|
|
32
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
-
__setModuleDefault(result, mod);
|
|
34
|
-
return result;
|
|
35
|
-
};
|
|
36
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
exports.withPropsStream = void 0;
|
|
38
|
-
var React = __importStar(require("react"));
|
|
39
|
-
var operators_1 = require("rxjs/operators");
|
|
40
|
-
var displayName_1 = require("./displayName");
|
|
41
|
-
var reactiveComponent_1 = require("./reactiveComponent");
|
|
42
|
-
/**
|
|
43
|
-
* @deprecated Use reactiveComponent instead
|
|
44
|
-
*/
|
|
45
|
-
function withPropsStream(observableOrFactory, TargetComponent) {
|
|
46
|
-
var ComposedComponent = (0, reactiveComponent_1.reactiveComponent)(function (sourceProps$) {
|
|
47
|
-
var targetProps$ = typeof observableOrFactory === 'function'
|
|
48
|
-
? observableOrFactory(sourceProps$)
|
|
49
|
-
: observableOrFactory;
|
|
50
|
-
return targetProps$.pipe((0, operators_1.map)(function (props) { return React.createElement(TargetComponent, __assign({}, props)); }));
|
|
51
|
-
});
|
|
52
|
-
ComposedComponent.displayName = (0, displayName_1.wrapDisplayName)(TargetComponent, 'withPropsStream');
|
|
53
|
-
return ComposedComponent;
|
|
54
|
-
}
|
|
55
|
-
exports.withPropsStream = withPropsStream;
|