feat: persist sidebar state
This commit is contained in:
parent
61eaa268ab
commit
de0e87cd71
4 changed files with 36 additions and 2 deletions
|
|
@ -13,7 +13,8 @@ const (
|
||||||
URLPathKey string = "url_path"
|
URLPathKey string = "url_path"
|
||||||
ConfigKey string = "config"
|
ConfigKey string = "config"
|
||||||
CSRFTokenKey string = "csrf_token"
|
CSRFTokenKey string = "csrf_token"
|
||||||
AppVersionKey string = "app_version"
|
AppVersionKey string = "app_version"
|
||||||
|
SidebarCollapsedKey string = "sidebar_collapsed"
|
||||||
)
|
)
|
||||||
|
|
||||||
func User(ctx context.Context) *model.User {
|
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 {
|
func WithAppVersion(ctx context.Context, version string) context.Context {
|
||||||
return context.WithValue(ctx, AppVersionKey, version)
|
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)
|
||||||
|
}
|
||||||
|
|
|
||||||
21
internal/middleware/sidebar.go
Normal file
21
internal/middleware/sidebar.go
Normal 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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -33,6 +33,7 @@ func SetupRoutes(a *app.App) http.Handler {
|
||||||
middleware.CSRFProtection,
|
middleware.CSRFProtection,
|
||||||
middleware.AuthMiddleware(a.AuthService, a.UserService),
|
middleware.AuthMiddleware(a.AuthService, a.UserService),
|
||||||
middleware.WithURLPath,
|
middleware.WithURLPath,
|
||||||
|
middleware.WithSidebarState,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Static assets (bypass router groups — registered directly on mux)
|
// Static assets (bypass router groups — registered directly on mux)
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,9 @@ templ App(title string) {
|
||||||
Path: ctxkeys.URLPath(ctx),
|
Path: ctxkeys.URLPath(ctx),
|
||||||
}) {
|
}) {
|
||||||
@sidebar.Layout() {
|
@sidebar.Layout() {
|
||||||
@sidebar.Sidebar() {
|
@sidebar.Sidebar(sidebar.Props{
|
||||||
|
Collapsed: ctxkeys.SidebarCollapsed(ctx),
|
||||||
|
}) {
|
||||||
@sidebar.Header() {
|
@sidebar.Header() {
|
||||||
@sidebar.Menu() {
|
@sidebar.Menu() {
|
||||||
@sidebar.MenuItem() {
|
@sidebar.MenuItem() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue