« get me outta code hell

content: generateFlashInfoPage - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateFlashNavAccent.js
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-08-10 11:01:25 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-08-10 11:01:25 -0300
commit178397c9af193b2cebd3f8552b1e725a7b432b48 (patch)
treef32f55db95dfedd74b0098be1c4b310fe1e5c567 /src/content/dependencies/generateFlashNavAccent.js
parent84757d1e54f9cb8825b041368b55e01ba0d4b17b (diff)
content: generateFlashInfoPage
...Except the sidebar, which will be some shenanigans.
Diffstat (limited to 'src/content/dependencies/generateFlashNavAccent.js')
-rw-r--r--src/content/dependencies/generateFlashNavAccent.js79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/content/dependencies/generateFlashNavAccent.js b/src/content/dependencies/generateFlashNavAccent.js
new file mode 100644
index 0000000..1e2d185
--- /dev/null
+++ b/src/content/dependencies/generateFlashNavAccent.js
@@ -0,0 +1,79 @@
+import {empty} from '../../util/sugar.js';
+import {sortFlashesChronologically} from '../../util/wiki-data.js';
+
+export default {
+  contentDependencies: [
+    'generatePreviousNextLinks',
+    'linkFlash',
+  ],
+
+  extraDependencies: ['html', 'language', 'wikiData'],
+
+  sprawl({flashData}) {
+    return {flashData};
+  },
+
+  query(sprawl, flash) {
+    const flashes =
+      sortFlashesChronologically(sprawl.flashData.slice());
+
+    const index = flashes.indexOf(flash);
+
+    const previousFlash =
+      (index > 0
+        ? flashes[index - 1]
+        : null);
+
+    const nextFlash =
+      (index < flashes.length - 1
+        ? flashes[index + 1]
+        : null);
+
+    return {previousFlash, nextFlash};
+  },
+
+  relations(relation, query) {
+    const relations = {};
+
+    if (query.previousFlash || query.nextFlash) {
+      relations.previousNextLinks =
+        relation('generatePreviousNextLinks');
+
+      relations.previousFlashLink =
+        (query.previousFlash
+          ? relation('linkFlash', query.previousFlash)
+          : null);
+
+      relations.nextFlashLink =
+        (query.nextFlash
+          ? relation('linkFlash', query.nextFlash)
+          : null);
+    }
+
+    return relations;
+  },
+
+  slots: {
+    showFlashNavigation: {type: 'boolean', default: false},
+  },
+
+  generate(relations, slots, {html, language}) {
+    const {content: previousNextLinks = []} =
+      slots.showFlashNavigation &&
+      relations.previousNextLinks &&
+        relations.previousNextLinks.slots({
+          previousLink: relations.previousFlashLink,
+          nextLink: relations.nextFlashLink,
+        });
+
+    const allLinks = [
+      ...previousNextLinks,
+    ].filter(Boolean);
+
+    if (empty(allLinks)) {
+      return html.blank();
+    }
+
+    return `(${language.formatUnitList(allLinks)})`;
+  },
+};