diff --git a/pages/index.go b/pages/index.go index 28eb446f..635a76c5 100644 --- a/pages/index.go +++ b/pages/index.go @@ -169,7 +169,10 @@ func Configure(app *aero.Application) { l.Page("/user/:nick", profile.Get) l.Page("/user/:nick/forum/threads", profile.GetThreadsByUser) l.Page("/user/:nick/forum/posts", profile.GetPostsByUser) - l.Page("/user/:nick/soundtracks", profile.GetSoundTracksByUser) + l.Page("/user/:nick/soundtracks/added", profile.GetSoundTracksByUser) + l.Page("/user/:nick/soundtracks/added/from/:index", profile.GetSoundTracksByUser) + l.Page("/user/:nick/soundtracks/liked", profile.GetSoundTracksLikedByUser) + l.Page("/user/:nick/soundtracks/liked/from/:index", profile.GetSoundTracksLikedByUser) l.Page("/user/:nick/stats", profile.GetStatsByUser) l.Page("/user/:nick/followers", profile.GetFollowers) l.Page("/user/:nick/animelist", animelist.Get) diff --git a/pages/profile/profile.pixy b/pages/profile/profile.pixy index 27f5ca61..0e2cdd2d 100644 --- a/pages/profile/profile.pixy +++ b/pages/profile/profile.pixy @@ -26,12 +26,16 @@ component ProfileTabs(viewUser *arn.User, uri string) Tab("Anime", "th", "/+" + viewUser.Nick) Tab("Collection", "list", "/+" + viewUser.Nick + "/animelist/watching") Tab("Forum", "comment", "/+" + viewUser.Nick + "/forum/threads") - Tab("Tracks", "music", "/+" + viewUser.Nick + "/soundtracks") + Tab("Tracks", "music", "/+" + viewUser.Nick + "/soundtracks/liked") Tab("Stats", "area-chart", "/+" + viewUser.Nick + "/stats") Tab("Followers", "users", "/+" + viewUser.Nick + "/followers") if strings.Contains(uri, "/animelist") StatusTabs("/+" + viewUser.Nick + "/animelist") + if strings.Contains(uri, "/soundtracks") + .tabs + Tab("Liked", "heart", "/+" + viewUser.Nick + "/soundtracks/liked") + Tab("Added", "music", "/+" + viewUser.Nick + "/soundtracks/added") component ProfileHeader(viewUser *arn.User, user *arn.User, uri string) ProfileHead(viewUser, user, uri) diff --git a/pages/profile/tracks.go b/pages/profile/tracks.go index 29e270d4..d27ee5d7 100644 --- a/pages/profile/tracks.go +++ b/pages/profile/tracks.go @@ -7,6 +7,7 @@ import ( "github.com/animenotifier/arn" "github.com/animenotifier/notify.moe/components" "github.com/animenotifier/notify.moe/utils" + "github.com/animenotifier/notify.moe/utils/infinitescroll" ) // GetSoundTracksByUser shows all soundtracks of a particular user. @@ -19,12 +20,67 @@ func GetSoundTracksByUser(ctx *aero.Context) string { return ctx.Error(http.StatusNotFound, "User not found", err) } - tracks := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { - return !track.IsDraft && len(track.Media) > 0 && track.CreatedBy == viewUser.ID - }) + index, _ := ctx.GetInt("index") - arn.SortSoundTracksLatestFirst(tracks) + // Fetch all eligible tracks + allTracks := fetchAllByUser(viewUser.ID) - return ctx.HTML(components.TrackList(tracks, viewUser, user, ctx.URI())) + // Sort the tracks by publication date + arn.SortSoundTracksLatestFirst(allTracks) + + // Slice the part that we need + tracks := allTracks[index:] + + if len(tracks) > maxTracks { + tracks = tracks[:maxTracks] + } + + // Next index + nextIndex := infinitescroll.NextIndex(ctx, len(allTracks), maxTracks, index) + + // In case we're scrolling, send soundtracks only (without the page frame) + if index > 0 { + return ctx.HTML(components.SoundTracksScrollable(tracks, user)) + } + + // Otherwise, send the full page + return ctx.HTML(components.TrackList(tracks, viewUser, nextIndex, user, ctx.URI())) } + +// GetSoundTracksLikedByUser shows all soundtracks liked by a particular user. +func GetSoundTracksLikedByUser(ctx *aero.Context) string { + nick := ctx.Get("nick") + user := utils.GetUser(ctx) + viewUser, err := arn.GetUserByNick(nick) + + if err != nil { + return ctx.Error(http.StatusNotFound, "User not found", err) + } + + index, _ := ctx.GetInt("index") + + // Fetch all eligible tracks + allTracks := fetchAllLikedByUser(viewUser.ID) + + // Sort the tracks by publication date + arn.SortSoundTracksLatestFirst(allTracks) + + // Slice the part that we need + tracks := allTracks[index:] + + if len(tracks) > maxTracks { + tracks = tracks[:maxTracks] + } + + // Next index + nextIndex := infinitescroll.NextIndex(ctx, len(allTracks), maxTracks, index) + + // In case we're scrolling, send soundtracks only (without the page frame) + if index > 0 { + return ctx.HTML(components.SoundTracksScrollable(tracks, user)) + } + + // Otherwise, send the full page + return ctx.HTML(components.TrackList(tracks, viewUser, nextIndex, user, ctx.URI())) +} diff --git a/pages/profile/tracks.pixy b/pages/profile/tracks.pixy index 1b4d3f9f..5ce54191 100644 --- a/pages/profile/tracks.pixy +++ b/pages/profile/tracks.pixy @@ -1,12 +1,18 @@ -component TrackList(tracks []*arn.SoundTrack, viewUser *arn.User, user *arn.User, uri string) +component TrackList(tracks []*arn.SoundTrack, viewUser *arn.User, nextIndex int, user *arn.User, uri string) ProfileHeader(viewUser, user, uri) - h1.page-title= "Tracks added by " + viewUser.Nick - + if strings.Contains(uri, "/added") + h1.page-title= "Tracks added by " + viewUser.Nick + else + h1.page-title= "Tracks liked by " + viewUser.Nick + if len(tracks) == 0 p.no-data.mountable= viewUser.Nick + " hasn't added any tracks yet." else - .soundtracks - each track in tracks - SoundTrack(track) + #load-more-target.soundtracks + SoundTracksScrollable(tracks, user) + + if nextIndex != -1 + .buttons + LoadMore(nextIndex) \ No newline at end of file diff --git a/tests.go b/tests.go index 3b1e4dde..ab1efc4b 100644 --- a/tests.go +++ b/tests.go @@ -14,8 +14,20 @@ var routeTests = map[string][]string{ "/+Akyoto/forum/posts", }, - "/user/:nick/soundtracks": []string{ - "/+Akyoto/soundtracks", + "/user/:nick/soundtracks/added": []string{ + "/+Akyoto/soundtracks/added", + }, + + "/user/:nick/soundtracks/added/from/:index": []string{ + "/+Akyoto/soundtracks/added/from/3", + }, + + "/user/:nick/soundtracks/liked": []string{ + "/+Akyoto/soundtracks/liked", + }, + + "/user/:nick/soundtracks/liked/from/:index": []string{ + "/+Akyoto/soundtracks/liked/from/3", }, "/user/:nick/followers": []string{