feat(auth): add user profile, phone login, and account deletion

This commit is contained in:
iu
2026-10-12 14:26:32 +03:00
parent 1cb9aaf198
commit 86aff695df
46 changed files with 2893 additions and 134 deletions
+35 -11
View File
@@ -4,7 +4,9 @@
import { auth } from '$lib/stores/auth.svelte';
let mode = $state<'login' | 'register'>('login');
let identifier = $state('');
let email = $state('');
let phone = $state('');
let password = $state('');
let name = $state('');
let error = $state('');
@@ -13,12 +15,16 @@
async function submit(ev: Event) {
ev.preventDefault();
error = '';
if (mode === 'register' && !email.trim() && !phone.trim()) {
error = 'Укажите email или телефон';
return;
}
busy = true;
try {
const data =
mode === 'login'
? await authApi.login(email, password)
: await authApi.register(email, password, name);
? await authApi.login(identifier, password)
: await authApi.register(email, phone, password, name);
auth.setTokens(data.tokens);
auth.setUser(data.user);
goto('/');
@@ -43,16 +49,34 @@
class="border-border bg-bg-elevated text-text w-full rounded-lg border px-3 py-2"
/>
</label>
<label class="block">
<span class="text-text-muted mb-1 block text-sm">Email (необязательно)</span>
<input
bind:value={email}
type="email"
class="border-border bg-bg-elevated text-text w-full rounded-lg border px-3 py-2"
/>
</label>
<label class="block">
<span class="text-text-muted mb-1 block text-sm">Телефон (необязательно)</span>
<input
bind:value={phone}
type="tel"
placeholder="+15551234567"
class="border-border bg-bg-elevated text-text w-full rounded-lg border px-3 py-2"
/>
</label>
<p class="text-text-muted text-xs">Нужен хотя бы один из email или телефона.</p>
{:else}
<label class="block">
<span class="text-text-muted mb-1 block text-sm">Email или телефон</span>
<input
bind:value={identifier}
required
class="border-border bg-bg-elevated text-text w-full rounded-lg border px-3 py-2"
/>
</label>
{/if}
<label class="block">
<span class="text-text-muted mb-1 block text-sm">Email</span>
<input
bind:value={email}
type="email"
required
class="border-border bg-bg-elevated text-text w-full rounded-lg border px-3 py-2"
/>
</label>
<label class="block">
<span class="text-text-muted mb-1 block text-sm">Пароль</span>
<input