From be010233e0e8cd67085af78f4c3b4d82969bba64 Mon Sep 17 00:00:00 2001 From: Luke Date: Sat, 6 Jul 2024 02:20:13 -0400 Subject: [PATCH] feat(server/web): error display pages --- internal/server/fetch.go | 2 +- internal/server/web/error.html | 76 +++++++++++++++++++++++++++ internal/server/web/static/global.css | 22 ++++++++ internal/util/helpers.go | 24 +++++++++ 4 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 internal/server/web/error.html diff --git a/internal/server/fetch.go b/internal/server/fetch.go index eaaeb203..05e5e348 100644 --- a/internal/server/fetch.go +++ b/internal/server/fetch.go @@ -57,7 +57,7 @@ func (s *Server) StaticDocument(w http.ResponseWriter, r *http.Request) { // Validate document ID if len(id) != s.Config.IDLength && !slices.Contains(s.Config.Documents, id) { err := fmt.Errorf("id is of length %d, should be %d", len(id), s.Config.IDLength) - util.WriteError(w, http.StatusBadRequest, err) + util.RenderError(&resources, w, http.StatusBadRequest, err) return } diff --git a/internal/server/web/error.html b/internal/server/web/error.html new file mode 100644 index 00000000..99888dbc --- /dev/null +++ b/internal/server/web/error.html @@ -0,0 +1,76 @@ + + + + + + + + + Spacebin + + + + + + + + + + + + + + +
+ Spacebin Logo + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+

+ + + + + + {{.Status}} +

+

{{.Error}}

+
+ + + + + diff --git a/internal/server/web/static/global.css b/internal/server/web/static/global.css index 3d809c72..07a5d3ff 100644 --- a/internal/server/web/static/global.css +++ b/internal/server/web/static/global.css @@ -44,6 +44,11 @@ textarea { display: inline; } +textarea:hover, textarea:focus { + outline: none; + border: none; +} + header { padding: 3px 9px; margin: 0; @@ -100,3 +105,20 @@ img { max-width: 24px; height: auto; } + +h1 { + font-size: 1.25rem; /* 20px */ + line-height: 1.75rem; /* 28px */ + margin-bottom: 5px; + padding: 0; +} + +#error { + display: inline-flex; + align-items: center; + gap: 10px; +} + +#warning { + color: #F97583; +} diff --git a/internal/util/helpers.go b/internal/util/helpers.go index 5a1796bd..ee35e428 100644 --- a/internal/util/helpers.go +++ b/internal/util/helpers.go @@ -17,6 +17,7 @@ package util import ( + "embed" "encoding/json" "fmt" "html/template" @@ -105,3 +106,26 @@ func WriteError(w http.ResponseWriter, status int, e error) error { return nil } + +// RenderError renders errors to the client using an HTML template. +func RenderError(r *embed.FS, w http.ResponseWriter, status int, err error) error { + tmpl := template.Must(template.ParseFS(r, "web/error.html")) + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(status) + + data := struct { + Status string + Error string + }{ + Status: strings.Join([]string{fmt.Sprintf("%d", status), http.StatusText(status)}, " "), + Error: err.Error(), + } + + err = tmpl.Execute(w, data) + if err != nil { + return err + } + + return nil +}