2018-02-09 01:51:48 +00:00
|
|
|
import { getAccessTokenFromAuthCode, registerApplication, generateAuthLink } from '../_api/oauth'
|
|
|
|
import { getInstanceInfo } from '../_api/instance'
|
2018-01-27 21:38:57 +00:00
|
|
|
import { goto } from 'sapper/runtime.js'
|
2018-02-09 01:51:48 +00:00
|
|
|
import { switchToTheme } from '../_utils/themeEngine'
|
|
|
|
import { store } from '../_store/store'
|
|
|
|
import { updateVerifyCredentialsForInstance } from './instances'
|
2018-02-28 07:18:07 +00:00
|
|
|
import { updateCustomEmojiForInstance } from './emoji'
|
2018-04-17 03:56:21 +00:00
|
|
|
import { setInstanceInfo as setInstanceInfoInDatabase } from '../_database/meta'
|
2018-01-27 21:38:57 +00:00
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
const REDIRECT_URI = (typeof location !== 'undefined'
|
|
|
|
? location.origin : 'https://pinafore.social') + '/settings/instances/add'
|
2018-01-27 21:38:57 +00:00
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
async function redirectToOauth () {
|
2018-01-27 21:38:57 +00:00
|
|
|
let instanceName = store.get('instanceNameInSearch')
|
|
|
|
let loggedInInstances = store.get('loggedInInstances')
|
2018-04-09 22:09:58 +00:00
|
|
|
instanceName = instanceName.replace(/^https?:\/\//, '').replace(/\/$/, '').replace('/$', '').toLowerCase()
|
2018-01-27 21:38:57 +00:00
|
|
|
if (Object.keys(loggedInInstances).includes(instanceName)) {
|
|
|
|
store.set({logInToInstanceError: `You've already logged in to ${instanceName}`})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
let registrationPromise = registerApplication(instanceName, REDIRECT_URI)
|
|
|
|
let instanceInfo = await getInstanceInfo(instanceName)
|
2018-04-17 03:56:21 +00:00
|
|
|
await setInstanceInfoInDatabase(instanceName, instanceInfo) // cache for later
|
2018-01-27 21:38:57 +00:00
|
|
|
let instanceData = await registrationPromise
|
|
|
|
store.set({
|
|
|
|
currentRegisteredInstanceName: instanceName,
|
|
|
|
currentRegisteredInstance: instanceData
|
|
|
|
})
|
|
|
|
store.save()
|
|
|
|
let oauthUrl = generateAuthLink(
|
|
|
|
instanceName,
|
|
|
|
instanceData.client_id,
|
|
|
|
REDIRECT_URI
|
|
|
|
)
|
|
|
|
document.location.href = oauthUrl
|
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
export async function logInToInstance () {
|
2018-02-15 02:15:14 +00:00
|
|
|
store.set({
|
|
|
|
logInToInstanceLoading: true,
|
|
|
|
logInToInstanceError: null
|
|
|
|
})
|
2018-01-27 21:38:57 +00:00
|
|
|
try {
|
|
|
|
await redirectToOauth()
|
|
|
|
} catch (err) {
|
|
|
|
console.error(err)
|
|
|
|
let error = `${err.message || err.name}. ` +
|
2018-02-09 06:29:29 +00:00
|
|
|
(navigator.onLine
|
2018-04-11 05:14:10 +00:00
|
|
|
? `Is this a valid Mastodon instance? Is a browser extension blocking the request?`
|
2018-02-09 06:29:29 +00:00
|
|
|
: `Are you offline?`)
|
2018-02-18 22:31:28 +00:00
|
|
|
store.set({
|
|
|
|
logInToInstanceError: error,
|
|
|
|
logInToInstanceErrorForText: store.get('instanceNameInSearch')
|
|
|
|
})
|
2018-01-27 21:38:57 +00:00
|
|
|
} finally {
|
|
|
|
store.set({logInToInstanceLoading: false})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
async function registerNewInstance (code) {
|
2018-01-27 21:38:57 +00:00
|
|
|
let currentRegisteredInstanceName = store.get('currentRegisteredInstanceName')
|
|
|
|
let currentRegisteredInstance = store.get('currentRegisteredInstance')
|
|
|
|
let instanceData = await getAccessTokenFromAuthCode(
|
|
|
|
currentRegisteredInstanceName,
|
|
|
|
currentRegisteredInstance.client_id,
|
|
|
|
currentRegisteredInstance.client_secret,
|
|
|
|
code,
|
|
|
|
REDIRECT_URI
|
|
|
|
)
|
|
|
|
let loggedInInstances = store.get('loggedInInstances')
|
|
|
|
let loggedInInstancesInOrder = store.get('loggedInInstancesInOrder')
|
|
|
|
let instanceThemes = store.get('instanceThemes')
|
|
|
|
instanceThemes[currentRegisteredInstanceName] = 'default'
|
|
|
|
loggedInInstances[currentRegisteredInstanceName] = instanceData
|
|
|
|
if (!loggedInInstancesInOrder.includes(currentRegisteredInstanceName)) {
|
|
|
|
loggedInInstancesInOrder.push(currentRegisteredInstanceName)
|
|
|
|
}
|
|
|
|
store.set({
|
|
|
|
instanceNameInSearch: '',
|
|
|
|
currentRegisteredInstanceName: null,
|
|
|
|
currentRegisteredInstance: null,
|
|
|
|
loggedInInstances: loggedInInstances,
|
|
|
|
currentInstance: currentRegisteredInstanceName,
|
|
|
|
loggedInInstancesInOrder: loggedInInstancesInOrder,
|
|
|
|
instanceThemes: instanceThemes
|
|
|
|
})
|
|
|
|
store.save()
|
|
|
|
switchToTheme('default')
|
2018-02-28 07:18:07 +00:00
|
|
|
// fire off these requests so they're cached
|
|
|
|
/* no await */ updateVerifyCredentialsForInstance(currentRegisteredInstanceName)
|
|
|
|
/* no await */ updateCustomEmojiForInstance(currentRegisteredInstanceName)
|
2018-01-27 21:38:57 +00:00
|
|
|
goto('/')
|
|
|
|
}
|
|
|
|
|
2018-02-09 06:29:29 +00:00
|
|
|
export async function handleOauthCode (code) {
|
2018-01-27 21:38:57 +00:00
|
|
|
try {
|
|
|
|
store.set({logInToInstanceLoading: true})
|
|
|
|
await registerNewInstance(code)
|
|
|
|
} catch (err) {
|
|
|
|
store.set({logInToInstanceError: `${err.message || err.name}. Failed to connect to instance.`})
|
|
|
|
} finally {
|
|
|
|
store.set({logInToInstanceLoading: false})
|
|
|
|
}
|
|
|
|
}
|