mizzkey/src/client/app/auth/views/index.vue

152 lines
3.1 KiB
Vue
Raw Normal View History

2018-02-20 12:50:01 +01:00
<template>
<div class="index">
2018-05-27 06:49:09 +02:00
<main v-if="$store.getters.isSignedIn">
2018-02-20 12:50:01 +01:00
<p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p>
2018-02-20 17:39:51 +01:00
<x-form
2018-06-02 21:51:58 +02:00
class="form"
2018-02-20 12:50:01 +01:00
ref="form"
v-if="state == 'waiting'"
:session="session"
@denied="state = 'denied'"
@accepted="accepted"
/>
<div class="denied" v-if="state == 'denied'">
<h1>アプリケーションの連携をキャンセルしました</h1>
<p>このアプリがあなたのアカウントにアクセスすることはありません</p>
</div>
<div class="accepted" v-if="state == 'accepted'">
2018-03-29 07:48:47 +02:00
<h1>{{ session.app.isAuthorized ? 'このアプリは既に連携済みです' : 'アプリケーションの連携を許可しました' }}</h1>
<p v-if="session.app.callbackUrl">アプリケーションに戻っています<mk-ellipsis/></p>
<p v-if="!session.app.callbackUrl">アプリケーションに戻ってやっていってください</p>
2018-02-20 12:50:01 +01:00
</div>
<div class="error" v-if="state == 'fetch-session-error'">
<p>セッションが存在しません</p>
</div>
</main>
2018-05-27 06:49:09 +02:00
<main class="signin" v-if="!$store.getters.isSignedIn">
2018-02-20 12:50:01 +01:00
<h1>サインインしてください</h1>
<mk-signin/>
</main>
2018-06-03 00:34:34 +02:00
<footer><img src="/assets/auth/icon.svg" alt="Misskey"/></footer>
2018-02-20 12:50:01 +01:00
</div>
</template>
<script lang="ts">
import Vue from 'vue';
2018-02-20 17:39:51 +01:00
import XForm from './form.vue';
2018-02-20 12:50:01 +01:00
export default Vue.extend({
components: {
2018-02-20 17:39:51 +01:00
XForm
2018-02-20 12:50:01 +01:00
},
data() {
return {
state: null,
session: null,
2018-02-27 16:11:28 +01:00
fetching: true
2018-02-20 12:50:01 +01:00
};
},
2018-02-27 16:11:28 +01:00
computed: {
token(): string {
return this.$route.params.token;
}
},
2018-02-20 12:50:01 +01:00
mounted() {
2018-05-28 18:55:32 +02:00
if (!this.$store.getters.isSignedIn) return;
2018-02-20 12:50:01 +01:00
// Fetch session
(this as any).api('auth/session/show', {
token: this.token
}).then(session => {
this.session = session;
this.fetching = false;
// 既に連携していた場合
2018-03-29 07:48:47 +02:00
if (this.session.app.isAuthorized) {
2018-05-29 10:10:59 +02:00
(this as any).api('auth/accept', {
2018-02-20 12:50:01 +01:00
token: this.session.token
}).then(() => {
this.accepted();
});
} else {
this.state = 'waiting';
}
}).catch(error => {
this.state = 'fetch-session-error';
2018-05-28 18:55:32 +02:00
this.fetching = false;
2018-02-20 12:50:01 +01:00
});
},
methods: {
accepted() {
this.state = 'accepted';
2018-03-29 07:48:47 +02:00
if (this.session.app.callbackUrl) {
location.href = this.session.app.callbackUrl + '?token=' + this.session.token;
2018-02-20 12:50:01 +01:00
}
}
}
});
</script>
<style lang="stylus" scoped>
.index
> main
width 100%
max-width 500px
margin 0 auto
text-align center
background #fff
2018-04-29 01:51:17 +02:00
box-shadow 0px 4px 16px rgba(#000, 0.2)
2018-02-20 12:50:01 +01:00
> .fetching
margin 0
padding 32px
color #555
2018-06-02 21:51:58 +02:00
> div:not(.form)
2018-02-20 12:50:01 +01:00
padding 64px
> h1
margin 0 0 8px 0
padding 0
font-size 20px
font-weight normal
> p
margin 0
color #555
&.denied > h1
color #e65050
&.accepted > h1
color #54af7c
&.signin
padding 32px 32px 16px 32px
> h1
margin 0 0 22px 0
padding 0
font-size 20px
font-weight normal
color #555
@media (max-width 600px)
max-width none
box-shadow none
@media (max-width 500px)
> div
> h1
font-size 16px
> footer
> img
display block
2018-06-03 00:34:34 +02:00
width 32px
height 32px
margin 16px auto
2018-02-20 12:50:01 +01:00
</style>