datastar/site/routes_examples_merge_optio...

84 lines
1.7 KiB
Go

package site
import (
"fmt"
"net/http"
"time"
"github.com/go-chi/chi/v5"
"github.com/samber/lo"
datastar "github.com/starfederation/datastar/sdk/go"
"github.com/zeebo/xxh3"
)
func setupExamplesMergeOptions(examplesRouter chi.Router) error {
examplesRouter.Get("/merge_options/reset", func(w http.ResponseWriter, r *http.Request) {
sse := datastar.NewSSE(w, r)
sse.MergeFragmentTempl(mergeOptionsView())
})
brewerColorsBG := []string{
"#a6cee3",
"#1f78b4",
"#b2df8a",
"#33a02c",
"#fb9a99",
"#e31a1c",
"#fdbf6f",
"#ff7f00",
"#cab2d6",
"#6a3d9a",
"#ffff99",
"#b15928",
}
brewrColorsFG := []string{
"black",
"white",
"black",
"black",
"black",
"white",
"black",
"black",
"black",
"white",
"black",
"white",
}
examplesRouter.Get("/merge_options/{mergeMode}", func(w http.ResponseWriter, r *http.Request) {
mergeModeRaw := chi.URLParam(r, "mergeMode")
sse := datastar.NewSSE(w, r)
switch mergeModeRaw {
case "":
http.Error(w, "missing merge mode", http.StatusBadRequest)
return
case "delete":
sse.RemoveFragments("#target")
return
default:
mergeMode, err := datastar.FragmentMergeTypeFromString(mergeModeRaw)
if err != nil {
sse.ConsoleError(err)
return
}
if !lo.Contains(datastar.ValidFragmentMergeTypes, mergeMode) {
http.Error(w, "invalid merge mode", http.StatusBadRequest)
return
}
idx := lo.IndexOf(datastar.ValidFragmentMergeTypes, mergeMode)
now := time.Now().UTC().Format(time.RFC3339)
h := fmt.Sprint(xxh3.HashString(now))
frag := mergeOptionsViewUpdate(brewerColorsBG[idx], brewrColorsFG[idx], h)
sse.MergeFragmentTempl(frag, datastar.WithMergeMode(mergeMode))
}
})
return nil
}