@@ -407,56 +407,72 @@ const stateModelFactory = (configSchema: ApolloInternetAccountConfigModel) => {
407407 return { postUserLocation : debouncePostUserLocation ( postUserLocation ) }
408408 } )
409409 . volatile ( ( ) => ( { roleNotificationSent : false } ) )
410- . actions ( ( self ) => ( {
411- initialize : flow ( function * initialize ( role : Role ) {
412- if ( role === 'none' ) {
413- if ( ! self . roleNotificationSent ) {
414- const { session } = getRoot < ApolloRootModel > ( self )
415- ; ( session as unknown as AbstractSessionModel ) . notify (
416- 'You have registered as an Apollo user but have not been given access. Ask your administrator to enable access for your account.' ,
417- 'warning' ,
418- )
419- self . roleNotificationSent = true
420- }
421- return
410+ . actions ( ( self ) => {
411+ function beforeUnloadListener ( ) {
412+ self . postUserLocation ( [ ] )
413+ }
414+ function visibilityChangeListener ( ) {
415+ // fires when user switches tabs, apps, goes to homescreen, etc.
416+ if ( document . visibilityState === 'hidden' ) {
417+ self . postUserLocation ( [ ] )
422418 }
423- if ( role === 'admin' ) {
424- const rootModel = getRoot ( self )
425- if ( isAbstractMenuManager ( rootModel ) ) {
426- addTopLevelAdminMenus ( rootModel )
427- }
419+ // fires when app transitions from prerender, user returns to the app / tab.
420+ if ( document . visibilityState === 'visible' ) {
421+ const { session } = getRoot < ApolloRootModel > ( self )
422+ session . broadcastLocations ( )
428423 }
429- // Get and set server last change sequence into session storage
430- yield self . updateLastChangeSequenceNumber ( )
431- // Open socket listeners
432- self . addSocketListeners ( )
433- // request user locations
434- const { baseURL } = self
435- const uri = new URL ( 'users/locations' , baseURL ) . href
436- const apolloFetch = self . getFetcher ( {
437- locationType : 'UriLocation' ,
438- uri,
439- } )
440- yield apolloFetch ( uri , {
441- method : 'GET' ,
442- signal : self . controller . signal ,
443- } )
444- window . addEventListener ( 'beforeunload' , ( ) => {
445- self . postUserLocation ( [ ] )
446- } )
447- document . addEventListener ( 'visibilitychange' , ( ) => {
448- // fires when user switches tabs, apps, goes to homescreen, etc.
449- if ( document . visibilityState === 'hidden' ) {
450- self . postUserLocation ( [ ] )
424+ }
425+ return {
426+ initialize : flow ( function * initialize ( role : Role ) {
427+ if ( role === 'none' ) {
428+ if ( ! self . roleNotificationSent ) {
429+ const { session } = getRoot < ApolloRootModel > ( self )
430+ ; ( session as unknown as AbstractSessionModel ) . notify (
431+ 'You have registered as an Apollo user but have not been given access. Ask your administrator to enable access for your account.' ,
432+ 'warning' ,
433+ )
434+ self . roleNotificationSent = true
435+ }
436+ return
451437 }
452- // fires when app transitions from prerender, user returns to the app / tab.
453- if ( document . visibilityState === 'visible' ) {
454- const { session } = getRoot < ApolloRootModel > ( self )
455- session . broadcastLocations ( )
438+ if ( role === 'admin' ) {
439+ const rootModel = getRoot ( self )
440+ if ( isAbstractMenuManager ( rootModel ) ) {
441+ addTopLevelAdminMenus ( rootModel )
442+ }
456443 }
457- } )
458- } ) ,
459- } ) )
444+ // Get and set server last change sequence into session storage
445+ yield self . updateLastChangeSequenceNumber ( )
446+ // Open socket listeners
447+ self . addSocketListeners ( )
448+ // request user locations
449+ const { baseURL } = self
450+ const uri = new URL ( 'users/locations' , baseURL ) . href
451+ const apolloFetch = self . getFetcher ( {
452+ locationType : 'UriLocation' ,
453+ uri,
454+ } )
455+ yield apolloFetch ( uri , {
456+ method : 'GET' ,
457+ signal : self . controller . signal ,
458+ } )
459+ window . addEventListener ( 'beforeunload' , beforeUnloadListener )
460+ document . addEventListener (
461+ 'visibilitychange' ,
462+ visibilityChangeListener ,
463+ )
464+ } ) ,
465+ removeBeforeUnloadListener ( ) {
466+ window . removeEventListener ( 'beforeunload' , beforeUnloadListener )
467+ } ,
468+ removeVisibilityChangeListener ( ) {
469+ document . removeEventListener (
470+ 'visibilitychange' ,
471+ visibilityChangeListener ,
472+ )
473+ } ,
474+ }
475+ } )
460476 . actions ( ( self ) => ( {
461477 afterAttach ( ) {
462478 self . setRole ( )
@@ -481,6 +497,8 @@ const stateModelFactory = (configSchema: ApolloInternetAccountConfigModel) => {
481497 )
482498 } ,
483499 beforeDestroy ( ) {
500+ self . removeBeforeUnloadListener ( )
501+ self . removeVisibilityChangeListener ( )
484502 self . controller . abort ( 'internet account beforeDestroy' )
485503 self . socket . close ( )
486504 } ,
0 commit comments