« get me outta code hell

generateTrackAdditionalNamesBox.js « dependencies « content « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateTrackAdditionalNamesBox.js
blob: bad04b742f5ab580447584ffb38540a2ad7ce83a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import {empty} from '#sugar';

export default {
  contentDependencies: ['generateAdditionalNamesBox'],
  extraDependencies: ['html'],

  query: (track) => {
    const {
      additionalNames: own,
      sharedAdditionalNames: shared,
      inferredAdditionalNames: inferred,
    } = track;

    if (empty(own) && empty(shared) && empty(inferred)) {
      return {combinedList: []};
    }

    const firstFilter =
      (empty(own)
        ? new Set()
        : new Set(own.map(({name}) => name)));

    const sharedFiltered =
      shared.filter(({name}) => !firstFilter.has(name))

    const secondFilter =
      new Set([
        ...firstFilter,
        ...sharedFiltered.map(({name}) => name),
      ]);

    const inferredFiltered =
      inferred.filter(({name}) => !secondFilter.has(name));

    return {
      combinedList: [
        ...own,
        ...sharedFiltered,
        ...inferredFiltered,
      ],
    };
  },

  relations: (relation, query) => ({
    box:
      (empty(query.combinedList)
        ? null
        : relation('generateAdditionalNamesBox', query.combinedList)),
  }),

  generate: (relations, {html}) =>
    relations.box ?? html.blank(),
};