package templates import "mal/internal/jikan" import "mal/internal/database" import "fmt" type WatchingAnimeWithDetails struct { Entry database.GetWatchingAnimeRow Anime jikan.Anime } templ Notifications(watching []WatchingAnimeWithDetails) { @Layout("mal - notifications") {

Airing shows (tracking)

Shows you're currently watching or planning to watch.

if len(watching) == 0 {

No airing anime in your watching list.

Add currently airing shows to your watching list to see upcoming episodes here.

} else {
for _, item := range watching { @NotificationCard(item) }
}

Discovered sequels

Because you've watched prequels.

Syncing sequel graphs...
} } func splitUpcomingSeasons(items []database.GetUpcomingSeasonsRow) (airing []database.GetUpcomingSeasonsRow, upcoming []database.GetUpcomingSeasonsRow) { for _, item := range items { if item.Status.Valid && item.Status.String == "Currently Airing" { airing = append(airing, item) } else { upcoming = append(upcoming, item) } } return } templ UpcomingSeasonsList(upcomingSeasons []database.GetUpcomingSeasonsRow) { if len(upcomingSeasons) == 0 {

No upcoming seasons for anime you've watched.

As you watch more shows, new seasons will appear here.

} else { @renderSplitSeasons(upcomingSeasons) } } templ renderSplitSeasons(upcomingSeasons []database.GetUpcomingSeasonsRow) { if airing, upcoming := splitUpcomingSeasons(upcomingSeasons); true { if len(airing) > 0 {

Airing now (not tracked)

for _, item := range airing { @UpcomingSeasonCard(item) }
} if len(upcoming) > 0 {

Announced & upcoming

for _, item := range upcoming { @UpcomingSeasonCard(item) }
} } } templ UpcomingSeasonCard(item database.GetUpcomingSeasonsRow) {
if item.ImageUrl != "" { { } else {
No image
}
{ displaySeasonTitle(item) }
Because you watched { item.PrequelTitle }
} func displaySeasonTitle(entry database.GetUpcomingSeasonsRow) string { return database.DisplayTitle(entry.TitleEnglish, entry.TitleJapanese, entry.TitleOriginal) } templ NotificationCard(item WatchingAnimeWithDetails) {
if item.Entry.ImageUrl != "" { { } else {
No image
}
{ displayTitle(item.Entry) }
if item.Anime.Broadcast.String != "" { { item.Anime.Broadcast.String } } if item.Anime.Episodes > 0 { if item.Entry.CurrentEpisode.Valid { { fmt.Sprintf("%d / %d eps", item.Entry.CurrentEpisode.Int64, item.Anime.Episodes) } } else { { fmt.Sprintf("0 / %d eps", item.Anime.Episodes) } } } else if item.Entry.CurrentEpisode.Valid && item.Entry.CurrentEpisode.Int64 > 0 { { fmt.Sprintf("%d eps watched", item.Entry.CurrentEpisode.Int64) } }
} func displayTitle(entry database.GetWatchingAnimeRow) string { return database.DisplayTitle(entry.TitleEnglish, entry.TitleJapanese, entry.TitleOriginal) } func truncate(s string, max int) string { if len(s) <= max { return s } return s[:max-3] + "..." }