summaryrefslogtreecommitdiff
path: root/packages/frontend/src/pages/auth.vue
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/pages/auth.vue')
-rw-r--r--packages/frontend/src/pages/auth.vue91
1 files changed, 91 insertions, 0 deletions
diff --git a/packages/frontend/src/pages/auth.vue b/packages/frontend/src/pages/auth.vue
new file mode 100644
index 0000000000..bb55881a22
--- /dev/null
+++ b/packages/frontend/src/pages/auth.vue
@@ -0,0 +1,91 @@
+<template>
+<div v-if="$i && fetching" class="">
+ <MkLoading/>
+</div>
+<div v-else-if="$i">
+ <XForm
+ v-if="state == 'waiting'"
+ ref="form"
+ class="form"
+ :session="session"
+ @denied="state = 'denied'"
+ @accepted="accepted"
+ />
+ <div v-if="state == 'denied'" class="denied">
+ <h1>{{ $ts._auth.denied }}</h1>
+ </div>
+ <div v-if="state == 'accepted'" class="accepted">
+ <h1>{{ session.app.isAuthorized ? $t('already-authorized') : $ts.allowed }}</h1>
+ <p v-if="session.app.callbackUrl">{{ $ts._auth.callback }}<MkEllipsis/></p>
+ <p v-if="!session.app.callbackUrl">{{ $ts._auth.pleaseGoBack }}</p>
+ </div>
+ <div v-if="state == 'fetch-session-error'" class="error">
+ <p>{{ $ts.somethingHappened }}</p>
+ </div>
+</div>
+<div v-else class="signin">
+ <MkSignin @login="onLogin"/>
+</div>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import XForm from './auth.form.vue';
+import MkSignin from '@/components/MkSignin.vue';
+import * as os from '@/os';
+import { login } from '@/account';
+
+export default defineComponent({
+ components: {
+ XForm,
+ MkSignin,
+ },
+ props: ['token'],
+ data() {
+ return {
+ state: null,
+ session: null,
+ fetching: true,
+ };
+ },
+ mounted() {
+ if (!this.$i) return;
+
+ // Fetch session
+ os.api('auth/session/show', {
+ token: this.token,
+ }).then(session => {
+ this.session = session;
+ this.fetching = false;
+
+ // 既に連携していた場合
+ if (this.session.app.isAuthorized) {
+ os.api('auth/accept', {
+ token: this.session.token,
+ }).then(() => {
+ this.accepted();
+ });
+ } else {
+ this.state = 'waiting';
+ }
+ }).catch(error => {
+ this.state = 'fetch-session-error';
+ this.fetching = false;
+ });
+ },
+ methods: {
+ accepted() {
+ this.state = 'accepted';
+ if (this.session.app.callbackUrl) {
+ location.href = `${this.session.app.callbackUrl}?token=${this.session.token}`;
+ }
+ }, onLogin(res) {
+ login(res.i);
+ },
+ },
+});
+</script>
+
+<style lang="scss" scoped>
+
+</style>