ChangelogModal.svelte 3.12 KB
Newer Older
Timothy J. Baek's avatar
Timothy J. Baek committed
1
<script lang="ts">
2
	import { onMount } from 'svelte';
Timothy J. Baek's avatar
Timothy J. Baek committed
3
	import { Confetti } from 'svelte-confetti';
4
5
6

	import { config } from '$lib/stores';

Timothy J. Baek's avatar
Timothy J. Baek committed
7
8
9
	import { WEBUI_NAME, WEB_UI_VERSION } from '$lib/constants';
	import { getChangelog } from '$lib/apis';

10
11
	import Modal from './common/Modal.svelte';

Timothy J. Baek's avatar
Timothy J. Baek committed
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	export let show = false;

	let changelog = null;

	onMount(async () => {
		const res = await getChangelog();
		changelog = res;
	});
</script>

<Modal bind:show>
	<div class="px-5 py-4 dark:text-gray-300">
		<div class="flex justify-between items-start">
			<div class="text-xl font-bold">
Timothy J. Baek's avatar
Timothy J. Baek committed
26
				What’s New in {WEBUI_NAME}
Timothy J. Baek's avatar
Timothy J. Baek committed
27
				<Confetti x={[-1, -0.25]} y={[0, 0.5]} />
Timothy J. Baek's avatar
Timothy J. Baek committed
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
			</div>
			<button
				class="self-center"
				on:click={() => {
					show = false;
				}}
			>
				<svg
					xmlns="http://www.w3.org/2000/svg"
					viewBox="0 0 20 20"
					fill="currentColor"
					class="w-5 h-5"
				>
					<path
						d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
					/>
				</svg>
			</button>
		</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
47
		<div class="flex items-center mt-1">
Timothy J. Baek's avatar
Timothy J. Baek committed
48
49
50
51
52
53
			<div class="text-sm dark:text-gray-200">Release Notes</div>
			<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
			<div class="text-sm dark:text-gray-200">
				v{WEB_UI_VERSION}
			</div>
		</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
54
55
56
57
58
	</div>

	<hr class=" dark:border-gray-800" />

	<div class=" w-full p-4 px-5">
Timothy J. Baek's avatar
Timothy J. Baek committed
59
		<div class=" overflow-y-scroll max-h-80">
Timothy J. Baek's avatar
Timothy J. Baek committed
60
			<div class="mb-3">
Timothy J. Baek's avatar
Timothy J. Baek committed
61
62
				{#if changelog}
					{#each Object.keys(changelog) as version}
Timothy J. Baek's avatar
Timothy J. Baek committed
63
64
65
66
						<div class=" mb-3 pr-2">
							<div class="font-bold text-xl mb-1 dark:text-white">
								v{version} - {changelog[version].date}
							</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
67

Timothy J. Baek's avatar
Timothy J. Baek committed
68
							<hr class=" dark:border-gray-800 my-2" />
Timothy J. Baek's avatar
Timothy J. Baek committed
69

Timothy J. Baek's avatar
Timothy J. Baek committed
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
							{#each Object.keys(changelog[version]).filter((section) => section !== 'date') as section}
								<div class="">
									<div
										class="font-bold uppercase text-xs {section === 'added'
											? 'text-white bg-blue-600'
											: section === 'fixed'
											? 'text-white bg-green-600'
											: section === 'changed'
											? 'text-white bg-yellow-600'
											: section === 'removed'
											? 'text-white bg-red-600'
											: ''}  w-fit px-3 rounded-full my-2"
									>
										{section}
									</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
85

Timothy J. Baek's avatar
Timothy J. Baek committed
86
87
88
89
90
91
92
									<div class="my-1.5 px-1.5">
										{#each Object.keys(changelog[version][section]) as item}
											<div class="text-sm mb-2">
												<div class="font-semibold uppercase">
													{changelog[version][section][item].title}
												</div>
												<div class="mb-2 mt-1">{changelog[version][section][item].content}</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
93
											</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
94
95
										{/each}
									</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
96
								</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
97
98
							{/each}
						</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
99
100
101
102
103
104
105
					{/each}
				{/if}
			</div>
		</div>
		<div class="flex justify-end pt-3 text-sm font-medium">
			<button
				on:click={() => {
106
					localStorage.version = $config.version;
Timothy J. Baek's avatar
Timothy J. Baek committed
107
108
109
110
					show = false;
				}}
				class=" px-4 py-2 bg-emerald-600 hover:bg-emerald-700 text-gray-100 transition rounded"
			>
111
				<span class="relative">Okay, Let's Go!</span>
Timothy J. Baek's avatar
Timothy J. Baek committed
112
113
114
115
			</button>
		</div>
	</div>
</Modal>