← back to Sublease Agentabrams
public/account.html
60 lines
<!doctype html>
<html lang="en"><head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>Account · Sublease Marketplace</title>
<style>
:root{--ink:#14181d;--mut:#6b7480;--line:#e7e9ee;--bg:#fbfbfc;--accent:#1a5f3c}
*{box-sizing:border-box}body{margin:0;font:15px/1.55 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,sans-serif;color:var(--ink);background:var(--bg)}
a{color:var(--accent);text-decoration:none}.wrap{max-width:460px;margin:0 auto;padding:0 22px}
header.top{border-bottom:1px solid var(--line);background:#fff}.top .wrap{display:flex;align-items:center;height:60px;max-width:1200px}
.top a{color:var(--mut);font-size:14px}
.card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:26px;margin:34px auto}
h1{font-size:22px;margin:0 0 4px}.sub{color:var(--mut);margin:0 0 20px;font-size:14px}
.tabs{display:flex;gap:6px;margin-bottom:18px}
.tabs button{flex:1;padding:9px;border:1px solid var(--line);background:#fff;border-radius:8px;font:inherit;cursor:pointer;color:var(--mut)}
.tabs button.on{background:var(--accent);color:#fff;border-color:var(--accent)}
label{display:block;font-size:12.5px;color:var(--mut);margin:12px 0 4px}
input{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:8px;font:inherit}
.btn{width:100%;margin-top:18px;background:var(--accent);color:#fff;border:0;padding:11px;border-radius:9px;font:600 15px system-ui;cursor:pointer}
.msg{margin-top:12px;font-size:13.5px}.err{color:#b3261e}.ok{color:#1a7a44}
.claim{border:1px solid var(--line);border-radius:9px;padding:10px 12px;margin-top:8px;font-size:13.5px}
.muted{color:var(--mut)}
</style></head><body>
<header class="top"><div class="wrap"><a href="/">← marketplace</a></div></header>
<div class="wrap"><div class="card" id="card"></div></div>
<script>
const $=s=>document.querySelector(s);
async function me(){ return (await fetch('/api/auth/me').then(r=>r.json()).catch(()=>({}))).user; }
async function render(){
const u=await me();
if(u){
$('#card').innerHTML=`<h1>My account</h1><p class="sub">${u.name?u.name+' · ':''}${u.email}</p>
<b style="font-size:14px">Profiles you've claimed</b>
${(u.claims&&u.claims.length)?u.claims.map(id=>`<div class="claim">Broker <a href="/brokers/${id}">#${id}</a> <span class="muted">— pending review</span></div>`).join(''):'<p class="muted" style="font-size:13.5px">None yet. Open your broker profile and click <b>Claim this profile</b>.</p>'}
<button class="btn" id="logout" style="background:#eef2f7;color:#41505f;margin-top:20px">Log out</button>`;
$('#logout').onclick=async()=>{await fetch('/api/auth/logout',{method:'POST'});render();};
return;
}
$('#card').innerHTML=`<h1>Sign in</h1><p class="sub">Create an account to claim and manage your broker profile.</p>
<div class="tabs"><button id="tLogin" class="on">Log in</button><button id="tSignup">Sign up</button></div>
<form id="form">
<div id="nameWrap" style="display:none"><label>Name</label><input name="name" placeholder="Your name"></div>
<label>Email</label><input name="email" type="email" required>
<label>Password</label><input name="password" type="password" required minlength="8" placeholder="8+ characters">
<button class="btn" type="submit" id="submit">Log in</button>
<div class="msg" id="msg"></div>
</form>`;
let mode='login';
const setMode=m=>{mode=m;$('#tLogin').classList.toggle('on',m==='login');$('#tSignup').classList.toggle('on',m==='signup');
$('#nameWrap').style.display=m==='signup'?'block':'none';$('#submit').textContent=m==='signup'?'Create account':'Log in';};
$('#tLogin').onclick=()=>setMode('login'); $('#tSignup').onclick=()=>setMode('signup');
$('#form').onsubmit=async(e)=>{
e.preventDefault(); const fd=Object.fromEntries(new FormData(e.target).entries());
$('#msg').textContent='…';$('#msg').className='msg';
const r=await fetch('/api/auth/'+mode,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(fd)}).then(r=>r.json());
if(r.ok){render();} else {$('#msg').className='msg err';$('#msg').textContent=r.error||'Failed';}
};
}
render();
</script></body></html>