From 172cca6ad6fe73d00686d0355bde264c6340958e Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Mon, 16 Apr 2018 15:59:43 +0900
Subject: [PATCH] Better recovery system

---
 locales/en.yml                                |   2 +
 locales/fr.yml                                |   2 +
 locales/ja.yml                                |   2 +
 src/client/app/boot.js                        |  34 ++--
 .../connect-failed.troubleshooter.vue         | 156 +++++++++---------
 src/client/assets/flush.html                  |  16 ++
 src/client/assets/recover.html                |  28 ----
 7 files changed, 124 insertions(+), 116 deletions(-)
 create mode 100644 src/client/assets/flush.html
 delete mode 100644 src/client/assets/recover.html

diff --git a/locales/en.yml b/locales/en.yml
index 5786819364..446ef371be 100644
--- a/locales/en.yml
+++ b/locales/en.yml
@@ -62,6 +62,8 @@ common/views/components/connect-failed.troubleshooter.vue:
   no-server-desc: "The network connection of your PC is normal, but you could not connect to Misskey's server. There is a possibility that the server is either down or under maintenance, please try again later."
   success: "Successfully connected to Misskey's server"
   success-desc: "It seems to be able to connect. Please reload the page."
+  flush: "Clean cache"
+  set-version: "Specify version"
 
 common/views/components/messaging.vue:
   search-user: "Find an user"
diff --git a/locales/fr.yml b/locales/fr.yml
index 4af300fcf6..583104b4f0 100644
--- a/locales/fr.yml
+++ b/locales/fr.yml
@@ -62,6 +62,8 @@ common/views/components/connect-failed.troubleshooter.vue:
   no-server-desc: "Votre connexion est OK, mais il a été impossible de vous connecter au serveur de Misskey. Il y a des chances que le serveur soit hors-ligne ou en maintenance, veuillez ressayer plus tard."
   success: "Connexion au serveur de Misskey reussie!"
   success-desc: "La connexion au serveur a été reussie. Veuillez recharger la page."
+  flush: "キャッシュの削除"
+  set-version: "バージョン指定"
 
 common/views/components/messaging.vue:
   search-user: "Trouver un utilisateur"
diff --git a/locales/ja.yml b/locales/ja.yml
index 1f70f4203d..b5479b5cef 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -62,6 +62,8 @@ common/views/components/connect-failed.troubleshooter.vue:
   no-server-desc: "お使いのPCのインターネット接続は正常ですが、Misskeyのサーバーには接続できませんでした。サーバーがダウンまたはメンテナンスしている可能性があるので、しばらくしてから再度御アクセスください。"
   success: "Misskeyのサーバーに接続できました"
   success-desc: "正常に接続できるようです。ページを再度読み込みしてください。"
+  flush: "キャッシュの削除"
+  set-version: "バージョン指定"
 
 common/views/components/messaging.vue:
   search-user: "ユーザーを探す"
diff --git a/src/client/app/boot.js b/src/client/app/boot.js
index 12b0d220a9..a0709842b9 100644
--- a/src/client/app/boot.js
+++ b/src/client/app/boot.js
@@ -18,6 +18,8 @@
 // ブロック内に入れてスコープを非グローバル化するとそれが防げます
 // (Chrome以外のブラウザでは検証していません)
 {
+	if (localStorage.getItem('shouldFlush') == 'true') refresh();
+
 	// Get the current url information
 	const url = new URL(location.href);
 
@@ -103,19 +105,25 @@
 				'\n\n' +
 				'New version of Misskey available. The page will be reloaded.');
 
-			// Clear cache (serive worker)
-			try {
-				navigator.serviceWorker.controller.postMessage('clear');
-
-				navigator.serviceWorker.getRegistrations().then(registrations => {
-					registrations.forEach(registration => registration.unregister());
-				});
-			} catch (e) {
-				console.error(e);
-			}
-
-			// Force reload
-			location.reload(true);
+			refresh();
 		}
 	}, 3000);
