diff --git a/api/anime/handler.go b/api/anime/handler.go index 058d46a..ac8f6d7 100644 --- a/api/anime/handler.go +++ b/api/anime/handler.go @@ -127,23 +127,57 @@ func (h *Handler) HandleBrowse(w http.ResponseWriter, r *http.Request) { } } - res, err := h.jikanClient.SearchAdvanced(r.Context(), q, animeType, status, orderBy, sort, genres, 1, 24) + pageStr := r.URL.Query().Get("page") + page, _ := strconv.Atoi(pageStr) + if page < 1 { + page = 1 + } + + res, err := h.jikanClient.SearchAdvanced(r.Context(), q, animeType, status, orderBy, sort, genres, page, 24) if err != nil { log.Printf("browse error: %v", err) } + if r.Header.Get("HX-Request") == "true" { + watchlistMap := make(map[int]bool) + if user != nil { + watchlist, _ := h.db.GetUserWatchList(r.Context(), user.ID) + for _, entry := range watchlist { + watchlistMap[int(entry.AnimeID)] = true + } + } + + w.Header().Set("Content-Type", "text/html") + err := templates.GetRenderer().ExecuteFragment(w, "browse.gohtml", "anime_card_scroll", map[string]any{ + "Animes": res.Animes, + "NextPage": page + 1, + "HasNextPage": res.HasNextPage, + "Query": q, + "Type": animeType, + "Status": status, + "OrderBy": orderBy, + "Sort": sort, + "Genres": genres, + "WatchlistMap": watchlistMap, + }) + if err != nil { + log.Printf("fragment render error: %v", err) + } + return + } + genresList, err := h.jikanClient.GetAnimeGenres(r.Context()) if err != nil { log.Printf("genres error: %v", err) } - watchlistMap := make(map[int64]bool) + watchlistMap := make(map[int]bool) var watchlistIDs []int64 if user != nil { watchlist, _ := h.db.GetUserWatchList(r.Context(), user.ID) watchlistIDs = make([]int64, len(watchlist)) for i, entry := range watchlist { - watchlistMap[entry.AnimeID] = true + watchlistMap[int(entry.AnimeID)] = true watchlistIDs[i] = entry.AnimeID } } @@ -159,6 +193,8 @@ func (h *Handler) HandleBrowse(w http.ResponseWriter, r *http.Request) { "Genres": genres, "GenresList": genresList, "Animes": res.Animes, + "HasNextPage": res.HasNextPage, + "NextPage": page + 1, "WatchlistMap": watchlistMap, "WatchlistIDs": watchlistIDs, }); err != nil { diff --git a/templates/browse.gohtml b/templates/browse.gohtml index dc94027..439b11a 100644 --- a/templates/browse.gohtml +++ b/templates/browse.gohtml @@ -15,12 +15,41 @@

No anime found matching your filters.

{{else}} -
- {{range .Animes}} - {{template "anime_card" dict "Anime" . "WithActions" true "IsWatchlist" (index $.WatchlistMap .MalID)}} +
+ {{range $i, $anime := .Animes}} + {{$isThreshold := eq (add $i 1) (sub (len $.Animes) 8)}} + {{if and $isThreshold $.HasNextPage}} +
+ {{template "anime_card" dict "Anime" . "WithActions" true "IsWatchlist" (index $.WatchlistMap .MalID)}} +
+ {{else}} + {{template "anime_card" dict "Anime" . "WithActions" true "IsWatchlist" (index $.WatchlistMap .MalID)}} + {{end}} {{end}}
{{end}}
-{{end}} \ No newline at end of file +{{end}} + +{{define "anime_card_scroll"}} + {{$count := len .Animes}} + {{range $i, $anime := .Animes}} + {{$isThreshold := eq (add $i 1) (sub $count 8)}} + {{if and $isThreshold $.HasNextPage}} +
+ {{template "anime_card" dict "Anime" $anime "WithActions" true "IsWatchlist" (index $.WatchlistMap $anime.MalID)}} +
+ {{else}} + {{template "anime_card" dict "Anime" $anime "WithActions" true "IsWatchlist" (index $.WatchlistMap $anime.MalID)}} + {{end}} + {{end}} +{{end}} diff --git a/templates/renderer.go b/templates/renderer.go index 3065099..e7ab068 100644 --- a/templates/renderer.go +++ b/templates/renderer.go @@ -59,6 +59,12 @@ func GetRenderer() *Renderer { } return false }, + "add": func(a, b int) int { + return a + b + }, + "sub": func(a, b int) int { + return a - b + }, } pages, err := filepath.Glob(filepath.Join(".", "templates", "*.gohtml"))