142 lines
3.8 KiB
Go
142 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"html/template"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// PageData holds data to be rendered in templates
|
|
type PageData struct {
|
|
Title string
|
|
Page string // Used by index.html to decide which template to include on full load
|
|
Time string
|
|
}
|
|
|
|
// Global template variable
|
|
var tmpl *template.Template
|
|
|
|
func main() {
|
|
// 1. Parse Templates
|
|
// standard lib 'Must' panics if parsing fails (good for startup)
|
|
tmpl = template.Must(template.ParseGlob("public/templates/*.html"))
|
|
tmpl = template.Must(tmpl.ParseGlob("public/templates/*/*.html"))
|
|
|
|
// 2. Setup Router (Go 1.22+ Standard Library Mux)
|
|
mux := http.NewServeMux()
|
|
|
|
// 3. Static Files
|
|
// "GET /static/" matches any path starting with /static/
|
|
fileServer := http.FileServer(http.Dir("./public/assets"))
|
|
mux.Handle("GET /public/assets/", http.StripPrefix("/public/assets/", fileServer))
|
|
|
|
// 4. Routes
|
|
mux.HandleFunc("GET /", homeHandler)
|
|
mux.HandleFunc("GET /explore", exploreHandler)
|
|
mux.HandleFunc("GET /songon", songonHandler)
|
|
mux.HandleFunc("GET /deposer-annonce", deposerAnnonceHandler)
|
|
mux.HandleFunc("GET /inscription", inscriptionHandler)
|
|
mux.HandleFunc("GET /contact", contactHandler)
|
|
|
|
// Example POST to show HTMX form handling
|
|
mux.HandleFunc("POST /contact", contactPostHandler)
|
|
|
|
log.Println("Starting server on :8080")
|
|
if err := http.ListenAndServe(":8080", mux); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
// Helper function to render pages with "If Else" logic for HTMX
|
|
func render(w http.ResponseWriter, r *http.Request, pageName string, data PageData) {
|
|
// Check if request is from HTMX
|
|
isHtmx := r.Header.Get("HX-Request") == "true"
|
|
|
|
// Ensure the Page field is set for the layout to use
|
|
data.Page = pageName
|
|
|
|
if isHtmx {
|
|
// IF HTMX: Render only the partial (e.g., "home", "songon")
|
|
// We set the content type slightly differently usually, but HTML is fine.
|
|
err := tmpl.ExecuteTemplate(w, pageName, data)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
} else {
|
|
// ELSE: Render the full layout ("index"), which includes the partial
|
|
err := tmpl.ExecuteTemplate(w, "index", data)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
}
|
|
}
|
|
|
|
// --- Handlers ---
|
|
|
|
func homeHandler(w http.ResponseWriter, r *http.Request) {
|
|
// Prevent catch-all "/" from matching non-existent paths
|
|
if r.URL.Path != "/" {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
|
|
data := PageData{
|
|
Title: "Home",
|
|
Time: time.Now().Format(time.Kitchen),
|
|
}
|
|
render(w, r, "home", data)
|
|
}
|
|
|
|
func exploreHandler(w http.ResponseWriter, r *http.Request) {
|
|
data := PageData{
|
|
Title: "Explore",
|
|
Time: time.Now().Format(time.Kitchen),
|
|
}
|
|
render(w, r, "explore", data)
|
|
}
|
|
|
|
func songonHandler(w http.ResponseWriter, r *http.Request) {
|
|
data := PageData{
|
|
Title: "Songon",
|
|
Time: time.Now().Format(time.Kitchen),
|
|
}
|
|
render(w, r, "songon", data)
|
|
}
|
|
|
|
func deposerAnnonceHandler(w http.ResponseWriter, r *http.Request) {
|
|
data := PageData{
|
|
Title: "Déposer",
|
|
Time: time.Now().Format(time.Kitchen),
|
|
}
|
|
render(w, r, "deposer-annonce", data)
|
|
}
|
|
|
|
func inscriptionHandler(w http.ResponseWriter, r *http.Request) {
|
|
data := PageData{
|
|
Title: "Inscription",
|
|
Time: time.Now().Format(time.Kitchen),
|
|
}
|
|
render(w, r, "inscription", data)
|
|
}
|
|
|
|
func contactHandler(w http.ResponseWriter, r *http.Request) {
|
|
data := PageData{
|
|
Title: "Contact",
|
|
}
|
|
render(w, r, "contact", data)
|
|
}
|
|
|
|
func contactPostHandler(w http.ResponseWriter, r *http.Request) {
|
|
// Emulate processing
|
|
time.Sleep(500 * time.Millisecond)
|
|
|
|
// Return a snippet to replace the form
|
|
w.Write([]byte(`<div class="card" style="background:#dcfce7; border:1px solid #86efac;">
|
|
<h2 style="color:#166534">Message Sent!</h2>
|
|
<p>Thank you for contacting us.</p>
|
|
<button class="btn" hx-get="/contact" hx-target="#view">Back</button>
|
|
</div>`))
|
|
}
|
|
|