"src/lib/components/workspace/Playground.svelte" did not exist on "61a8f732910043ee0fd1c0690f22230ccea7a30d"
+page.svelte 5.17 KB
Newer Older
1
2
<script>
	import { goto } from '$app/navigation';
Timothy J. Baek's avatar
Timothy J. Baek committed
3
	import { userSignIn, userSignUp } from '$lib/apis/auths';
4
5
	import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
	import { WEBUI_NAME, config, user } from '$lib/stores';
6
	import { onMount, getContext } from 'svelte';
Jannik Streidl's avatar
Jannik Streidl committed
7
	import { toast } from 'svelte-sonner';
8
	import { generateInitialsImage, canvasPixelTest } from '$lib/utils';
9

10
11
	const i18n = getContext('i18n');

Timothy J. Baek's avatar
Timothy J. Baek committed
12
	let loaded = false;
13
14
15
16
17
18
	let mode = 'signin';

	let name = '';
	let email = '';
	let password = '';

Timothy J. Baek's avatar
Timothy J. Baek committed
19
20
21
	const setSessionUser = async (sessionUser) => {
		if (sessionUser) {
			console.log(sessionUser);
22
			toast.success($i18n.t(`You're now logged in.`));
Timothy J. Baek's avatar
Timothy J. Baek committed
23
24
			localStorage.token = sessionUser.token;
			await user.set(sessionUser);
25
26
27
28
			goto('/');
		}
	};

Timothy J. Baek's avatar
Timothy J. Baek committed
29
30
31
32
33
34
35
36
37
	const signInHandler = async () => {
		const sessionUser = await userSignIn(email, password).catch((error) => {
			toast.error(error);
			return null;
		});

		await setSessionUser(sessionUser);
	};

38
	const signUpHandler = async () => {
Danny Liu's avatar
Danny Liu committed
39
40
41
42
43
44
		const sessionUser = await userSignUp(name, email, password, generateInitialsImage(name)).catch(
			(error) => {
				toast.error(error);
				return null;
			}
		);
Timothy J. Baek's avatar
Timothy J. Baek committed
45

46
47
48
49
50
51
		if (!canvasPixelTest()) {
			toast.error('Canvas pixel test failed, fingerprint evasion likely. Default image used.', {
				autoClose: 1000 * 10
			});
		}

Timothy J. Baek's avatar
Timothy J. Baek committed
52
53
54
55
56
57
58
59
		await setSessionUser(sessionUser);
	};

	const submitHandler = async () => {
		if (mode === 'signin') {
			await signInHandler();
		} else {
			await signUpHandler();
60
61
62
		}
	};

Timothy J. Baek's avatar
Timothy J. Baek committed
63
	onMount(async () => {
Timothy J. Baek's avatar
Timothy J. Baek committed
64
		if ($user !== undefined) {
Timothy J. Baek's avatar
Timothy J. Baek committed
65
66
67
68
			await goto('/');
		}
		loaded = true;
	});
69
70
</script>

Timothy J. Baek's avatar
Timothy J. Baek committed
71
72
73
74
75
76
<svelte:head>
	<title>
		{`${$WEBUI_NAME}`}
	</title>
</svelte:head>

