From cce3e526427af324119203f5b570cfa0caa28a45 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 28 Dec 2018 05:06:25 +0900
Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E7=9F=A5=E3=81=AE=E7=AE=A1=E7=90=86?=
 =?UTF-8?q?=E3=82=92=E5=BC=B7=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Resolve #3772
---
 locales/ja-JP.yml                             | 12 +++--
 .../components/notification-settings.vue      | 44 +++++++++++++++++++
 .../app/desktop/views/components/settings.vue | 22 ++--------
 .../app/mobile/views/pages/notifications.vue  |  2 -
 .../app/mobile/views/pages/settings.vue       |  4 ++
 .../i/read_all_messaging_messages.ts          | 42 ++++++++++++++++++
 6 files changed, 101 insertions(+), 25 deletions(-)
 create mode 100644 src/client/app/common/views/components/notification-settings.vue
 create mode 100644 src/server/api/endpoints/i/read_all_messaging_messages.ts

diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index ac56b31883..49d6a836d2 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -445,6 +445,14 @@ common/views/components/stream-indicator.vue:
   reconnecting: "再接続中"
   connected: "接続完了"
 
+common/views/components/notification-settings.vue:
+  title: "通知"
+  mark-as-read-all-notifications: "すべての通知を既読にする"
+  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
+  mark-as-read-all-talk-messages: "すべてのトークを既読にする"
+  auto-watch: "投稿の自動ウォッチ"
+  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
+
 common/views/components/integration-settings.vue:
   title: "サービス連携"
   connect: "接続する"
@@ -842,7 +850,6 @@ desktop/views/components/settings.vue:
   2fa: "二段階認証"
   other: "その他"
   license: "ライセンス"
-  mark-as-read-all-unread-notes: "すべての投稿を既読にする"
   theme: "テーマ"
 
   behaviour: "動作"
@@ -904,9 +911,6 @@ desktop/views/components/settings.vue:
   cache-cleared: "キャッシュを削除しました"
   cache-cleared-desc: "ページを再度読み込みしてください。"
 
-  auto-watch: "投稿の自動ウォッチ"
-  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
-
   about: "Misskeyについて"
   operator: "このサーバーの運営者"
 
diff --git a/src/client/app/common/views/components/notification-settings.vue b/src/client/app/common/views/components/notification-settings.vue
new file mode 100644
index 0000000000..566d0b5702
--- /dev/null
+++ b/src/client/app/common/views/components/notification-settings.vue
@@ -0,0 +1,44 @@
+<template>
+<ui-card>
+	<div slot="title"><fa :icon="['far', 'bell']"/> {{ $t('notification') }}</div>
+	<section>
+		<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch">
+			{{ $t('auto-watch') }}<span slot="desc">{{ $t('auto-watch-desc') }}</span>
+		</ui-switch>
+		<section>
+			<ui-button @click="readAllNotifications">{{ $t('mark-as-read-all-notifications') }}</ui-button>
+			<ui-button @click="readAllUnreadNotes">{{ $t('mark-as-read-all-unread-notes') }}</ui-button>
+			<ui-button @click="readAllMessagingMessages">{{ $t('mark-as-read-all-talk-messages') }}</ui-button>
+		</section>
+	</section>
+</ui-card>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import i18n from '../../../i18n';
+
+export default Vue.extend({
+	i18n: i18n('common/views/components/notification-settings.vue'),
+
+	methods: {
+		onChangeAutoWatch(v) {
+			this.$root.api('i/update', {
+				autoWatch: v
+			});
+		},
+
+		readAllUnreadNotes() {
+			this.$root.api('i/read_all_unread_notes');
+		},
+
+		readAllMessagingMessages() {
+			this.$root.api('i/read_all_messaging_messages');
+		},
+
+		readAllNotifications() {
+			this.$root.api('notifications/mark_all_as_read');
+		}
+	}
+});
+</script>
diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue
index 921aa59c5e..741e11db15 100644
--- a/src/client/app/desktop/views/components/settings.vue
+++ b/src/client/app/desktop/views/components/settings.vue
@@ -170,17 +170,7 @@
 			</section>
 		</ui-card>
 
-		<ui-card class="notification" v-show="page == 'notification'">
-			<div slot="title"><fa :icon="['far', 'bell']"/> {{ $t('notification') }}</div>
-			<section>
-				<ui-switch v-model="$store.state.i.settings.autoWatch" @change="onChangeAutoWatch">
-					{{ $t('auto-watch') }}<span slot="desc">{{ $t('auto-watch-desc') }}</span>
-				</ui-switch>
-				<section>
-					<ui-button @click="readAllUnreadNotes">{{ $t('mark-as-read-all-unread-notes') }}</ui-button>
-				</section>
-			</section>
-		</ui-card>
+		<x-notification-settings v-show="page == 'notification'"/>
 
 		<div class="drive" v-if="page == 'drive'">
 			<x-drive-settings/>
@@ -289,6 +279,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 XNotificationSettings from '../../../common/views/components/notification-settings.vue';
 
 import { url, clientVersion as version } from '../../../config';
 import checkForUpdate from '../../../common/scripts/check-for-update';
@@ -308,6 +299,7 @@ export default Vue.extend({
 		XProfileEditor,
 		XApiSettings,
 		XLanguageSettings,
+		XNotificationSettings,
 	},
 	props: {
 		initialPage: {
@@ -531,9 +523,6 @@ export default Vue.extend({
 		});
 	},
 	methods: {
-		readAllUnreadNotes() {
-			this.$root.api('i/read_all_unread_notes');
-		},
 		customizeHome() {
 			this.$router.push('/i/customize-home');
 			this.$emit('done');
@@ -552,11 +541,6 @@ export default Vue.extend({
 				wallpaperId: null
 			});
 		},
-		onChangeAutoWatch(v) {
-			this.$root.api('i/update', {
-				autoWatch: v
-			});
-		},
 		checkForUpdate() {
 			this.checkingForUpdate = true;
 			checkForUpdate(this.$root, true, true).then(newer => {
diff --git a/src/client/app/mobile/views/pages/notifications.vue b/src/client/app/mobile/views/pages/notifications.vue
index 69f7b902c8..c6e5b646f2 100644
--- a/src/client/app/mobile/views/pages/notifications.vue
+++ b/src/client/app/mobile/views/pages/notifications.vue
@@ -41,8 +41,6 @@ export default Vue.extend({
 </script>
 
 <style lang="stylus" scoped>
-
-
 main
 	width 100%
 	max-width 680px
diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue
index cdeb8a50ff..3aa8bb7673 100644
--- a/src/client/app/mobile/views/pages/settings.vue
+++ b/src/client/app/mobile/views/pages/settings.vue
@@ -94,6 +94,8 @@
 				</section>
 			</ui-card>
 
+			<x-notification-settings/>
+
 			<x-drive-settings/>
 
 			<x-mute-and-block/>
@@ -157,6 +159,7 @@ 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';
+import XNotificationSettings from '../../../common/views/components/notification-settings.vue';
 
 export default Vue.extend({
 	i18n: i18n('mobile/views/pages/settings.vue'),
@@ -170,6 +173,7 @@ export default Vue.extend({
 		XApiSettings,
 		XLanguageSettings,
 		XIntegrationSettings,
+		XNotificationSettings,
 	},
 
 	data() {
diff --git a/src/server/api/endpoints/i/read_all_messaging_messages.ts b/src/server/api/endpoints/i/read_all_messaging_messages.ts
new file mode 100644
index 0000000000..a1fe82c4cb
--- /dev/null
+++ b/src/server/api/endpoints/i/read_all_messaging_messages.ts
@@ -0,0 +1,42 @@
+import User from '../../../../models/user';
+import { publishMainStream } from '../../../../stream';
+import Message from '../../../../models/messaging-message';
+import define from '../../define';
+
+export const meta = {
+	desc: {
+		'ja-JP': 'トークメッセージをすべて既読にします。',
+		'en-US': 'Mark all talk messages as read.'
+	},
+
+	requireCredential: true,
+
+	kind: 'account-write',
+
+	params: {
+	}
+};
+
+export default define(meta, (ps, user) => new Promise(async (res, rej) => {
+	// Update documents
+	await Message.update({
+		recipientId: user._id,
+		isRead: false
+	}, {
+		$set: {
+			isRead: true
+		}
+	}, {
+		multi: true
+	});
+
+	User.update({ _id: user._id }, {
+		$set: {
+			hasUnreadMessagingMessage: false
+		}
+	});
+
+	publishMainStream(user._id, 'readAllMessagingMessages');
+
+	res();
+}));