2021-07-05 03:19:04 +00:00
|
|
|
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'
|
2019-10-30 01:58:49 +00:00
|
|
|
import { importVirtualListStore } from '../_utils/asyncModules/importVirtualListStore.js'
|
2021-07-05 03:19:04 +00:00
|
|
|
import { formatIntl } from '../_utils/formatIntl.js'
|
2018-01-27 22:45:51 +00:00
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
export function changeTheme (instanceName, newTheme) {
|
2019-08-03 20:49:37 +00:00
|
|
|
const { instanceThemes } = store.get()
|
2018-01-27 22:45:51 +00:00
|
|
|
instanceThemes[instanceName] = newTheme
|
2018-08-30 04:42:57 +00:00
|
|
|
store.set({ instanceThemes: instanceThemes })
|
2018-01-27 22:45:51 +00:00
|
|
|
store.save()
|
2019-08-03 20:49:37 +00:00
|
|
|
const { currentInstance } = store.get()
|
2018-04-19 16:37:05 +00:00
|
|
|
if (instanceName === currentInstance) {
|
2019-08-03 20:49:37 +00:00
|
|
|
const { enableGrayscale } = store.get()
|
2019-06-01 20:07:31 +00:00
|
|
|
switchToTheme(newTheme, enableGrayscale)
|
2018-01-27 22:45:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
export function switchToInstance (instanceName) {
|
2019-08-03 20:49:37 +00:00
|
|
|
const { instanceThemes } = store.get()
|
2018-02-27 06:22:56 +00:00
|
|
|
store.set({
|
|
|
|
currentInstance: instanceName,
|
|
|
|
searchResults: null,
|
2018-03-03 22:51:48 +00:00
|
|
|
queryInSearch: ''
|
2018-02-27 06:22:56 +00:00
|
|
|
})
|
2018-01-27 22:45:51 +00:00
|
|
|
store.save()
|
2019-08-03 20:49:37 +00:00
|
|
|
const { enableGrayscale } = store.get()
|
2019-06-01 20:07:31 +00:00
|
|
|
switchToTheme(instanceThemes[instanceName], enableGrayscale)
|
2018-01-27 22:45:51 +00:00
|
|
|
}
|
|
|
|
|
2020-11-29 22:13:27 +00:00
|
|
|
export async function logOutOfInstance (instanceName, message) {
|
|
|
|
message = message || formatIntl('intl.loggedOutOfInstance', { instance: instanceName })
|
2019-08-03 20:49:37 +00:00
|
|
|
const {
|
2019-09-26 16:07:49 +00:00
|
|
|
composeData,
|
|
|
|
currentInstance,
|
|
|
|
customEmoji,
|
|
|
|
instanceInfos,
|
|
|
|
instanceLists,
|
2018-04-19 16:37:05 +00:00
|
|
|
instanceThemes,
|
2019-09-26 16:07:49 +00:00
|
|
|
loggedInInstances,
|
2018-04-19 16:37:05 +00:00
|
|
|
loggedInInstancesInOrder,
|
2019-09-26 16:07:49 +00:00
|
|
|
verifyCredentials
|
2018-04-19 16:37:05 +00:00
|
|
|
} = store.get()
|
2018-01-27 22:45:51 +00:00
|
|
|
loggedInInstancesInOrder.splice(loggedInInstancesInOrder.indexOf(instanceName), 1)
|
2019-09-26 16:07:49 +00:00
|
|
|
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 22:45:51 +00:00
|
|
|
store.set({
|
2019-09-26 16:07:49 +00:00
|
|
|
composeData,
|
2018-02-11 18:35:25 +00:00
|
|
|
currentInstance: newInstance,
|
2019-09-26 16:07:49 +00:00
|
|
|
customEmoji,
|
|
|
|
instanceInfos,
|
|
|
|
instanceLists,
|
|
|
|
instanceThemes,
|
|
|
|
loggedInInstances,
|
|
|
|
loggedInInstancesInOrder,
|
2018-02-27 06:22:56 +00:00
|
|
|
queryInSearch: '',
|
2019-09-26 16:07:49 +00:00
|
|
|
searchResults: null,
|
|
|
|
timelineInitialized: false,
|
|
|
|
timelinePreinitialized: false,
|
|
|
|
verifyCredentials
|
2018-01-27 22:45:51 +00:00
|
|
|
})
|
2019-09-26 16:07:49 +00:00
|
|
|
store.clearTimelineDataForInstance(instanceName)
|
|
|
|
store.clearAutosuggestDataForInstance(instanceName)
|
2018-01-27 22:45:51 +00:00
|
|
|
store.save()
|
2019-09-26 16:07:49 +00:00
|
|
|
const { virtualListStore } = await importVirtualListStore()
|
|
|
|
virtualListStore.clearRealmByPrefix(currentInstance + '/') // TODO: this is a hacky way to clear the vlist cache
|
2019-08-29 14:55:12 +00:00
|
|
|
toast.say(message)
|
2019-08-03 20:49:37 +00:00
|
|
|
const { enableGrayscale } = store.get()
|
2019-06-01 20:07:31 +00:00
|
|
|
switchToTheme(instanceThemes[newInstance], enableGrayscale)
|
2018-11-04 00:06:01 +00:00
|
|
|
/* no await */ database.clearDatabaseForInstance(instanceName)
|
2018-01-27 22:45:51 +00:00
|
|
|
goto('/settings/instances')
|
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
function setStoreVerifyCredentials (instanceName, thisVerifyCredentials) {
|
2019-08-03 20:49:37 +00:00
|
|
|
const { verifyCredentials } = store.get()
|
2018-01-27 22:45:51 +00:00
|
|
|
verifyCredentials[instanceName] = thisVerifyCredentials
|
2018-08-30 04:42:57 +00:00
|
|
|
store.set({ verifyCredentials: verifyCredentials })
|
2018-01-27 22:45:51 +00:00
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
export async function updateVerifyCredentialsForInstance (instanceName) {
|
2019-08-03 20:49:37 +00:00
|
|
|
const { loggedInInstances } = store.get()
|
|
|
|
const accessToken = loggedInInstances[instanceName].access_token
|
2018-02-09 01:51:48 +00:00
|
|
|
await cacheFirstUpdateAfter(
|
2019-08-29 14:55:12 +00:00
|
|
|
() => getVerifyCredentials(instanceName, accessToken).catch(logOutOnUnauthorized(instanceName)),
|
2018-08-30 02:03:12 +00:00
|
|
|
() => database.getInstanceVerifyCredentials(instanceName),
|
|
|
|
verifyCredentials => database.setInstanceVerifyCredentials(instanceName, verifyCredentials),
|
2018-02-09 01:51:48 +00:00
|
|
|
verifyCredentials => setStoreVerifyCredentials(instanceName, verifyCredentials)
|
|
|
|
)
|
2018-02-09 06:29:29 +00:00
|
|
|
}
|
2018-02-11 21:46:57 +00:00
|
|
|
|
2018-02-26 00:26:43 +00:00
|
|
|
export async function updateVerifyCredentialsForCurrentInstance () {
|
2019-08-03 20:49:37 +00:00
|
|
|
const { currentInstance } = store.get()
|
2018-04-19 16:37:05 +00:00
|
|
|
await updateVerifyCredentialsForInstance(currentInstance)
|
2018-02-26 00:26:43 +00:00
|
|
|
}
|
|
|
|
|
2018-02-11 22:11:03 +00:00
|
|
|
export async function updateInstanceInfo (instanceName) {
|
2018-02-11 21:46:57 +00:00
|
|
|
await cacheFirstUpdateAfter(
|
|
|
|
() => getInstanceInfo(instanceName),
|
2018-08-30 02:03:12 +00:00
|
|
|
() => database.getInstanceInfo(instanceName),
|
|
|
|
info => database.setInstanceInfo(instanceName, info),
|
2018-02-11 21:46:57 +00:00
|
|
|
info => {
|
2019-08-03 20:49:37 +00:00
|
|
|
const { instanceInfos } = store.get()
|
2018-02-11 21:46:57 +00:00
|
|
|
instanceInfos[instanceName] = info
|
2018-08-30 04:42:57 +00:00
|
|
|
store.set({ instanceInfos: instanceInfos })
|
2018-02-11 21:46:57 +00:00
|
|
|
}
|
|
|
|
)
|
2018-02-11 22:11:03 +00:00
|
|
|
}
|
2019-08-29 14:55:12 +00:00
|
|
|
|
|
|
|
export function logOutOnUnauthorized (instanceName) {
|
|
|
|
return async error => {
|
|
|
|
if (error.message.startsWith('401:')) {
|
2020-11-29 22:13:27 +00:00
|
|
|
await logOutOfInstance(instanceName, formatIntl('intl.accessTokenRevoked', { instance: instanceName }))
|
2019-08-29 14:55:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
throw error
|
|
|
|
}
|
|
|
|
}
|