Timothy J. Baek's avatar
Timothy J. Baek committed
77
{#if loaded}
78
79
80
	<div class="fixed m-10 z-50">
		<div class="flex space-x-2">
			<div class=" self-center">
81
				<img src="{WEBUI_BASE_URL}/static/favicon.png" class=" w-8 rounded-full" alt="logo" />
82
83
84
85
			</div>
		</div>
	</div>

Timothy J. Baek's avatar
Timothy J. Baek committed
86
	<div class=" bg-white dark:bg-gray-900 min-h-screen w-full flex justify-center font-mona">
Timothy J. Baek's avatar
Timothy J. Baek committed
87
		<!-- <div class="hidden lg:flex lg:flex-1 px-10 md:px-16 w-full bg-yellow-50 justify-center">
88
89
90
91
92
93
94
95
96
97
98
			<div class=" my-auto pb-16 text-left">
				<div>
					<div class=" font-bold text-yellow-600 text-4xl">
						Get up and running with <br />large language models, locally.
					</div>

					<div class="mt-2 text-yellow-600 text-xl">
						Run Llama 2, Code Llama, and other models. Customize and create your own.
					</div>
				</div>
			</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
99
		</div> -->
100

Timothy J. Baek's avatar
Timothy J. Baek committed
101
		<div class="w-full sm:max-w-lg px-4 min-h-screen flex flex-col">
102
103
			<div class=" my-auto pb-10 w-full">
				<form
Timothy J. Baek's avatar
Timothy J. Baek committed
104
					class=" flex flex-col justify-center bg-white py-6 sm:py-16 px-6 sm:px-16 rounded-2xl"
105
					on:submit|preventDefault={() => {
Timothy J. Baek's avatar
Timothy J. Baek committed
106
						submitHandler();
107
108
					}}
				>
Timothy J. Baek's avatar
Timothy J. Baek committed
109
					<div class=" text-xl sm:text-2xl font-bold">
Jannik Streidl's avatar
Jannik Streidl committed
110
111
112
						{mode === 'signin' ? $i18n.t('Sign in') : $i18n.t('Sign up')}
						{$i18n.t('to')}
						{$WEBUI_NAME}
113
114
					</div>

115
116
					{#if mode === 'signup'}
						<div class=" mt-1 text-xs font-medium text-gray-500">
Jannik Streidl's avatar
Jannik Streidl committed
117
118
119
120
							ⓘ {$WEBUI_NAME}
							{$i18n.t(
								'does not make any external connections, and your data stays securely on your locally hosted server.'
							)}
121
122
123
						</div>
					{/if}

Timothy J. Baek's avatar
Timothy J. Baek committed
124
					<div class="flex flex-col mt-4">
125
126
						{#if mode === 'signup'}
							<div>
127
								<div class=" text-sm font-semibold text-left mb-1">{$i18n.t('Name')}</div>
128
129
130
								<input
									bind:value={name}
									type="text"
Timothy J. Baek's avatar
Timothy J. Baek committed
131
									class=" border px-4 py-2.5 rounded-2xl w-full text-sm"
132
									autocomplete="name"
Jannik Streidl's avatar
Jannik Streidl committed
133
									placeholder={$i18n.t('Enter Your Full Name')}
134
135
136
									required
								/>
							</div>
Timothy J. Baek's avatar
Timothy J. Baek committed
137
138

							<hr class=" my-3" />
139
140
						{/if}

Timothy J. Baek's avatar
Timothy J. Baek committed
141
						<div class="mb-2">
142
							<div class=" text-sm font-semibold text-left mb-1">{$i18n.t('Email')}</div>
143
144
145
							<input
								bind:value={email}
								type="email"
Timothy J. Baek's avatar
Timothy J. Baek committed
146
								class=" border px-4 py-2.5 rounded-2xl w-full text-sm"
147
								autocomplete="email"
Jannik Streidl's avatar
Jannik Streidl committed
148
								placeholder={$i18n.t('Enter Your Email')}
149
150
151
152
153
								required
							/>
						</div>

						<div>
154
							<div class=" text-sm font-semibold text-left mb-1">{$i18n.t('Password')}</div>
155
156
157
							<input
								bind:value={password}
								type="password"
Timothy J. Baek's avatar
Timothy J. Baek committed
158
								class=" border px-4 py-2.5 rounded-2xl w-full text-sm"
Jannik Streidl's avatar
Jannik Streidl committed
159
								placeholder={$i18n.t('Enter Your Password')}
160
161
162
163
164
165
								autocomplete="current-password"
								required
							/>
						</div>
					</div>

Timothy J. Baek's avatar
Timothy J. Baek committed
166
					<div class="mt-5">
167
						<button
Timothy J. Baek's avatar
Timothy J. Baek committed
168
							class=" bg-gray-900 hover:bg-gray-800 w-full rounded-full text-white font-semibold text-sm py-3 transition"
169
170
							type="submit"
						>
Jannik Streidl's avatar
Jannik Streidl committed
171
							{mode === 'signin' ? $i18n.t('Sign in') : $i18n.t('Create Account')}
172
173
174
						</button>

						<div class=" mt-4 text-sm text-center">
Jannik Streidl's avatar
Jannik Streidl committed
175
176
177
							{mode === 'signin'
								? $i18n.t("Don't have an account?")
								: $i18n.t('Already have an account?')}
178
179
180
181
182
183
184
185
186
187
188
189

							<button
								class=" font-medium underline"
								type="button"
								on:click={() => {
									if (mode === 'signin') {
										mode = 'signup';
									} else {
										mode = 'signin';
									}
								}}
							>
Jannik Streidl's avatar
Jannik Streidl committed
190
								{mode === 'signin' ? $i18n.t('Sign up') : $i18n.t('Sign in')}
191
192
193
194
195
196
197
198
							</button>
						</div>
					</div>
				</form>
			</div>
		</div>
	</div>
{/if}
Timothy J. Baek's avatar
Timothy J. Baek committed
199
200
201
202
203
204

<style>
	.font-mona {
		font-family: 'Mona Sans';
	}
</style>