Pinafore-Web-Client-Frontend/src/routes/_actions/instances.js

134 lines
4.5 KiB
JavaScript
Raw Normal View History

import { getVerifyCredentials } from '../_api/user.js'
import { store } from '../_store/store.js'
import { switchToTheme } from '../_utils/themeEngine.js'
import { toast } from '../_components/toast/toast.js'
import { goto } from '../../../__sapper__/client.js'
import { cacheFirstUpdateAfter } from '../_utils/sync.js'
import { getInstanceInfo } from '../_api/instance.js'
import { database } from '../_database/database.js'
import { importVirtualListStore } from '../_utils/asyncModules/importVirtualListStore.js'
import { formatIntl } from '../_utils/formatIntl.js'
2018-01-27 23:45:51 +01:00
2018-02-09 07:29:29 +01:00
export function changeTheme (instanceName, newTheme) {
2019-08-03 22:49:37 +02:00
const { instanceThemes } = store.get()
2018-01-27 23:45:51 +01:00
instanceThemes[instanceName] = newTheme
store.set({ instanceThemes: instanceThemes })
2018-01-27 23:45:51 +01:00
store.save()
2019-08-03 22:49:37 +02:00
const { currentInstance } = store.get()
if (instanceName === currentInstance) {
2019-08-03 22:49:37 +02:00
const { enableGrayscale } = store.get()
switchToTheme(newTheme, enableGrayscale)
2018-01-27 23:45:51 +01:00
}
}
2018-02-09 07:29:29 +01:00
export function switchToInstance (instanceName) {
2019-08-03 22:49:37 +02:00
const { instanceThemes } = store.get()
2018-02-27 07:22:56 +01:00
store.set({
currentInstance: instanceName,
searchResults: null,
2018-03-03 23:51:48 +01:00
queryInSearch: ''
2018-02-27 07:22:56 +01:00
})
2018-01-27 23:45:51 +01:00
store.save()
2019-08-03 22:49:37 +02:00
const { enableGrayscale } = store.get()
switchToTheme(instanceThemes[instanceName], enableGrayscale)
2018-01-27 23:45:51 +01:00
}
export async function logOutOfInstance (instanceName, message) {
message = message || formatIntl('intl.loggedOutOfInstance', { instance: instanceName })
2019-08-03 22:49:37 +02:00
const {
composeData,
currentInstance,
customEmoji,
instanceInfos,
instanceLists,
instanceThemes,
loggedInInstances,
loggedInInstancesInOrder,
verifyCredentials
} = store.get()
2018-01-27 23:45:51 +01:00
loggedInInstancesInOrder.splice(loggedInInstancesInOrder.indexOf(instanceName), 1)
const newInstance = instanceName === currentInstance ? loggedInInstancesInOrder[0] : currentInstance
const objectsToClear = [
composeData,
customEmoji,
instanceInfos,
instanceLists,
instanceThemes,
loggedInInstances,
verifyCredentials
]
for (const obj of objectsToClear) {
delete obj[instanceName]
}
2018-01-27 23:45:51 +01:00
store.set({
composeData,
2018-02-11 19:35:25 +01:00
currentInstance: newInstance,
customEmoji,
instanceInfos,
instanceLists,
instanceThemes,
loggedInInstances,
loggedInInstancesInOrder,
2018-02-27 07:22:56 +01:00
queryInSearch: '',
searchResults: null,
timelineInitialized: false,
timelinePreinitialized: false,
verifyCredentials
2018-01-27 23:45:51 +01:00
})
store.clearTimelineDataForInstance(instanceName)
store.clearAutosuggestDataForInstance(instanceName)
2018-01-27 23:45:51 +01:00
store.save()
const { virtualListStore } = await importVirtualListStore()
virtualListStore.clearRealmByPrefix(currentInstance + '/') // TODO: this is a hacky way to clear the vlist cache
toast.say(message)
2019-08-03 22:49:37 +02:00
const { enableGrayscale } = store.get()
switchToTheme(instanceThemes[newInstance], enableGrayscale)
/* no await */ database.clearDatabaseForInstance(instanceName)
2018-01-27 23:45:51 +01:00
goto('/settings/instances')
}
2018-02-09 07:29:29 +01:00
function setStoreVerifyCredentials (instanceName, thisVerifyCredentials) {
2019-08-03 22:49:37 +02:00
const { verifyCredentials } = store.get()
2018-01-27 23:45:51 +01:00
verifyCredentials[instanceName] = thisVerifyCredentials
store.set({ verifyCredentials: verifyCredentials })
2018-01-27 23:45:51 +01:00
}
2018-02-09 07:29:29 +01:00
export async function updateVerifyCredentialsForInstance (instanceName) {
2019-08-03 22:49:37 +02:00
const { loggedInInstances } = store.get()
const accessToken = loggedInInstances[instanceName].access_token
await cacheFirstUpdateAfter(
() => getVerifyCredentials(instanceName, accessToken).catch(logOutOnUnauthorized(instanceName)),
() => database.getInstanceVerifyCredentials(instanceName),
verifyCredentials => database.setInstanceVerifyCredentials(instanceName, verifyCredentials),
verifyCredentials => setStoreVerifyCredentials(instanceName, verifyCredentials)
)
2018-02-09 07:29:29 +01:00
}
2018-02-11 22:46:57 +01:00
2018-02-26 01:26:43 +01:00
export async function updateVerifyCredentialsForCurrentInstance () {
2019-08-03 22:49:37 +02:00
const { currentInstance } = store.get()
await updateVerifyCredentialsForInstance(currentInstance)
2018-02-26 01:26:43 +01:00
}
2018-02-11 23:11:03 +01:00
export async function updateInstanceInfo (instanceName) {
2018-02-11 22:46:57 +01:00
await cacheFirstUpdateAfter(
() => getInstanceInfo(instanceName),
() => database.getInstanceInfo(instanceName),
info => database.setInstanceInfo(instanceName, info),
2018-02-11 22:46:57 +01:00
info => {
2019-08-03 22:49:37 +02:00
const { instanceInfos } = store.get()
2018-02-11 22:46:57 +01:00
instanceInfos[instanceName] = info
store.set({ instanceInfos: instanceInfos })
2018-02-11 22:46:57 +01:00
}
)
2018-02-11 23:11:03 +01:00
}
export function logOutOnUnauthorized (instanceName) {
return async error => {
if (error.message.startsWith('401:')) {
await logOutOfInstance(instanceName, formatIntl('intl.accessTokenRevoked', { instance: instanceName }))
}
throw error
}
}