feat: add watchlist quick-add button to anime cards

This commit is contained in:
2026-04-21 00:34:13 +02:00
parent bda7afa31d
commit a5f2628d1e
9 changed files with 187 additions and 38 deletions

View File

@@ -88,6 +88,60 @@ func (h *Handler) HandleUpdateWatchlist(w http.ResponseWriter, r *http.Request)
watchlist.WatchlistDropdown(int(animeID), animeTitle, animeTitleEnglish, animeTitleJapanese, animeImage, status, airing).Render(r.Context(), w)
}
func (h *Handler) HandleCardWatchlist(w http.ResponseWriter, r *http.Request) {
if !requireMethod(w, r, http.MethodPost) {
return
}
user := middleware.GetUser(r.Context())
if user == nil {
w.Header().Set("HX-Redirect", "/login")
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
if err := r.ParseForm(); err != nil {
http.Error(w, "invalid form", http.StatusBadRequest)
return
}
animeIDStr := r.FormValue("anime_id")
animeTitle := r.FormValue("anime_title")
animeTitleEnglish := r.FormValue("anime_title_english")
animeTitleJapanese := r.FormValue("anime_title_japanese")
animeImage := r.FormValue("anime_image")
airingStr := r.FormValue("airing")
airing := airingStr == "true"
animeID, err := strconv.ParseInt(animeIDStr, 10, 64)
if err != nil || animeID <= 0 {
http.Error(w, "invalid anime ID", http.StatusBadRequest)
return
}
req := AddRequest{
AnimeID: animeID,
TitleOriginal: animeTitle,
TitleEnglish: animeTitleEnglish,
TitleJapanese: animeTitleJapanese,
ImageURL: animeImage,
Status: "plan_to_watch",
Airing: airing,
}
if err := h.svc.AddEntry(r.Context(), user.ID, req); err != nil {
if errors.Is(err, ErrInvalidAnimeID) || errors.Is(err, ErrInvalidStatus) {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Printf("watchlist card add failed: user_id=%s anime_id=%d err=%v", user.ID, animeID, err)
http.Error(w, "failed to update watchlist", http.StatusInternalServerError)
return
}
watchlist.CardButton(int(animeID), animeTitle, animeTitleEnglish, animeTitleJapanese, animeImage, airing, true).Render(r.Context(), w)
}
func (h *Handler) HandleDeleteWatchlist(w http.ResponseWriter, r *http.Request) {
if !requireMethod(w, r, http.MethodDelete) {
return