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...
} } templ UpcomingSeasonsList(upcomingSeasons []database.GetUpcomingSeasonsRow) { // Split into Airing vs Upcoming var airing []database.GetUpcomingSeasonsRow var upcoming []database.GetUpcomingSeasonsRow for _, item := range upcomingSeasons { if item.Status.Valid && item.Status.String == "Currently Airing" { airing = append(airing, item) } else { upcoming = append(upcoming, item) } } if len(upcomingSeasons) == 0 {

no upcoming seasons for anime you've watched

as you watch more shows, new seasons will appear here

} else { 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 { if entry.TitleEnglish.Valid && entry.TitleEnglish.String != "" { return entry.TitleEnglish.String } if entry.TitleJapanese.Valid && entry.TitleJapanese.String != "" { return entry.TitleJapanese.String } return 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 { if entry.TitleEnglish.Valid && entry.TitleEnglish.String != "" { return entry.TitleEnglish.String } if entry.TitleJapanese.Valid && entry.TitleJapanese.String != "" { return entry.TitleJapanese.String } return entry.TitleOriginal } func truncate(s string, max int) string { if len(s) <= max { return s } return s[:max-3] + "..." }