template-monorepo/frontend/src/pages/user/ProfilePage.tsx

75 lines
2.1 KiB
TypeScript
Raw Normal View History

2026-05-26 09:32:32 +00:00
import { useEffect, useState, type FormEvent } from 'react';
import * as memberApi from '../../api/member';
import { ApiError } from '../../api/http';
export function ProfilePage() {
const [displayName, setDisplayName] = useState('');
const [language, setLanguage] = useState('zh-TW');
const [currency, setCurrency] = useState('TWD');
const [phone, setPhone] = useState('');
const [msg, setMsg] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
useEffect(() => {
memberApi.getMe().then((m) => {
setDisplayName(m.display_name ?? '');
setLanguage(m.language ?? 'zh-TW');
setCurrency(m.currency ?? 'TWD');
setPhone(m.phone ?? '');
});
}, []);
const submit = async (e: FormEvent) => {
e.preventDefault();
setError('');
setMsg('');
setLoading(true);
try {
await memberApi.updateMe({
display_name: displayName,
language,
currency,
phone: phone || undefined,
});
setMsg('已儲存');
} catch (err) {
setError(err instanceof ApiError ? err.message : '儲存失敗');
} finally {
setLoading(false);
}
};
return (
<div>
<h1></h1>
<form onSubmit={submit} className="form form-narrow">
<label>
<input
value={displayName}
onChange={(e) => setDisplayName(e.target.value)}
/>
</label>
<label>
<input value={language} onChange={(e) => setLanguage(e.target.value)} />
</label>
<label>
<input value={currency} onChange={(e) => setCurrency(e.target.value)} />
</label>
<label>
<input value={phone} onChange={(e) => setPhone(e.target.value)} />
</label>
{error && <p className="form-error">{error}</p>}
{msg && <p className="form-ok">{msg}</p>}
<button type="submit" className="btn-primary" disabled={loading}>
</button>
</form>
</div>
);
}