aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Tools/Schedule/Tool.svelte
blob: 6b3a6a0c429f330df1c14e1cbc46f8f576b30a4b (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
<script lang="ts">
	import Error from '$lib/Error/RateLimited.svelte';
	import type { SubsPlease } from '$lib/Media/Anime/Airing/Subtitled/subsPlease';
	import { onMount } from 'svelte';
	import { parseOrDefault } from '$lib/Utility/parameters';
	import { browser } from '$app/environment';
	import type { Media } from '$lib/AniList/media';
	import { scheduleMediaListCollection } from '$lib/AniList/schedule';
	import { season } from '$lib/Media/Anime/season';
	import HeadTitle from '$lib/Home/HeadTitle.svelte';
	import Crunchyroll from '$lib/Tools/Schedule/Crunchyroll.svelte';
	import Loading from '$lib/Utility/Loading.svelte';
	import './container.css';
	import Days from './Days.svelte';
	import settings from '$stores/settings';

	let subsPleasePromise: Promise<SubsPlease>;
	let scheduledMediaPromise: Promise<Partial<Media[]>>;
	const urlParameters = browser ? new URLSearchParams(window.location.search) : null;
	let timeZone = parseOrDefault(
		urlParameters,
		'tz',
		Intl.DateTimeFormat().resolvedOptions().timeZone
	);
	let crunchyrollExpanded = false;
	let forceListMode = parseOrDefault(urlParameters, 'list', false);

	onMount(async () => {
		subsPleasePromise = fetch(`/api/subsplease?tz=${timeZone}`).then((r) => r.json());
		scheduledMediaPromise = scheduleMediaListCollection(new Date().getFullYear(), season(), true);
	});
</script>

<HeadTitle route="Schedule" path="/schedule" />

<blockquote>
	<select
		bind:value={timeZone}
		on:change={() =>
			(subsPleasePromise = fetch(`/api/subsplease?tz=${timeZone}`).then((r) => r.json()))}
	>
		{#each Intl.supportedValuesOf('timeZone') as zone}
			<option value={zone}>
				{zone.split('/').reverse().join(', ').replace(/_/g, ' ')}
			</option>
		{/each}
	</select>
</blockquote>

<details bind:open={crunchyrollExpanded}>
	<summary
		>Crunchyroll Release Calender (Click to {crunchyrollExpanded ? 'collapse' : 'expand'})</summary
	>

	<p />

	<Crunchyroll />
</details>

<p />

{#await subsPleasePromise}
	<Loading type="subtitle release data" percent={49.5} />
{:then subsPlease}
	{#if subsPlease}
		{#await scheduledMediaPromise}
			<Loading type="anime schedule" percent={82.5} />
		{:then scheduledMedia}
			{#if scheduledMedia}
				{@const columnCount = Math.ceil(Object.keys(subsPlease.schedule).length / 2)}

				<div
					class="list-container"
					id="schedule"
					style={`column-count: ${
						columnCount / ($settings.displayScheduleListMode || forceListMode ? 1 : 2)
					}`}
				>
					<Days {subsPlease} {scheduledMedia} {forceListMode} />
				</div>
			{:else}
				<Loading type="anime schedule" percent={66} />
			{/if}
		{:catch}
			<Error type="Media" loginSessionError={false} card />
		{/await}
	{:else}
		<Loading type="subtitle release data" percent={33} />
	{/if}
{:catch}
	<Error type="Schedule" loginSessionError={false} card />
{/await}