From 396a2b9bfc043c77e0869ca3d98533e848b3bd4f Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 3 Dec 2018 19:44:03 +0900
Subject: [PATCH] Refactor

---
 locales/ja-JP.yml                             | 22 +----
 .../views/components/discord-setting.vue      | 64 -------------
 .../views/components/github-setting.vue       | 64 -------------
 .../views/components/integration-settings.vue | 96 +++++++++++++++++++
 .../views/components/twitter-setting.vue      | 65 -------------
 .../app/desktop/views/components/settings.vue | 32 +------
 .../app/mobile/views/pages/settings.vue       | 41 +-------
 7 files changed, 107 insertions(+), 277 deletions(-)
 delete mode 100644 src/client/app/common/views/components/discord-setting.vue
 delete mode 100644 src/client/app/common/views/components/github-setting.vue
 create mode 100644 src/client/app/common/views/components/integration-settings.vue
 delete mode 100644 src/client/app/common/views/components/twitter-setting.vue

diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index d6a0521fe..38921587f 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -440,13 +440,11 @@ common/views/components/stream-indicator.vue:
   reconnecting: "再接続中"
   connected: "接続完了"
 
-common/views/components/twitter-setting.vue:
-  description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。"
-  connected-to: "次のTwitterアカウントに接続されています"
-  detail: "詳細..."
-  reconnect: "再接続する"
-  connect: "Twitterと接続する"
+common/views/components/integration-settings.vue:
+  title: "サービス連携"
+  connect: "接続する"
   disconnect: "切断する"
+  connected-to: "次のアカウントに接続されています"
 
 common/views/components/github-setting.vue:
   description: "お使いのGitHubアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでGitHubアカウント情報が表示されるようになったり、GitHubを用いた便利なサインインを利用できるようになります。"
@@ -1582,18 +1580,6 @@ mobile/views/pages/settings.vue:
   disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
   load-raw-images: "添付された画像を高画質で表示する"
   load-remote-media: "リモートサーバーのメディアを表示する"
-  twitter: "Twitter連携"
-  twitter-connect: "Twitterアカウントに接続する"
-  twitter-reconnect: "再接続する"
-  twitter-disconnect: "切断する"
-  github: "GitHub連携"
-  github-connect: "GitHubアカウントに接続する"
-  github-reconnect: "再接続する"
-  github-disconnect: "切断する"
-  discord: "Discord連携"
-  discord-connect: "Discordアカウントに接続する"
-  discord-reconnect: "再接続する"
-  discord-disconnect: "切断する"
   update: "Misskey Update"
   version: "バージョン:"
   latest-version: "最新のバージョン:"
