Feat: show colors by pressing words

This commit is contained in:
Grail Finder
2025-05-02 15:21:28 +03:00
parent 8b768f919b
commit 322743e33d
6 changed files with 48 additions and 33 deletions

13
components/cardword.html Normal file
View File

@ -0,0 +1,13 @@
{{define "cardword"}}
<div id="card-%s" style="
background-color: {{.Color}};
padding: 1rem;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
min-width: 100px;
text-align: center;
color: white;
text-shadow: 0 2px 4px rgba(0,0,0,0.8);
cursor: pointer;"> {{.Word}}
</div>
{{end}}

View File

@ -49,7 +49,7 @@
<h1>Word Color Cards</h1> <h1>Word Color Cards</h1>
<div style="display: flex; gap: 1rem; flex-wrap: wrap; padding: 1rem;"> <div style="display: flex; gap: 1rem; flex-wrap: wrap; padding: 1rem;">
{{range $word, $color := .}} {{range $word, $color := .}}
<div style=" <div id="card-{{$word}}" class="slide-it" style="
background-color: beige; background-color: beige;
padding: 1rem; padding: 1rem;
border-radius: 8px; border-radius: 8px;
@ -58,8 +58,8 @@
text-align: center; text-align: center;
color: white; color: white;
text-shadow: 0 2px 4px rgba(0,0,0,0.8); text-shadow: 0 2px 4px rgba(0,0,0,0.8);
cursor: pointer; cursor: pointer;"
" hx-get="/show-color?word={{$word}}" hx-trigger="click" hx-swap="outerHTML"> hx-get="/word/show-color?word={{$word}}" hx-trigger="click" hx-swap="outerHTML transition:true swap:.2s">
{{$word}} {{$word}}
</div> </div>
{{end}} {{end}}

View File

@ -1,6 +1,7 @@
package handlers package handlers
import ( import (
"golias/models"
"html/template" "html/template"
"net/http" "net/http"
) )
@ -24,3 +25,24 @@ func HandleHideCreateForm(w http.ResponseWriter, r *http.Request) {
} }
tmpl.ExecuteTemplate(w, "createform", show) tmpl.ExecuteTemplate(w, "createform", show)
} }
func HandleShowColor(w http.ResponseWriter, r *http.Request) {
word := r.URL.Query().Get("word")
color, exists := roundWords[word]
log.Debug("got show-color request", "word", word, "color", color)
if !exists {
abortWithError(w, "word is not found")
return
}
tmpl, err := template.ParseGlob("components/*.html")
if err != nil {
abortWithError(w, err.Error())
return
}
cardword := models.WordCard{
Word: word,
Color: models.StrToWordColor(color),
Revealed: true,
}
tmpl.ExecuteTemplate(w, "cardword", cardword)
}

View File

@ -36,29 +36,6 @@ func HandlePing(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("pong")) w.Write([]byte("pong"))
} }
func HandleShowColor(w http.ResponseWriter, r *http.Request) {
word := r.URL.Query().Get("word")
color, exists := roundWords[word]
if !exists {
http.Error(w, "word not found", http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "text/html")
w.Write([]byte(
fmt.Sprintf(`<div style="
background-color: %s;
padding: 1rem;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
min-width: 100px;
text-align: center;
color: white;
text-shadow: 0 2px 4px rgba(0,0,0,0.8);
cursor: pointer;
">%s</div>`, color, word)))
}
func HandleHome(w http.ResponseWriter, r *http.Request) { func HandleHome(w http.ResponseWriter, r *http.Request) {
tmpl, err := template.ParseGlob("components/*.html") tmpl, err := template.ParseGlob("components/*.html")
if err != nil { if err != nil {

View File

@ -16,16 +16,16 @@ func ListenToRequests(port string) error {
ReadTimeout: time.Second * 5, ReadTimeout: time.Second * 5,
WriteTimeout: time.Second * 5, WriteTimeout: time.Second * 5,
} }
fs := http.FileServer(http.Dir("assets/")) fs := http.FileServer(http.Dir("assets/"))
mux.Handle("GET /assets/", http.StripPrefix("/assets/", fs)) mux.Handle("GET /assets/", http.StripPrefix("/assets/", fs))
//
mux.HandleFunc("GET /ping", handlers.HandlePing) mux.HandleFunc("GET /ping", handlers.HandlePing)
mux.HandleFunc("GET /", handlers.HandleHome) mux.HandleFunc("GET /", handlers.HandleHome)
mux.HandleFunc("POST /login", handlers.HandleFrontLogin) mux.HandleFunc("POST /login", handlers.HandleFrontLogin)
//elements //elements
mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm) mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm)
mux.HandleFunc("GET /room/hideform", handlers.HandleHideCreateForm) mux.HandleFunc("GET /room/hideform", handlers.HandleHideCreateForm)
mux.HandleFunc("GET /word/show-color", handlers.HandleShowColor)
slog.Info("Listening", "addr", port) slog.Info("Listening", "addr", port)
return server.ListenAndServe() return server.ListenAndServe()
} }

View File

@ -5,10 +5,11 @@ import "time"
type WordColor string type WordColor string
const ( const (
WordColorWhite = "white" WordColorWhite = "white"
WordColorBlue = "blue" WordColorBlue = "blue"
WordColorRed = "red" WordColorRed = "red"
WordColorBlack = "black" WordColorBlack = "black"
WordColorUknown = "beige"
) )
func StrToWordColor(s string) WordColor { func StrToWordColor(s string) WordColor {
@ -22,7 +23,7 @@ func StrToWordColor(s string) WordColor {
case "black": case "black":
return WordColorBlack return WordColorBlack
default: default:
return "beige" return WordColorUknown
} }
} }
@ -34,6 +35,7 @@ type Room struct {
RoomLink string RoomLink string
CreatorName string `json:"creator_name"` CreatorName string `json:"creator_name"`
PlayerList []string `json:"player_list"` PlayerList []string `json:"player_list"`
TeamTurn string
RedMime string RedMime string
BlueMime string BlueMime string
RedGuessers []string RedGuessers []string
@ -56,6 +58,7 @@ type RoomPublic struct {
CreatorName string `json:"creator_name"` CreatorName string `json:"creator_name"`
GameSettings *GameSettings `json:"settings"` GameSettings *GameSettings `json:"settings"`
RedMime string RedMime string
TeamTurn string
BlueMime string BlueMime string
RedGuessers []string RedGuessers []string
BlueGuessers []string BlueGuessers []string