musora-content-services 1.7.0 → 1.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.claude/settings.local.json +17 -0
  2. package/.github/workflows/conventional-commits.yaml +0 -0
  3. package/.github/workflows/node.js.yml +0 -0
  4. package/.prettierignore +0 -0
  5. package/.prettierrc +0 -0
  6. package/CHANGELOG.md +15 -0
  7. package/docs/v2/Content.html +269 -0
  8. package/docs/v2/ContentOrganization.html +2 -2
  9. package/docs/v2/Forums.html +2 -2
  10. package/docs/v2/Gamification.html +2 -2
  11. package/docs/v2/TestUser.html +2 -2
  12. package/docs/v2/UserManagementSystem.html +2 -2
  13. package/docs/v2/api_types.js.html +2 -2
  14. package/docs/v2/config.js.html +5 -2
  15. package/docs/v2/content-org_content-org.js.html +2 -2
  16. package/docs/v2/content-org_guided-courses.ts.html +2 -2
  17. package/docs/v2/content-org_learning-paths.ts.html +194 -59
  18. package/docs/v2/content-org_playlists-types.js.html +2 -2
  19. package/docs/v2/content-org_playlists.js.html +2 -2
  20. package/docs/v2/content.js.html +88 -10
  21. package/docs/v2/content_artist.ts.html +206 -0
  22. package/docs/v2/content_content.ts.html +77 -0
  23. package/docs/v2/content_genre.ts.html +209 -0
  24. package/docs/v2/content_instructor.ts.html +206 -0
  25. package/docs/v2/forums_categories.ts.html +22 -3
  26. package/docs/v2/forums_forums.ts.html +2 -2
  27. package/docs/v2/forums_posts.ts.html +22 -3
  28. package/docs/v2/forums_threads.ts.html +23 -10
  29. package/docs/v2/gamification_awards.ts.html +26 -12
  30. package/docs/v2/gamification_gamification.js.html +2 -2
  31. package/docs/v2/global.html +56 -8
  32. package/docs/v2/index.html +2 -2
  33. package/docs/v2/liveTesting.ts.html +2 -2
  34. package/docs/v2/module-Accounts.html +202 -13
  35. package/docs/v2/module-Artist.html +993 -0
  36. package/docs/v2/module-Awards.html +106 -6
  37. package/docs/v2/module-Config.html +5 -4
  38. package/docs/v2/module-Content-Services-V2.html +440 -9
  39. package/docs/v2/module-Forums.html +1398 -192
  40. package/docs/v2/module-Genre.html +981 -0
  41. package/docs/v2/module-GuidedCourses.html +2 -2
  42. package/docs/v2/module-Instructor.html +929 -0
  43. package/docs/v2/module-Interests.html +2 -2
  44. package/docs/v2/module-LearningPaths.html +1276 -182
  45. package/docs/v2/module-Onboarding.html +32 -8
  46. package/docs/v2/module-Payments.html +2 -2
  47. package/docs/v2/module-Permissions.html +2 -2
  48. package/docs/v2/module-Playlists.html +2 -2
  49. package/docs/v2/module-ProgressRow.html +2 -2
  50. package/docs/v2/module-Railcontent-Services.html +34 -626
  51. package/docs/v2/module-Sanity-Services.html +803 -1722
  52. package/docs/v2/module-Sessions.html +2 -2
  53. package/docs/v2/module-UserActivity.html +70 -116
  54. package/docs/v2/module-UserChat.html +2 -2
  55. package/docs/v2/module-UserManagement.html +2 -2
  56. package/docs/v2/module-UserMemberships.html +2 -2
  57. package/docs/v2/module-UserNotifications.html +2 -2
  58. package/docs/v2/module-UserProfile.html +2 -2
  59. package/docs/v2/progress-row_method-card.js.html +46 -47
  60. package/docs/v2/railcontent.js.html +14 -125
  61. package/docs/v2/sanity.js.html +247 -320
  62. package/docs/v2/userActivity.js.html +93 -169
  63. package/docs/v2/user_account.ts.html +41 -13
  64. package/docs/v2/user_chat.js.html +2 -2
  65. package/docs/v2/user_interests.js.html +2 -2
  66. package/docs/v2/user_management.js.html +2 -2
  67. package/docs/v2/user_memberships.ts.html +2 -2
  68. package/docs/v2/user_notifications.js.html +2 -2
  69. package/docs/v2/user_onboarding.ts.html +99 -4
  70. package/docs/v2/user_payments.ts.html +2 -2
  71. package/docs/v2/user_permissions.js.html +3 -3
  72. package/docs/v2/user_profile.js.html +2 -2
  73. package/docs/v2/user_sessions.js.html +2 -2
  74. package/docs/v2/user_types.js.html +4 -2
  75. package/docs/v2/user_user-management-system.js.html +2 -2
  76. package/jest.config.js +0 -0
  77. package/link_mcs.sh +0 -0
  78. package/package.json +1 -1
  79. package/src/services/imageSRCBuilder.js +1 -1
  80. package/src/services/imageSRCVerify.js +1 -1
  81. package/src/services/sanity.js +3 -3
  82. package/test/dataContext.test.js +0 -0
  83. package/test/imageSRCBuilder.test.js +1 -1
  84. package/test/imageSRCVerify.test.js +4 -4
  85. package/test/localStorageMock.js +0 -0
  86. package/test/log.js +0 -0
@@ -29,7 +29,7 @@
29
29
  <nav >
30
30
 
31
31
 
