aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Schedule/Crunchyroll.svelte
blob: 066a5d229031acada1938cfdf0acfc9d0d56f504 (plain) (blame)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
<script lang="ts">
  import crunchyroll from '$lib/Data/Static/crunchyroll.json';
  import './container.css';

  interface CrunchyrollMedia<T = number | 'soon' | 'continuing'> {
    year: number;
    month: number;
    day: T;
    title: string;
  }

  type KnownMedia = { [key: string]: CrunchyrollMedia<number>[] };

  const days: KnownMedia = crunchyroll
    .filter((media) => media.day !== 'soon' && media.day !== 'continuing')
    .reduce((acc: KnownMedia, media) => {
      const date = new Date(media.year, media.month - 1, media.day as number).toLocaleDateString();

      if (!acc[date]) acc[date] = [];

      acc[date].push(media as CrunchyrollMedia<number>);

      return acc;
    }, {});
  const continuing: CrunchyrollMedia<number | string>[] = crunchyroll.filter(
    (media) => media.day === 'continuing'
  );
  const soon: CrunchyrollMedia<number | string>[] = crunchyroll.filter(
    (media) => media.day === 'soon'
  );

  $: columnCount = Math.ceil(Object.keys(days).length / 2);

  const ordinalSuffix = (i: number) => {
    const j = i % 10;
    const k = i % 100;

    if (j === 1 && k !== 11) return i + 'st';
    if (j === 2 && k !== 12) return i + 'nd';
    if (j === 3 && k !== 13) return i + 'rd';

    return i + 'th';
  };
</script>

<div class="list-container" id="crunchyroll" style={`column-count: ${columnCount};`}>
  {#each Object.values(days) as day}
    {@const date = new Date(day[0].year, day[0].month - 1, day[0].day)}

    <div class="card day">
      <details open class="details-unstyled">
        <summary>
          {date.toLocaleString('default', { month: 'long' })}
          {ordinalSuffix(day[0].day)}, {day[0].year}
        </summary>
        <ol>
          {#each day as media}
            <li>{media.title}</li>
          {/each}
        </ol>
      </details>
    </div>

    <p></p>
  {/each}

  <div class="card day">
    <details open class="details-unstyled">
      <summary>Coming soon</summary>

      <ol>
        {#each soon as media}
          <li>{media.title}</li>
        {/each}
      </ol>
    </details>
  </div>

  <p></p>

  <div class="card day">
    <details open class="details-unstyled">
      <summary>Continuing from previous season</summary>

      <ol>
        {#each continuing as media}
          <li>{media.title}</li>
        {/each}
      </ol>
    </details>
  </div>
</div>

<style>
  .day {
    overflow-y: auto;
    break-inside: avoid;
    page-break-inside: avoid;
  }
</style>