1
1
import randomWords from "random-words" ;
2
2
import { v4 as uuid } from "uuid" ;
3
- import React , { useEffect , useMemo } from "react" ;
3
+ import React , { useMemo , useState , useEffect , useCallback } from "react" ;
4
4
import { connectToDB , getConnection } from "./sharedb" ;
5
+ import { useTransition } from "./react-experimental" ;
5
6
import {
6
7
Link ,
7
8
BrowserRouter as Router ,
@@ -26,16 +27,21 @@ function useFlow(config: {
26
27
addNode : ( ) => void ;
27
28
removeNode : ( id : string ) => void ;
28
29
reset : ( flow : Flow ) => void ;
30
+ isPending : boolean ;
29
31
} {
30
32
// Setup
31
33
32
- const [ state , setState ] = React . useState < Flow | null > ( null ) ;
34
+ const [ startTransition , isPending ] = useTransition ( ) ;
35
+
36
+ const [ state , setState ] = useState < Flow | null > ( null ) ;
33
37
34
38
const doc = useMemo ( ( ) => getConnection ( config . id ) , [ config . id ] ) ;
35
39
36
40
useEffect ( ( ) => {
37
41
const cloneStateFromShareDB = ( ) =>
38
- setState ( JSON . parse ( JSON . stringify ( doc . data ) ) ) ;
42
+ startTransition ( ( ) => {
43
+ setState ( JSON . parse ( JSON . stringify ( doc . data ) ) ) ;
44
+ } ) ;
39
45
40
46
connectToDB ( doc ) . then ( ( ) => {
41
47
cloneStateFromShareDB ( ) ;
@@ -46,22 +52,22 @@ function useFlow(config: {
46
52
setState ( null ) ;
47
53
doc . destroy ( ) ;
48
54
} ;
49
- } , [ doc ] ) ;
55
+ } , [ doc , startTransition ] ) ;
50
56
51
57
// Methods
52
58
53
- const addNode = React . useCallback ( ( ) => {
59
+ const addNode = useCallback ( ( ) => {
54
60
doc . submitOp ( [ { p : [ "nodes" , uuid ( ) ] , oi : { text : randomWords ( ) } } ] ) ;
55
61
} , [ doc ] ) ;
56
62
57
- const removeNode = React . useCallback (
63
+ const removeNode = useCallback (
58
64
( id ) => {
59
65
doc . submitOp ( [ { p : [ "nodes" , id ] , od : { } } ] ) ;
60
66
} ,
61
67
[ doc ]
62
68
) ;
63
69
64
- const reset = React . useCallback (
70
+ const reset = useCallback (
65
71
( flow ) => {
66
72
doc . submitOp ( [ { p : [ ] , od : doc . data , oi : flow } ] ) ;
67
73
} ,
@@ -75,6 +81,7 @@ function useFlow(config: {
75
81
addNode,
76
82
removeNode,
77
83
reset,
84
+ isPending,
78
85
} ;
79
86
}
80
87
@@ -86,44 +93,47 @@ const Flow: React.FC<{ id: string }> = ({ id }) => {
86
93
}
87
94
88
95
return (
89
- < main >
90
- < button
91
- onClick = { ( ) => {
92
- flow . addNode ( ) ;
93
- } }
94
- >
95
- Add
96
- </ button >
97
- < button
98
- onClick = { ( ) => {
99
- fetch ( "/flow.json" )
100
- . then ( ( res ) => res . json ( ) )
101
- . then ( ( flowData ) => {
102
- flow . reset ( flowData ) ;
96
+ < >
97
+ < main >
98
+ < button
99
+ onClick = { ( ) => {
100
+ flow . addNode ( ) ;
101
+ } }
102
+ >
103
+ Add
104
+ </ button >
105
+ < button
106
+ onClick = { ( ) => {
107
+ fetch ( "/flow.json" )
108
+ . then ( ( res ) => res . json ( ) )
109
+ . then ( ( flowData ) => {
110
+ flow . reset ( flowData ) ;
111
+ } ) ;
112
+ } }
113
+ >
114
+ Import flow
115
+ </ button >
116
+ < button
117
+ onClick = { ( ) => {
118
+ flow . reset ( {
119
+ nodes : { } ,
120
+ edges : [ ] ,
103
121
} ) ;
104
- } }
105
- >
106
- Import flow
107
- </ button >
108
- < button
109
- onClick = { ( ) => {
110
- flow . reset ( {
111
- nodes : { } ,
112
- edges : [ ] ,
113
- } ) ;
114
- } }
115
- >
116
- Reset
117
- </ button >
118
- { Object . keys ( flow . state . nodes ) . map ( ( k ) => (
119
- < NodeView
120
- key = { k }
121
- onRemove = { flow . removeNode }
122
- id = { k }
123
- node = { flow . state . nodes [ k ] }
124
- />
125
- ) ) }
126
- </ main >
122
+ } }
123
+ >
124
+ Reset
125
+ </ button >
126
+ { Object . keys ( flow . state . nodes ) . map ( ( k ) => (
127
+ < NodeView
128
+ key = { k }
129
+ onRemove = { flow . removeNode }
130
+ id = { k }
131
+ node = { flow . state . nodes [ k ] }
132
+ />
133
+ ) ) }
134
+ </ main >
135
+ { flow . isPending && < div className = "overlay" /> }
136
+ </ >
127
137
) ;
128
138
} ;
129
139
@@ -168,7 +178,7 @@ const App = () => {
168
178
const history = useHistory ( ) ;
169
179
const location = useLocation ( ) ;
170
180
171
- const id = React . useMemo ( ( ) => {
181
+ const id = useMemo ( ( ) => {
172
182
if ( location . hash . length < 2 ) {
173
183
return null ;
174
184
}
0 commit comments