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

Notifications

Tracking Sequels
if activeTab == "sequels" {
@ui.LoadingIndicator("Syncing sequel graphs...")
} else {

Shows you're currently watching or planning to watch.

if len(watching) == 0 { @ui.EmptyState("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) }
} }
} } 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 { @ui.EmptyState("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

These are the currently airing anime, but you're not tracking any of these.

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

Announced & upcoming

Newly announced or upcoming seasons related to anime you've watched.

for _, item := range upcoming { @UpcomingSeasonCard(item) }
} } } templ UpcomingSeasonCard(item database.GetUpcomingSeasonsRow) { @ui.AnimeCard(ui.AnimeCardProps{ ID: int(item.ID), Title: displaySeasonTitle(item), ImageURL: item.ImageUrl, Class: "notification-card", ImgClass: "notification-image", }) {
{ displaySeasonTitle(item) }
} } func displaySeasonTitle(entry database.GetUpcomingSeasonsRow) string { return database.DisplayTitle(entry.TitleEnglish, entry.TitleJapanese, entry.TitleOriginal) } templ NotificationCard(item WatchingAnimeWithDetails) { @ui.AnimeCard(ui.AnimeCardProps{ ID: int(item.Entry.AnimeID), Title: displayTitle(item.Entry), ImageURL: item.Entry.ImageUrl, Class: "notification-card", ImgClass: "notification-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) }