Add theme support using environment variable (#145)

* Add theme support using environment variable

* Propagate theme variable to template in options.go

Propagate the `theme` variable from the environment to the template in `src/routes/options.go`

* Retrieve the `theme` variable from the environment using `os.Getenv("THEME")`
* Set the `theme` variable in the `gin.H` map when rendering the `home.html` template


---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/httpjamesm/AnonymousOverflow/pull/145?shareId=6397c9b4-9450-425c-bbbe-019425965d2b).

* Move all theme environment variable logic to a utils function

Move theme environment variable logic to a utils function and update routes to use it.

* Add `GetThemeFromEnv` function in `src/utils/theme.go` to derive the theme from environment variables and default to "auto" if not set.
* Update `src/routes/home.go` to import and use `GetThemeFromEnv` in the `GetHome` function.
* Update `src/routes/options.go` to import and use `GetThemeFromEnv` in the `ChangeOptions` function.
* Update `src/routes/question.go` to import and use `GetThemeFromEnv` in the `ViewQuestion` function.


---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/httpjamesm/AnonymousOverflow/pull/145?shareId=a0dab6f3-027c-4f6e-85fe-60e7675d0e70).

* fix: imports removed by copilot

* fix: override theme in posthome

* style: reduced repetition in themes with common vars
This commit is contained in:
httpjamesm 2024-07-25 10:50:06 -07:00 committed by GitHub
parent e35ffdcc07
commit 4c971f3121
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 44 additions and 9 deletions

View File

@ -1,9 +1,13 @@
:root { :root {
--code-bg: #36383d;
--code-fg: #ffffff;
}
:root,
[data-theme="dark"] {
--main-bg: #1b1f26; --main-bg: #1b1f26;
--text-color: #fff; --text-color: #fff;
--muted-text-color: #b3b3b3; --muted-text-color: #b3b3b3;
--code-bg: #36383d;
--code-fg: #ffffff;
--input-bg: #2b303b; --input-bg: #2b303b;
--input-bg-hover: #3b404b; --input-bg-hover: #3b404b;
--meta-bg: #525262; --meta-bg: #525262;
@ -12,12 +16,10 @@
} }
@media (prefers-color-scheme: light) { @media (prefers-color-scheme: light) {
:root { :root:not([data-theme="dark"]) {
--main-bg: #dbdbdb; --main-bg: #dbdbdb;
--text-color: #000; --text-color: #000;
--muted-text-color: #636363; --muted-text-color: #636363;
--code-bg: #36383d;
--code-fg: #ffffff;
--input-bg: #bcbcbc; --input-bg: #bcbcbc;
--input-bg-hover: #a8a8a8; --input-bg-hover: #a8a8a8;
--meta-bg: #aaa8a8; --meta-bg: #aaa8a8;
@ -26,6 +28,17 @@
} }
} }
[data-theme="light"] {
--main-bg: #dbdbdb;
--text-color: #000;
--muted-text-color: #636363;
--input-bg: #bcbcbc;
--input-bg-hover: #a8a8a8;
--meta-bg: #aaa8a8;
--divider-color: #b5b5b5;
--link-color: #335ad0;
}
a { a {
color: var(--link-color); color: var(--link-color);
} }

View File

@ -2,6 +2,7 @@ package routes
import ( import (
"anonymousoverflow/config" "anonymousoverflow/config"
"anonymousoverflow/src/utils"
"fmt" "fmt"
"regexp" "regexp"
"strings" "strings"
@ -10,8 +11,10 @@ import (
) )
func GetHome(c *gin.Context) { func GetHome(c *gin.Context) {
theme := utils.GetThemeFromEnv()
c.HTML(200, "home.html", gin.H{ c.HTML(200, "home.html", gin.H{
"version": config.Version, "version": config.Version,
"theme": theme,
}) })
} }
@ -68,8 +71,10 @@ func PostHome(c *gin.Context) {
translated := translateUrl(body.URL) translated := translateUrl(body.URL)
if translated == "" { if translated == "" {
theme := utils.GetThemeFromEnv()
c.HTML(400, "home.html", gin.H{ c.HTML(400, "home.html", gin.H{
"errorMessage": "Invalid stack overflow/exchange URL", "errorMessage": "Invalid stack overflow/exchange URL",
"theme": theme,
}) })
return return
} }

View File

@ -2,6 +2,7 @@ package routes
import ( import (
"anonymousoverflow/config" "anonymousoverflow/config"
"anonymousoverflow/src/utils"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -17,9 +18,11 @@ func ChangeOptions(c *gin.Context) {
text = "enabled" text = "enabled"
} }
c.SetCookie("disable_images", fmt.Sprintf("%t", !c.MustGet("disable_images").(bool)), 60*60*24*365*10, "/", "", false, true) c.SetCookie("disable_images", fmt.Sprintf("%t", !c.MustGet("disable_images").(bool)), 60*60*24*365*10, "/", "", false, true)
theme := utils.GetThemeFromEnv()
c.HTML(200, "home.html", gin.H{ c.HTML(200, "home.html", gin.H{
"successMessage": "Images are now " + text, "successMessage": "Images are now " + text,
"version": config.Version, "version": config.Version,
"theme": theme,
}) })
default: default:
c.String(400, "400 Bad Request") c.String(400, "400 Bad Request")

View File

@ -101,6 +101,8 @@ func ViewQuestion(c *gin.Context) {
imagePolicy = "'self'" imagePolicy = "'self'"
} }
theme := utils.GetThemeFromEnv()
c.HTML(200, "question.html", gin.H{ c.HTML(200, "question.html", gin.H{
"question": newFilteredQuestion, "question": newFilteredQuestion,
"answers": answers, "answers": answers,
@ -108,6 +110,7 @@ func ViewQuestion(c *gin.Context) {
"currentUrl": fmt.Sprintf("%s%s", os.Getenv("APP_URL"), c.Request.URL.Path), "currentUrl": fmt.Sprintf("%s%s", os.Getenv("APP_URL"), c.Request.URL.Path),
"sortValue": params.SoSortValue, "sortValue": params.SoSortValue,
"domain": domain, "domain": domain,
"theme": theme,
}) })
} }

11
src/utils/theme.go Normal file
View File

@ -0,0 +1,11 @@
package utils
import "os"
func GetThemeFromEnv() string {
theme := os.Getenv("THEME")
if theme == "" {
theme = "auto"
}
return theme
}

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html data-theme="{{ .theme }}">
<head> <head>
<title>AnonymousOverflow - Private frontend for StackOverflow</title> <title>AnonymousOverflow - Private frontend for StackOverflow</title>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html data-theme="{{ .theme }}">
<head> <head>
<title>{{ .question.Title }} | AnonymousOverflow</title> <title>{{ .question.Title }} | AnonymousOverflow</title>