From 0e5416aab30b5ca27bdc93c536bfc62544a5052e Mon Sep 17 00:00:00 2001 From: mkelvers Date: Fri, 15 May 2026 19:36:35 +0200 Subject: [PATCH] feat: add reviews subpage with infinite scroll --- internal/anime/handler/handler.go | 41 +++++++++++ templates/anime/reviews.gohtml | 115 ++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 templates/anime/reviews.gohtml diff --git a/internal/anime/handler/handler.go b/internal/anime/handler/handler.go index aab8ccc..29212d9 100644 --- a/internal/anime/handler/handler.go +++ b/internal/anime/handler/handler.go @@ -413,3 +413,44 @@ func (h *AnimeHandler) HandleRandomAnime(c *gin.Context) { "in_watchlist": inWatchlist, }) } + +func (h *AnimeHandler) HandleAnimeReviews(c *gin.Context) { + id, _ := strconv.Atoi(c.Param("id")) + if id <= 0 { + c.Status(http.StatusNotFound) + return + } + + page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) + if page < 1 { + page = 1 + } + + reviews, hasNextPage, err := h.svc.GetReviews(c.Request.Context(), id, page) + if err != nil { + c.Status(http.StatusInternalServerError) + return + } + + user, _ := c.Get("User") + + if c.GetHeader("HX-Request") == "true" && page > 1 { + c.HTML(http.StatusOK, "reviews.gohtml", gin.H{ + "_fragment": "review_cards", + "Reviews": reviews, + "NextPage": page + 1, + "HasNextPage": hasNextPage, + "AnimeID": id, + }) + return + } + + c.HTML(http.StatusOK, "reviews.gohtml", gin.H{ + "CurrentPath": fmt.Sprintf("/anime/%d/reviews", id), + "Reviews": reviews, + "NextPage": page + 1, + "HasNextPage": hasNextPage, + "AnimeID": id, + "User": user, + }) +} diff --git a/templates/anime/reviews.gohtml b/templates/anime/reviews.gohtml new file mode 100644 index 0000000..0c878cd --- /dev/null +++ b/templates/anime/reviews.gohtml @@ -0,0 +1,115 @@ +{{define "title"}}Reviews{{end}} +{{define "content"}} +{{template "reviews_content" .}} +{{end}} + +{{define "reviews_content"}} +
+ ← Back to anime +

Reviews

+ + {{if eq (len .Reviews) 0}} +
+

No reviews yet

+
+ {{else}} +
+ {{template "review_cards" .}} +
+ {{end}} +
+{{end}} + +{{define "review_cards"}} +{{range .Reviews}} +
+
+
+
+ {{.User.Username}} +
+
+ {{.User.Username}} + {{formatDate .Date}} +
+
+
+ {{if .IsPreliminary}} + Preliminary + {{end}} + {{if .IsSpoiler}} + Spoiler + {{end}} +
+ + {{.Score}} +
+
+
+ {{if .Tags}} +
+ {{range .Tags}} + {{.}} + {{end}} +
+ {{end}} +
+ {{.Review}} +
+
+ {{if .EpisodesSeen}}{{.EpisodesSeen}} episodes seen{{end}} +
+ {{if .Reactions.Nice}} + + + {{.Reactions.Nice}} + + {{end}} + {{if .Reactions.LoveIt}} + + + {{.Reactions.LoveIt}} + + {{end}} + {{if .Reactions.Funny}} + + + {{.Reactions.Funny}} + + {{end}} + {{if .Reactions.Confusing}} + + + {{.Reactions.Confusing}} + + {{end}} + {{if .Reactions.Informative}} + + + {{.Reactions.Informative}} + + {{end}} + {{if .Reactions.WellWritten}} + + + {{.Reactions.WellWritten}} + + {{end}} + {{if .Reactions.Creative}} + + + {{.Reactions.Creative}} + + {{end}} +
+
+
+{{end}} +{{if .HasNextPage}} +
+{{end}} +{{end}} \ No newline at end of file