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"
|
||||
ConfigKey string = "config"
|
||||
CSRFTokenKey string = "csrf_token"
|
||||
AppVersionKey string = "app_version"
|
||||
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)
|
||||
}
|
||||
|
|
|
|||
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.AuthMiddleware(a.AuthService, a.UserService),
|
||||
middleware.WithURLPath,
|
||||
middleware.WithSidebarState,
|
||||
)
|
||||
|
||||
// Static assets (bypass router groups — registered directly on mux)
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue