diff options
Diffstat (limited to 'src/content/dependencies/generateAlbumNavAccent.js')
-rw-r--r-- | src/content/dependencies/generateAlbumNavAccent.js | 164 |
1 files changed, 97 insertions, 67 deletions
diff --git a/src/content/dependencies/generateAlbumNavAccent.js b/src/content/dependencies/generateAlbumNavAccent.js index 121af439..432c5f3d 100644 --- a/src/content/dependencies/generateAlbumNavAccent.js +++ b/src/content/dependencies/generateAlbumNavAccent.js @@ -1,8 +1,10 @@ -import {empty} from '#sugar'; +import {atOffset, empty} from '#sugar'; export default { contentDependencies: [ - 'generatePreviousNextLinks', + 'generateInterpageDotSwitcher', + 'generateNextLink', + 'generatePreviousLink', 'linkTrack', 'linkAlbumCommentary', 'linkAlbumGallery', @@ -10,47 +12,68 @@ export default { extraDependencies: ['html', 'language'], - relations(relation, album, track) { - const relations = {}; + query(album, track) { + const query = {}; - relations.previousNextLinks = - relation('generatePreviousNextLinks'); + const index = + (track + ? album.tracks.indexOf(track) + : null); - relations.previousTrackLink = null; - relations.nextTrackLink = null; + query.previousTrack = + (track + ? atOffset(album.tracks, index, -1) + : null); - if (track) { - const index = album.tracks.indexOf(track); + query.nextTrack = + (track + ? atOffset(album.tracks, index, +1) + : null); - if (index > 0) { - relations.previousTrackLink = - relation('linkTrack', album.tracks[index - 1]); - } + return query; + }, - if (index < album.tracks.length - 1) { - relations.nextTrackLink = - relation('linkTrack', album.tracks[index + 1]); - } - } + relations: (relation, query, album, _track) => ({ + switcher: + relation('generateInterpageDotSwitcher'), - relations.albumGalleryLink = - relation('linkAlbumGallery', album); + previousLink: + relation('generatePreviousLink'), - if (album.commentary || album.tracks.some(t => t.commentary)) { - relations.albumCommentaryLink = - relation('linkAlbumCommentary', album); - } + nextLink: + relation('generateNextLink'), - return relations; - }, + previousTrackLink: + (query.previousTrack + ? relation('linkTrack', query.previousTrack) + : null), - data(album, track) { - return { - hasMultipleTracks: album.tracks.length > 1, - galleryIsStub: album.tracks.every(t => !t.hasUniqueCoverArt), - isTrackPage: !!track, - }; - }, + nextTrackLink: + (query.nextTrack + ? relation('linkTrack', query.nextTrack) + : null), + + albumGalleryLink: + relation('linkAlbumGallery', album), + + albumCommentaryLink: + relation('linkAlbumCommentary', album), + }), + + data: (query, album, track) => ({ + hasMultipleTracks: + album.tracks.length > 1, + + commentaryPageIsStub: + [album, ...album.tracks] + .every(({commentary}) => empty(commentary)), + + galleryIsStub: + album.tracks.every(t => !t.hasUniqueCoverArt), + + isTrackPage: + !!track, + }), slots: { showTrackNavigation: {type: 'boolean', default: false}, @@ -62,51 +85,58 @@ export default { }, generate(data, relations, slots, {html, language}) { - const {content: extraLinks = []} = - slots.showExtraLinks && - {content: [ - (!data.galleryIsStub || slots.currentExtra === 'gallery') && - relations.albumGalleryLink?.slots({ - attributes: {class: slots.currentExtra === 'gallery' && 'current'}, - content: language.$('albumPage.nav.gallery'), - }), - - relations.albumCommentaryLink?.slots({ - attributes: {class: slots.currentExtra === 'commentary' && 'current'}, - content: language.$('albumPage.nav.commentary'), - }), - ]}; - - const {content: previousNextLinks = []} = - slots.showTrackNavigation && + const albumNavCapsule = language.encapsulate('albumPage.nav'); + const trackNavCapsule = language.encapsulate('trackPage.nav'); + + const previousLink = data.isTrackPage && - data.hasMultipleTracks && - relations.previousNextLinks.slots({ - previousLink: relations.previousTrackLink, - nextLink: relations.nextTrackLink, + relations.previousLink.slot('link', relations.previousTrackLink); + + const nextLink = + data.isTrackPage && + relations.nextLink.slot('link', relations.nextTrackLink); + + const galleryLink = + (!data.galleryIsStub || slots.currentExtra === 'gallery') && + relations.albumGalleryLink.slots({ + attributes: {class: slots.currentExtra === 'gallery' && 'current'}, + content: language.$(albumNavCapsule, 'gallery'), + }); + + const commentaryLink = + (!data.commentaryPageIsStub || slots.currentExtra === 'commentary') && + relations.albumCommentaryLink.slots({ + attributes: {class: slots.currentExtra === 'commentary' && 'current'}, + content: language.$(albumNavCapsule, 'commentary'), }); const randomLink = - slots.showTrackNavigation && data.hasMultipleTracks && html.tag('a', {id: 'random-button'}, {href: '#', 'data-random': 'track-in-sidebar'}, (data.isTrackPage - ? language.$('trackPage.nav.random') - : language.$('albumPage.nav.randomTrack'))); + ? language.$(trackNavCapsule, 'random') + : language.$(albumNavCapsule, 'randomTrack'))); + + return relations.switcher.slots({ + links: [ + slots.showTrackNavigation && + previousLink, + + slots.showTrackNavigation && + nextLink, - const allLinks = [ - ...previousNextLinks, - ...extraLinks, - randomLink, - ].filter(Boolean); + slots.showExtraLinks && + galleryLink, - if (empty(allLinks)) { - return html.blank(); - } + slots.showExtraLinks && + commentaryLink, - return `(${language.formatUnitList(allLinks)})`; + slots.showTrackNavigation && + randomLink, + ], + }); }, }; |