32
- <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-Accounts.html">Accounts</a><ul class='methods'><li data-type='method'><a href="module-Accounts.html#~confirmEmailChange">confirmEmailChange</a></li><li data-type='method'><a href="module-Accounts.html#~deleteAccount">deleteAccount</a></li><li data-type='method'><a href="module-Accounts.html#~numberOfActiveUsers">numberOfActiveUsers</a></li><li data-type='method'><a href="module-Accounts.html#~requestEmailChange">requestEmailChange</a></li><li data-type='method'><a href="module-Accounts.html#~resetPassword">resetPassword</a></li><li data-type='method'><a href="module-Accounts.html#~sendAccountSetupEmail">sendAccountSetupEmail</a></li><li data-type='method'><a href="module-Accounts.html#~sendPasswordResetEmail">sendPasswordResetEmail</a></li><li data-type='method'><a href="module-Accounts.html#~setupAccount">setupAccount</a></li><li data-type='method'><a href="module-Accounts.html#~status">status</a></li></ul></li><li><a href="module-Awards.html">Awards</a><ul class='methods'><li data-type='method'><a href="module-Awards.html#~fetchAwardsForUser">fetchAwardsForUser</a></li><li data-type='method'><a href="module-Awards.html#~fetchCertificate">fetchCertificate</a></li><li data-type='method'><a href="module-Awards.html#~getAwardDataForGuidedContent">getAwardDataForGuidedContent</a></li></ul></li><li><a href="module-Config.html">Config</a><ul class='methods'><li data-type='method'><a href="module-Config.html#.initializeService">initializeService</a></li></ul></li><li><a href="module-Content-Services-V2.html">Content-Services-V2</a><ul class='methods'><li data-type='method'><a href="module-Content-Services-V2.html#.getContentRows">getContentRows</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getLegacyMethods">getLegacyMethods</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getNewAndUpcoming">getNewAndUpcoming</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getRecent">getRecent</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getRecommendedForYou">getRecommendedForYou</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getScheduleContentRows">getScheduleContentRows</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getTabResults">getTabResults</a></li></ul></li><li><a href="module-Forums.html">Forums</a><ul class='methods'><li data-type='method'><a href="module-Forums.html#~createForumCategory">createForumCategory</a></li><li data-type='method'><a href="module-Forums.html#~createPost">createPost</a></li><li data-type='method'><a href="module-Forums.html#~createThread">createThread</a></li><li data-type='method'><a href="module-Forums.html#~deletePost">deletePost</a></li><li data-type='method'><a href="module-Forums.html#~deleteThread">deleteThread</a></li><li data-type='method'><a href="module-Forums.html#~fetchCommunityGuidelines">fetchCommunityGuidelines</a></li><li data-type='method'><a href="module-Forums.html#~fetchFollowedThreads">fetchFollowedThreads</a></li><li data-type='method'><a href="module-Forums.html#~fetchForumCategories">fetchForumCategories</a></li><li data-type='method'><a href="module-Forums.html#~fetchLatestThreads">fetchLatestThreads</a></li><li data-type='method'><a href="module-Forums.html#~fetchPosts">fetchPosts</a></li><li data-type='method'><a href="module-Forums.html#~fetchThreads">fetchThreads</a></li><li data-type='method'><a href="module-Forums.html#~followThread">followThread</a></li><li data-type='method'><a href="module-Forums.html#~jumpToPost">jumpToPost</a></li><li data-type='method'><a href="module-Forums.html#~likePost">likePost</a></li><li data-type='method'><a href="module-Forums.html#~lockThread">lockThread</a></li><li data-type='method'><a href="module-Forums.html#~pinThread">pinThread</a></li><li data-type='method'><a href="module-Forums.html#~search">search</a></li><li data-type='method'><a href="module-Forums.html#~unfollowThread">unfollowThread</a></li><li data-type='method'><a href="module-Forums.html#~unlikePost">unlikePost</a></li><li data-type='method'><a href="module-Forums.html#~unlockThread">unlockThread</a></li><li data-type='method'><a href="module-Forums.html#~unpinThread">unpinThread</a></li><li data-type='method'><a href="module-Forums.html#~updateForumCategory">updateForumCategory</a></li><li data-type='method'><a href="module-Forums.html#~updatePost">updatePost</a></li><li data-type='method'><a href="module-Forums.html#~updateThread">updateThread</a></li></ul></li><li></li><li></li><li><a href="module-GuidedCourses.html">GuidedCourses</a></li><li><a href="module-Interests.html">Interests</a><ul class='methods'><li data-type='method'><a href="module-Interests.html#.fetchInterests">fetchInterests</a></li><li data-type='method'><a href="module-Interests.html#.fetchUninterests">fetchUninterests</a></li><li data-type='method'><a href="module-Interests.html#.markContentAsInterested">markContentAsInterested</a></li><li data-type='method'><a href="module-Interests.html#.markContentAsNotInterested">markContentAsNotInterested</a></li><li data-type='method'><a href="module-Interests.html#.removeContentAsInterested">removeContentAsInterested</a></li><li data-type='method'><a href="module-Interests.html#.removeContentAsNotInterested">removeContentAsNotInterested</a></li></ul></li><li><a href="module-LearningPaths.html">LearningPaths</a><ul class='methods'><li data-type='method'><a href="module-LearningPaths.html#~fetchLearningPathLessons">fetchLearningPathLessons</a></li><li data-type='method'><a href="module-LearningPaths.html#~getActivePath">getActivePath</a></li><li data-type='method'><a href="module-LearningPaths.html#~getDailySession">getDailySession</a></li><li data-type='method'><a href="module-LearningPaths.html#~resetAllLearningPaths">resetAllLearningPaths</a></li><li data-type='method'><a href="module-LearningPaths.html#~startLearningPath">startLearningPath</a></li><li data-type='method'><a href="module-LearningPaths.html#~updateActivePath">updateActivePath</a></li><li data-type='method'><a href="module-LearningPaths.html#~updateDailySession">updateDailySession</a></li></ul></li><li><a href="module-Onboarding.html">Onboarding</a><ul class='methods'><li data-type='method'><a href="module-Onboarding.html#~getOnboardingRecommendedContent">getOnboardingRecommendedContent</a></li><li data-type='method'><a href="module-Onboarding.html#~startOnboarding">startOnboarding</a></li><li data-type='method'><a href="module-Onboarding.html#~updateOnboarding">updateOnboarding</a></li><li data-type='method'><a href="module-Onboarding.html#~userOnboardingForBrand">userOnboardingForBrand</a></li></ul></li><li><a href="module-Payments.html">Payments</a><ul class='methods'><li data-type='method'><a href="module-Payments.html#~fetchCustomerPayments">fetchCustomerPayments</a></li></ul></li><li><a href="module-Permissions.html">Permissions</a><ul class='methods'><li data-type='method'><a href="module-Permissions.html#.fetchUserPermissions">fetchUserPermissions</a></li><li data-type='method'><a href="module-Permissions.html#.reset">reset</a></li></ul></li><li><a href="module-Playlists.html">Playlists</a><ul class='methods'><li data-type='method'><a href="module-Playlists.html#.addItemToPlaylist">addItemToPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.createPlaylist">createPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.deletePlaylist">deletePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.duplicatePlaylist">duplicatePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.fetchPlaylist">fetchPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.fetchPlaylistItems">fetchPlaylistItems</a></li><li data-type='method'><a href="module-Playlists.html#.fetchUserPlaylists">fetchUserPlaylists</a></li><li data-type='method'><a href="module-Playlists.html#.togglePlaylistPrivate">togglePlaylistPrivate</a></li><li data-type='method'><a href="module-Playlists.html#.undeletePlaylist">undeletePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.updatePlaylist">updatePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~deleteItemsFromPlaylist">deleteItemsFromPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~likePlaylist">likePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~reportPlaylist">reportPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~restoreItemFromPlaylist">restoreItemFromPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~unlikePlaylist">unlikePlaylist</a></li></ul></li><li><a href="module-ProgressRow.html">ProgressRow</a></li><li><a href="module-Railcontent-Services.html">Railcontent-Services</a><ul class='methods'><li data-type='method'><a href="module-Railcontent-Services.html#.assignModeratorToComment">assignModeratorToComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.closeComment">closeComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.createComment">createComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.deleteComment">deleteComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.editComment">editComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchAllCompletedStates">fetchAllCompletedStates</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCarouselCardData">fetchCarouselCardData</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchComment">fetchComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCommentRelies">fetchCommentRelies</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchComments">fetchComments</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCompletedContent">fetchCompletedContent</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCompletedState">fetchCompletedState</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchContentInProgress">fetchContentInProgress</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchContentPageUserData">fetchContentPageUserData</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchNextContentDataForParent">fetchNextContentDataForParent</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchRecentUserActivities">fetchRecentUserActivities</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchSongsInProgress">fetchSongsInProgress</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchTopComment">fetchTopComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchUserAward">fetchUserAward</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchUserBadges">fetchUserBadges</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchUserPracticeNotes">fetchUserPracticeNotes</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.likeComment">likeComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.openComment">openComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.postContentComplete">postContentComplete</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.postContentReset">postContentReset</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.postContentRestore">postContentRestore</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.postContentStart">postContentStart</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.replyToComment">replyToComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.reportComment">reportComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.restoreComment">restoreComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.setStudentViewForUser">setStudentViewForUser</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.unassignModeratorToComment">unassignModeratorToComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.unlikeComment">unlikeComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#~fetchLastInteractedChild">fetchLastInteractedChild</a></li></ul></li><li><a href="module-Sanity-Services.html">Sanity-Services</a><ul class='methods'><li data-type='method'><a href="module-Sanity-Services.html#.fetchAll">fetchAll</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchAllFilterOptions">fetchAllFilterOptions</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchAllPacks">fetchAllPacks</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchArtistLessons">fetchArtistLessons</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchArtists">fetchArtists</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchByRailContentId">fetchByRailContentId</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchByRailContentIds">fetchByRailContentIds</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchByReference">fetchByReference</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchCoachLessons">fetchCoachLessons</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchComingSoon">fetchComingSoon</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchCommentModContentData">fetchCommentModContentData</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchFoundation">fetchFoundation</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchGenreLessons">fetchGenreLessons</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchLeaving">fetchLeaving</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchLessonContent">fetchLessonContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchLessonsFeaturingThisContent">fetchLessonsFeaturingThisContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMetadata">fetchMetadata</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethod">fetchMethod</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodChildren">fetchMethodChildren</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodChildrenIds">fetchMethodChildrenIds</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodPreviousNextLesson">fetchMethodPreviousNextLesson</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodV2IntroVideo">fetchMethodV2IntroVideo</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodV2Structure">fetchMethodV2Structure</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchNewReleases">fetchNewReleases</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchNextPreviousLesson">fetchNextPreviousLesson</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchOtherSongVersions">fetchOtherSongVersions</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchPackAll">fetchPackAll</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchPackData">fetchPackData</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchRelatedLessons">fetchRelatedLessons</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchRelatedRecommendedContent">fetchRelatedRecommendedContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchRelatedSongs">fetchRelatedSongs</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchReturning">fetchReturning</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSanity">fetchSanity</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchScheduledReleases">fetchScheduledReleases</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchShowsData">fetchShowsData</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSiblingContent">fetchSiblingContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSongArtistCount">fetchSongArtistCount</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSongById">fetchSongById</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchUpcomingEvents">fetchUpcomingEvents</a></li><li data-type='method'><a href="module-Sanity-Services.html#.jumpToContinueContent">jumpToContinueContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#~fetchRelatedByLicense">fetchRelatedByLicense</a></li><li data-type='method'><a href="module-Sanity-Services.html#~getQueryFromPage">getQueryFromPage</a></li></ul></li><li><a href="module-Sessions.html">Sessions</a><ul class='methods'><li data-type='method'><a href="module-Sessions.html#.login">login</a></li><li data-type='method'><a href="module-Sessions.html#.logout">logout</a></li></ul></li><li><a href="module-UserActivity.html">UserActivity</a><ul class='methods'><li data-type='method'><a href="module-UserActivity.html#.calculateLongestStreaks">calculateLongestStreaks</a></li><li data-type='method'><a href="module-UserActivity.html#.createPracticeNotes">createPracticeNotes</a></li><li data-type='method'><a href="module-UserActivity.html#.deletePracticeSession">deletePracticeSession</a></li><li data-type='method'><a href="module-UserActivity.html#.deleteUserActivity">deleteUserActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.getPracticeNotes">getPracticeNotes</a></li><li data-type='method'><a href="module-UserActivity.html#.getPracticeSessions">getPracticeSessions</a></li><li data-type='method'><a href="module-UserActivity.html#.getProgressRows">getProgressRows</a></li><li data-type='method'><a href="module-UserActivity.html#.getRecentActivity">getRecentActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.getUserMonthlyStats">getUserMonthlyStats</a></li><li data-type='method'><a href="module-UserActivity.html#.getUserWeeklyStats">getUserWeeklyStats</a></li><li data-type='method'><a href="module-UserActivity.html#.pinProgressRow">pinProgressRow</a></li><li data-type='method'><a href="module-UserActivity.html#.recordUserActivity">recordUserActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.recordUserPractice">recordUserPractice</a></li><li data-type='method'><a href="module-UserActivity.html#.removeUserPractice">removeUserPractice</a></li><li data-type='method'><a href="module-UserActivity.html#.restorePracticeSession">restorePracticeSession</a></li><li data-type='method'><a href="module-UserActivity.html#.restoreUserActivity">restoreUserActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.restoreUserPractice">restoreUserPractice</a></li><li data-type='method'><a href="module-UserActivity.html#.unpinProgressRow">unpinProgressRow</a></li><li data-type='method'><a href="module-UserActivity.html#.updatePracticeNotes">updatePracticeNotes</a></li><li data-type='method'><a href="module-UserActivity.html#.updateUserPractice">updateUserPractice</a></li></ul></li><li><a href="module-UserChat.html">UserChat</a><ul class='methods'><li data-type='method'><a href="module-UserChat.html#.fetchChatSettings">fetchChatSettings</a></li></ul></li><li><a href="module-UserManagement.html">UserManagement</a><ul class='methods'><li data-type='method'><a href="module-UserManagement.html#.blockUser">blockUser</a></li><li data-type='method'><a href="module-UserManagement.html#.blockedUsers">blockedUsers</a></li><li data-type='method'><a href="module-UserManagement.html#.deletePicture">deletePicture</a></li><li data-type='method'><a href="module-UserManagement.html#.getUserData">getUserData</a></li><li data-type='method'><a href="module-UserManagement.html#.getUserSignature">getUserSignature</a></li><li data-type='method'><a href="module-UserManagement.html#.isUsernameAvailable">isUsernameAvailable</a></li><li data-type='method'><a href="module-UserManagement.html#.setUserSignature">setUserSignature</a></li><li data-type='method'><a href="module-UserManagement.html#.toggleSignaturePrivate">toggleSignaturePrivate</a></li><li data-type='method'><a href="module-UserManagement.html#.unblockUser">unblockUser</a></li><li data-type='method'><a href="module-UserManagement.html#.updateDisplayName">updateDisplayName</a></li><li data-type='method'><a href="module-UserManagement.html#.uploadPicture">uploadPicture</a></li><li data-type='method'><a href="module-UserManagement.html#.uploadPictureFromS3">uploadPictureFromS3</a></li></ul></li><li><a href="module-UserMemberships.html">UserMemberships</a><ul class='methods'><li data-type='method'><a href="module-UserMemberships.html#~fetchMemberships">fetchMemberships</a></li><li data-type='method'><a href="module-UserMemberships.html#~fetchRechargeTokens">fetchRechargeTokens</a></li><li data-type='method'><a href="module-UserMemberships.html#~restorePurchases">restorePurchases</a></li><li data-type='method'><a href="module-UserMemberships.html#~upgradeSubscription">upgradeSubscription</a></li></ul></li><li><a href="module-UserNotifications.html">UserNotifications</a><ul class='methods'><li data-type='method'><a href="module-UserNotifications.html#.deleteNotification">deleteNotification</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchLiveEventPollingState">fetchLiveEventPollingState</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchNotificationSettings">fetchNotificationSettings</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchNotifications">fetchNotifications</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchUnreadCount">fetchUnreadCount</a></li><li data-type='method'><a href="module-UserNotifications.html#.markAllNotificationsAsRead">markAllNotificationsAsRead</a></li><li data-type='method'><a href="module-UserNotifications.html#.markNotificationAsRead">markNotificationAsRead</a></li><li data-type='method'><a href="module-UserNotifications.html#.markNotificationAsUnread">markNotificationAsUnread</a></li><li data-type='method'><a href="module-UserNotifications.html#.pauseLiveEventPolling">pauseLiveEventPolling</a></li><li data-type='method'><a href="module-UserNotifications.html#.restoreNotification">restoreNotification</a></li><li data-type='method'><a href="module-UserNotifications.html#.startLiveEventPolling">startLiveEventPolling</a></li><li data-type='method'><a href="module-UserNotifications.html#.updateNotificationSetting">updateNotificationSetting</a></li></ul></li><li><a href="module-UserProfile.html">UserProfile</a><ul class='methods'><li data-type='method'><a href="module-UserProfile.html#.deleteProfilePicture">deleteProfilePicture</a></li><li data-type='method'><a href="module-UserProfile.html#.otherStats">otherStats</a></li></ul></li></ul><h3>Namespaces</h3><ul><li><a href="ContentOrganization.html">ContentOrganization</a></li><li><a href="Forums.html">Forums</a></li><li><a href="Gamification.html">Gamification</a></li><li><a href="UserManagementSystem.html">UserManagementSystem</a></li></ul><h3>Interfaces</h3><ul><li><a href="TestUser.html">TestUser</a></li></ul><h3>Global</h3><ul><li><a href="global.html#createTestUser">createTestUser</a></li></ul>
32
+ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-Accounts.html">Accounts</a><ul class='methods'><li data-type='method'><a href="module-Accounts.html#~confirmEmailChange">confirmEmailChange</a></li><li data-type='method'><a href="module-Accounts.html#~deleteAccount">deleteAccount</a></li><li data-type='method'><a href="module-Accounts.html#~numberOfActiveUsers">numberOfActiveUsers</a></li><li data-type='method'><a href="module-Accounts.html#~requestEmailChange">requestEmailChange</a></li><li data-type='method'><a href="module-Accounts.html#~resetPassword">resetPassword</a></li><li data-type='method'><a href="module-Accounts.html#~sendAccountSetupEmail">sendAccountSetupEmail</a></li><li data-type='method'><a href="module-Accounts.html#~sendPasswordResetEmail">sendPasswordResetEmail</a></li><li data-type='method'><a href="module-Accounts.html#~setupAccount">setupAccount</a></li><li data-type='method'><a href="module-Accounts.html#~status">status</a></li><li data-type='method'><a href="module-Accounts.html#~toggleStudentView">toggleStudentView</a></li></ul></li><li><a href="module-Artist.html">Artist</a><ul class='methods'><li data-type='method'><a href="module-Artist.html#~fetchArtistBySlug">fetchArtistBySlug</a></li><li data-type='method'><a href="module-Artist.html#~fetchArtistLessons">fetchArtistLessons</a></li><li data-type='method'><a href="module-Artist.html#~fetchArtists">fetchArtists</a></li></ul></li><li><a href="module-Awards.html">Awards</a><ul class='methods'><li data-type='method'><a href="module-Awards.html#~fetchAwardsForUser">fetchAwardsForUser</a></li><li data-type='method'><a href="module-Awards.html#~fetchCertificate">fetchCertificate</a></li><li data-type='method'><a href="module-Awards.html#~getAwardDataForGuidedContent">getAwardDataForGuidedContent</a></li></ul></li><li><a href="module-Config.html">Config</a><ul class='methods'><li data-type='method'><a href="module-Config.html#.initializeService">initializeService</a></li></ul></li><li><a href="module-Content-Services-V2.html">Content-Services-V2</a><ul class='methods'><li data-type='method'><a href="module-Content-Services-V2.html#.getContentRows">getContentRows</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getLegacyMethods">getLegacyMethods</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getNewAndUpcoming">getNewAndUpcoming</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getOwnedContent">getOwnedContent</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getRecent">getRecent</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getRecommendedForYou">getRecommendedForYou</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getScheduleContentRows">getScheduleContentRows</a></li><li data-type='method'><a href="module-Content-Services-V2.html#.getTabResults">getTabResults</a></li></ul></li><li><a href="module-Forums.html">Forums</a><ul class='methods'><li data-type='method'><a href="module-Forums.html#~createForumCategory">createForumCategory</a></li><li data-type='method'><a href="module-Forums.html#~createPost">createPost</a></li><li data-type='method'><a href="module-Forums.html#~createThread">createThread</a></li><li data-type='method'><a href="module-Forums.html#~deleteForumCategory">deleteForumCategory</a></li><li data-type='method'><a href="module-Forums.html#~deletePost">deletePost</a></li><li data-type='method'><a href="module-Forums.html#~deleteThread">deleteThread</a></li><li data-type='method'><a href="module-Forums.html#~fetchCommunityGuidelines">fetchCommunityGuidelines</a></li><li data-type='method'><a href="module-Forums.html#~fetchFollowedThreads">fetchFollowedThreads</a></li><li data-type='method'><a href="module-Forums.html#~fetchForumCategories">fetchForumCategories</a></li><li data-type='method'><a href="module-Forums.html#~fetchLatestThreads">fetchLatestThreads</a></li><li data-type='method'><a href="module-Forums.html#~fetchPosts">fetchPosts</a></li><li data-type='method'><a href="module-Forums.html#~fetchThreads">fetchThreads</a></li><li data-type='method'><a href="module-Forums.html#~followThread">followThread</a></li><li data-type='method'><a href="module-Forums.html#~jumpToPost">jumpToPost</a></li><li data-type='method'><a href="module-Forums.html#~likePost">likePost</a></li><li data-type='method'><a href="module-Forums.html#~lockThread">lockThread</a></li><li data-type='method'><a href="module-Forums.html#~markThreadAsRead">markThreadAsRead</a></li><li data-type='method'><a href="module-Forums.html#~pinThread">pinThread</a></li><li data-type='method'><a href="module-Forums.html#~search">search</a></li><li data-type='method'><a href="module-Forums.html#~unfollowThread">unfollowThread</a></li><li data-type='method'><a href="module-Forums.html#~unlikePost">unlikePost</a></li><li data-type='method'><a href="module-Forums.html#~unlockThread">unlockThread</a></li><li data-type='method'><a href="module-Forums.html#~unpinThread">unpinThread</a></li><li data-type='method'><a href="module-Forums.html#~updateForumCategory">updateForumCategory</a></li><li data-type='method'><a href="module-Forums.html#~updatePost">updatePost</a></li><li data-type='method'><a href="module-Forums.html#~updateThread">updateThread</a></li></ul></li><li></li><li></li><li><a href="module-Genre.html">Genre</a><ul class='methods'><li data-type='method'><a href="module-Genre.html#~fetchGenreBySlug">fetchGenreBySlug</a></li><li data-type='method'><a href="module-Genre.html#~fetchGenreLessons">fetchGenreLessons</a></li><li data-type='method'><a href="module-Genre.html#~fetchGenres">fetchGenres</a></li></ul></li><li><a href="module-GuidedCourses.html">GuidedCourses</a></li><li><a href="module-Instructor.html">Instructor</a><ul class='methods'><li data-type='method'><a href="module-Instructor.html#~fetchInstructorBySlug">fetchInstructorBySlug</a></li><li data-type='method'><a href="module-Instructor.html#~fetchInstructorLessons">fetchInstructorLessons</a></li><li data-type='method'><a href="module-Instructor.html#~fetchInstructors">fetchInstructors</a></li></ul></li><li><a href="module-Interests.html">Interests</a><ul class='methods'><li data-type='method'><a href="module-Interests.html#.fetchInterests">fetchInterests</a></li><li data-type='method'><a href="module-Interests.html#.fetchUninterests">fetchUninterests</a></li><li data-type='method'><a href="module-Interests.html#.markContentAsInterested">markContentAsInterested</a></li><li data-type='method'><a href="module-Interests.html#.markContentAsNotInterested">markContentAsNotInterested</a></li><li data-type='method'><a href="module-Interests.html#.removeContentAsInterested">removeContentAsInterested</a></li><li data-type='method'><a href="module-Interests.html#.removeContentAsNotInterested">removeContentAsNotInterested</a></li></ul></li><li><a href="module-LearningPaths.html">LearningPaths</a><ul class='methods'><li data-type='method'><a href="module-LearningPaths.html#~completeLearningPathIntroVideo">completeLearningPathIntroVideo</a></li><li data-type='method'><a href="module-LearningPaths.html#~completeMethodIntroVideo">completeMethodIntroVideo</a></li><li data-type='method'><a href="module-LearningPaths.html#~fetchLearningPathLessons">fetchLearningPathLessons</a></li><li data-type='method'><a href="module-LearningPaths.html#~fetchLearningPathProgressCheckLessons">fetchLearningPathProgressCheckLessons</a></li><li data-type='method'><a href="module-LearningPaths.html#~getActivePath">getActivePath</a></li><li data-type='method'><a href="module-LearningPaths.html#~getDailySession">getDailySession</a></li><li data-type='method'><a href="module-LearningPaths.html#~getEnrichedLearningPath">getEnrichedLearningPath</a></li><li data-type='method'><a href="module-LearningPaths.html#~getLearningPathLessonsByIds">getLearningPathLessonsByIds</a></li><li data-type='method'><a href="module-LearningPaths.html#~mapContentToParent">mapContentToParent</a></li><li data-type='method'><a href="module-LearningPaths.html#~resetAllLearningPaths">resetAllLearningPaths</a></li><li data-type='method'><a href="module-LearningPaths.html#~startLearningPath">startLearningPath</a></li><li data-type='method'><a href="module-LearningPaths.html#~updateDailySession">updateDailySession</a></li></ul></li><li><a href="module-Onboarding.html">Onboarding</a><ul class='methods'><li data-type='method'><a href="module-Onboarding.html#~getOnboardingRecommendedContent">getOnboardingRecommendedContent</a></li><li data-type='method'><a href="module-Onboarding.html#~startOnboarding">startOnboarding</a></li><li data-type='method'><a href="module-Onboarding.html#~updateOnboarding">updateOnboarding</a></li><li data-type='method'><a href="module-Onboarding.html#~userOnboardingForBrand">userOnboardingForBrand</a></li></ul></li><li><a href="module-Payments.html">Payments</a><ul class='methods'><li data-type='method'><a href="module-Payments.html#~fetchCustomerPayments">fetchCustomerPayments</a></li></ul></li><li><a href="module-Permissions.html">Permissions</a><ul class='methods'><li data-type='method'><a href="module-Permissions.html#.fetchUserPermissions">fetchUserPermissions</a></li><li data-type='method'><a href="module-Permissions.html#.reset">reset</a></li></ul></li><li><a href="module-Playlists.html">Playlists</a><ul class='methods'><li data-type='method'><a href="module-Playlists.html#.addItemToPlaylist">addItemToPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.createPlaylist">createPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.deletePlaylist">deletePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.duplicatePlaylist">duplicatePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.fetchPlaylist">fetchPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.fetchPlaylistItems">fetchPlaylistItems</a></li><li data-type='method'><a href="module-Playlists.html#.fetchUserPlaylists">fetchUserPlaylists</a></li><li data-type='method'><a href="module-Playlists.html#.togglePlaylistPrivate">togglePlaylistPrivate</a></li><li data-type='method'><a href="module-Playlists.html#.undeletePlaylist">undeletePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#.updatePlaylist">updatePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~deleteItemsFromPlaylist">deleteItemsFromPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~likePlaylist">likePlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~reportPlaylist">reportPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~restoreItemFromPlaylist">restoreItemFromPlaylist</a></li><li data-type='method'><a href="module-Playlists.html#~unlikePlaylist">unlikePlaylist</a></li></ul></li><li><a href="module-ProgressRow.html">ProgressRow</a></li><li><a href="module-Railcontent-Services.html">Railcontent-Services</a><ul class='methods'><li data-type='method'><a href="module-Railcontent-Services.html#.assignModeratorToComment">assignModeratorToComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.closeComment">closeComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.createComment">createComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.deleteComment">deleteComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.editComment">editComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchAllCompletedStates">fetchAllCompletedStates</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCarouselCardData">fetchCarouselCardData</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchComment">fetchComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCommentRelies">fetchCommentRelies</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchComments">fetchComments</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCompletedContent">fetchCompletedContent</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchCompletedState">fetchCompletedState</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchContentInProgress">fetchContentInProgress</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchContentPageUserData">fetchContentPageUserData</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchNextContentDataForParent">fetchNextContentDataForParent</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchRecentUserActivities">fetchRecentUserActivities</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchSongsInProgress">fetchSongsInProgress</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchTopComment">fetchTopComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchUserAward">fetchUserAward</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchUserBadges">fetchUserBadges</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.fetchUserPracticeNotes">fetchUserPracticeNotes</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.likeComment">likeComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.openComment">openComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.replyToComment">replyToComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.reportComment">reportComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.restoreComment">restoreComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.setStudentViewForUser">setStudentViewForUser</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.unassignModeratorToComment">unassignModeratorToComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#.unlikeComment">unlikeComment</a></li><li data-type='method'><a href="module-Railcontent-Services.html#~fetchLastInteractedChild">fetchLastInteractedChild</a></li></ul></li><li><a href="module-Sanity-Services.html">Sanity-Services</a><ul class='methods'><li data-type='method'><a href="module-Sanity-Services.html#.fetchAll">fetchAll</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchAllFilterOptions">fetchAllFilterOptions</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchAllPacks">fetchAllPacks</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchByRailContentId">fetchByRailContentId</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchByRailContentIds">fetchByRailContentIds</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchByReference">fetchByReference</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchComingSoon">fetchComingSoon</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchCommentModContentData">fetchCommentModContentData</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchFoundation">fetchFoundation</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchLeaving">fetchLeaving</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchLessonContent">fetchLessonContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchLessonsFeaturingThisContent">fetchLessonsFeaturingThisContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMetadata">fetchMetadata</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethod">fetchMethod</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodChildren">fetchMethodChildren</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodChildrenIds">fetchMethodChildrenIds</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodPreviousNextLesson">fetchMethodPreviousNextLesson</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodV2IntroVideo">fetchMethodV2IntroVideo</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodV2Structure">fetchMethodV2Structure</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchMethodV2StructureFromId">fetchMethodV2StructureFromId</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchNewReleases">fetchNewReleases</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchNextPreviousLesson">fetchNextPreviousLesson</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchOtherSongVersions">fetchOtherSongVersions</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchOwnedContent">fetchOwnedContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchPackAll">fetchPackAll</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchPackData">fetchPackData</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchRelatedLessons">fetchRelatedLessons</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchRelatedRecommendedContent">fetchRelatedRecommendedContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchRelatedSongs">fetchRelatedSongs</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchReturning">fetchReturning</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSanity">fetchSanity</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchScheduledReleases">fetchScheduledReleases</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchShowsData">fetchShowsData</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSiblingContent">fetchSiblingContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSongArtistCount">fetchSongArtistCount</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchSongById">fetchSongById</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchTopLevelParentId">fetchTopLevelParentId</a></li><li data-type='method'><a href="module-Sanity-Services.html#.fetchUpcomingEvents">fetchUpcomingEvents</a></li><li data-type='method'><a href="module-Sanity-Services.html#.jumpToContinueContent">jumpToContinueContent</a></li><li data-type='method'><a href="module-Sanity-Services.html#~fetchRelatedByLicense">fetchRelatedByLicense</a></li><li data-type='method'><a href="module-Sanity-Services.html#~getQueryFromPage">getQueryFromPage</a></li></ul></li><li><a href="module-Sessions.html">Sessions</a><ul class='methods'><li data-type='method'><a href="module-Sessions.html#.login">login</a></li><li data-type='method'><a href="module-Sessions.html#.logout">logout</a></li></ul></li><li><a href="module-UserActivity.html">UserActivity</a><ul class='methods'><li data-type='method'><a href="module-UserActivity.html#.calculateLongestStreaks">calculateLongestStreaks</a></li><li data-type='method'><a href="module-UserActivity.html#.createPracticeNotes">createPracticeNotes</a></li><li data-type='method'><a href="module-UserActivity.html#.deletePracticeSession">deletePracticeSession</a></li><li data-type='method'><a href="module-UserActivity.html#.deleteUserActivity">deleteUserActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.getPracticeNotes">getPracticeNotes</a></li><li data-type='method'><a href="module-UserActivity.html#.getPracticeSessions">getPracticeSessions</a></li><li data-type='method'><a href="module-UserActivity.html#.getProgressRows">getProgressRows</a></li><li data-type='method'><a href="module-UserActivity.html#.getRecentActivity">getRecentActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.getUserMonthlyStats">getUserMonthlyStats</a></li><li data-type='method'><a href="module-UserActivity.html#.getUserWeeklyStats">getUserWeeklyStats</a></li><li data-type='method'><a href="module-UserActivity.html#.pinProgressRow">pinProgressRow</a></li><li data-type='method'><a href="module-UserActivity.html#.recordUserActivity">recordUserActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.recordUserPractice">recordUserPractice</a></li><li data-type='method'><a href="module-UserActivity.html#.removeUserPractice">removeUserPractice</a></li><li data-type='method'><a href="module-UserActivity.html#.restorePracticeSession">restorePracticeSession</a></li><li data-type='method'><a href="module-UserActivity.html#.restoreUserActivity">restoreUserActivity</a></li><li data-type='method'><a href="module-UserActivity.html#.restoreUserPractice">restoreUserPractice</a></li><li data-type='method'><a href="module-UserActivity.html#.unpinProgressRow">unpinProgressRow</a></li><li data-type='method'><a href="module-UserActivity.html#.updatePracticeNotes">updatePracticeNotes</a></li><li data-type='method'><a href="module-UserActivity.html#.updateUserPractice">updateUserPractice</a></li></ul></li><li><a href="module-UserChat.html">UserChat</a><ul class='methods'><li data-type='method'><a href="module-UserChat.html#.fetchChatSettings">fetchChatSettings</a></li></ul></li><li><a href="module-UserManagement.html">UserManagement</a><ul class='methods'><li data-type='method'><a href="module-UserManagement.html#.blockUser">blockUser</a></li><li data-type='method'><a href="module-UserManagement.html#.blockedUsers">blockedUsers</a></li><li data-type='method'><a href="module-UserManagement.html#.deletePicture">deletePicture</a></li><li data-type='method'><a href="module-UserManagement.html#.getUserData">getUserData</a></li><li data-type='method'><a href="module-UserManagement.html#.getUserSignature">getUserSignature</a></li><li data-type='method'><a href="module-UserManagement.html#.isUsernameAvailable">isUsernameAvailable</a></li><li data-type='method'><a href="module-UserManagement.html#.setUserSignature">setUserSignature</a></li><li data-type='method'><a href="module-UserManagement.html#.toggleSignaturePrivate">toggleSignaturePrivate</a></li><li data-type='method'><a href="module-UserManagement.html#.unblockUser">unblockUser</a></li><li data-type='method'><a href="module-UserManagement.html#.updateDisplayName">updateDisplayName</a></li><li data-type='method'><a href="module-UserManagement.html#.uploadPicture">uploadPicture</a></li><li data-type='method'><a href="module-UserManagement.html#.uploadPictureFromS3">uploadPictureFromS3</a></li></ul></li><li><a href="module-UserMemberships.html">UserMemberships</a><ul class='methods'><li data-type='method'><a href="module-UserMemberships.html#~fetchMemberships">fetchMemberships</a></li><li data-type='method'><a href="module-UserMemberships.html#~fetchRechargeTokens">fetchRechargeTokens</a></li><li data-type='method'><a href="module-UserMemberships.html#~restorePurchases">restorePurchases</a></li><li data-type='method'><a href="module-UserMemberships.html#~upgradeSubscription">upgradeSubscription</a></li></ul></li><li><a href="module-UserNotifications.html">UserNotifications</a><ul class='methods'><li data-type='method'><a href="module-UserNotifications.html#.deleteNotification">deleteNotification</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchLiveEventPollingState">fetchLiveEventPollingState</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchNotificationSettings">fetchNotificationSettings</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchNotifications">fetchNotifications</a></li><li data-type='method'><a href="module-UserNotifications.html#.fetchUnreadCount">fetchUnreadCount</a></li><li data-type='method'><a href="module-UserNotifications.html#.markAllNotificationsAsRead">markAllNotificationsAsRead</a></li><li data-type='method'><a href="module-UserNotifications.html#.markNotificationAsRead">markNotificationAsRead</a></li><li data-type='method'><a href="module-UserNotifications.html#.markNotificationAsUnread">markNotificationAsUnread</a></li><li data-type='method'><a href="module-UserNotifications.html#.pauseLiveEventPolling">pauseLiveEventPolling</a></li><li data-type='method'><a href="module-UserNotifications.html#.restoreNotification">restoreNotification</a></li><li data-type='method'><a href="module-UserNotifications.html#.startLiveEventPolling">startLiveEventPolling</a></li><li data-type='method'><a href="module-UserNotifications.html#.updateNotificationSetting">updateNotificationSetting</a></li></ul></li><li><a href="module-UserProfile.html">UserProfile</a><ul class='methods'><li data-type='method'><a href="module-UserProfile.html#.deleteProfilePicture">deleteProfilePicture</a></li><li data-type='method'><a href="module-UserProfile.html#.otherStats">otherStats</a></li></ul></li></ul><h3>Namespaces</h3><ul><li><a href="ContentOrganization.html">ContentOrganization</a></li><li><a href="Forums.html">Forums</a></li><li><a href="Gamification.html">Gamification</a></li><li><a href="UserManagementSystem.html">UserManagementSystem</a></li></ul><h3>Interfaces</h3><ul><li><a href="TestUser.html">TestUser</a></li></ul><h3>Global</h3><ul><li><a href="global.html#createTestUser">createTestUser</a></li></ul>
33
33
 
