diff --git a/handlers/account.go b/handlers/account.go index 36c180f..08ed745 100644 --- a/handlers/account.go +++ b/handlers/account.go @@ -1,9 +1,15 @@ package handlers import ( + "database/sql" "net/http" + + "projectreshoot/contexts" + "projectreshoot/db" "projectreshoot/view/component/account" "projectreshoot/view/page" + + "github.com/rs/zerolog" ) func HandleAccountPage() http.Handler { @@ -19,7 +25,38 @@ func HandleAccountSubpage() http.Handler { func(w http.ResponseWriter, r *http.Request) { r.ParseForm() subpage := r.FormValue("subpage") - account.AccountContent(subpage).Render(r.Context(), w) + account.AccountContainer(subpage).Render(r.Context(), w) + }, + ) +} + +func HandleChangeUsername( + logger *zerolog.Logger, + conn *sql.DB, +) http.Handler { + return http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + r.ParseForm() + newUsername := r.FormValue("username") + + unique, err := db.CheckUsernameUnique(conn, newUsername) + if err != nil { + logger.Error().Err(err).Msg("Error updating username") + w.WriteHeader(http.StatusInternalServerError) + return + } + if !unique { + account.ChangeUsername("Usename is taken", newUsername).Render(r.Context(), w) + return + } + user := contexts.GetUser(r.Context()) + err = user.ChangeUsername(conn, newUsername) + if err != nil { + logger.Error().Err(err).Msg("Error updating username") + w.WriteHeader(http.StatusInternalServerError) + return + } + w.Header().Set("HX-Redirect", "/account") }, ) } diff --git a/server/routes.go b/server/routes.go index fc54841..2bada29 100644 --- a/server/routes.go +++ b/server/routes.go @@ -75,4 +75,8 @@ func addRoutes( middleware.RequiresLogin( handlers.HandleAccountSubpage(), )) + mux.Handle("POST /change-username", + middleware.RequiresLogin( + handlers.HandleChangeUsername(logger, conn), + )) } diff --git a/view/component/account/changeusername.templ b/view/component/account/changeusername.templ new file mode 100644 index 0000000..d70a2f3 --- /dev/null +++ b/view/component/account/changeusername.templ @@ -0,0 +1,94 @@ +package account + +import "projectreshoot/contexts" + +templ ChangeUsername(err string, username string) { + {{ + user := contexts.GetUser(ctx) + if username == "" { + username = user.Username + } + }} +
+
+
+ + +
+ +
+
+
+ + +
+
+

+
+} diff --git a/view/component/account/container.templ b/view/component/account/container.templ new file mode 100644 index 0000000..37b4a0a --- /dev/null +++ b/view/component/account/container.templ @@ -0,0 +1,24 @@ +package account + +templ AccountContainer(subpage string) { +
+ @SelectMenu(subpage) +
+
+ { subpage } +
+ switch subpage { + case "General": + @AccountGeneral() + case "Security": + @AccountGeneral() + } +
+
+} diff --git a/view/component/account/content.templ b/view/component/account/content.templ deleted file mode 100644 index 2e84536..0000000 --- a/view/component/account/content.templ +++ /dev/null @@ -1,15 +0,0 @@ -package account - -templ AccountContent(subpage string) { -
-
- @SelectMenu(subpage) -
-
- { subpage } -
- // page content -
-
-
-} diff --git a/view/component/account/general.templ b/view/component/account/general.templ new file mode 100644 index 0000000..c79fe56 --- /dev/null +++ b/view/component/account/general.templ @@ -0,0 +1,7 @@ +package account + +templ AccountGeneral() { +
+ @ChangeUsername("", "") +
+} diff --git a/view/component/account/selectmenu.templ b/view/component/account/selectmenu.templ index c8c1ea9..c202e39 100644 --- a/view/component/account/selectmenu.templ +++ b/view/component/account/selectmenu.templ @@ -29,27 +29,35 @@ templ SelectMenu(activePage string) { menuItems := getMenuItems() page := fmt.Sprintf("{page:'%s'}", activePage) }} -
-
- +
- + } diff --git a/view/page/account.templ b/view/page/account.templ index 896f657..c11b900 100644 --- a/view/page/account.templ +++ b/view/page/account.templ @@ -5,6 +5,6 @@ import "projectreshoot/view/component/account" templ Account(subpage string) { @layout.Global() { - @account.AccountContent(subpage) + @account.AccountContainer(subpage) } }