+
+	function refresh() {
+		localStorage.setItem('shouldFlush', 'false');
+
+		// Clear cache (serive worker)
+		try {
+			navigator.serviceWorker.controller.postMessage('clear');
+
+			navigator.serviceWorker.getRegistrations().then(registrations => {
+				registrations.forEach(registration => registration.unregister());
+			});
+		} catch (e) {
+			console.error(e);
+		}
+
+		// Force reload
+		location.reload(true);
+	}
 }
diff --git a/src/client/app/common/views/components/connect-failed.troubleshooter.vue b/src/client/app/common/views/components/connect-failed.troubleshooter.vue
index fffabe5a30..2ee5f67c89 100644
--- a/src/client/app/common/views/components/connect-failed.troubleshooter.vue
+++ b/src/client/app/common/views/components/connect-failed.troubleshooter.vue
@@ -1,34 +1,39 @@
 <template>
 <div class="troubleshooter">
-	<h1>%fa:wrench%%i18n:@title%</h1>
-	<div>
-		<p :data-wip="network == null">
-			<template v-if="network != null">
-				<template v-if="network">%fa:check%</template>
-				<template v-if="!network">%fa:times%</template>
-			</template>
-			{{ network == null ? '%i18n:!@checking-network%' : '%i18n:!@network%' }}<mk-ellipsis v-if="network == null"/>
-		</p>
-		<p v-if="network == true" :data-wip="internet == null">
-			<template v-if="internet != null">
-				<template v-if="internet">%fa:check%</template>
-				<template v-if="!internet">%fa:times%</template>
-			</template>
-			{{ internet == null ? '%i18n:!@checking-internet%' : '%i18n:!@internet%' }}<mk-ellipsis v-if="internet == null"/>
-		</p>
-		<p v-if="internet == true" :data-wip="server == null">
-			<template v-if="server != null">
-				<template v-if="server">%fa:check%</template>
-				<template v-if="!server">%fa:times%</template>
-			</template>
-			{{ server == null ? '%i18n:!@checking-server%' : '%i18n:!@server%' }}<mk-ellipsis v-if="server == null"/>
-		</p>
+	<div class="body">
+		<h1>%fa:wrench%%i18n:@title%</h1>
+		<div>
+			<p :data-wip="network == null">
+				<template v-if="network != null">
+					<template v-if="network">%fa:check%</template>
+					<template v-if="!network">%fa:times%</template>
+				</template>
+				{{ network == null ? '%i18n:!@checking-network%' : '%i18n:!@network%' }}<mk-ellipsis v-if="network == null"/>
+			</p>
+			<p v-if="network == true" :data-wip="internet == null">
+				<template v-if="internet != null">
+					<template v-if="internet">%fa:check%</template>
+					<template v-if="!internet">%fa:times%</template>
+				</template>
+				{{ internet == null ? '%i18n:!@checking-internet%' : '%i18n:!@internet%' }}<mk-ellipsis v-if="internet == null"/>
+			</p>
+			<p v-if="internet == true" :data-wip="server == null">
+				<template v-if="server != null">
+					<template v-if="server">%fa:check%</template>
+					<template v-if="!server">%fa:times%</template>
+				</template>
+				{{ server == null ? '%i18n:!@checking-server%' : '%i18n:!@server%' }}<mk-ellipsis v-if="server == null"/>
+			</p>
+		</div>
+		<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
+		<p v-if="network === false"><b>%fa:exclamation-triangle%%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
+		<p v-if="internet === false"><b>%fa:exclamation-triangle%%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
+		<p v-if="server === false"><b>%fa:exclamation-triangle%%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
+		<p v-if="server === true" class="success"><b>%fa:info-circle%%i18n:@success%</b><br>%i18n:@success-desc%</p>
 	</div>
-	<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
-	<p v-if="network === false"><b>%fa:exclamation-triangle%%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
-	<p v-if="internet === false"><b>%fa:exclamation-triangle%%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
-	<p v-if="server === false"><b>%fa:exclamation-triangle%%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
-	<p v-if="server === true" class="success"><b>%fa:info-circle%%i18n:@success%</b><br>%i18n:@success-desc%</p>
+	<footer>
+		<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
+	</footer>
 </div>
 </template>
 
