From a0403539ae3abe3a0018d2cb1d5a02245de7232c Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Tue, 9 Apr 2024 16:09:08 +0700 Subject: [PATCH] views: prepare home page --- ...ubreddit_list.go => api_subreddit_list.go} | 3 - server/routes/page_home.go | 15 ++- server/routes/routes.go | 2 + views/components/body.templ | 16 +++ views/components/container.templ | 7 ++ views/components/navigation.templ | 106 ++++++++++++++++++ views/components/toasts.templ | 33 ++++++ views/homeview/homeview.templ | 26 ++++- 8 files changed, 201 insertions(+), 7 deletions(-) rename server/routes/{subreddit_list.go => api_subreddit_list.go} (92%) create mode 100644 views/components/body.templ create mode 100644 views/components/container.templ create mode 100644 views/components/navigation.templ create mode 100644 views/components/toasts.templ diff --git a/server/routes/subreddit_list.go b/server/routes/api_subreddit_list.go similarity index 92% rename from server/routes/subreddit_list.go rename to server/routes/api_subreddit_list.go index b8337fb..5ff7352 100644 --- a/server/routes/subreddit_list.go +++ b/server/routes/api_subreddit_list.go @@ -25,9 +25,6 @@ func (r *Routes) SubredditsListAPI(rw http.ResponseWriter, req *http.Request) { } } -func (r *Routes) SubredditsListPage(rw http.ResponseWriter, req *http.Request) { -} - func parseSubredditListQuery(req *http.Request) (params api.ListSubredditsParams) { params.Name = req.FormValue("name") params.Limit, _ = strconv.ParseInt(req.FormValue("limit"), 10, 64) diff --git a/server/routes/page_home.go b/server/routes/page_home.go index ba6fe7b..5aa8dce 100644 --- a/server/routes/page_home.go +++ b/server/routes/page_home.go @@ -11,7 +11,20 @@ import ( func (routes *Routes) PageHome(rw http.ResponseWriter, r *http.Request) { ctx := r.Context() vc := views.NewContext(routes.Config, r) - if err := homeview.Home(vc).Render(ctx, rw); err != nil { + + params := parseSubredditListQuery(r) + + list, err := routes.API.ListSubreddits(ctx, params) + if err != nil { + rw.WriteHeader(http.StatusInternalServerError) + } + + data := homeview.Data{ + SubredditsList: list, + Error: err, + } + + if err := homeview.Home(vc, data).Render(ctx, rw); err != nil { log.New(ctx).Err(err).Error("failed to render home view") } } diff --git a/server/routes/routes.go b/server/routes/routes.go index c2822b5..8f8b4e4 100644 --- a/server/routes/routes.go +++ b/server/routes/routes.go @@ -39,7 +39,9 @@ func (routes *Routes) registerWWWRoutes(router chi.Router) { router.Mount("/public", http.StripPrefix("/public", http.FileServer(http.FS(routes.PublicDir)))) router.Group(func(r chi.Router) { + r.Use(chimiddleware.RequestID) r.Use(chimiddleware.RequestLogger(middleware.ChiLogger{})) + r.Use(chimiddleware.SetHeader("Content-Type", "text/html; charset=utf-8")) r.Get("/", routes.PageHome) }) } diff --git a/views/components/body.templ b/views/components/body.templ new file mode 100644 index 0000000..c80bdaa --- /dev/null +++ b/views/components/body.templ @@ -0,0 +1,16 @@ +package components + +import "github.com/tigorlazuardi/redmage/views" + +templ Body(c *views.Context) { + + @Navigation(c) { +
+ @Navbar(c) +
+ { children... } +
+
+ } + +} diff --git a/views/components/container.templ b/views/components/container.templ new file mode 100644 index 0000000..dfc2ff0 --- /dev/null +++ b/views/components/container.templ @@ -0,0 +1,7 @@ +package components + +templ Container() { +
+ { children... } +
+} diff --git a/views/components/navigation.templ b/views/components/navigation.templ new file mode 100644 index 0000000..332fb8e --- /dev/null +++ b/views/components/navigation.templ @@ -0,0 +1,106 @@ +package components + +import "github.com/tigorlazuardi/redmage/views" +import "strings" + +templ Navigation(c *views.Context) { +
+ +
+ + { children... } +
+ +
+} + +func cx(m map[string]bool) string { + var res string + for k, v := range m { + if v { + res += k + " " + } + } + return res +} + +func classForNavItem(c *views.Context, prefix string) string { + classNames := map[string]bool{} + if prefix == "/" && c.Request.URL.Path == "/" { + classNames["font-bold"] = true + return cx(classNames) + } else if strings.HasPrefix(c.Request.URL.Path, prefix) && prefix != "/" { + classNames["font-bold"] = true + } + return cx(classNames) +} + +templ navLogo() { + + + + +} + +templ Navbar(c *views.Context) { + +} diff --git a/views/components/toasts.templ b/views/components/toasts.templ new file mode 100644 index 0000000..9d58f03 --- /dev/null +++ b/views/components/toasts.templ @@ -0,0 +1,33 @@ +package components + +import "fmt" +import "strings" + +templ SuccessToast(message string, args ...any) { + +} + +templ ErrorToast(message string, args ...any) { +
+ +
+ for _, line := range strings.Split(fmt.Sprintf(message, args...), "\n") { +

{ line }

+ } +
+
+} \ No newline at end of file diff --git a/views/homeview/homeview.templ b/views/homeview/homeview.templ index 9eb4455..a7f5a3f 100644 --- a/views/homeview/homeview.templ +++ b/views/homeview/homeview.templ @@ -2,10 +2,30 @@ package homeview import "github.com/tigorlazuardi/redmage/views/components" import "github.com/tigorlazuardi/redmage/views" +import "github.com/tigorlazuardi/redmage/api" -templ Home(vc *views.Context) { +type Data struct { + SubredditsList api.ListSubredditsResult + Error error +} + +templ Home(c *views.Context, data Data) { @components.Doctype() { - @components.Head(vc) -
Hello World
+ @components.Head(c) + @components.Body(c) { + @components.Container() { + if data.Error != nil { + @components.ErrorToast(data.Error.Error()) + } else { + @home(c, data) + } + } + } } } + +templ home(c *views.Context, data Data) { +
+

Recently Added

+
+}