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.
Files changed (171) hide show
  1. package/.idea/vcs.xml +0 -3
  2. package/.idea/workspace.xml +18 -15
  3. package/dist/cjs/WithObservable.d.ts +3 -3
  4. package/dist/cjs/WithObservable.js +3 -3
  5. package/dist/cjs/index.d.ts +3 -2
  6. package/dist/cjs/index.js +9 -6
  7. package/dist/cjs/reactiveComponent.d.ts +6 -6
  8. package/dist/cjs/reactiveComponent.js +7 -26
  9. package/dist/cjs/useAsObservable.d.ts +1 -0
  10. package/dist/cjs/useAsObservable.js +10 -33
  11. package/dist/cjs/useIsomorphicEffect.d.ts +2 -0
  12. package/dist/cjs/useIsomorphicEffect.js +5 -0
  13. package/dist/cjs/useObservable.d.ts +6 -6
  14. package/dist/cjs/useObservable.js +8 -26
  15. package/dist/cjs/useObservableCallback.d.ts +3 -0
  16. package/dist/cjs/useObservableCallback.js +24 -0
  17. package/dist/cjs/useWithObservable.d.ts +9 -0
  18. package/dist/cjs/useWithObservable.js +11 -0
  19. package/dist/cjs/utils.d.ts +3 -3
  20. package/dist/cjs/utils.js +8 -27
  21. package/dist/cjs/withPropsStream.js +3 -3
  22. package/dist/es2015/WithObservable.d.ts +3 -3
  23. package/dist/es2015/index.d.ts +3 -2
  24. package/dist/es2015/index.js +4 -2
  25. package/dist/es2015/reactiveComponent.d.ts +6 -6
  26. package/dist/es2015/reactiveComponent.js +5 -5
  27. package/dist/es2015/useAsObservable.d.ts +1 -0
  28. package/dist/es2015/useAsObservable.js +10 -14
  29. package/dist/es2015/useIsomorphicEffect.d.ts +2 -0
  30. package/dist/es2015/useIsomorphicEffect.js +2 -0
  31. package/dist/es2015/useObservable.d.ts +6 -6
  32. package/dist/es2015/useObservable.js +8 -7
  33. package/dist/es2015/useObservableCallback.d.ts +3 -0
  34. package/dist/es2015/useObservableCallback.js +19 -0
  35. package/dist/es2015/useWithObservable.d.ts +9 -0
  36. package/dist/es2015/useWithObservable.js +7 -0
  37. package/dist/es2015/utils.d.ts +3 -3
  38. package/dist/es2015/utils.js +5 -5
  39. package/dist/esm/WithObservable.d.ts +3 -3
  40. package/dist/esm/index.d.ts +3 -2
  41. package/dist/esm/index.js +4 -2
  42. package/dist/esm/reactiveComponent.d.ts +6 -6
  43. package/dist/esm/reactiveComponent.js +5 -5
  44. package/dist/esm/useAsObservable.d.ts +1 -0
  45. package/dist/esm/useAsObservable.js +10 -14
  46. package/dist/esm/useIsomorphicEffect.d.ts +2 -0
  47. package/dist/esm/useIsomorphicEffect.js +2 -0
  48. package/dist/esm/useObservable.d.ts +6 -6
  49. package/dist/esm/useObservable.js +8 -7
  50. package/dist/esm/useObservableCallback.d.ts +3 -0
  51. package/dist/esm/useObservableCallback.js +20 -0
  52. package/dist/esm/useWithObservable.d.ts +9 -0
  53. package/dist/esm/useWithObservable.js +7 -0
  54. package/dist/esm/utils.d.ts +3 -3
  55. package/dist/esm/utils.js +5 -5
  56. package/package.json +3 -3
  57. package/src/WithObservable.tsx +4 -3
  58. package/src/index.ts +5 -4
  59. package/src/reactiveComponent.ts +24 -18
  60. package/src/useAsObservable.ts +18 -8
  61. package/src/useIsomorphicEffect.ts +3 -0
  62. package/src/useObservable.ts +17 -19
  63. package/src/useObservableCallback.ts +30 -0
  64. package/src/useWithObservable.ts +23 -0
  65. package/src/utils.ts +8 -8
  66. package/jest.config.js +0 -5
  67. package/website/.babelrc +0 -21
  68. package/website/.prettierrc +0 -7
  69. package/website/README.mdx +0 -1
  70. package/website/package.json +0 -84
  71. package/website/src/@types/babel.d.ts +0 -4
  72. package/website/src/@types/mdx.d.ts +0 -11
  73. package/website/src/@types/react-css-burger.d.ts +0 -4
  74. package/website/src/App.tsx +0 -68
  75. package/website/src/components/Header.tsx +0 -118
  76. package/website/src/components/Link.tsx +0 -18
  77. package/website/src/components/LoadPage.tsx +0 -60
  78. package/website/src/components/Sidebar.tsx +0 -88
  79. package/website/src/components/logos/Github.tsx +0 -10
  80. package/website/src/components/logos/React.tsx +0 -27
  81. package/website/src/components/logos/ReactRxLogo.tsx +0 -39
  82. package/website/src/components/logos/RxJs.tsx +0 -69
  83. package/website/src/components/repl/Checkerboard.tsx +0 -25
  84. package/website/src/components/repl/CodeBlock.tsx +0 -147
  85. package/website/src/components/repl/CodeMirror.tsx +0 -37
  86. package/website/src/components/repl/CodeMirrorMode.tsx +0 -67
  87. package/website/src/components/repl/EvalCode.tsx +0 -55
  88. package/website/src/components/repl/Prelude.tsx +0 -50
  89. package/website/src/components/repl/ShowError.tsx +0 -27
  90. package/website/src/components/repl/codemirror-lib.ts +0 -8
  91. package/website/src/components/repl/codemirror-theme.css +0 -131
  92. package/website/src/components/repl/compile/babel.ts +0 -21
  93. package/website/src/components/repl/eval/evalCallback.ts +0 -27
  94. package/website/src/components/repl/eval/evalCode.ts +0 -7
  95. package/website/src/components/repl/eval/evalExpression.ts +0 -4
  96. package/website/src/components/repl/eval/evalReactDomRender.ts +0 -23
  97. package/website/src/components/repl/index.ts +0 -1
  98. package/website/src/components/repl/runMode.ts +0 -42
  99. package/website/src/datastores/location.ts +0 -14
  100. package/website/src/datastores/page.ts +0 -11
  101. package/website/src/datastores/pageTransition.ts +0 -97
  102. package/website/src/entries/main.css +0 -2
  103. package/website/src/entries/main.tsx +0 -6
  104. package/website/src/examples/FizzBuzz/FizzBuzzExample.tsx +0 -39
  105. package/website/src/examples/FizzBuzz/index.tsx +0 -9
  106. package/website/src/examples/_utils/globalScope.ts +0 -45
  107. package/website/src/examples/animation/AnimationExample.tsx +0 -152
  108. package/website/src/examples/animation/easings.ts +0 -0
  109. package/website/src/examples/animation/index.tsx +0 -15
  110. package/website/src/examples/context/Context.example.jsx +0 -67
  111. package/website/src/examples/context/index.tsx +0 -9
  112. package/website/src/examples/errors/Errors.example.jsx +0 -69
  113. package/website/src/examples/errors/index.tsx +0 -9
  114. package/website/src/examples/event-handlers/EventHandlersExample.tsx +0 -48
  115. package/website/src/examples/event-handlers/index.tsx +0 -9
  116. package/website/src/examples/fetch/FetchExample.jsx +0 -43
  117. package/website/src/examples/fetch/a.txt +0 -1
  118. package/website/src/examples/fetch/b.txt +0 -1
  119. package/website/src/examples/fetch/index.tsx +0 -9
  120. package/website/src/examples/form-data/FormDataExample.jsx +0 -119
  121. package/website/src/examples/form-data/index.tsx +0 -12
  122. package/website/src/examples/form-data/storage.ts +0 -27
  123. package/website/src/examples/forward-ref/ForwardRefExample.tsx +0 -55
  124. package/website/src/examples/forward-ref/index.tsx +0 -9
  125. package/website/src/examples/hello-world/HelloWorld.example.jsx +0 -6
  126. package/website/src/examples/hello-world/index.tsx +0 -9
  127. package/website/src/examples/hooks-interop/HooksInterop.example.tsx +0 -42
  128. package/website/src/examples/hooks-interop/index.tsx +0 -9
  129. package/website/src/examples/passthrough-props/PassThroughPropsExample.jsx +0 -57
  130. package/website/src/examples/passthrough-props/index.tsx +0 -11
  131. package/website/src/examples/reactive-state/ReactiveState.example.jsx +0 -43
  132. package/website/src/examples/reactive-state/index.ts +0 -9
  133. package/website/src/examples/readme-examples/README.mdx +0 -0
  134. package/website/src/examples/readme-examples/index.ts +0 -11
  135. package/website/src/examples/shared-state/SharedState.example.tsx +0 -59
  136. package/website/src/examples/shared-state/index.tsx +0 -9
  137. package/website/src/examples/simple/Counter.example.tsx +0 -14
  138. package/website/src/examples/simple/index.tsx +0 -9
  139. package/website/src/examples/sync/Sync.example.tsx +0 -9
  140. package/website/src/examples/sync/index.tsx +0 -9
  141. package/website/src/examples/tick/TickExample.jsx +0 -51
  142. package/website/src/examples/tick/index.ts +0 -9
  143. package/website/src/examples/todo-app/TodoApp.example.tsx +0 -88
  144. package/website/src/examples/todo-app/index.tsx +0 -12
  145. package/website/src/examples/todo-app/storage.ts +0 -27
  146. package/website/src/examples/use-element/UseElementExample.tsx +0 -70
  147. package/website/src/examples/use-element/index.tsx +0 -9
  148. package/website/src/examples/use-observable/search/SearchExample.tsx +0 -82
  149. package/website/src/examples/use-observable/search/index.tsx +0 -8
  150. package/website/src/examples/use-observable/use-observable/UseObservableExample.tsx +0 -70
  151. package/website/src/examples/use-observable/use-observable/index.tsx +0 -9
  152. package/website/src/index.html +0 -10
  153. package/website/src/mdx-components.tsx +0 -74
  154. package/website/src/pages/Api/Api.mdx +0 -134
  155. package/website/src/pages/Api/ApiPage.tsx +0 -25
  156. package/website/src/pages/Examples/Examples.tsx +0 -105
  157. package/website/src/pages/Examples/ExamplesPage.tsx +0 -13
  158. package/website/src/pages/Guide/Guide.mdx +0 -275
  159. package/website/src/pages/Guide/GuidePage.tsx +0 -25
  160. package/website/src/pages/Index/IndexPage.tsx +0 -50
  161. package/website/src/pages/Index/ReactRxReadme.md +0 -20
  162. package/website/src/pages/NotFound.tsx +0 -3
  163. package/website/src/pages/pages.ts +0 -46
  164. package/website/src/pages/styles.tsx +0 -24
  165. package/website/src/theme.ts +0 -61
  166. package/website/src/utils/parseCodeFenceHeader.ts +0 -32
  167. package/website/tsconfig.json +0 -30
  168. package/website/vercel.json +0 -4
  169. package/website/webpack/config.js +0 -5
  170. package/website/webpack/createConfig.js +0 -95
  171. package/website/webpack/mdx-toc-loader.js +0 -38
@@ -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<React.ReactNode>
15
+ type Component<Props> = (input$: Observable<Props>) => Observable<ReactNode>
8
16
 
9
- function fromComponent<Props>(component: Component<Props>): React.FunctionComponent<Props> {
17
+ function fromComponent<Props>(component: Component<Props>): FunctionComponent<Props> {
10
18
  const wrappedComponent = (props: Props) => {
11
- return React.createElement(
12
- React.Fragment,
19
+ return createElement(
20
+ Fragment,
13
21
  null,
14
- useObservable<React.ReactNode>(React.useRef(component(useAsObservable(props))).current),
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>): React.FunctionComponent<{}> {
29
+ function fromObservable<Props>(input$: Observable<Props>): FunctionComponent<{}> {
22
30
  return function ReactiveComponent() {
23
- return React.createElement(React.Fragment, null, useObservable<React.ReactNode>(input$))
31
+ return createElement(Fragment, null, useObservable<ReactNode>(input$))
24
32
  }
25
33
  }
26
34
 
27
- export function reactiveComponent<Props>(observable: Observable<Props>): React.FunctionComponent<{}>
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: React.Ref<RefType>,
42
- ) => Observable<React.ReactNode>
47
+ ref: Ref<RefType>,
48
+ ) => Observable<ReactNode>
43
49
 
44
50
  export function forwardRef<RefType, Props = {}>(component: ForwardRefComponent<RefType, Props>) {
45
- const wrappedComponent = React.forwardRef((props: Props, ref: React.Ref<RefType>) => {
46
- return React.createElement(
47
- React.Fragment,
51
+ const wrappedComponent = reactForwardRef((props: Props, ref: Ref<RefType>) => {
52
+ return createElement(
53
+ Fragment,
48
54
  null,
49
- useObservable<React.ReactNode>(React.useRef(component(useAsObservable(props), ref)).current),
55
+ useObservable<ReactNode>(useRef(component(useAsObservable(props), ref)).current),
50
56
  )
51
57
  })
52
58
  wrappedComponent.displayName = wrapDisplayName(component, 'reactiveComponent')
@@ -1,5 +1,6 @@
1
1
  import {BehaviorSubject, Observable, Subject} from 'rxjs'
2
- import * as React from 'react'
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
- const isInitial = React.useRef(true)
12
- const subjectRef = React.useRef<Subject<T>>(new BehaviorSubject(value))
13
- const observableRef = React.useRef<Observable<T>>()
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
- observableRef.current = subjectRef.current.asObservable()
24
+ const observable = subjectRef.current.asObservable()
25
+ observableRef.current = operator ? observable.pipe(operator) : observable
16
26
  }
17
27
 
18
- React.useEffect(() => {
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
- React.useEffect(() => {
36
+ useIsomorphicEffect(() => {
27
37
  return () => {
28
38
  return subjectRef.current.complete()
29
39
  }
@@ -0,0 +1,3 @@
1
+ import {useEffect, useLayoutEffect} from 'react'
2
+
3
+ export const useIsomorphicEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect
@@ -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$: Observable<T>): T | undefined
9
- export function useObservable<T>(observable$: Observable<T>, initialValue: T): T
10
- export function useObservable<T>(observable$: Observable<T>, initialValue: () => T): T
11
- export function useObservable<T>(
12
- observable: Observable<T>,
13
- initialValue?: T | (() => T),
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
- React.useEffect(() => {
32
- // when the observable$ changes after initial (possibly sync render)
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: React.DependencyList,
51
- ): Observable<T | undefined>
48
+ deps: DependencyList,
49
+ ): T | undefined
52
50
  export function useMemoObservable<T>(
53
51
  observableOrFactory: Observable<T> | (() => Observable<T>),
54
- deps: React.DependencyList,
52
+ deps: DependencyList,
55
53
  initialValue: T | (() => T),
56
- ): Observable<T>
54
+ ): T
57
55
  export function useMemoObservable<T>(
58
56
  observableOrFactory: Observable<T> | (() => Observable<T>),
59
- deps: React.DependencyList,
57
+ deps: DependencyList,
60
58
  initialValue?: T | (() => T),
61
59
  ) {
62
60
  return useObservable(
63
- React.useMemo(() => getValue(observableOrFactory), deps),
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>, React.Dispatch<React.SetStateAction<T>>]
11
+ ): [Observable<T>, Dispatch<SetStateAction<T>>]
12
12
  export function observeState<T>(
13
13
  initial?: T | (() => T),
14
- ): [Observable<T | undefined>, React.Dispatch<React.SetStateAction<T | undefined>>] {
15
- const [value, update] = React.useState<T | undefined>(initial)
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 = React.useRef<[Observable<T | K>, (arg: T) => void]>()
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: React.Context<T>): Observable<T> {
34
- return useAsObservable(React.useContext<T>(context))
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 = React.useRef<[Observable<T | null>, (value: T | null) => void]>()
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
@@ -1,5 +0,0 @@
1
- module.exports = {
2
- preset: 'ts-jest',
3
- testEnvironment: 'jsdom',
4
- rootDir: "src"
5
- }
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
- }
@@ -1,7 +0,0 @@
1
- {
2
- "semi": false,
3
- "printWidth": 80,
4
- "bracketSpacing": false,
5
- "singleQuote": true,
6
- "trailingComma": "none"
7
- }
@@ -1 +0,0 @@
1
- WRONG README
@@ -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,4 +0,0 @@
1
- declare module '@babel/plugin-proposal-optional-chaining'
2
- declare module '@babel/plugin-transform-typescript'
3
- declare module '@babel/plugin-transform-react-jsx'
4
- declare module '@babel/standalone'
@@ -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
- }
@@ -1,4 +0,0 @@
1
- declare module 'react-css-burger' {
2
- const Default: React.ComponentType<any>
3
- export default Default
4
- }
@@ -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
- }