@@ -77,61 +82,62 @@ export default Vue.extend({
 
 <style lang="stylus" scoped>
 .troubleshooter
-	width 100%
-	max-width 500px
-	text-align left
-	background #fff
-	border-radius 8px
-	border solid 1px #ddd
+	> .body
+		width 100%
+		max-width 500px
+		text-align left
+		background #fff
+		border-radius 8px
+		border solid 1px #ddd
 
-	> h1
-		margin 0
-		padding 0.6em 1.2em
-		font-size 1em
-		color #444
-		border-bottom solid 1px #eee
+		> h1
+			margin 0
+			padding 0.6em 1.2em
+			font-size 1em
+			color #444
+			border-bottom solid 1px #eee
 
-		> [data-fa]
-			margin-right 0.25em
+			> [data-fa]
+				margin-right 0.25em
 
-	> div
-		overflow hidden
-		padding 0.6em 1.2em
+		> div
+			overflow hidden
+			padding 0.6em 1.2em
+
+			> p
+				margin 0.5em 0
+				font-size 0.9em
+				color #444
+
+				&[data-wip]
+					color #888
+
+				> [data-fa]
+					margin-right 0.25em
+
+					&.times
+						color #e03524
+
+					&.check
+						color #84c32f
 
 		> p
-			margin 0.5em 0
-			font-size 0.9em
+			margin 0
+			padding 0.7em 1.2em
+			font-size 1em
 			color #444
+			border-top solid 1px #eee
 
-			&[data-wip]
-				color #888
-
-			> [data-fa]
-				margin-right 0.25em
-
-				&.times
-					color #e03524
-
-				&.check
-					color #84c32f
-
-	> p
-		margin 0
-		padding 0.7em 1.2em
-		font-size 1em
-		color #444
-		border-top solid 1px #eee
-
-		> b
-			> [data-fa]
-				margin-right 0.25em
-
-		&.success
 			> b
-				color #39adad
+				> [data-fa]
+					margin-right 0.25em
 
-		&:not(.success)
-			> b
-				color #ad4339
+			&.success
+				> b
+					color #39adad
+
+			&:not(.success)
+				> b
+					color #ad4339
 
 </style>
diff --git a/src/client/assets/flush.html b/src/client/assets/flush.html
new file mode 100644
index 0000000000..d43600157a
--- /dev/null
+++ b/src/client/assets/flush.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+
+<html>
+	<head>
+		<meta charset="utf-8">
+		<title>Misskeyのリカバリ</title>
+		<script>
+			const yn = window.confirm('キャッシュをクリアしますか?\n\nDo you want to clear caches?');
+			if (yn) {
+				localStorage.setItem('shouldFlush', 'true');
+			}
+
+			location.href = '/';
+		</script>
+	</head>
+</html>
diff --git a/src/client/assets/recover.html b/src/client/assets/recover.html
deleted file mode 100644
index b1889c72e6..0000000000
--- a/src/client/assets/recover.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-	<head>
-		<meta charset="utf-8">
-		<title>Misskeyのリカバリ</title>
-		<script>
-			const yn = window.confirm('キャッシュをクリアしますか?(他のタブでMisskeyを開いている状態だと正常にクリアできないので、他のMisskeyのタブをすべて閉じてから行ってください)\n\nDo you want to clear caches? (Please close all other Misskey tabs before clear cache)');
-			if (yn) {
-				try {
-					navigator.serviceWorker.controller.postMessage('clear');
-					navigator.serviceWorker.getRegistrations().then(registrations => {
-						registrations.forEach(registration => registration.unregister());
-					});
-				} catch (e) {
-					console.error(e);
-				}
-				alert('キャッシュをクリアしました。\n\ncache cleared.');
-				alert('まもなくページを再度読み込みします。再度読み込みが終わると、再度キャッシュをクリアするか尋ねられるので、「キャンセル」を選択して抜けてください。\n\nWe will reload the page shortly. After that, you are asked whether you want to clear the cache again, so please select "Cancel" and exit.');
-				setTimeout(() => {
-					location.reload(true);
-				}, 100);
-			} else {
-				location.href = '/';
-			}
-		</script>
-	</head>
-</html>