« get me outta code hell

homepage-layout.js « files « data « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/files/homepage-layout.js
blob: 646beff68ddfd95df1a171a78a195df0d54c483b (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import {empty} from '#sugar';

export default ({
  documentModes: {allInOne},
  thingConstructors: {
    HomepageLayout,
    HomepageLayoutActionsRow,
    HomepageLayoutAlbumCarouselRow,
    HomepageLayoutAlbumGridRow,
    HomepageLayoutRow,
    HomepageLayoutSection,
  },
}) => ({
  title: `Process homepage layout file`,
  file: 'homepage.yaml',

  documentMode: allInOne,
  documentThing: document => {
    if (document['Homepage']) {
      return HomepageLayout;
    }

    if (document['Section']) {
      return HomepageLayoutSection;
    }

    if (document['Row']) {
      switch (document['Row']) {
        case 'actions':
          return HomepageLayoutActionsRow;
        case 'album carousel':
          return HomepageLayoutAlbumCarouselRow;
        case 'album grid':
          return HomepageLayoutAlbumGridRow;
        default:
          throw new TypeError(`Unrecognized row type ${document['Row']}`);
      }
    }

    return null;
  },

  connect(results) {
    if (!empty(results) && !(results[0] instanceof HomepageLayout)) {
      throw new Error(`Expected 'Homepage' document at top of homepage layout file`);
    }

    const homepageLayout = results[0];
    const sections = [];

    let currentSection = null;
    let currentSectionRows = [];

    const closeCurrentSection = () => {
      if (currentSection) {
        for (const row of currentSectionRows) {
          row.section = currentSection;
        }

        currentSection.rows = currentSectionRows;
        sections.push(currentSection);

        currentSection = null;
        currentSectionRows = [];
      }
    };

    for (const entry of results.slice(1)) {
      if (entry instanceof HomepageLayout) {
        throw new Error(`Expected only one 'Homepage' document in total`);
      } else if (entry instanceof HomepageLayoutSection) {
        closeCurrentSection();
        currentSection = entry;
      } else if (entry instanceof HomepageLayoutRow) {
        if (currentSection) {
          currentSectionRows.push(entry);
        } else {
          throw new Error(`Expected a 'Section' document to add following rows into`);
        }
      }
    }

    closeCurrentSection();

    homepageLayout.sections = sections;
  },
});