divan/web/src/pages/account.astro
Anas Rashid c4bf52dd97 Icons and colour roles: header icons with tooltips and a red log out; buttons coloured by what they do; محفوظ شدہ and پسندیدہ لکھاری
- 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>
2026-10-09 15:23:06 +02:00

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>