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
package/src/reactiveComponent.ts
CHANGED
|
@@ -1,33 +1,39 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
1
|
import {Observable} from 'rxjs'
|
|
3
2
|
import {wrapDisplayName} from './displayName'
|
|
4
3
|
import {useAsObservable} from './useAsObservable'
|
|
5
4
|
import {useObservable} from './useObservable'
|
|
5
|
+
import {
|
|
6
|
+
createElement,
|
|
7
|
+
Fragment,
|
|
8
|
+
FunctionComponent,
|
|
9
|
+
ReactNode,
|
|
10
|
+
Ref,
|
|
11
|
+
useRef,
|
|
12
|
+
forwardRef as reactForwardRef,
|
|
13
|
+
} from 'react'
|
|
6
14
|
|
|
7
|
-
type Component<Props> = (input$: Observable<Props>) => Observable<
|
|
15
|
+
type Component<Props> = (input$: Observable<Props>) => Observable<ReactNode>
|
|
8
16
|
|
|
9
|
-
function fromComponent<Props>(component: Component<Props>):
|
|
17
|
+
function fromComponent<Props>(component: Component<Props>): FunctionComponent<Props> {
|
|
10
18
|
const wrappedComponent = (props: Props) => {
|
|
11
|
-
return
|
|
12
|
-
|
|
19
|
+
return createElement(
|
|
20
|
+
Fragment,
|
|
13
21
|
null,
|
|
14
|
-
useObservable<
|
|
22
|
+
useObservable<ReactNode>(useRef(component(useAsObservable(props))).current),
|
|
15
23
|
)
|
|
16
24
|
}
|
|
17
25
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent')
|
|
18
26
|
return wrappedComponent
|
|
19
27
|
}
|
|
20
28
|
|
|
21
|
-
function fromObservable<Props>(input$: Observable<Props>):
|
|
29
|
+
function fromObservable<Props>(input$: Observable<Props>): FunctionComponent<{}> {
|
|
22
30
|
return function ReactiveComponent() {
|
|
23
|
-
return
|
|
31
|
+
return createElement(Fragment, null, useObservable<ReactNode>(input$))
|
|
24
32
|
}
|
|
25
33
|
}
|
|
26
34
|
|
|
27
|
-
export function reactiveComponent<Props>(observable: Observable<Props>):
|
|
28
|
-
export function reactiveComponent<Props>(
|
|
29
|
-
component: Component<Props>,
|
|
30
|
-
): React.FunctionComponent<Props>
|
|
35
|
+
export function reactiveComponent<Props>(observable: Observable<Props>): FunctionComponent<{}>
|
|
36
|
+
export function reactiveComponent<Props>(component: Component<Props>): FunctionComponent<Props>
|
|
31
37
|
export function reactiveComponent<Props>(
|
|
32
38
|
observableOrComponent: Observable<Props> | Component<Props>,
|
|
33
39
|
) {
|
|
@@ -38,15 +44,15 @@ export function reactiveComponent<Props>(
|
|
|
38
44
|
|
|
39
45
|
type ForwardRefComponent<RefType, Props> = (
|
|
40
46
|
input$: Observable<Props>,
|
|
41
|
-
ref:
|
|
42
|
-
) => Observable<
|
|
47
|
+
ref: Ref<RefType>,
|
|
48
|
+
) => Observable<ReactNode>
|
|
43
49
|
|
|
44
50
|
export function forwardRef<RefType, Props = {}>(component: ForwardRefComponent<RefType, Props>) {
|
|
45
|
-
const wrappedComponent =
|
|
46
|
-
return
|
|
47
|
-
|
|
51
|
+
const wrappedComponent = reactForwardRef((props: Props, ref: Ref<RefType>) => {
|
|
52
|
+
return createElement(
|
|
53
|
+
Fragment,
|
|
48
54
|
null,
|
|
49
|
-
useObservable<
|
|
55
|
+
useObservable<ReactNode>(useRef(component(useAsObservable(props), ref)).current),
|
|
50
56
|
)
|
|
51
57
|
})
|
|
52
58
|
wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent')
|
package/src/useAsObservable.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {BehaviorSubject, Observable, Subject} from 'rxjs'
|
|
2
|
-
import
|
|
2
|
+
import {useRef} from 'react'
|
|
3
|
+
import {useIsomorphicEffect} from './useIsomorphicEffect'
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* React hook to convert any props or state value into an observable
|
|
@@ -7,15 +8,24 @@ import * as React from 'react'
|
|
|
7
8
|
* Note: the returned observable is the same instance throughout the component lifecycle
|
|
8
9
|
* @param value
|
|
9
10
|
*/
|
|
10
|
-
export function useAsObservable<T>(value: T): Observable<T>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
export function useAsObservable<T>(value: T): Observable<T>
|
|
12
|
+
export function useAsObservable<T, K>(
|
|
13
|
+
value: T,
|
|
14
|
+
operator: (input: Observable<T>) => Observable<K>,
|
|
15
|
+
): Observable<K>
|
|
16
|
+
export function useAsObservable<T, K = T>(
|
|
17
|
+
value: T,
|
|
18
|
+
operator?: (input: Observable<T>) => Observable<K>,
|
|
19
|
+
): Observable<T | K> {
|
|
20
|
+
const isInitial = useRef(true)
|
|
21
|
+
const subjectRef = useRef<Subject<T>>(new BehaviorSubject(value))
|
|
22
|
+
const observableRef = useRef<Observable<T | K>>()
|
|
14
23
|
if (!observableRef.current) {
|
|
15
|
-
|
|
24
|
+
const observable = subjectRef.current.asObservable()
|
|
25
|
+
observableRef.current = operator ? observable.pipe(operator) : observable
|
|
16
26
|
}
|
|
17
27
|
|
|
18
|
-
|
|
28
|
+
useIsomorphicEffect(() => {
|
|
19
29
|
if (isInitial.current) {
|
|
20
30
|
isInitial.current = false
|
|
21
31
|
} else {
|
|
@@ -23,7 +33,7 @@ export function useAsObservable<T>(value: T): Observable<T> {
|
|
|
23
33
|
subjectRef.current.next(value)
|
|
24
34
|
}
|
|
25
35
|
}, [value])
|
|
26
|
-
|
|
36
|
+
useIsomorphicEffect(() => {
|
|
27
37
|
return () => {
|
|
28
38
|
return subjectRef.current.complete()
|
|
29
39
|
}
|
package/src/useObservable.ts
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
1
|
import {Observable, Subscription} from 'rxjs'
|
|
2
|
+
import {DependencyList, useMemo, useRef, useState} from 'react'
|
|
3
|
+
import {useIsomorphicEffect} from './useIsomorphicEffect'
|
|
3
4
|
|
|
4
5
|
function getValue<T>(value: T): T extends () => infer U ? U : T {
|
|
5
6
|
return typeof value === 'function' ? value() : value
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
export function useObservable<T>(observable
|
|
9
|
-
export function useObservable<T>(observable
|
|
10
|
-
export function useObservable<T>(observable
|
|
11
|
-
export function useObservable<T>(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
) {
|
|
15
|
-
const subscription = React.useRef<Subscription>()
|
|
16
|
-
const isInitial = React.useRef(true)
|
|
17
|
-
const [value, setState] = React.useState(() => {
|
|
9
|
+
export function useObservable<T>(observable: Observable<T>): T | undefined
|
|
10
|
+
export function useObservable<T>(observable: Observable<T>, initialValue: T): T
|
|
11
|
+
export function useObservable<T>(observable: Observable<T>, initialValue: () => T): T
|
|
12
|
+
export function useObservable<T>(observable: Observable<T>, initialValue?: T | (() => T)) {
|
|
13
|
+
const subscription = useRef<Subscription>()
|
|
14
|
+
const isInitial = useRef(true)
|
|
15
|
+
const [value, setState] = useState(() => {
|
|
18
16
|
let isSync = true
|
|
19
17
|
let syncVal = getValue(initialValue)
|
|
20
18
|
subscription.current = observable.subscribe(nextVal => {
|
|
@@ -28,8 +26,8 @@ export function useObservable<T>(
|
|
|
28
26
|
return syncVal
|
|
29
27
|
})
|
|
30
28
|
|
|
31
|
-
|
|
32
|
-
// when the observable
|
|
29
|
+
useIsomorphicEffect(() => {
|
|
30
|
+
// when the observable changes after initial (possibly sync render)
|
|
33
31
|
if (!isInitial.current) {
|
|
34
32
|
subscription.current = observable.subscribe(nextVal => setState(nextVal))
|
|
35
33
|
}
|
|
@@ -47,20 +45,20 @@ export function useObservable<T>(
|
|
|
47
45
|
|
|
48
46
|
export function useMemoObservable<T>(
|
|
49
47
|
observableOrFactory: Observable<T> | (() => Observable<T>),
|
|
50
|
-
deps:
|
|
51
|
-
):
|
|
48
|
+
deps: DependencyList,
|
|
49
|
+
): T | undefined
|
|
52
50
|
export function useMemoObservable<T>(
|
|
53
51
|
observableOrFactory: Observable<T> | (() => Observable<T>),
|
|
54
|
-
deps:
|
|
52
|
+
deps: DependencyList,
|
|
55
53
|
initialValue: T | (() => T),
|
|
56
|
-
):
|
|
54
|
+
): T
|
|
57
55
|
export function useMemoObservable<T>(
|
|
58
56
|
observableOrFactory: Observable<T> | (() => Observable<T>),
|
|
59
|
-
deps:
|
|
57
|
+
deps: DependencyList,
|
|
60
58
|
initialValue?: T | (() => T),
|
|
61
59
|
) {
|
|
62
60
|
return useObservable(
|
|
63
|
-
|
|
61
|
+
useMemo(() => getValue(observableOrFactory), deps),
|
|
64
62
|
initialValue,
|
|
65
63
|
)
|
|
66
64
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {DependencyList, useCallback, useEffect, useRef} from 'react'
|
|
2
|
+
import {observableCallback} from 'observable-callback'
|
|
3
|
+
import {Observable} from 'rxjs'
|
|
4
|
+
|
|
5
|
+
const EMPTY_DEPS: DependencyList = []
|
|
6
|
+
|
|
7
|
+
export function useObservableCallback<T, U>(
|
|
8
|
+
fn: (arg: Observable<T>) => Observable<U>,
|
|
9
|
+
dependencies: DependencyList = EMPTY_DEPS,
|
|
10
|
+
): (arg: T) => void {
|
|
11
|
+
const callbackRef = useRef<[Observable<T>, (val: T) => void]>()
|
|
12
|
+
|
|
13
|
+
if (!callbackRef.current) {
|
|
14
|
+
callbackRef.current = observableCallback<T>()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const [calls$, call] = callbackRef.current
|
|
18
|
+
|
|
19
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
20
|
+
const callback = useCallback(fn, dependencies)
|
|
21
|
+
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const subscription = calls$.pipe(callback).subscribe()
|
|
24
|
+
return () => {
|
|
25
|
+
subscription.unsubscribe()
|
|
26
|
+
}
|
|
27
|
+
}, [calls$, call, callback])
|
|
28
|
+
|
|
29
|
+
return call
|
|
30
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {Observable} from 'rxjs'
|
|
2
|
+
import {useObservable} from './useObservable'
|
|
3
|
+
import {useAsObservable} from './useAsObservable'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* React hook to convert any props or state value into an observable
|
|
7
|
+
* Returns an observable representing updates to any React value (props, state or any other calculated value)
|
|
8
|
+
* Note: the returned observable is the same instance throughout the component lifecycle
|
|
9
|
+
* @param value
|
|
10
|
+
*/
|
|
11
|
+
export function useWithObservable<T>(value: T): T | undefined
|
|
12
|
+
export function useWithObservable<T, K>(
|
|
13
|
+
value: T,
|
|
14
|
+
operator: (input: Observable<T>) => Observable<K>,
|
|
15
|
+
): K | undefined
|
|
16
|
+
export function useWithObservable<T, K = T>(
|
|
17
|
+
value: T,
|
|
18
|
+
operator?: (input: Observable<T>) => Observable<K>,
|
|
19
|
+
): T | K | undefined {
|
|
20
|
+
return operator
|
|
21
|
+
? useObservable(useAsObservable(value, operator))
|
|
22
|
+
: useObservable(useAsObservable(value))
|
|
23
|
+
}
|
package/src/utils.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {Observable, OperatorFunction} from 'rxjs'
|
|
2
|
-
import * as React from 'react'
|
|
3
2
|
import {useAsObservable} from './useAsObservable'
|
|
4
3
|
import {observableCallback} from 'observable-callback'
|
|
5
4
|
import {startWith} from 'rxjs/operators'
|
|
5
|
+
import {Dispatch, SetStateAction, useContext, useRef, useState, Context} from 'react'
|
|
6
6
|
|
|
7
7
|
const createState = <T>(initialState: T) => observableCallback(startWith<T, T>(initialState))
|
|
8
8
|
|
|
9
9
|
export function observeState<T>(
|
|
10
10
|
initial: T | (() => T),
|
|
11
|
-
): [Observable<T>,
|
|
11
|
+
): [Observable<T>, Dispatch<SetStateAction<T>>]
|
|
12
12
|
export function observeState<T>(
|
|
13
13
|
initial?: T | (() => T),
|
|
14
|
-
): [Observable<T | undefined>,
|
|
15
|
-
const [value, update] =
|
|
14
|
+
): [Observable<T | undefined>, Dispatch<SetStateAction<T | undefined>>] {
|
|
15
|
+
const [value, update] = useState<T | undefined>(initial)
|
|
16
16
|
return [useAsObservable(value), update]
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -23,19 +23,19 @@ export function observeCallback<T, K>(
|
|
|
23
23
|
export function observeCallback<T, K>(
|
|
24
24
|
operator?: OperatorFunction<T, K>,
|
|
25
25
|
): [Observable<T | K>, (arg: T) => void] {
|
|
26
|
-
const ref =
|
|
26
|
+
const ref = useRef<[Observable<T | K>, (arg: T) => void]>()
|
|
27
27
|
if (!ref.current) {
|
|
28
28
|
ref.current = operator ? observableCallback<T, K>(operator) : observableCallback<T>()
|
|
29
29
|
}
|
|
30
30
|
return ref.current
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
export function observeContext<T>(context:
|
|
34
|
-
return useAsObservable(
|
|
33
|
+
export function observeContext<T>(context: Context<T>): Observable<T> {
|
|
34
|
+
return useAsObservable(useContext<T>(context))
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export function observeElement<T>(): [Observable<T | null>, (el: T | null) => void] {
|
|
38
|
-
const ref =
|
|
38
|
+
const ref = useRef<[Observable<T | null>, (value: T | null) => void]>()
|
|
39
39
|
if (!ref.current) {
|
|
40
40
|
ref.current = createState<T | null>(null)
|
|
41
41
|
}
|
package/jest.config.js
DELETED
package/website/.babelrc
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"presets": [
|
|
3
|
-
"@babel/react",
|
|
4
|
-
"@babel/typescript",
|
|
5
|
-
[
|
|
6
|
-
"@babel/env",
|
|
7
|
-
{
|
|
8
|
-
"targets": {
|
|
9
|
-
"esmodules": true
|
|
10
|
-
},
|
|
11
|
-
"modules": false
|
|
12
|
-
}
|
|
13
|
-
]
|
|
14
|
-
],
|
|
15
|
-
"plugins": [
|
|
16
|
-
"@babel/plugin-proposal-optional-chaining",
|
|
17
|
-
"@babel/plugin-proposal-class-properties",
|
|
18
|
-
"babel-plugin-static-fs",
|
|
19
|
-
"babel-plugin-styled-components"
|
|
20
|
-
]
|
|
21
|
-
}
|
package/website/.prettierrc
DELETED
package/website/README.mdx
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
WRONG README
|
package/website/package.json
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "react-rx-website",
|
|
3
|
-
"private": true,
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "React rx website",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"build": "NODE_ENV=production webpack --mode=production --config webpack/config.js",
|
|
8
|
-
"watch": "webpack -w --config webpack/config.js",
|
|
9
|
-
"start": "webpack-dev-server --config webpack/config.js",
|
|
10
|
-
"dev": "npm start",
|
|
11
|
-
"postinstall": "cp ../README.md src/pages/Index/ReactRxReadme.md"
|
|
12
|
-
},
|
|
13
|
-
"keywords": [],
|
|
14
|
-
"dependencies": {
|
|
15
|
-
"@babel/core": "^7.10.3",
|
|
16
|
-
"@babel/plugin-proposal-class-properties": "^7.10.1",
|
|
17
|
-
"@babel/plugin-proposal-optional-chaining": "^7.10.3",
|
|
18
|
-
"@babel/plugin-transform-typescript": "^7.10.3",
|
|
19
|
-
"@babel/preset-react": "^7.10.1",
|
|
20
|
-
"@babel/preset-typescript": "^7.10.1",
|
|
21
|
-
"@mdx-js/react": "^1.6.6",
|
|
22
|
-
"@types/babel__core": "^7.1.9",
|
|
23
|
-
"@types/codemirror": "^0.0.96",
|
|
24
|
-
"@types/history": "^4.7.6",
|
|
25
|
-
"@types/mdx-js__react": "^1.5.2",
|
|
26
|
-
"@types/react": "^16.9.41",
|
|
27
|
-
"@types/react-dom": "^16.9.8",
|
|
28
|
-
"@types/styled-components": "^5.1.0",
|
|
29
|
-
"@typescript-eslint/eslint-plugin": "^3.4.0",
|
|
30
|
-
"@typescript-eslint/parser": "^3.4.0",
|
|
31
|
-
"bezier-easing": "^2.1.0",
|
|
32
|
-
"codemirror": "^5.55.0",
|
|
33
|
-
"date-fns": "^2.14.0",
|
|
34
|
-
"eslint": "^7.3.1",
|
|
35
|
-
"eslint-config-prettier": "^6.11.0",
|
|
36
|
-
"eslint-plugin-prettier": "^3.1.4",
|
|
37
|
-
"eslint-plugin-react": "^7.20.0",
|
|
38
|
-
"history": "^5.0.0",
|
|
39
|
-
"jest": "^26.1.0",
|
|
40
|
-
"lodash": "^4.17.15",
|
|
41
|
-
"observable-callback": "^1.0.1",
|
|
42
|
-
"prettier": "2.0.5",
|
|
43
|
-
"react": "^17.0.1",
|
|
44
|
-
"react-codemirror2": "^7.2.1",
|
|
45
|
-
"react-css-burger": "^0.2.0",
|
|
46
|
-
"react-dom": "^17.0.1",
|
|
47
|
-
"react-rx": "1.0.0-beta.3",
|
|
48
|
-
"remark-emoji": "^2.1.0",
|
|
49
|
-
"rimraf": "^3.0.2",
|
|
50
|
-
"rxjs": "^6.5.5",
|
|
51
|
-
"styled-components": "^5.1.1",
|
|
52
|
-
"webpack": "^4.43.0",
|
|
53
|
-
"webpack-cli": "^3.3.12"
|
|
54
|
-
},
|
|
55
|
-
"author": "",
|
|
56
|
-
"license": "ISC",
|
|
57
|
-
"devDependencies": {
|
|
58
|
-
"@babel/preset-env": "^7.10.3",
|
|
59
|
-
"@babel/standalone": "^7.10.3",
|
|
60
|
-
"@mdx-js/loader": "^1.6.6",
|
|
61
|
-
"@mdx-js/mdx": "^1.6.6",
|
|
62
|
-
"@types/lodash": "^4.14.157",
|
|
63
|
-
"@types/node": "^14.0.14",
|
|
64
|
-
"@webhotelier/webpack-fast-refresh": "5.0.1",
|
|
65
|
-
"babel-loader": "^8.1.0",
|
|
66
|
-
"babel-plugin-static-fs": "^3.0.0",
|
|
67
|
-
"babel-plugin-styled-components": "^1.10.7",
|
|
68
|
-
"clean-webpack-plugin": "^3.0.0",
|
|
69
|
-
"copy-webpack-plugin": "^6.0.2",
|
|
70
|
-
"css-loader": "^3.6.0",
|
|
71
|
-
"github-slugger": "^1.3.0",
|
|
72
|
-
"html-loader": "^1.1.0",
|
|
73
|
-
"html-webpack-plugin": "^4.3.0",
|
|
74
|
-
"markdown-toc": "^1.2.0",
|
|
75
|
-
"react-refresh": "0.8.3",
|
|
76
|
-
"remark-slug": "^6.0.0",
|
|
77
|
-
"style-loader": "^1.2.1",
|
|
78
|
-
"ts-loader": "^7.0.5",
|
|
79
|
-
"ts-node": "^8.10.2",
|
|
80
|
-
"tsconfig-paths": "^3.9.0",
|
|
81
|
-
"typescript": "^3.9.5",
|
|
82
|
-
"webpack-dev-server": "^3.11.0"
|
|
83
|
-
}
|
|
84
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
declare module '*.md' {
|
|
2
|
-
const MDXComponent: (props: any) => JSX.Element
|
|
3
|
-
export default MDXComponent
|
|
4
|
-
export {MDXComponent as Toc}
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
declare module '*.mdx' {
|
|
8
|
-
const MDXComponent: (props: any) => JSX.Element
|
|
9
|
-
export default MDXComponent
|
|
10
|
-
export {MDXComponent as Toc}
|
|
11
|
-
}
|
package/website/src/App.tsx
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
import {createGlobalStyle} from 'styled-components'
|
|
3
|
-
import {rxComponent} from 'react-rx'
|
|
4
|
-
import {map} from 'rxjs/operators'
|
|
5
|
-
import {COLORS, media} from './theme'
|
|
6
|
-
import {pageTransition$} from './datastores/pageTransition'
|
|
7
|
-
|
|
8
|
-
const GlobalStyle = createGlobalStyle`
|
|
9
|
-
body {
|
|
10
|
-
${media.between('xsmall', 'small')} {
|
|
11
|
-
font-size: 12px;
|
|
12
|
-
}
|
|
13
|
-
${media.between('small', 'medium')} {
|
|
14
|
-
font-size: 14px;
|
|
15
|
-
}
|
|
16
|
-
${media.greaterThan('medium')} {
|
|
17
|
-
font-size: 16px;
|
|
18
|
-
}
|
|
19
|
-
${media.greaterThan('large')} {
|
|
20
|
-
font-size: 18px;
|
|
21
|
-
}
|
|
22
|
-
padding: 0;
|
|
23
|
-
margin: 0;
|
|
24
|
-
background: ${COLORS.background};
|
|
25
|
-
color: ${COLORS.text};
|
|
26
|
-
font-family: Inter, -apple-system, system-ui, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,
|
|
27
|
-
'Droid Sans', 'Helvetica Neue', 'Fira Sans', system-ui, sans-serif;
|
|
28
|
-
font-size: 1.125rem;
|
|
29
|
-
overflow-y: scroll;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
h1::before, h2::before, h3::before, h4::before {
|
|
33
|
-
display: block;
|
|
34
|
-
content: " ";
|
|
35
|
-
visibility: hidden;
|
|
36
|
-
pointer-events: none;
|
|
37
|
-
}
|
|
38
|
-
h2::before, h3::before, h4::before {
|
|
39
|
-
margin-top: -6em;
|
|
40
|
-
height: 6em;
|
|
41
|
-
}
|
|
42
|
-
h1::before {
|
|
43
|
-
margin-top: -6em;
|
|
44
|
-
height: 6em;
|
|
45
|
-
}
|
|
46
|
-
a:link,
|
|
47
|
-
a:visited {
|
|
48
|
-
color: ${COLORS.link};
|
|
49
|
-
text-decoration: none;
|
|
50
|
-
}
|
|
51
|
-
`
|
|
52
|
-
|
|
53
|
-
export const App = rxComponent(
|
|
54
|
-
pageTransition$.pipe(
|
|
55
|
-
map((transition) => {
|
|
56
|
-
return (
|
|
57
|
-
<>
|
|
58
|
-
<GlobalStyle />
|
|
59
|
-
{transition.component ? (
|
|
60
|
-
<transition.component />
|
|
61
|
-
) : (
|
|
62
|
-
<div>Loading…</div>
|
|
63
|
-
)}
|
|
64
|
-
</>
|
|
65
|
-
)
|
|
66
|
-
})
|
|
67
|
-
)
|
|
68
|
-
)
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import {Link} from './Link'
|
|
2
|
-
import * as React from 'react'
|
|
3
|
-
import styled from 'styled-components'
|
|
4
|
-
import {rxComponent} from 'react-rx'
|
|
5
|
-
import {pages} from '../pages/pages'
|
|
6
|
-
|
|
7
|
-
import {map} from 'rxjs/operators'
|
|
8
|
-
import {GithubLogo} from './logos/Github'
|
|
9
|
-
import {COLORS} from '../theme'
|
|
10
|
-
import {ReactRxLogo} from './logos/ReactRxLogo'
|
|
11
|
-
import {pageTransition$} from '../datastores/pageTransition'
|
|
12
|
-
import {omit} from 'lodash'
|
|
13
|
-
|
|
14
|
-
const StyledHeader = styled.header`
|
|
15
|
-
z-index: 2000;
|
|
16
|
-
position: fixed;
|
|
17
|
-
top: 0;
|
|
18
|
-
left: 0;
|
|
19
|
-
right: 0;
|
|
20
|
-
padding-bottom: 0;
|
|
21
|
-
background: ${COLORS.header.background};
|
|
22
|
-
a,
|
|
23
|
-
a:link,
|
|
24
|
-
a:visited {
|
|
25
|
-
color: ${COLORS.header.text};
|
|
26
|
-
}
|
|
27
|
-
`
|
|
28
|
-
|
|
29
|
-
const HeaderInner = styled.div`
|
|
30
|
-
display: flex;
|
|
31
|
-
flex-direction: row;
|
|
32
|
-
justify-content: space-between;
|
|
33
|
-
align-items: center;
|
|
34
|
-
height: 5em;
|
|
35
|
-
padding: 0.5em 1em 0.5em 1em;
|
|
36
|
-
background-color: ${COLORS.header.background};
|
|
37
|
-
`
|
|
38
|
-
|
|
39
|
-
const LinkWrapper = styled.div`
|
|
40
|
-
color: #efefef;
|
|
41
|
-
padding: 0.5em 1.2em 0.5em 0;
|
|
42
|
-
`
|
|
43
|
-
|
|
44
|
-
const omitProps = <T extends React.ComponentType>(
|
|
45
|
-
Component: T,
|
|
46
|
-
omitProps: string[]
|
|
47
|
-
) => (props: React.ComponentProps<T>) => {
|
|
48
|
-
const omitted: any = omit(props, omitProps)
|
|
49
|
-
return <Component {...omitted} />
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const PageLink = styled(omitProps(Link, ['isActive', 'isTransitioningTo']))<{
|
|
53
|
-
isActive: boolean
|
|
54
|
-
isTransitioningTo: boolean
|
|
55
|
-
}>`
|
|
56
|
-
display: block;
|
|
57
|
-
color: ${COLORS.text};
|
|
58
|
-
font-size: 1em;
|
|
59
|
-
&:link,
|
|
60
|
-
&:visited {
|
|
61
|
-
color: ${COLORS.text};
|
|
62
|
-
text-decoration: ${(props) =>
|
|
63
|
-
(props.isActive || props.isTransitioningTo) && `underline`};
|
|
64
|
-
text-decoration-style: ${(props) => props.isTransitioningTo && `wavy`};
|
|
65
|
-
}
|
|
66
|
-
`
|
|
67
|
-
|
|
68
|
-
const LogoWrapper = styled.div`
|
|
69
|
-
font-family: Roboto, 'Helvetica Neue Light', 'Helvetica Neue', Helvetica,
|
|
70
|
-
Arial, 'Lucida Grande', sans-serif;
|
|
71
|
-
-webkit-font-smoothing: antialiased;
|
|
72
|
-
font-weight: bold;
|
|
73
|
-
font-size: 1.3em;
|
|
74
|
-
display: flex;
|
|
75
|
-
flex-grow: 1;
|
|
76
|
-
align-items: center;
|
|
77
|
-
`
|
|
78
|
-
const Logo = () => (
|
|
79
|
-
<LogoWrapper>
|
|
80
|
-
<Link href="/">
|
|
81
|
-
<ReactRxLogo size="2em" style={{paddingRight: '0.4em'}} />
|
|
82
|
-
ReactRx
|
|
83
|
-
</Link>
|
|
84
|
-
</LogoWrapper>
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
export const Header = rxComponent((page$) =>
|
|
88
|
-
pageTransition$.pipe(
|
|
89
|
-
map((transitionState) => (
|
|
90
|
-
<StyledHeader>
|
|
91
|
-
<HeaderInner>
|
|
92
|
-
<Logo />
|
|
93
|
-
{pages
|
|
94
|
-
.filter((page) => page.id !== 'home')
|
|
95
|
-
.map((page) => {
|
|
96
|
-
return (
|
|
97
|
-
<LinkWrapper key={page.id}>
|
|
98
|
-
<PageLink
|
|
99
|
-
href={page.route}
|
|
100
|
-
isTransitioningTo={
|
|
101
|
-
transitionState.isTransitioning &&
|
|
102
|
-
transitionState.next === page
|
|
103
|
-
}
|
|
104
|
-
isActive={transitionState.current === page}
|
|
105
|
-
>
|
|
106
|
-
{page.title}
|
|
107
|
-
</PageLink>
|
|
108
|
-
</LinkWrapper>
|
|
109
|
-
)
|
|
110
|
-
})}
|
|
111
|
-
<a href="https://github.com/sanity-io/react-rx">
|
|
112
|
-
<GithubLogo style={{color: '#fff'}} height="25" width="25" />
|
|
113
|
-
</a>
|
|
114
|
-
</HeaderInner>
|
|
115
|
-
</StyledHeader>
|
|
116
|
-
))
|
|
117
|
-
)
|
|
118
|
-
)
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
import {navigate} from '../datastores/location'
|
|
3
|
-
|
|
4
|
-
export function Link(props: React.ComponentProps<'a'>) {
|
|
5
|
-
const onClick = React.useCallback(
|
|
6
|
-
event => {
|
|
7
|
-
if (props.onClick) {
|
|
8
|
-
props.onClick(event)
|
|
9
|
-
}
|
|
10
|
-
event.preventDefault()
|
|
11
|
-
if (props.href) {
|
|
12
|
-
navigate(props.href)
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
[props.href, props.onClick]
|
|
16
|
-
)
|
|
17
|
-
return <a {...props} onClick={onClick} />
|
|
18
|
-
}
|