Files
mal/web/templates/continue_watching.templ

81 lines
2.9 KiB
Plaintext

package templates
import (
"database/sql"
"fmt"
db "mal/internal/db"
ui "mal/web/components"
"mal/web/shared"
"mal/web/shared/layout"
)
templ ContinueWatching(entries []db.GetContinueWatchingEntriesRow) {
@layout.Layout("mal - continue watching", true) {
<div class="grid gap-4">
<h1>Continue watching</h1>
<p class="m-0 text-sm text-(--text-muted)">Pick up where you left off.</p>
if len(entries) == 0 {
@ui.EmptyState("Nothing to continue yet") {
Start watching any anime and your progress will show up here.
}
} else {
<div class="grid grid-cols-2 gap-3 sm:grid-cols-3 md:gap-4 lg:grid-cols-4 xl:grid-cols-5 relative">
for _, entry := range entries {
<div class="group relative min-w-0" id={ fmt.Sprintf("continue-entry-%d", entry.AnimeID) }>
@ui.AnimeCard(ui.AnimeCardProps{
ID: int(entry.AnimeID),
Title: displayContinueWatchingTitle(entry),
ImageURL: entry.ImageUrl,
Href: continueWatchingURL(entry),
TitleEnglish: nullString(entry.TitleEnglish),
TitleJapanese: nullString(entry.TitleJapanese),
DisableWatchlist: true,
Class: "notification-card min-w-0 flex flex-col bg-transparent text-inherit no-underline",
HideTitle: true,
}) {
<div class="mt-2 grid gap-1 p-0">
<div class="line-clamp-2 text-sm leading-snug text-(--text)">{ displayContinueWatchingTitle(entry) }</div>
<div class="flex flex-wrap gap-2">
if entry.CurrentEpisode.Valid && entry.CurrentEpisode.Int64 > 0 {
<span class="text-xs text-(--text-faint)">Continue ep { fmt.Sprintf("%d", entry.CurrentEpisode.Int64) }</span>
}
if entry.CurrentTimeSeconds > 0 {
<span class="text-xs text-(--text-faint)">{ shared.FormatProgressTime(entry.CurrentTimeSeconds) }</span>
}
</div>
</div>
}
<button
class="absolute right-2 top-2 z-30 h-6 w-6 cursor-pointer border-0 bg-(--overlay-subtle) text-(--text-muted) opacity-0 transition-opacity duration-150 group-hover:opacity-100 hover:text-(--danger)"
hx-delete={ string(templ.URL(fmt.Sprintf("/api/continue-watching/%d", entry.AnimeID))) }
hx-target={ fmt.Sprintf("#continue-entry-%d", entry.AnimeID) }
hx-swap="delete"
>&times;</button>
</div>
}
</div>
}
</div>
}
}
func continueWatchingURL(entry db.GetContinueWatchingEntriesRow) string {
episode := 1
if entry.CurrentEpisode.Valid && entry.CurrentEpisode.Int64 > 0 {
episode = int(entry.CurrentEpisode.Int64)
}
return fmt.Sprintf("/watch/%d/%d", entry.AnimeID, episode)
}
func displayContinueWatchingTitle(entry db.GetContinueWatchingEntriesRow) string {
return db.DisplayTitle(entry.TitleEnglish, entry.TitleJapanese, entry.TitleOriginal)
}
func nullString(s sql.NullString) string {
if s.Valid {
return s.String
}
return ""
}