pinafore/routes/_actions/instances.js
Nolan Lawson bc3a74bbcb don't wait if idb is blocked, remove workerize-loader (#602)
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.
2018-11-04 13:59:14 -08:00

97 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 })
}
)
}