From 40656e3ee2ece0df754bad612f92449f40c43e1d Mon Sep 17 00:00:00 2001
From: Kainoa Kanter <44733677+ThatOneCalculator@users.noreply.github.com>
Date: Tue, 5 Jul 2022 01:44:05 -0700
Subject: [PATCH] feat: styled error screen (#8930)

* Styled error screen

* Make details margin auto

* Update boot.css

* Replace fontawesome with tabler svg

* Remove hr

* Add new style to flush screen

* Rename to `error.css`
---
 packages/backend/src/server/web/boot.js       | 43 ++++++--
 packages/backend/src/server/web/error.css     | 98 +++++++++++++++++++
 .../backend/src/server/web/views/base.pug     |  2 +-
 .../backend/src/server/web/views/flush.pug    |  6 ++
 4 files changed, 138 insertions(+), 11 deletions(-)
 create mode 100644 packages/backend/src/server/web/error.css

diff --git a/packages/backend/src/server/web/boot.js b/packages/backend/src/server/web/boot.js
index 9fc536555a..124f25f5e8 100644
--- a/packages/backend/src/server/web/boot.js
+++ b/packages/backend/src/server/web/boot.js
@@ -106,15 +106,39 @@
 	function renderError(code, details) {
 		let errorsElement = document.getElementById('errors');
 		if (!errorsElement) {
+			document.getElementsByTagName("head")[0].insertAdjacentHTML(
+				"beforeend",
+				`<link rel="stylesheet" href="../error.css" />`);
 			document.documentElement.innerHTML = `
-			<h1>⚠ An error has occurred. ⚠</h1>
-			<p>If the problem persists, please contact the administrator. You may also try the following options:</p>
-			<ul>
-				<li>Start <a href="/cli">the simple client</a></li>
-				<li>Attempt to repair in <a href="/bios">BIOS</a></li>
-				<li><a href="/flush">Flush preferences and cache</a></li>
-			</ul>
-			<hr>
+			<svg class="icon-warning" xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-alert-triangle" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
+   			<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
+   			<path d="M12 9v2m0 4v.01"></path>
+   			<path d="M5 19h14a2 2 0 0 0 1.84 -2.75l-7.1 -12.25a2 2 0 0 0 -3.5 0l-7.1 12.25a2 2 0 0 0 1.75 2.75"></path>
+			</svg>
+			<h1>An error has occurred!</h1>
+			<button class="button-big" onclick="location.reload(true);">
+				<span class="button-label-big">Refresh</span>
+			</button>
+      <p class="dont-worry">Don't worry, it's (probably) not your fault.</p>
+			<p>If the problem persists after refreshing, please contact your instance's administrator.<br>You may also try the following options:</p>
+      <a href="/flush">
+      <button class="button-small">
+        <span class="button-label-small">Flush preferences and cache</span>
+      </button>
+      </a>
+			<br>
+      <a href="/cli">
+        <button class="button-small">
+          <span class="button-label-small">Start the simple client</span>
+        </button>
+      </a>
+			<br>
+      <a href="/bios">
+        <button class="button-small">
+          <span class="button-label-small">Attempt to repair in BIOS</span>
+        </button>
+      </a>
+			<br>
 			<div id="errors"></div>
 			`;
 
@@ -122,8 +146,7 @@
 		}
 
 		const detailsElement = document.createElement('details');
-		detailsElement.innerHTML = `<summary><code>ERROR CODE: ${code}</code></summary>${JSON.stringify(details)}`;
-
+		detailsElement.innerHTML = `<br><summary><code>ERROR CODE: ${code}</code></summary>${JSON.stringify(details)}`;
 		errorsElement.appendChild(detailsElement);
 	}
 
diff --git a/packages/backend/src/server/web/error.css b/packages/backend/src/server/web/error.css
new file mode 100644
index 0000000000..9f8f905017
--- /dev/null
+++ b/packages/backend/src/server/web/error.css
@@ -0,0 +1,98 @@
+* {
+	font-family: BIZ UDGothic, Roboto, HelveticaNeue, Arial, sans-serif;
+}
+
+body,
+html {
+	background-color: #222;
+	color: #dfddcc;
+	justify-content: center;
+	margin: auto;
+	width: 80%;
+	padding: 10px;
+	text-align: center;
+}
+
+button {
+	border-radius: 999px;
+	padding: 0px 12px 0px 12px;
+	border: none;
+	cursor: pointer;
+	margin-bottom: 12px;
+}
+
+.button-big {
+	background: linear-gradient(90deg, rgb(134, 179, 0), rgb(74, 179, 0));
+	line-height: 50px;
+}
+
+.button-big:hover {
+	background: rgb(153, 204, 0);
+}
+
+.button-small {
+	background: #444;
+	line-height: 40px;
+}
+
+.button-small:hover {
+	background: #555;
+}
+
+.button-label-big {
+	color: #222;
+	font-weight: bold;
+	font-size: 20px;
+	padding: 12px;
+}
+
+.button-label-small {
+	color: rgb(153, 204, 0);
+	font-size: 16px;
+	padding: 12px;
+}
+
+a {
+	color: rgb(134, 179, 0);
+	text-decoration: none;
+}
+
+p,
+li {
+	font-size: 16px;
+}
+
+.dont-worry,
+#msg {
+	font-size: 18px;
+}
+
+.icon-warning {
+	color: #dec340;
+	height: 4rem;
+}
+
+h1 {
+	font-size: 32px;
+}
+
+code {
+	font-family: Fira, FiraCode, monospace;
+}
+
+details {
+	background: #333;
+	margin-bottom: 2rem;
+	padding: 0.5rem 1rem;
+	border-radius: 5px;
+	justify-content: center;
+	margin: auto;
+}
+
+summary {
+	cursor: pointer;
+}
+
+summary > * {
+	display: inline;
+}
diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug
index 5bb156f0f4..32499aa452 100644
--- a/packages/backend/src/server/web/views/base.pug
+++ b/packages/backend/src/server/web/views/base.pug
@@ -53,7 +53,7 @@ html
 		block meta
 
 		block og
-			meta(property='og:title'       content= title || 'Misskey') 
+			meta(property='og:title'       content= title || 'Misskey')
 			meta(property='og:description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨') 
 			meta(property='og:image'       content= img)
 
diff --git a/packages/backend/src/server/web/views/flush.pug b/packages/backend/src/server/web/views/flush.pug
index ec585a34db..b08f61c73a 100644
--- a/packages/backend/src/server/web/views/flush.pug
+++ b/packages/backend/src/server/web/views/flush.pug
@@ -1,6 +1,12 @@
 doctype html
 
 html
+	head
+		meta(charset='utf-8')
+		meta(name='application-name' content='Misskey')
+		title Flushing Misskey
+		style
+			include ../error.css
 	#msg
 	script.
 		const msg = document.getElementById('msg');