forked from cybrespace/pinafore
		
	There are two issues here: - if IDB is blocked, then the promise never resolves when you log out (and call indexedDB.deleteDatabase) and the app remains in a permanently hung state - why is IDB blocked? well, something seems to have changed in Chrome 70 such that doing these operations in a web worker causes the blocked error. The benefits of workerizing IDB is so small that I'd rather just remove it at this point.
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { getVerifyCredentials } from '../_api/user'
 | 
						|
import { store } from '../_store/store'
 | 
						|
import { switchToTheme } from '../_utils/themeEngine'
 | 
						|
import { toast } from '../_utils/toast'
 | 
						|
import { goto } from 'sapper/runtime.js'
 | 
						|
import { cacheFirstUpdateAfter } from '../_utils/sync'
 | 
						|
import { getInstanceInfo } from '../_api/instance'
 | 
						|
import { database } from '../_database/database'
 | 
						|
 | 
						|
export function changeTheme (instanceName, newTheme) {
 | 
						|
  let { instanceThemes } = store.get()
 | 
						|
  instanceThemes[instanceName] = newTheme
 | 
						|
  store.set({ instanceThemes: instanceThemes })
 | 
						|
  store.save()
 | 
						|
  let { currentInstance } = store.get()
 | 
						|
  if (instanceName === currentInstance) {
 | 
						|
    switchToTheme(newTheme)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export function switchToInstance (instanceName) {
 | 
						|
  let { instanceThemes } = store.get()
 | 
						|
  store.set({
 | 
						|
    currentInstance: instanceName,
 | 
						|
    searchResults: null,
 | 
						|
    queryInSearch: ''
 | 
						|
  })
 | 
						|
  store.save()
 | 
						|
  switchToTheme(instanceThemes[instanceName])
 | 
						|
}
 | 
						|
 | 
						|
export async function logOutOfInstance (instanceName) {
 | 
						|
  let {
 | 
						|
    loggedInInstances,
 | 
						|
    instanceThemes,
 | 
						|
    loggedInInstancesInOrder,
 | 
						|
    composeData,
 | 
						|
    currentInstance
 | 
						|
  } = store.get()
 | 
						|
  loggedInInstancesInOrder.splice(loggedInInstancesInOrder.indexOf(instanceName), 1)
 | 
						|
  let newInstance = instanceName === currentInstance
 | 
						|
    ? loggedInInstancesInOrder[0]
 | 
						|
    : currentInstance
 | 
						|
  delete loggedInInstances[instanceName]
 | 
						|
  delete instanceThemes[instanceName]
 | 
						|
  delete composeData[instanceName]
 | 
						|
  store.set({
 | 
						|
    loggedInInstances: loggedInInstances,
 | 
						|
    instanceThemes: instanceThemes,
 | 
						|
    loggedInInstancesInOrder: loggedInInstancesInOrder,
 | 
						|
    currentInstance: newInstance,
 | 
						|
    searchResults: null,
 | 
						|
    queryInSearch: '',
 | 
						|
    composeData: composeData
 | 
						|
  })
 | 
						|
  store.save()
 | 
						|
  toast.say(`Logged out of ${instanceName}`)
 | 
						|
  switchToTheme(instanceThemes[newInstance] || 'default')
 | 
						|
  /* no await */ database.clearDatabaseForInstance(instanceName)
 | 
						|
  goto('/settings/instances')
 | 
						|
}
 | 
						|
 | 
						|
function setStoreVerifyCredentials (instanceName, thisVerifyCredentials) {
 | 
						|
  let { verifyCredentials } = store.get()
 | 
						|
  verifyCredentials[instanceName] = thisVerifyCredentials
 | 
						|
  store.set({ verifyCredentials: verifyCredentials })
 | 
						|
}
 | 
						|
 | 
						|
export async function updateVerifyCredentialsForInstance (instanceName) {
 | 
						|
  let { loggedInInstances } = store.get()
 | 
						|
  let accessToken = loggedInInstances[instanceName].access_token
 | 
						|
  await cacheFirstUpdateAfter(
 | 
						|
    () => getVerifyCredentials(instanceName, accessToken),
 | 
						|
    () => database.getInstanceVerifyCredentials(instanceName),
 | 
						|
    verifyCredentials => database.setInstanceVerifyCredentials(instanceName, verifyCredentials),
 | 
						|
    verifyCredentials => setStoreVerifyCredentials(instanceName, verifyCredentials)
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
export async function updateVerifyCredentialsForCurrentInstance () {
 | 
						|
  let { currentInstance } = store.get()
 | 
						|
  await updateVerifyCredentialsForInstance(currentInstance)
 | 
						|
}
 | 
						|
 | 
						|
export async function updateInstanceInfo (instanceName) {
 | 
						|
  await cacheFirstUpdateAfter(
 | 
						|
    () => getInstanceInfo(instanceName),
 | 
						|
    () => database.getInstanceInfo(instanceName),
 | 
						|
    info => database.setInstanceInfo(instanceName, info),
 | 
						|
    info => {
 | 
						|
      let { instanceInfos } = store.get()
 | 
						|
      instanceInfos[instanceName] = info
 | 
						|
      store.set({ instanceInfos: instanceInfos })
 | 
						|
    }
 | 
						|
  )
 | 
						|
}
 |