Skip to content

Commit 8e44a07

Browse files
Remove event listeners in beforeDestroy (GMOD#714)
1 parent f751bea commit 8e44a07

File tree

1 file changed

+64
-46
lines changed
  • packages/jbrowse-plugin-apollo/src/ApolloInternetAccount

1 file changed

+64
-46
lines changed

packages/jbrowse-plugin-apollo/src/ApolloInternetAccount/model.ts

Lines changed: 64 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)