- Icon component (Lucide shapes, ISC), currentColor, decorative (the control keeps its words in aria-label/title). - Colour roles: --action (primary, filled), --ok (approve, publish), --danger (log out, delete, reject); .btn variants and .icon-btn; light and dark. - Header: admin, moderation, saved, word book, account/sign in, font, theme as icons; log out in red. - Review: save/send filled, approve/publish green, return plain, reject red, with icons. Account: save, log out, password, delete. Reading pages: edit, history, arrange, tag. E-books: add, download, covers; the reader's controls as icons. - نشانات is now محفوظ شدہ; favourite writers have their own page, پسندیدہ لکھاری (/writers). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
78 lines
3.8 KiB
Plaintext
78 lines
3.8 KiB
Plaintext
---
|
|
import Base from '../layouts/Base.astro';
|
|
import { auth, COOKIE } from '../lib/auth';
|
|
import { ud } from '../lib/urdu';
|
|
|
|
const user = Astro.locals.user;
|
|
if (!user) return Astro.redirect('/signin?next=/account');
|
|
const token = Astro.cookies.get(COOKIE)!.value;
|
|
let error = '', done = '';
|
|
if (Astro.request.method === 'POST') {
|
|
const form = await Astro.request.formData();
|
|
const act = form.get('act');
|
|
if (act === 'signout') {
|
|
await auth('signout', { token });
|
|
Astro.cookies.delete(COOKIE, { path: '/' });
|
|
return Astro.redirect('/');
|
|
}
|
|
if (act === 'profile') {
|
|
const r = await auth('profile', { token, body: { full_name: form.get('full_name'), bio: form.get('bio') } });
|
|
r.ok ? ((done = 'پروفائل محفوظ ہو گیا'), Object.assign(user, r.data.user)) : (error = r.data.error);
|
|
}
|
|
if (act === 'password') {
|
|
if (form.get('next') !== form.get('next2')) error = 'نئے پاس ورڈ ایک جیسے نہیں';
|
|
else {
|
|
const r = await auth('password', { token, body: { current: form.get('current'), next: form.get('next') } });
|
|
r.ok ? (done = 'پاس ورڈ بدل گیا۔ دوسرے آلات سے لاگ آؤٹ کر دیا گیا۔') : (error = r.data.error);
|
|
}
|
|
}
|
|
if (act === 'delete') {
|
|
const r = await auth('delete', { token, body: { password: form.get('password') } });
|
|
if (r.ok) {
|
|
Astro.cookies.delete(COOKIE, { path: '/' });
|
|
return Astro.redirect('/');
|
|
}
|
|
error = r.data.error;
|
|
}
|
|
}
|
|
const since = new Date(user.created_at);
|
|
import Icon from '../components/Icon.astro';
|
|
---
|
|
<Base title="میرا اکاؤنٹ">
|
|
<h1>{user.full_name || 'میرا اکاؤنٹ'}</h1>
|
|
<p class="muted center"><bdi dir="ltr">{user.email}</bdi> · رکنیت: {ud(since.getFullYear())}</p>
|
|
{user.bio && <p class="profile-bio">{user.bio}</p>}
|
|
{error && <p class="form-error" role="alert">{error}</p>}
|
|
{done && <p class="form-done" role="status">{done}</p>}
|
|
|
|
<form method="post" class="account-form">
|
|
<h2>پروفائل</h2>
|
|
<input type="hidden" name="act" value="profile" />
|
|
<label>پورا نام<input name="full_name" value={user.full_name} maxlength="100" dir="auto" autocomplete="name" /></label>
|
|
<label>تعارف<textarea name="bio" maxlength="1000" rows="4" dir="auto">{user.bio}</textarea></label>
|
|
<button type="submit" class="btn primary"><Icon name="save" size={18} /> محفوظ کریں</button>
|
|
</form>
|
|
|
|
<form method="post" class="account-form">
|
|
<input type="hidden" name="act" value="signout" />
|
|
<button type="submit" class="btn danger"><Icon name="logout" size={18} /> لاگ آؤٹ</button>
|
|
</form>
|
|
|
|
<form method="post" class="account-form">
|
|
<h2>پاس ورڈ بدلیں</h2>
|
|
<input type="hidden" name="act" value="password" />
|
|
<label>موجودہ پاس ورڈ<input type="password" name="current" required autocomplete="current-password" dir="ltr" /></label>
|
|
<label>نیا پاس ورڈ<input type="password" name="next" required minlength="8" autocomplete="new-password" dir="ltr" /></label>
|
|
<label>نیا پاس ورڈ دوبارہ<input type="password" name="next2" required minlength="8" autocomplete="new-password" dir="ltr" /></label>
|
|
<button type="submit" class="btn"><Icon name="key" size={18} /> پاس ورڈ بدلیں</button>
|
|
</form>
|
|
|
|
<form method="post" class="account-form danger">
|
|
<h2>اکاؤنٹ ختم کریں</h2>
|
|
<p class="muted">اکاؤنٹ اور اس کا تمام ڈیٹا مستقل طور پر حذف ہو جائے گا۔</p>
|
|
<input type="hidden" name="act" value="delete" />
|
|
<label>پاس ورڈ<input type="password" name="password" required autocomplete="current-password" dir="ltr" /></label>
|
|
<button type="submit" class="btn danger"><Icon name="trash" size={18} /> اکاؤنٹ مستقل طور پر ختم کریں</button>
|
|
</form>
|
|
</Base>
|