feat: persist sidebar state

This commit is contained in:
juancwu 2026-04-12 16:15:22 +00:00
commit de0e87cd71
4 changed files with 36 additions and 2 deletions

View file

@ -14,6 +14,7 @@ const (
ConfigKey string = "config"
CSRFTokenKey string = "csrf_token"
AppVersionKey string = "app_version"
SidebarCollapsedKey string = "sidebar_collapsed"
)
func User(ctx context.Context) *model.User {
@ -61,3 +62,12 @@ func AppVersion(ctx context.Context) string {
func WithAppVersion(ctx context.Context, version string) context.Context {
return context.WithValue(ctx, AppVersionKey, version)
}
func SidebarCollapsed(ctx context.Context) bool {
collapsed, _ := ctx.Value(SidebarCollapsedKey).(bool)
return collapsed
}
func WithSidebarCollapsed(ctx context.Context, collapsed bool) context.Context {
return context.WithValue(ctx, SidebarCollapsedKey, collapsed)
}

View file

@ -0,0 +1,21 @@
package middleware
import (
"net/http"
"git.juancwu.dev/juancwu/budgit/internal/ctxkeys"
)
// WithSidebarState reads the sidebar_state cookie and adds the collapsed
// state to the request context so templates can render the sidebar in the
// correct initial state.
func WithSidebarState(next http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
collapsed := false
if c, err := r.Cookie("sidebar_state"); err == nil {
collapsed = c.Value == "false"
}
ctx := ctxkeys.WithSidebarCollapsed(r.Context(), collapsed)
next.ServeHTTP(w, r.WithContext(ctx))
}
}

View file

@ -33,6 +33,7 @@ func SetupRoutes(a *app.App) http.Handler {
middleware.CSRFProtection,
middleware.AuthMiddleware(a.AuthService, a.UserService),
middleware.WithURLPath,
middleware.WithSidebarState,
)
// Static assets (bypass router groups — registered directly on mux)

View file

@ -22,7 +22,9 @@ templ App(title string) {
Path: ctxkeys.URLPath(ctx),
}) {
@sidebar.Layout() {
@sidebar.Sidebar() {
@sidebar.Sidebar(sidebar.Props{
Collapsed: ctxkeys.SidebarCollapsed(ctx),
}) {
@sidebar.Header() {
@sidebar.Menu() {
@sidebar.MenuItem() {