34
34
  </nav>
35
35
 
@@ -51,7 +51,6 @@
51
51
 
52
52
  import {
53
53
  fetchUserPractices,
54
- logUserPractice,
55
54
  fetchUserPracticeMeta,
56
55
  fetchUserPracticeNotes,
57
56
  fetchHandler,
@@ -85,13 +84,11 @@ import {
85
84
  import { getAllStartedOrCompleted, getProgressStateByIds } from './contentProgress'
86
85
  import { TabResponseType } from '../contentMetaData'
87
86
  import dayjs from 'dayjs'
88
- import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'
89
- import weekOfYear from 'dayjs/plugin/weekOfYear'
90
87
  import { addContextToContent } from './contentAggregator.js'
91
88
  import { getMethodCard } from './progress-row/method-card.js'
89
+ import { db, Q } from './sync'
92
90
 
93
91
  const DATA_KEY_PRACTICES = 'practices'
94
- const DATA_KEY_LAST_UPDATED_TIME = 'u'
95
92
 
96
93
  const DAYS = ['M', 'T', 'W', 'T', 'F', 'S', 'S']
97
94
 
@@ -124,17 +121,29 @@ function getIndefiniteArticle(streak) {
124
121
  : 'a'
125
122
  }
126
123
 
127
- export async function getUserPractices(userId = globalConfig.sessionConfig.userId) {
128
- if (userId !== globalConfig.sessionConfig.userId) {
129
- let data = await fetchUserPractices(0, { userId: userId })
130
- return data?.['data']?.[DATA_KEY_PRACTICES] ?? {}
124
+ async function getUserPractices(userId) {
125
+ if (userId === globalConfig.sessionConfig.userId) {
126
+ return getOwnPractices()
131
127
  } else {
132
- let data = await userActivityContext.getData()
133
- return data?.[DATA_KEY_PRACTICES] ?? {}
128
+ return await fetchUserPractices(userId)
134
129
  }
135
130
  }
136
131
 
137
- export let userActivityContext = new DataContext(UserActivityVersionKey, fetchUserPractices)
132
+ async function getOwnPractices(...clauses) {
133
+ const query = await db.practices.queryAll(...clauses)
134
+ const data = query.data.reduce((acc, practice) => {
135
+ acc[practice.date] = acc[practice.date] || []
136
+ acc[practice.date].push({
137
+ id: practice.id,
138
+ duration_seconds: practice.duration_seconds,
139
+ })
140
+ return acc
141
+ }, {})
142
+
143
+ return data
144
+ }
145
+
146
+ export let userActivityContext = new DataContext(UserActivityVersionKey, function() {})
138
147
 
139
148
  /**
140
149
  * Retrieves user activity statistics for the current week, including daily activity and streak messages.
@@ -149,20 +158,21 @@ export let userActivityContext = new DataContext(UserActivityVersionKey, fetchUs
149
158
  */
150
159
  export async function getUserWeeklyStats() {
151
160
  const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone
152
- let data = await userActivityContext.getData()
153
- let practices = data?.[DATA_KEY_PRACTICES] ?? {}
154
- let sortedPracticeDays = Object.keys(practices)
155
- .map((date) => toDayjs(date)) // Convert to dayjs instance
156
- .sort((a, b) => b.valueOf() - a.valueOf())
157
- let today = dayjs()
158
- let startOfWeek = getMonday(today, timeZone) // Get last Monday
161
+ const today = dayjs()
162
+ const startOfWeek = getMonday(today, timeZone)
163
+ const weekDays = Array.from({ length: 7 }, (_, i) => startOfWeek.add(i, 'day').format('YYYY-MM-DD'))
164
+
165
+ const practices = await getOwnPractices(
166
+ Q.where('date', Q.oneOf(weekDays)),
167
+ Q.sortBy('date', 'desc')
168
+ )
169
+ const practiceDaysSet = new Set(Object.keys(practices))
159
170
  let dailyStats = []
160
171
  for (let i = 0; i &lt; 7; i++) {
161
172
  const day = startOfWeek.add(i, 'day')
162
- let hasPractice = sortedPracticeDays.some((practiceDate) =>
163
- isSameDate(practiceDate, day.format('YYYY-MM-DD'))
164
- )
165
- let isActive = isSameDate(today.format(), day.format())
173
+ const dayStr = day.format('YYYY-MM-DD')
174
+ let hasPractice = practiceDaysSet.has(dayStr)
175
+ let isActive = isSameDate(today.format(), dayStr)
166
176
  let type = hasPractice ? 'tracked' : isActive ? 'active' : 'none'
167
177
  dailyStats.push({
168
178
  key: i,
@@ -170,7 +180,7 @@ export async function getUserWeeklyStats() {
170
180
  isActive,
171
181
  inStreak: hasPractice,
172
182
  type,
173
- day: day.format('YYYY-MM-DD'),
183
+ day: dayStr,
174
184
  })
175
185
  }
176
186
 
@@ -311,82 +321,50 @@ export async function getUserMonthlyStats(params = {}) {
311
321
  }
312
322
 
313
323
  /**
314
- * Records user practice data and updates both the remote and local activity context.
324
+ * Records a manual user practice data, updating the local database and syncing with remote.
315
325
  *
316
326
  * @param {Object} practiceDetails - The details of the practice session.
317
327
  * @param {number} practiceDetails.duration_seconds - The duration of the practice session in seconds.
318
- * @param {boolean} [practiceDetails.auto=true] - Whether the session was automatically logged.
319
- * @param {number} [practiceDetails.content_id] - The ID of the practiced content (if available).
320
- * @param {number} [practiceDetails.category_id] - The ID of the associated category (if available).
321
328
  * @param {string} [practiceDetails.title] - The title of the practice session (max 64 characters).
329
+ * @param {number} [practiceDetails.category_id] - The ID of the associated category (if available).
322
330
  * @param {string} [practiceDetails.thumbnail_url] - The URL of the session's thumbnail (max 255 characters).
331
+ * @param {number} [practiceDetails.instrument_id] - The ID of the associated instrument (if available).
323
332
  * @returns {Promise&lt;Object>} - A promise that resolves to the response from logging the user practice.
324
333
  *
325
334
  * @example
326
- * // Record an auto practice session with content ID
327
- * recordUserPractice({ content_id: 123, duration_seconds: 300 })
335
+ * // Record a manual practice session with a title
336
+ * recordUserPractice({ title: "Some title", duration_seconds: 300 })
328
337
  * .then(response => console.log(response))
329
338
  * .catch(error => console.error(error));
330
339
  *
331
- * @example
332
- * // Record a custom practice session with additional details
333
- * recordUserPractice({
334
- * duration_seconds: 600,
335
- * auto: false,
336
- * category_id: 5,
337
- * title: "Guitar Warm-up",
338
- * thumbnail_url: "https://example.com/thumbnail.jpg",
339
- * instrument_id: 1,
340
- * instrument_id: 2,
341
- * })
342
- * .then(response => console.log(response))
343
- * .catch(error => console.error(error));
344
340
  */
345
341
  export async function recordUserPractice(practiceDetails) {
346
- practiceDetails.auto = 0
347
- practiceDetails.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone
348
- if (practiceDetails.content_id) {
349
- practiceDetails.auto = 1
350
- }
342
+ const day = new Date().toLocaleDateString('sv-SE'); // YYYY-MM-DD wall clock date in user's timezone
343
+ const durationSeconds = practiceDetails.duration_seconds
344
+
345
+ return await db.practices.recordManualPractice(day, durationSeconds, {
346
+ title: practiceDetails.title ?? null,
347
+ category_id: practiceDetails.category_id ?? null,
348
+ thumbnail_url: practiceDetails.thumbnail_url ?? null,
349
+ instrument_id: practiceDetails.instrument_id ?? null,
350
+ })
351
+ }
351
352
 
352
- await userActivityContext.update(
353
- async function (localContext) {
354
- let userData = localContext.data ?? { [DATA_KEY_PRACTICES]: {} }
355
- localContext.data = userData
356
- },
357
- async function () {
358
- const response = await logUserPractice(practiceDetails)
359
- if (response) {
360
- await userActivityContext.updateLocal(async function (localContext) {
361
- const newPractices = response.data ?? []
362
- newPractices.forEach((newPractice) => {
363
- const { date } = newPractice
364
- if (!localContext.data[DATA_KEY_PRACTICES][date]) {
365
- localContext.data[DATA_KEY_PRACTICES][date] = []
366
- }
367
- localContext.data[DATA_KEY_PRACTICES][date][DATA_KEY_LAST_UPDATED_TIME] = Math.round(
368
- new Date().getTime() / 1000
369
- )
370
- localContext.data[DATA_KEY_PRACTICES][date].push({
371
- id: newPractice.id,
372
- duration_seconds: newPractice.duration_seconds, // Add the new practice for this date
373
- })
374
- })
375
- })
376
- }
377
- return response
378
- }
379
- )
353
+ export async function trackUserPractice(contentId, incSeconds) {
354
+ const day = new Date().toLocaleDateString('sv-SE'); // YYYY-MM-DD wall clock date in user's timezone
355
+ return await db.practices.trackAutoPractice(contentId, day, incSeconds);
380
356
  }
357
+
381
358
  /**
382
359
  * Updates a user's practice session with new details and syncs the changes remotely.
383
360
  *
384
- * @param {number} id - The unique identifier of the practice session to update.
361
+ * @param {string} id - The unique identifier of the practice session to update.
385
362
  * @param {Object} practiceDetails - The updated details of the practice session.
386
363
  * @param {number} [practiceDetails.duration_seconds] - The duration of the practice session in seconds.
387
364
  * @param {number} [practiceDetails.category_id] - The ID of the associated category (if available).
388
365
  * @param {string} [practiceDetails.title] - The title of the practice session (max 64 characters).
389
366
  * @param {string} [practiceDetails.thumbnail_url] - The URL of the session's thumbnail (max 255 characters).
367
+ * @param {number} [practiceDetails.instrument_id] - The ID of the associated instrument (if available).
390
368
  * @returns {Promise&lt;Object>} - A promise that resolves to the response from updating the user practice.
391
369
  *
392
370
  * @example
@@ -395,15 +373,9 @@ export async function recordUserPractice(practiceDetails) {
395
373
  * .then(response => console.log(response))
396
374
  * .catch(error => console.error(error));
397
375
  *
398
- * @example
399
- * // Change a practice session to manual and update its category
400
- * updateUserPractice(456, { auto: false, category_id: 8 })
401
- * .then(response => console.log(response))
402
- * .catch(error => console.error(error));
403
376
  */
404
377
  export async function updateUserPractice(id, practiceDetails) {
405
- const url = `/api/user/practices/v1/practices/${id}`
406
- return await fetchHandler(url, 'PUT', null, practiceDetails)
378
+ return await db.practices.updateDetails(id, practiceDetails)
407
379
  }
408
380
 
409
381
  /**
@@ -419,26 +391,7 @@ export async function updateUserPractice(id, practiceDetails) {
419
391
  * .catch(error => console.error(error));
420
392
  */
421
393
  export async function removeUserPractice(id) {
422
- let url = `/api/user/practices/v1/practices${buildQueryString([id])}`
423
- await userActivityContext.update(
424
- async function (localContext) {
425
- if (localContext.data?.[DATA_KEY_PRACTICES]) {
426
- Object.keys(localContext.data[DATA_KEY_PRACTICES]).forEach((date) => {
427
- const filtered = localContext.data[DATA_KEY_PRACTICES][date].filter(
428
- (practice) => practice.id !== id
429
- )
430
- if (filtered.length > 0) {
431
- localContext.data[DATA_KEY_PRACTICES][date] = filtered
432
- } else {
433
- delete localContext.data[DATA_KEY_PRACTICES][date]
434
- }
435
- })
436
- }
437
- },
438
- async function () {
439
- return await fetchHandler(url, 'delete')
440
- }
441
- )
394
+ return await db.practices.deleteOne(id)
442
395
  }
443
396
 
444
397
  /**
@@ -502,20 +455,8 @@ export async function restoreUserPractice(id) {
502
455
  * .catch(error => console.error("Delete failed:", error));
503
456
  */
504
457
  export async function deletePracticeSession(day) {
505
- const userPracticesIds = await getUserPracticeIds(day)
506
- if (!userPracticesIds.length) return []
507
-
508
- const url = `/api/user/practices/v1/practices${buildQueryString(userPracticesIds)}`
509
- await userActivityContext.update(
510
- async function (localContext) {
511
- if (localContext.data?.[DATA_KEY_PRACTICES]?.[day]) {
512
- delete localContext.data[DATA_KEY_PRACTICES][day]
513
- }
514
- },
515
- async function () {
516
- return await fetchHandler(url, 'DELETE', null)
517
- }
518
- )
458
+ const ids = await db.practices.queryAllIds(Q.where('date', day))
459
+ return await db.practices.deleteSome(ids.data)
519
460
  }
520
461
 
521
462
  /**
@@ -586,13 +527,23 @@ export async function restorePracticeSession(date) {
586
527
  */
587
528
  export async function getPracticeSessions(params = {}) {
588
529
  const { day, userId = globalConfig.sessionConfig.userId } = params
589
- const userPracticesIds = await getUserPracticeIds(day, userId)
590
- if (!userPracticesIds.length) return { data: { practices: [], practiceDuration: 0 } }
591
530
 
592
- const meta = await fetchUserPracticeMeta(userPracticesIds, userId)
593
- if (!meta.data.length) return { data: { practices: [], practiceDuration: 0 } }
531
+ let data
532
+
533
+ if (userId === globalConfig.sessionConfig.userId) {
534
+ const query = await db.practices.queryAll(
535
+ Q.where('date', day),
536
+ Q.sortBy('created_at', 'asc')
537
+ )
538
+ data = query.data
539
+ } else {
540
+ const query = await fetchUserPracticeMeta(day, userId)
541
+ data = query.data
542
+ }
543
+
544
+ if (!data.length) return { data: { practices: [], practiceDuration: 0 } }
594
545
 
595
- const formattedMeta = await formatPracticeMeta(meta.data)
546
+ const formattedMeta = await formatPracticeMeta(data)
596
547
  const practiceDuration = formattedMeta.reduce(
597
548
  (total, practice) => total + (practice.duration || 0),
598
549
  0
@@ -614,9 +565,8 @@ export async function getPracticeSessions(params = {}) {
614
565
  * .then(({ data }) => console.log("Practice notes:", data))
615
566
  * .catch(error => console.error("Failed to get notes:", error));
616
567
  */
617
- export async function getPracticeNotes(day) {
618
- const notes = await fetchUserPracticeNotes(day)
619
- return { data: notes }
568
+ export async function getPracticeNotes(date) {
569
+ return await db.practiceDayNotes.queryOne(Q.where('date', date))
620
570
  }
621
571
 
622
572
  /**
@@ -665,8 +615,10 @@ export async function getRecentActivity({ page = 1, limit = 5, tabName = null }
665
615
  * .catch(error => console.error(error));
666
616
  */
667
617
  export async function createPracticeNotes(payload) {
668
- const url = `/api/user/practices/v1/notes`
669
- return await fetchHandler(url, 'POST', null, payload)
618
+ return await db.practiceDayNotes.upsertOne(payload.date, r => {
619
+ r.date = payload.date
620
+ r.notes = payload.notes
621
+ })
670
622
  }
671
623
 
672
624
  /**
@@ -683,8 +635,9 @@ export async function createPracticeNotes(payload) {
683
635
  * .catch(error => console.error(error));
684
636
  */
685
637
  export async function updatePracticeNotes(payload) {
686
- const url = `/api/user/practices/v1/notes`
687
- return await fetchHandler(url, 'PUT', null, payload)
638
+ return await db.practiceDayNotes.updateOneId(payload.date, r => {
639
+ r.notes = payload.notes
640
+ })
688
641
  }
689
642
 
690
643
  function getStreaksAndMessage(practices) {
@@ -697,24 +650,6 @@ function getStreaksAndMessage(practices) {
697
650
  }
698
651
  }
699
652
 
700
- async function getUserPracticeIds(day = dayjs().format('YYYY-MM-DD'), userId = null) {
701
- let practices = {}
702
- if (userId !== globalConfig.sessionConfig.userId) {
703
- let data = await fetchUserPractices(0, { userId: userId })
704
- practices = data?.['data']?.[DATA_KEY_PRACTICES] ?? {}
705
- } else {
706
- let data = await userActivityContext.getData()
707
- practices = data?.[DATA_KEY_PRACTICES] ?? {}
708
- }
709
- let userPracticesIds = []
710
- Object.keys(practices).forEach((date) => {
711
- if (date === day) {
712
- practices[date].forEach((practice) => userPracticesIds.push(practice.id))
713
- }
714
- })
715
- return userPracticesIds
716
- }
717
-
718
653
  function buildQueryString(ids, paramName = 'practice_ids') {
719
654
  if (!ids.length) return ''
720
655
  return '?' + ids.map((id) => `${paramName}[]=${id}`).join('&amp;')
@@ -1033,7 +968,7 @@ async function extractPinnedItemsAndSortAllItems(
1033
968
  return mergeAndSortItems(combined, limit)
1034
969
  }
1035
970
 
1036
- function generateContentsMap(contents, playlistsContents, methodProgressContents) {
971
+ function generateContentsMap(contents, playlistsContents) {
1037
972
  const excludedTypes = new Set(['pack-bundle', 'guided-course-part'])
1038
973
  const existingShows = new Set()
1039
974
  const contentsMap = new Map()
@@ -1074,15 +1009,6 @@ function generateContentsMap(contents, playlistsContents, methodProgressContents
1074
1009
  parentIds.forEach((id) => contentsMap.delete(id))
1075
1010
  }
1076
1011
  }
1077
- //TODO:: remove method cards from progress rows
1078
- // if (methodProgressContents &amp;&amp; Object.keys(methodProgressContents).length) {
1079
- // for (const item of methodProgressContents) {
1080
- // const contentId = item.id
1081
- // contentsMap.delete(contentId)
1082
- // const parentIds = item.parent_content_data || []
1083
- // parentIds.forEach((id) => contentsMap.delete(id))
1084
- // }
1085
- // }
1086
1012
 
1087
1013
  return contentsMap
1088
1014
  }
@@ -1102,12 +1028,11 @@ function generateContentsMap(contents, playlistsContents, methodProgressContents
1102
1028
  */
1103
1029
  export async function getProgressRows({ brand = 'drumeo', limit = 8 } = {}) {
1104
1030
  // TODO slice progress to a reasonable number, say 100
1105
-
1106
- const [recentPlaylists, progressContents, userPinnedItem, methodCard] = await Promise.all([
1031
+ const methodCardPromise = getMethodCard(brand)
1032
+ const [recentPlaylists, progressContents, userPinnedItem] = await Promise.all([
1107
1033
  fetchUserPlaylists(brand, { sort: '-last_progress', limit: limit }),
1108
- getAllStartedOrCompleted({ onlyIds: false, brand: brand }),
1034
+ getAllStartedOrCompleted({ onlyIds: false, brand: brand, limit }),
1109
1035
  getUserPinnedItem(brand),
1110
- getMethodCard(brand),
1111
1036
  ])
1112
1037
 
1113
1038
  const playlists = recentPlaylists?.data || []
@@ -1123,23 +1048,21 @@ export async function getProgressRows({ brand = 'drumeo', limit = 8 } = {}) {
1123
1048
  }
1124
1049
  //need to update addContextToContent to accept collection info
1125
1050
  const [playlistsContents, contents] = await Promise.all([
1126
- playlistEngagedOnContents
1051
+ (playlistEngagedOnContents.length > 0)
1127
1052
  ? addContextToContent(fetchByRailContentIds, playlistEngagedOnContents, 'progress-tracker', {
1128
- addNextLesson: true,
1129
1053
  addNavigateTo: true,
1130
1054
  addProgressStatus: true,
1131
1055
  addProgressPercentage: true,
1132
1056
  addProgressTimestamp: true,
1133
1057
  })
1134
1058
  : Promise.resolve([]),
1135
- nonPlaylistContentIds
1059
+ (nonPlaylistContentIds.length > 0)
1136
1060
  ? addContextToContent(
1137
1061
  fetchByRailContentIds,
1138
1062
  nonPlaylistContentIds,
1139
1063
  'progress-tracker',
1140
1064
  brand,
1141
1065
  {
1142
- addNextLesson: true,
1143
1066
  addNavigateTo: true,
1144
1067
  addProgressStatus: true,
1145
1068
  addProgressPercentage: true,
@@ -1150,7 +1073,7 @@ export async function getProgressRows({ brand = 'drumeo', limit = 8 } = {}) {
1150
1073
  ])
1151
1074
 
1152
1075
  const contentsMap = generateContentsMap(contents, playlistsContents)
1153
-
1076
+ const methodCard = await methodCardPromise
1154
1077
  let combined = await extractPinnedItemsAndSortAllItems(
1155
1078
  userPinnedItem,
1156
1079
  contentsMap,
@@ -1163,6 +1086,7 @@ export async function getProgressRows({ brand = 'drumeo', limit = 8 } = {}) {
1163
1086
  switch (item.type) {
1164
1087
  case 'playlist':
1165
1088
  return processPlaylistItem(item)
1089
+ case 'learning-path-v2':
1166
1090
  case 'method':
1167
1091
  return item
1168
1092
  default:
@@ -1405,7 +1329,7 @@ function mergeAndSortItems(items, limit) {
1405
1329
 
1406
1330
  export function findIncompleteLesson(progressOnItems, currentContentId, contentType) {
1407
1331
  const ids = Object.keys(progressOnItems).map(Number)
1408
- if (contentType === 'guided-course' || contentType === 'learning-path') {
1332
+ if (contentType === 'guided-course' || contentType === 'learning-path-v2') {
1409
1333
  // Return first incomplete lesson
1410
1334
  return ids.find((id) => progressOnItems[id] !== 'completed') || ids.at(0)
1411
1335
  }
@@ -1575,7 +1499,7 @@ export async function fetchRecentActivitiesActiveTabs() {
1575
1499
  <br class="clear">
1576
1500
 
1577
1501
  <footer>
1578
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.3</a> on Mon Nov 10 2025 16:22:45 GMT+0000 (Coordinated Universal Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1502
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.3</a> on Fri Nov 28 2025 11:22:56 GMT-0800 (Pacific Standard Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1579
1503
  </footer>
1580
1504
 
1581
1505
  <script>prettyPrint();</script>