From eca001e57f444372589d35196dab29ab22f09afb Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Wed, 7 Aug 2024 16:59:51 +0200 Subject: Set a theme cookie --- middleware/pipe.go | 14 ++++++++++++++ middleware/theme.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 middleware/pipe.go create mode 100644 middleware/theme.go (limited to 'middleware') diff --git a/middleware/pipe.go b/middleware/pipe.go new file mode 100644 index 0000000..4b5064d --- /dev/null +++ b/middleware/pipe.go @@ -0,0 +1,14 @@ +package middleware + +import "net/http" + +type Middleware func(http.Handler) http.Handler + +func Pipe(xs ...Middleware) Middleware { + return func(next http.Handler) http.Handler { + for i := len(xs) - 1; i >= 0; i-- { + next = xs[i](next) + } + return next + } +} diff --git a/middleware/theme.go b/middleware/theme.go new file mode 100644 index 0000000..4f14c97 --- /dev/null +++ b/middleware/theme.go @@ -0,0 +1,42 @@ +package middleware + +import ( + "cmp" + "context" + "math" + "net/http" +) + +const defaultTheme = "dark" + +func Theme(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var userTheme string + + /* Grab the ‘theme’ cookie to figure out what the users current + theme is and add it to the context. If the user doesn’t yet + have a theme cookie or the cookie they have contains an + invalid theme then we fallback to the default theme and + (re)set the cookie. */ + + c, err := r.Cookie("theme") + if err == nil { + switch c.Value { + case "dark", "light": + userTheme = c.Value + } + } + + theme := cmp.Or(userTheme, defaultTheme) + if userTheme == "" { + http.SetCookie(w, &http.Cookie{ + Name: "theme", + Value: theme, + MaxAge: math.MaxInt32, + }) + } + + ctx := context.WithValue(r.Context(), "theme", theme) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} -- cgit v1.2.3