<template> <div> <div v-if="error" class="mb-10 bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" role="alert" > <span class="block sm:inline">{{ error }}</span> </div> <div> <div v-if="!hasRemoteSources" class="mb-10 bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" > No remote sources defined <router-link class="underline text-blue-600 block" to="/newsource"> <button class="btn btn-blue">Create one</button> </router-link> </div> <div v-else-if="!hasLoginRemoteSources" class="mb-10 bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative" > No remote sources enabled for login </div> <div v-else> <div class="my-6 flex justify-center items-center" v-for="rs in remotesources" v-bind:key="rs.id" > <div v-if="rs.login_enabled"> <LoginForm action="Login" :name="rs.name" v-if="rs.auth_type == 'password'" v-on:login="doLogin($event.username, $event.password, rs.name)" /> <div v-else class="w-full max-w-xs"> <div class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4"> <div class="flex justify-center"> <button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" @click="doLogin(null, null, rs.name)" > Login with {{ rs.name }} </button> </div> </div> </div> </div> </div> </div> </div> </div> </template> <script> import { fetchRemoteSources, login } from '@/util/data'; import { setLoggedUser, unsetLoginRedirect, setLoginRedirect, doLogout, } from '@/util/auth'; import LoginForm from '@/components/loginform'; export default { name: 'Login', components: { LoginForm, }, data: function () { return { error: null, remotesources: null, }; }, computed: { hasRemoteSources() { if (this.remotesources) { return this.remotesources.length > 0; } return false; }, hasLoginRemoteSources() { for (let rs of this.remotesources) { if (rs.login_enabled) { return true; } } return false; }, }, methods: { async fetchRemoteSources() { let { data, error } = await fetchRemoteSources(); if (error) { this.$store.dispatch('setError', error); return; } this.remotesources = data; }, async doLogin(username, password, remotesourcename) { unsetLoginRedirect(); let redirect = this.$route.query['redirect']; this.error = null; let { data, error } = await login(username, password, remotesourcename); if (error) { // set local login error on failed login. this.error = error; return; } if (data.oauth2_redirect) { if (redirect) { setLoginRedirect(redirect); } window.location = data.oauth2_redirect; return; } setLoggedUser(data.token, data.user); if (redirect) { unsetLoginRedirect(); this.$router.push(redirect); } else { this.$router.push({ name: 'home' }); } }, }, mounted: function () { this.$store.dispatch('setError', null); }, created: function () { doLogout(); this.fetchRemoteSources(); }, }; </script>