amerc/src/Account.jsx
artheru c2a8616255 legion: rename My Booth -> My Legion, Mansion -> My Mansion (1.0.0)
Route 'legion' with a legacy '#/booth' alias; BoothDashboard -> LegionDashboard;
nav, footer, hotspots, WebMCP enum, gate copy all renamed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 02:33:41 +08:00

56 lines
2.8 KiB
JavaScript

import React, { useState } from 'react';
import { api } from './api.js';
import { KeysCard } from './AgentPlatform.jsx';
import { toast } from './toast.js';
function avatarStyle(name) { let h = 0; for (const ch of String(name)) h = (h * 31 + ch.charCodeAt(0)) >>> 0; const a = h % 360, b = (a + 70 + h % 90) % 360; return { background: `linear-gradient(135deg, hsl(${a} 68% 46%), hsl(${b} 64% 32%))` }; }
export default function Account({ auth, setRoute }) {
const [cur, setCur] = useState('');
const [nw, setNw] = useState('');
const [err, setErr] = useState('');
if (!auth.ready) return <div className="ap"><p>Loading</p></div>;
if (!auth.user) return (
<div className="ap ap-gate ap-gate-rich">
<span className="ap-gate-ico" aria-hidden="true">👤</span>
<h2>Your account</h2>
<p>Log in to manage your profile and password, mint agent keys, and view your showcases.</p>
<div className="ap-gate-cta"><button className="gm-cta-btn gm-cta-primary" onClick={() => setRoute('signin')}>Log in / Sign up</button></div>
</div>
);
const u = auth.user;
const changePw = async (e) => {
e.preventDefault(); setErr('');
try { await api('/auth/password', { method: 'POST', body: { currentPassword: cur, newPassword: nw } }); setCur(''); setNw(''); toast('Password updated ✓'); }
catch (e2) { setErr(e2.message); }
};
return (
<div className="ap acct">
<div className="ap-head"><h2>Account</h2></div>
<div className="acct-grid">
<div className="acct-card acct-profile">
<span className="ap-avatar acct-avatar" style={avatarStyle(u.handle)}>{u.handle.slice(0, 2).toUpperCase()}</span>
<h3>{u.handle}</h3>
<p className="acct-email">{u.email}</p>
<span className={`acct-role acct-role-${u.role}`}>{u.role}</span>
<div className="acct-links">
<button className="px-action" onClick={() => setRoute('legion')}>My Legion</button>
<button className="px-action" onClick={() => setRoute('mansion')}>My Mansion</button>
<button className="px-action" onClick={() => auth.logout()}>Log out</button>
</div>
</div>
<div className="acct-card">
<h4 className="ap-h4">Change password</h4>
<form className="acct-form" onSubmit={changePw}>
<input type="password" placeholder="current password" value={cur} onChange={(e) => setCur(e.target.value)} required />
<input type="password" placeholder="new password (min 6)" value={nw} onChange={(e) => setNw(e.target.value)} required minLength={6} />
{err && <p className="px-auth-err">{err}</p>}
<button className="px-action px-auth-submit" type="submit">Update password</button>
</form>
</div>
</div>
<KeysCard />
</div>
);
}