1- import React , { useCallback , useContext , useEffect , useMemo , useState } from 'react' ;
1+ import React , { useCallback , useContext , useEffect , useMemo , useRef , useState } from 'react' ;
22import type {
33 Config ,
44 CoreOptions ,
5- EventSubject ,
65 RepoProviderSpec ,
76 ThebeEventCb ,
87 ThebeEventData ,
@@ -53,21 +52,24 @@ export function ThebeServerProvider({
5352 const [ server , setServer ] = useState < ThebeServer | undefined > ( ) ;
5453 const [ ready , setReady ] = useState < boolean > ( false ) ;
5554 const [ error , setError ] = useState < string | undefined > ( ) ;
55+ const configRef = useRef < Config | undefined > ( ) ;
5656
5757 // create a valid configuration, either using the one supplied
5858 // or based on the options provided
5959 // once only - if options/config were to change, we'd need logic to create a new server etc..
6060 const thebeConfig = useMemo (
6161 ( ) => config ?? core ?. makeConfiguration ( options ?? { } , events ) ,
62- [ core , options ] ,
62+ [ core , config , options ] ,
6363 ) ;
6464
6565 // create an iniital server
6666 useEffect ( ( ) => {
67- if ( ! core || ! thebeConfig || server ) return ;
67+ if ( ! core || ! thebeConfig ) return ; // not intialized yet
68+ else if ( thebeConfig === configRef . current && server ) return ; // config has not changed and server is already created
69+
6870 const svr = new core . ThebeServer ( thebeConfig ) ;
6971
70- // register an error handler immedately
72+ // register an error handler immediately
7173 const handler = ( evt : string , data : ThebeEventData ) => {
7274 const subjects = [
7375 core . EventSubject . server ,
@@ -81,6 +83,7 @@ export function ThebeServerProvider({
8183 // TODO we need a way to unsubscribe from this that does not cause
8284 // error events to be missed due to rerenders
8385 thebeConfig . events . on ( core . ThebeEventType . error , handler ) ;
86+ configRef . current = thebeConfig ;
8487 setServer ( svr ) ;
8588 } , [ core , thebeConfig , server ] ) ;
8689
@@ -118,7 +121,6 @@ export function ThebeServerProvider({
118121 // Once the core is loaded, connect to a server
119122 // TODO: this should be an action not a side effect
120123 useEffect ( ( ) => {
121- if ( ! core || ! thebeConfig ) return ; // TODO is there a better way to keep typescript happy here?
122124 if ( ! server || ! doConnect ) return ;
123125 // do not reconnect if already connected!
124126 if ( server . isReady && server . userServerUrl ) return ;
0 commit comments