70 lines
2.6 KiB
Plaintext
70 lines
2.6 KiB
Plaintext
package templates
|
|
|
|
import (
|
|
"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">
|
|
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),
|
|
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 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"
|
|
>×</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)
|
|
}
|