diff --git a/src/client/app/common/views/components/discord-setting.vue b/src/client/app/common/views/components/discord-setting.vue
deleted file mode 100644
index 113df9b0a..000000000
--- a/src/client/app/common/views/components/discord-setting.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-<template>
-<div class="mk-discord-setting">
-	<p>{{ $t('description') }}</p>
-	<p class="account" v-if="$store.state.i.discord" :title="`Discord ID: ${$store.state.i.discord.id}`">{{ $t('connected-to') }}: <a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
-	<p>
-		<a :href="`${apiUrl}/connect/discord`" target="_blank" @click.prevent="connect">{{ $store.state.i.discord ? this.$t('reconnect') : this.$t('connect') }}</a>
-		<span v-if="$store.state.i.discord"> or </span>
-		<a :href="`${apiUrl}/disconnect/discord`" target="_blank" v-if="$store.state.i.discord" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
-	</p>
-	<p class="id" v-if="$store.state.i.discord">Discord ID: {{ $store.state.i.discord.id }}</p>
-</div>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-import i18n from '../../../i18n';
-import { apiUrl } from '../../../config';
-
-export default Vue.extend({
-	i18n: i18n('common/views/components/discord-setting.vue'),
-	data() {
-		return {
-			form: null,
-			apiUrl
-		};
-	},
-	mounted() {
-		this.$watch('$store.state.i', () => {
-			if (this.$store.state.i.discord && this.form)
-				this.form.close();
-		}, {
-			deep: true
-		});
-	},
-	methods: {
-		connect() {
-			this.form = window.open(apiUrl + '/connect/discord',
-				'discord_connect_window',
-				'height=570, width=520');
-		},
-
-		disconnect() {
-			window.open(apiUrl + '/disconnect/discord',
-				'discord_disconnect_window',
-				'height=570, width=520');
-		}
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-.mk-discord-setting
-	.account
-		border solid 1px #e1e8ed
-		border-radius 4px
-		padding 16px
-
-		a
-			font-weight bold
-			color inherit
-
-	.id
-		color #8899a6
-</style>
diff --git a/src/client/app/common/views/components/github-setting.vue b/src/client/app/common/views/components/github-setting.vue
deleted file mode 100644
index 93d7f406f..000000000
--- a/src/client/app/common/views/components/github-setting.vue
+++ /dev/null
@@ -1,64 +0,0 @@
-<template>
-<div class="mk-github-setting">
-	<p>{{ $t('description') }}</p>
-	<p class="account" v-if="$store.state.i.github" :title="`GitHub ID: ${$store.state.i.github.id}`">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
-	<p>
-		<a :href="`${apiUrl}/connect/github`" target="_blank" @click.prevent="connect">{{ $store.state.i.github ? this.$t('reconnect') : this.$t('connect') }}</a>
-		<span v-if="$store.state.i.github"> or </span>
-		<a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
-	</p>
-	<p class="id" v-if="$store.state.i.github">GitHub ID: {{ $store.state.i.github.id }}</p>
-</div>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-import i18n from '../../../i18n';
-import { apiUrl } from '../../../config';
-
-export default Vue.extend({
-	i18n: i18n('common/views/components/github-setting.vue'),
-	data() {
-		return {
-			form: null,
-			apiUrl
-		};
-	},
-	mounted() {
-		this.$watch('$store.state.i', () => {
-			if (this.$store.state.i.github && this.form)
-				this.form.close();
-		}, {
-			deep: true
-		});
-	},
-	methods: {
-		connect() {
-			this.form = window.open(apiUrl + '/connect/github',
-				'github_connect_window',
-				'height=570, width=520');
-		},
-
-		disconnect() {
-			window.open(apiUrl + '/disconnect/github',
-				'github_disconnect_window',
-				'height=570, width=520');
-		}
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-.mk-github-setting
-	.account
-		border solid 1px #e1e8ed
-		border-radius 4px
-		padding 16px
-
-		a
-			font-weight bold
-			color inherit
-
-	.id
-		color #8899a6
-</style>
diff --git a/src/client/app/common/views/components/integration-settings.vue b/src/client/app/common/views/components/integration-settings.vue
new file mode 100644
index 000000000..1a0af799a
--- /dev/null
+++ b/src/client/app/common/views/components/integration-settings.vue
@@ -0,0 +1,96 @@
+<template>
+<ui-card>
+	<div slot="title"><fa icon="share-alt"/> {{ $t('title') }}</div>
+
+	<section>
+		<header><fa :icon="['fab', 'twitter']"/> Twitter</header>
+		<p v-if="$store.state.i.twitter">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
+		<ui-button v-if="$store.state.i.twitter" @click="disconnectTwitter">{{ $t('disconnect') }}</ui-button>
+		<ui-button v-else @click="connectTwitter">{{ $t('connect') }}</ui-button>
+	</section>
+
+	<section>
+		<header><fa :icon="['fab', 'discord']"/> Discord</header>
+		<p v-if="$store.state.i.discord">{{ $t('connected-to') }}: <a :href="`https://discord.com/${$store.state.i.discord.screenName}`" target="_blank">@{{ $store.state.i.discord.screenName }}</a></p>
+		<ui-button v-if="$store.state.i.discord" @click="disconnectDiscord">{{ $t('disconnect') }}</ui-button>
+		<ui-button v-else @click="connectDiscord">{{ $t('connect') }}</ui-button>
+	</section>
+
+	<section>
+		<header><fa :icon="['fab', 'github']"/> GitHub</header>
+		<p v-if="$store.state.i.github">{{ $t('connected-to') }}: <a :href="`https://github.com/${$store.state.i.github.screenName}`" target="_blank">@{{ $store.state.i.github.screenName }}</a></p>
+		<ui-button v-if="$store.state.i.github" @click="disconnectGithub">{{ $t('disconnect') }}</ui-button>
+		<ui-button v-else @click="connectGithub">{{ $t('connect') }}</ui-button>
+	</section>
+</ui-card>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import i18n from '../../../i18n';
+import { apiUrl } from '../../../config';
+
+export default Vue.extend({
+	i18n: i18n('common/views/components/integration-settings.vue'),
+
+	data() {
+		return {
+			apiUrl,
+			twitterForm: null,
+			discordForm: null,
+			githubForm: null,
+		};
+	},
+
+	mounted() {
+		this.$watch('$store.state.i', () => {
+			if (this.$store.state.i.twitter) {
+				if (this.twitterForm) this.twitterForm.close();
+			}
+		}, {
+			deep: true
+		});
+	},
+
+	methods: {
+		connectTwitter() {
+			this.twitterForm = window.open(apiUrl + '/connect/twitter',
+				'twitter_connect_window',
+				'height=570, width=520');
+		},
+
+		disconnectTwitter() {
+			window.open(apiUrl + '/disconnect/twitter',
+				'twitter_disconnect_window',
+				'height=570, width=520');
+		},
+
+		connectDiscord() {
+			this.discordForm = window.open(apiUrl + '/connect/discord',
+				'discord_connect_window',
+				'height=570, width=520');
+		},
+
+		disconnectDiscord() {
+			window.open(apiUrl + '/disconnect/discord',
+				'discord_disconnect_window',
+				'height=570, width=520');
+		},
+
+		connectGithub() {
+			this.githubForm = window.open(apiUrl + '/connect/github',
+				'github_connect_window',
+				'height=570, width=520');
+		},
+
+		disconnectGithub() {
+			window.open(apiUrl + '/disconnect/github',
+				'github_disconnect_window',
+				'height=570, width=520');
+		},
+	}
+});
+</script>
+
+<style lang="stylus" scoped>
+</style>
diff --git a/src/client/app/common/views/components/twitter-setting.vue b/src/client/app/common/views/components/twitter-setting.vue
deleted file mode 100644
index f75bbb7fb..000000000
--- a/src/client/app/common/views/components/twitter-setting.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-<template>
-<div class="mk-twitter-setting">
-	<p>{{ $t('description') }}</p>
-	<p class="account" v-if="$store.state.i.twitter" :title="`Twitter ID: ${$store.state.i.twitter.userId}`">{{ $t('connected-to') }}: <a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
-	<p>
-		<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ $store.state.i.twitter ? this.$t('reconnect') : this.$t('connect') }}</a>
-		<span v-if="$store.state.i.twitter"> or </span>
-		<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter" @click.prevent="disconnect">{{ $t('disconnect') }}</a>
-	</p>
-	<p class="id" v-if="$store.state.i.twitter">Twitter ID: {{ $store.state.i.twitter.userId }}</p>
-</div>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-import i18n from '../../../i18n';
-import { apiUrl } from '../../../config';
-
-export default Vue.extend({
-	i18n: i18n('common/views/components/twitter-setting.vue'),
-	data() {
-		return {
-			form: null,
-			apiUrl
-		};
-	},
-	mounted() {
-		this.$watch('$store.state.i', () => {
-			if (this.$store.state.i.twitter) {
-				if (this.form) this.form.close();
-			}
-		}, {
-			deep: true
-		});
-	},
-	methods: {
-		connect() {
-			this.form = window.open(apiUrl + '/connect/twitter',
-				'twitter_connect_window',
-				'height=570, width=520');
-		},
-
-		disconnect() {
-			window.open(apiUrl + '/disconnect/twitter',
-				'twitter_disconnect_window',
-				'height=570, width=520');
-		}
-	}
-});
-</script>
-
-<style lang="stylus" scoped>
-.mk-twitter-setting
-	.account
-		border solid 1px #e1e8ed
-		border-radius 4px
-		padding 16px
-
-		a
-			font-weight bold
-			color inherit
-
-	.id
-		color #8899a6
-</style>
diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue
index a89982eea..9cb28eb86 100644
--- a/src/client/app/desktop/views/components/settings.vue
+++ b/src/client/app/desktop/views/components/settings.vue
@@ -16,27 +16,7 @@
 	<div class="pages">
 		<div class="profile" v-show="page == 'profile'">
 			<x-profile-editor/>
-
-			<ui-card>
-				<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div>
-				<section>
-					<x-twitter-setting/>
-				</section>
-			</ui-card>
-
-			<ui-card>
-				<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div>
-				<section>
-					<x-github-setting/>
-				</section>
-			</ui-card>
-
-			<ui-card>
-				<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord') }}</div>
-				<section>
-					<x-discord-setting/>
-				</section>
-			</ui-card>
+			<x-integration-settings/>
 		</div>
 
 		<ui-card class="theme" v-show="page == 'theme'">
@@ -169,7 +149,7 @@
 			</section>
 		</ui-card>
 
-		<x-language-settings/>
+		<x-language-settings v-show="page == 'web'"/>
 
 		<ui-card class="web" v-show="page == 'web'">
 			<div slot="title"><fa :icon="['far', 'trash-alt']"/> {{ $t('cache') }}</div>
@@ -292,9 +272,7 @@ import X2fa from './settings.2fa.vue';
 import XApps from './settings.apps.vue';
 import XSignins from './settings.signins.vue';
 import XTags from './settings.tags.vue';
-import XTwitterSetting from '../../../common/views/components/twitter-setting.vue';
-import XGithubSetting from '../../../common/views/components/github-setting.vue';
-import XDiscordSetting from '../../../common/views/components/discord-setting.vue';
+import XIntegrationSettings from '../../../common/views/components/integration-settings.vue';
 import XTheme from '../../../common/views/components/theme.vue';
 import XDriveSettings from '../../../common/views/components/drive-settings.vue';
 import XMuteAndBlock from '../../../common/views/components/mute-and-block.vue';
@@ -313,9 +291,7 @@ export default Vue.extend({
 		XApps,
 		XSignins,
 		XTags,
-		XTwitterSetting,
-		XGithubSetting,
-		XDiscordSetting,
+		XIntegrationSettings,
 		XTheme,
 		XDriveSettings,
 		XMuteAndBlock,
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index de881af3b..3e048a198 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -107,44 +107,7 @@
 
 			<x-language-settings/>
 
-			<ui-card>
-				<div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div>
-
-				<section>
-					<p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p>
-					<p>
-						<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? this.$t('twitter-reconnect') : this.$t('twitter-connect') }}</a>
-						<span v-if="$store.state.i.twitter"> or </span>
-						<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">{{ $t('twitter-disconnect') }}</a>
-					</p>
-				</section>
-			</ui-card>
-
-			<ui-card>
-				<div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div>
-
-				<section>
-					<p class="account" v-if="$store.state.i.github"><a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p>
-					<p>
-						<a :href="`${apiUrl}/connect/github`" target="_blank">{{ $store.state.i.github ? this.$t('github-reconnect') : this.$t('github-connect') }}</a>
-						<span v-if="$store.state.i.github"> or </span>
-						<a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github">{{ $t('github-disconnect') }}</a>
-					</p>
-				</section>
-			</ui-card>
-
-			<ui-card>
-				<div slot="title"><fa :icon="['fab', 'discord']"/> {{ $t('discord') }}</div>
-
-				<section>
-					<p class="account" v-if="$store.state.i.discord"><a :href="`https://discordapp.com/users/${$store.state.i.discord.id}`" target="_blank">@{{ $store.state.i.discord.username }}#{{ $store.state.i.discord.discriminator }}</a></p>
-					<p>
-						<a :href="`${apiUrl}/connect/discord`" target="_blank">{{ $store.state.i.discord ? this.$t('discord-reconnect') : this.$t('discord-connect') }}</a>
-						<span v-if="$store.state.i.discord"> or </span>
-						<a :href="`${apiUrl}/disconnect/discord`" target="_blank" v-if="$store.state.i.discord">{{ $t('discord-disconnect') }}</a>
-					</p>
-				</section>
-			</ui-card>
+			<x-integration-settings/>
 
 			<x-api-settings />
 
@@ -192,6 +155,7 @@ import XPasswordSettings from '../../../common/views/components/password-setting
 import XProfileEditor from '../../../common/views/components/profile-editor.vue';
 import XApiSettings from '../../../common/views/components/api-settings.vue';
 import XLanguageSettings from '../../../common/views/components/language-settings.vue';
+import XIntegrationSettings from '../../../common/views/components/integration-settings.vue';
 
 export default Vue.extend({
 	i18n: i18n('mobile/views/pages/settings.vue'),
@@ -204,6 +168,7 @@ export default Vue.extend({
 		XProfileEditor,
 		XApiSettings,
 		XLanguageSettings,
+		XIntegrationSettings,
 	},
 
 	data() {