media query theme (#139)

* feat: use css media query to derive theme

* fix: rename alt for toggle images

* feat: remove no-cache middleware
This commit is contained in:
httpjamesm 2024-06-20 00:18:22 -04:00 committed by GitHub
parent b0ae8a50b5
commit e409176642
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 17 additions and 77 deletions

View File

@ -35,7 +35,6 @@ func main() {
r.Use(gin.Recovery())
r.Use(middleware.XssPreventionHeaders())
r.Use(middleware.NoCacheMiddleware())
r.Use(middleware.OptionsMiddleware())
r.Use(middleware.Ratelimit())

View File

@ -11,7 +11,8 @@
--link-color: #92adff;
}
[data-theme='light'] {
@media (prefers-color-scheme: light) {
:root {
--main-bg: #dbdbdb;
--text-color: #000;
--muted-text-color: #636363;
@ -22,6 +23,7 @@
--meta-bg: #aaa8a8;
--divider-color: #b5b5b5;
--link-color: #335ad0;
}
}
a {

View File

@ -1,12 +0,0 @@
package middleware
import "github.com/gin-gonic/gin"
func NoCacheMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("Cache-Control", "no-cache, no-store, must-revalidate")
c.Header("Pragma", "no-cache")
c.Header("Expires", "0")
c.Next()
}
}

View File

@ -7,7 +7,6 @@ import (
func OptionsMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.Set("disable_images", false)
c.Set("theme", "dark")
imagesCookie, err := c.Cookie("disable_images")
if err == nil {
@ -16,13 +15,6 @@ func OptionsMiddleware() gin.HandlerFunc {
}
}
themeCookie, err := c.Cookie("theme")
if err == nil {
if themeCookie == "light" {
c.Set("theme", "light")
}
}
c.Next()
}
}

View File

@ -47,7 +47,6 @@ func Ratelimit() gin.HandlerFunc {
if val.(int) > 30 {
c.HTML(429, "home.html", gin.H{
"errorMessage": "You have exceeded the request limit. Please try again in a minute.",
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
c.Abort()

View File

@ -12,7 +12,6 @@ import (
func GetHome(c *gin.Context) {
c.HTML(200, "home.html", gin.H{
"version": config.Version,
"theme": c.MustGet("theme").(string),
})
}
@ -62,7 +61,6 @@ func PostHome(c *gin.Context) {
if err := c.ShouldBind(&body); err != nil {
c.HTML(400, "home.html", gin.H{
"errorMessage": "Invalid request body",
"theme": c.MustGet("theme").(string),
})
return
}
@ -72,7 +70,6 @@ func PostHome(c *gin.Context) {
if translated == "" {
c.HTML(400, "home.html", gin.H{
"errorMessage": "Invalid stack overflow/exchange URL",
"theme": c.MustGet("theme").(string),
})
return
}

View File

@ -3,8 +3,6 @@ package routes
import (
"anonymousoverflow/config"
"fmt"
"os"
"strings"
"github.com/gin-gonic/gin"
)
@ -21,26 +19,8 @@ func ChangeOptions(c *gin.Context) {
c.SetCookie("disable_images", fmt.Sprintf("%t", !c.MustGet("disable_images").(bool)), 60*60*24*365*10, "/", "", false, true)
c.HTML(200, "home.html", gin.H{
"successMessage": "Images are now " + text,
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
case "theme":
text := "dark"
if c.MustGet("theme").(string) == "dark" {
text = "light"
}
c.SetCookie("theme", text, 60*60*24*365*10, "/", "", false, true)
// get redirect url from query
redirectUrl := c.Query("redirect_url")
if !strings.HasPrefix(redirectUrl, os.Getenv("APP_URL")) {
redirectUrl = os.Getenv("APP_URL")
}
c.Redirect(302, redirectUrl)
default:
c.String(400, "400 Bad Request")
}

View File

@ -34,7 +34,6 @@ func ViewQuestion(c *gin.Context) {
if _, err := strconv.Atoi(questionId); err != nil {
c.HTML(400, "home.html", gin.H{
"errorMessage": "Invalid question ID",
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
return
@ -60,7 +59,6 @@ func ViewQuestion(c *gin.Context) {
if resp.StatusCode() != 200 {
c.HTML(500, "home.html", gin.H{
"errorMessage": fmt.Sprintf("Received a non-OK status code %d", resp.StatusCode()),
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
return
@ -74,7 +72,6 @@ func ViewQuestion(c *gin.Context) {
if err != nil {
c.HTML(500, "home.html", gin.H{
"errorMessage": "Unable to parse question data",
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
return
@ -84,7 +81,6 @@ func ViewQuestion(c *gin.Context) {
if err != nil {
c.HTML(500, "home.html", gin.H{
"errorMessage": "Failed to extract question data",
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
return
@ -94,7 +90,6 @@ func ViewQuestion(c *gin.Context) {
if err != nil {
c.HTML(500, "home.html", gin.H{
"errorMessage": "Failed to extract answer data",
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
return
@ -110,7 +105,6 @@ func ViewQuestion(c *gin.Context) {
"question": newFilteredQuestion,
"answers": answers,
"imagePolicy": imagePolicy,
"theme": c.MustGet("theme").(string),
"currentUrl": fmt.Sprintf("%s%s", os.Getenv("APP_URL"), c.Request.URL.Path),
"sortValue": params.SoSortValue,
"domain": domain,
@ -132,7 +126,6 @@ func parseAndValidateParameters(c *gin.Context) (inputs viewQuestionInputs, err
if _, err = strconv.Atoi(questionId); err != nil {
c.HTML(400, "home.html", gin.H{
"errorMessage": "Invalid question ID",
"theme": c.MustGet("theme").(string),
"version": config.Version,
})
return

View File

@ -33,7 +33,6 @@ func RedirectShortenedOverflowURL(c *gin.Context) {
if err != nil {
c.HTML(400, "home.html", gin.H{
"errorMessage": "Unable to fetch stack overflow URL",
"theme": c.MustGet("theme").(string),
})
return
}
@ -41,7 +40,6 @@ func RedirectShortenedOverflowURL(c *gin.Context) {
if resp.StatusCode() != 302 {
c.HTML(400, "home.html", gin.H{
"errorMessage": fmt.Sprintf("Unexpected HTTP status from origin: %d", resp.StatusCode()),
"theme": c.MustGet("theme").(string),
})
return
}

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html data-theme="{{ .theme }}">
<html>
<head>
<title>AnonymousOverflow - Private frontend for StackOverflow</title>
@ -43,10 +43,9 @@
<div class="options">
<div class="icon">
<a href="/options/images">
<img src="/static/icons/image.svg" alt="Toggle theme" />
<img src="/static/icons/image.svg" alt="Toggle images" />
</a>
</div>
{{ template "themeSwitcher.html" .}}
</div>
<p class="footer">
Brought to you by

View File

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html data-theme="{{ .theme }}">
<html>
<head>
<title>{{ .question.Title }} | AnonymousOverflow</title>
@ -25,7 +25,6 @@
<a href="/" class="logo-link">
<img class="logo" src="/static/codecircles.webp" alt="AnonymousOverflow home" />
</a>
{{ template "themeSwitcher.html" . }}
</div>
<div class="card">
<div class="card-header">

View File

@ -1,6 +0,0 @@
<div class="icon">
<a href="/options/theme?redirect_url={{ .currentUrl }}">
<img src="/static/icons/{{ if eq .theme "dark" }}sun{{
else }}moon{{ end }}.svg" alt="Toggle theme" />
</a>
</div>