fedilove-ui/routes/settings/add-instance.html

108 lines
3.4 KiB
HTML
Raw Normal View History

2018-01-08 00:00:42 +00:00
<:Head>
<title>Instance Wizard</title>
</:Head>
<Layout page='settings'>
2018-01-09 01:44:29 +00:00
<SettingsLayout page='add-instance'>
<h1>Add an instance</h1>
2018-01-08 00:00:42 +00:00
2018-01-09 01:44:29 +00:00
<p>Log in to your instance to use Pinafore.</p>
2018-01-08 00:00:42 +00:00
2018-01-09 02:14:21 +00:00
<form on:submit='onSubmit(event)'>
2018-01-09 01:44:29 +00:00
<label for="instanceInput">Instance name:</label>
<input type="text" id="instanceInput" bind:value='$instanceNameInSearch' placeholder=''>
<button class="primary" type="submit" id="submitButton">Add instance</button>
</form>
2018-01-08 00:00:42 +00:00
2018-01-09 01:44:29 +00:00
<p>Don't have an instance? <a href="https://joinmastodon.org">Join Mastodon!</a></p>
</SettingsLayout>
2018-01-08 00:00:42 +00:00
</Layout>
<style>
2018-01-08 06:00:16 +00:00
@media (max-width: 767px) {
input {
width: 90%;
}
}
2018-01-08 00:00:42 +00:00
input {
2018-01-08 06:00:16 +00:00
width: 250px;
2018-01-08 00:00:42 +00:00
}
form {
2018-01-12 17:01:46 +00:00
background: var(--form-bg);
2018-01-08 00:00:42 +00:00
padding: 5px 10px 15px;
2018-01-12 17:01:46 +00:00
margin: 20px auto;
border: 1px solid var(--form-border);
2018-01-08 00:00:42 +00:00
}
form label, form input, form button {
display: block;
margin: 20px 5px;
}
</style>
<script>
import Layout from '../_components/Layout.html';
2018-01-09 01:44:29 +00:00
import SettingsLayout from './_components/SettingsLayout.html'
2018-01-08 06:00:16 +00:00
import { registerApplication, generateAuthLink, getAccessTokenFromAuthCode } from '../_utils/mastodon'
import { databasePromise } from '../_utils/database'
import { store } from '../_utils/store'
2018-01-08 06:13:15 +00:00
import { goto } from 'sapper/runtime.js'
2018-01-08 00:00:42 +00:00
export default {
2018-01-08 06:00:16 +00:00
oncreate: function () {
if (process.browser) {
(async () => {
let params = new URLSearchParams(location.search)
if (params.has('code')) {
this.onReceivedOauthCode(params.get('code'))
2018-01-08 06:00:16 +00:00
}
})()
}
},
2018-01-08 00:00:42 +00:00
components: {
2018-01-09 01:44:29 +00:00
Layout,
SettingsLayout
2018-01-08 00:00:42 +00:00
},
store: () => store,
2018-01-08 00:00:42 +00:00
methods: {
onReceivedOauthCode: async function(code) {
2018-01-13 06:24:54 +00:00
let currentRegisteredInstanceName = this.store.get('currentRegisteredInstanceName')
let currentRegisteredInstance = this.store.get('currentRegisteredInstance')
let instanceData = await (await getAccessTokenFromAuthCode(
currentRegisteredInstanceName,
currentRegisteredInstance.client_id,
currentRegisteredInstance.client_secret,
code
)).json()
2018-01-13 06:24:54 +00:00
// TODO: handle error
let loggedInInstances = this.store.get('loggedInInstances')
let loggedInInstancesInOrder = this.store.get('loggedInInstancesInOrder')
loggedInInstances[currentRegisteredInstanceName] = instanceData
if (!loggedInInstancesInOrder.includes(currentRegisteredInstanceName)) {
loggedInInstancesInOrder.push(currentRegisteredInstanceName)
}
this.store.set({
2018-01-13 06:24:54 +00:00
'loggedInInstances': loggedInInstances,
'currentInstance': currentRegisteredInstanceName,
'loggedInInstancesInOrder': loggedInInstancesInOrder
})
this.store.save()
goto('/')
},
2018-01-09 01:23:33 +00:00
onSubmit: async function(event) {
2018-01-08 00:00:42 +00:00
event.preventDefault()
let instanceName = this.store.get('instanceNameInSearch')
2018-01-08 06:00:16 +00:00
instanceName = instanceName.replace(/^https?:\/\//, '').replace('/$', '')
2018-01-13 06:24:54 +00:00
let instanceData = await (await registerApplication(instanceName)).json()
// TODO: handle error
this.store.set({
currentRegisteredInstanceName: instanceName,
currentRegisteredInstance: instanceData
})
this.store.save()
2018-01-13 06:24:54 +00:00
let oauthUrl = generateAuthLink(instanceName, instanceData.client_id)
2018-01-08 06:00:16 +00:00
document.location.href = oauthUrl
},
2018-01-08 00:00:42 +00:00
}
}
</script>