diff --git a/internal/webserver/response_helpers.go b/internal/webserver/response_helpers.go index a5c08e4..e49207c 100644 --- a/internal/webserver/response_helpers.go +++ b/internal/webserver/response_helpers.go @@ -34,5 +34,17 @@ func (app *Application) error_500(w http.ResponseWriter, err error) { if err2 != nil { panic(err2) } - http.Error(w, "Server error :(", 500) + + w.Header().Set("HX-Reswap", "beforeend") + w.Header().Set("HX-Retarget", "main") + w.Header().Set("HX-Push-Url", "false") + + r := renderer{ + Filenames: []string{get_filepath("tpl/http_500.tpl")}, + TplName: "error-toast", + Data: struct{ + ErrorMsg string + }{err.Error()}, + } + r.BufferedRender(w) } diff --git a/internal/webserver/static/icons/spinner.svg b/internal/webserver/static/icons/spinner.svg new file mode 100644 index 0000000..a6eede6 --- /dev/null +++ b/internal/webserver/static/icons/spinner.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/internal/webserver/static/styles.css b/internal/webserver/static/styles.css index 5102dc4..a04bb72 100644 --- a/internal/webserver/static/styles.css +++ b/internal/webserver/static/styles.css @@ -51,6 +51,28 @@ input, select { border-radius: 0.5em; } +.server-error-msg { + position: fixed; + margin: 6em 0; + left: 0; + top: 0; + z-index: 1; + width: 100%; + box-sizing: border-box; + display: flex; + flex-direction: row; + justify-content: center; +} +.server-error-msg .error-msg-container { + width: 30%; + background-color: #fee; + border: 1px solid red; + border-radius: 1em; + padding: 1em; + color: red; + text-align: center; +} + ul.inline-dotted-list { list-style: none; margin: 0; @@ -67,10 +89,39 @@ ul.inline-dotted-list li:last-child:after { .tweet { padding: 0 1.5em; + position: relative; } :not(#focused-tweet) > .tweet { cursor: pointer; } +.htmx-spinner-container { + display: none; +} +.tweet.htmx-request .htmx-spinner-container { + display: revert; + font-size: 3em; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.tweet .htmx-spinner-container .htmx-spinner-background { + opacity: 0.3; + background-color: #7cc5f6; + width: 100%; + height: 100%; +} +.tweet .htmx-spinner-container .htmx-spinner { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%,-50%); + + /* https://codepen.io/sosuke/pen/Pjoqqp */ + filter: invert(54%) sepia(17%) saturate(4210%) hue-rotate(176deg) brightness(89%) contrast(98%); +} .quoted-tweet { margin: 1em 0; diff --git a/internal/webserver/tpl/http_500.tpl b/internal/webserver/tpl/http_500.tpl new file mode 100644 index 0000000..acfb5e3 --- /dev/null +++ b/internal/webserver/tpl/http_500.tpl @@ -0,0 +1,8 @@ +{{define "error-toast"}} +
+
+ {{.ErrorMsg}} + +
+
+{{end}} diff --git a/internal/webserver/tpl/tweet_page_includes/single_tweet.tpl b/internal/webserver/tpl/tweet_page_includes/single_tweet.tpl index acbcf1e..230afac 100644 --- a/internal/webserver/tpl/tweet_page_includes/single_tweet.tpl +++ b/internal/webserver/tpl/tweet_page_includes/single_tweet.tpl @@ -150,5 +150,9 @@ +
+
+ +
{{end}}