@@ -70,6 +70,18 @@ if (process.env.NODE_ENV === 'development' && ENABLE_WHY_DID_YOU_RENDER) {
7070}
7171
7272export const App = observer ( function App ( ) {
73+ const startupStartRef = useRef < number > ( performance . now ( ) )
74+ const loggedFirstProject = useRef ( false )
75+ const loggedFirstAppData = useRef ( false )
76+ const logStartup = useCallback ( ( label : string , data ?: Record < string , unknown > ) => {
77+ const elapsedMs = Math . round ( performance . now ( ) - startupStartRef . current )
78+ if ( data ) {
79+ console . info ( '[startup]' , label , { elapsedMs, ...data } )
80+ } else {
81+ console . info ( '[startup]' , label , { elapsedMs } )
82+ }
83+ } , [ ] )
84+
7385 const [ project , setProject ] = useState < Project > ( )
7486 const [ sorensenInitialized , setSorensenInitialized ] = useState ( false )
7587 const { enqueueSnackbar, closeSnackbar } = useSnackbar ( )
@@ -107,8 +119,13 @@ export const App = observer(function App() {
107119 [ enqueueSnackbar , logger , serverAPI ]
108120 )
109121
122+ useEffect ( ( ) => {
123+ logStartup ( 'App mounted' )
124+ } , [ logStartup ] )
125+
110126 // Handle IPC-messages from server
111127 useEffect ( ( ) => {
128+ logStartup ( 'RealtimeDataProvider init' )
112129 const ipcClient = new RealtimeDataProvider ( logger , {
113130 systemMessage : ( messageStr : string , options : SystemMessageOptions ) => {
114131 messageStr = messageStr . replace ( / \n / g, '<br>' )
@@ -149,10 +166,18 @@ export const App = observer(function App() {
149166 updateAppData : ( appData : AppData ) => {
150167 store . appStore . update ( appData )
151168 store . rundownsStore . update ( appData . rundowns )
169+ if ( ! loggedFirstAppData . current ) {
170+ loggedFirstAppData . current = true
171+ logStartup ( 'Received initial appData' )
172+ }
152173 } ,
153174 updateProject : ( project : Project ) => {
154175 setProject ( project )
155176 store . projectStore . update ( project )
177+ if ( ! loggedFirstProject . current ) {
178+ loggedFirstProject . current = true
179+ logStartup ( 'Received initial project' )
180+ }
156181 } ,
157182 updatePeripheralTriggers : ( peripheralTriggers : ActiveTriggers ) => {
158183 triggers . setPeripheralTriggers ( peripheralTriggers )
@@ -174,7 +199,7 @@ export const App = observer(function App() {
174199 return ( ) => {
175200 ipcClient . destroy ( )
176201 }
177- } , [ enqueueSnackbar , closeSnackbar , triggers , logger , handleError , serverAPI ] )
202+ } , [ enqueueSnackbar , closeSnackbar , triggers , logger , handleError , serverAPI , logStartup ] )
178203
179204 const errorHandlerContextValue = useMemo ( ( ) => {
180205 return {
@@ -184,7 +209,16 @@ export const App = observer(function App() {
184209
185210 useEffect ( ( ) => {
186211 // Ask backend for the data once ready:
187- serverAPI . triggerSendAll ( ) . catch ( handleError )
212+ logStartup ( 'triggerSendAll start' )
213+ serverAPI
214+ . triggerSendAll ( )
215+ . then ( ( ) => {
216+ logStartup ( 'triggerSendAll resolved' )
217+ } )
218+ . catch ( ( error ) => {
219+ logStartup ( 'triggerSendAll failed' )
220+ handleError ( error )
221+ } )
188222
189223 // @ts -expect-error hack:
190224 window . makeDevData = ( ) => {
@@ -200,7 +234,7 @@ export const App = observer(function App() {
200234 }
201235 } )
202236 }
203- } , [ handleError , serverAPI ] )
237+ } , [ handleError , serverAPI , logStartup ] )
204238
205239 useEffect ( ( ) => {
206240 window . addEventListener ( 'error' , handleError )
@@ -331,12 +365,14 @@ export const App = observer(function App() {
331365
332366 /* eslint-disable @typescript-eslint/unbound-method */
333367 useEffect ( ( ) => {
368+ logStartup ( 'Sorensen init start' )
334369 Sorensen . init ( )
335370 . then ( ( ) => {
336371 setSorensenInitialized ( true )
372+ logStartup ( 'Sorensen init resolved' )
337373 } )
338374 . catch ( logger . error )
339- } , [ logger . error , serverAPI ] )
375+ } , [ logger . error , serverAPI , logStartup ] )
340376 /* eslint-enable @typescript-eslint/unbound-method */
341377
342378 const appStore = store . appStore
@@ -641,13 +677,7 @@ export const App = observer(function App() {
641677 true
642678 )
643679
644- if ( ! project || ! sorensenInitialized ) {
645- return (
646- < div className = "app-loading" >
647- < Spinner heavyOperation />
648- </ div >
649- )
650- }
680+ const hasProject = Boolean ( project )
651681
652682 const handleClickResizer : React . MouseEventHandler < HTMLDivElement > = ( e ) => {
653683 const tarEl = e . target as HTMLElement
@@ -662,7 +692,7 @@ export const App = observer(function App() {
662692 < HotkeyContext . Provider value = { hotkeyContext } >
663693 < LoggerContext . Provider value = { logger } >
664694 < IPCServerContext . Provider value = { serverAPI } >
665- < ProjectContext . Provider value = { project } >
695+ < ProjectContext . Provider value = { project ?? ( { } as Project ) } >
666696 < ErrorHandlerContext . Provider value = { errorHandlerContextValue } >
667697 < div className = "app" onClick = { handleClickAnywhere } >
668698 < ErrorBoundary >
@@ -691,7 +721,11 @@ export const App = observer(function App() {
691721 }
692722 </ ErrorBoundary >
693723
694- { store . guiStore . isNewRundownSelected ( ) ? (
724+ { ! hasProject ? (
725+ < div className = "app-loading" >
726+ < Spinner heavyOperation />
727+ </ div >
728+ ) : store . guiStore . isNewRundownSelected ( ) ? (
695729 < ErrorBoundary >
696730 < NewRundownPage />
697731 </ ErrorBoundary >
0 commit comments