This commit is contained in:
Grae Jones
2026-03-23 13:59:56 -07:00
parent 981117629a
commit 541251f065
4 changed files with 60 additions and 23 deletions

View File

@@ -41,12 +41,17 @@ export function useAuth() {
// ── Map ID token claims → user object ───────────────────────────────────── // ── Map ID token claims → user object ─────────────────────────────────────
function claimsToUser(claims, provider) { function claimsToUser(claims, provider) {
const firstName = claims.given_name ?? null;
const surname = claims.family_name ?? null;
const displayName = claims.name
?? [firstName, surname].filter(Boolean).join(' ')
?? null;
return { return {
entraSubjectId: claims.oid ?? claims.sub ?? null, entraSubjectId: claims.oid ?? claims.sub ?? null,
email: claims.email ?? claims.preferred_username ?? null, email: claims.email ?? claims.preferred_username ?? null,
displayName: claims.name ?? null, displayName,
firstName: claims.given_name ?? null, firstName,
surname: claims.family_name ?? null, surname,
provider: provider ?? 'unknown', provider: provider ?? 'unknown',
}; };
} }

View File

@@ -6,11 +6,12 @@ export default function ContactStep() {
const { user } = useAuth(); const { user } = useAuth();
const { contactData, setContactData, saveContact, goBack, loading, error } = useRegistration(); const { contactData, setContactData, saveContact, goBack, loading, error } = useRegistration();
// Pre-fill from auth claims on mount // Pre-fill from CIAM claims on mount
useEffect(() => { useEffect(() => {
if (user) { if (user) {
setContactData(prev => ({ setContactData(prev => ({
contactName: prev.contactName || user.displayName || '', firstName: prev.firstName || user.firstName || '',
lastName: prev.lastName || user.surname || '',
contactEmail: prev.contactEmail || user.email || '', contactEmail: prev.contactEmail || user.email || '',
contactPhone: prev.contactPhone || '', contactPhone: prev.contactPhone || '',
})); }));
@@ -39,7 +40,9 @@ export default function ContactStep() {
{user && ( {user && (
<div className="info-card"> <div className="info-card">
<div className="info-card-primary">{user.displayName}</div> <div className="info-card-primary">
{[user.firstName, user.surname].filter(Boolean).join(' ') || user.displayName || user.email}
</div>
<div className="info-card-secondary">{user.email}</div> <div className="info-card-secondary">{user.email}</div>
</div> </div>
)} )}
@@ -47,26 +50,41 @@ export default function ContactStep() {
{error && <div className="error-message">{error}</div>} {error && <div className="error-message">{error}</div>}
<form onSubmit={handleSubmit}> <form onSubmit={handleSubmit}>
<div className="form-row">
<div className="form-group"> <div className="form-group">
<label htmlFor="contactName">Full Name <span className="required">*</span></label> <label htmlFor="firstName">First Name <span className="required">*</span></label>
<input <input
type="text" type="text"
id="contactName" id="firstName"
name="contactName" name="firstName"
value={contactData.contactName} value={contactData.firstName || ''}
onChange={handleChange} onChange={handleChange}
placeholder="Jane Smith" placeholder="Jane"
required required
/> />
</div> </div>
<div className="form-group">
<label htmlFor="lastName">Last Name <span className="required">*</span></label>
<input
type="text"
id="lastName"
name="lastName"
value={contactData.lastName || ''}
onChange={handleChange}
placeholder="Smith"
required
/>
</div>
</div>
<div className="form-group"> <div className="form-group">
<label htmlFor="contactEmail">Email <span className="required">*</span></label> <label htmlFor="contactEmail">Email <span className="required">*</span></label>
<input <input
type="email" type="email"
id="contactEmail" id="contactEmail"
name="contactEmail" name="contactEmail"
value={contactData.contactEmail} value={contactData.contactEmail || ''}
onChange={handleChange} onChange={handleChange}
placeholder="jane@example.com" placeholder="jane@example.com"
required required
@@ -79,7 +97,7 @@ export default function ContactStep() {
type="tel" type="tel"
id="contactPhone" id="contactPhone"
name="contactPhone" name="contactPhone"
value={contactData.contactPhone} value={contactData.contactPhone || ''}
onChange={handleChange} onChange={handleChange}
placeholder="(555) 123-4567" placeholder="(555) 123-4567"
/> />

View File

@@ -53,7 +53,8 @@ export function RegistrationProvider({ children }) {
// Form data — maps to RegisterRequest model fields (minus entraSubjectId) // Form data — maps to RegisterRequest model fields (minus entraSubjectId)
const [contactData, setContactData] = useState({ const [contactData, setContactData] = useState({
contactName: '', firstName: '',
lastName: '',
contactEmail: '', contactEmail: '',
contactPhone: '', contactPhone: '',
}); });
@@ -83,8 +84,9 @@ export function RegistrationProvider({ children }) {
// ─── Validation ───────────────────────────────────────────────────── // ─── Validation ─────────────────────────────────────────────────────
const validateContact = useCallback(() => { const validateContact = useCallback(() => {
if (!contactData.contactName.trim()) return 'Contact name is required'; if (!contactData.firstName?.trim()) return 'First name is required';
if (!contactData.contactEmail.trim()) return 'Email is required'; if (!contactData.lastName?.trim()) return 'Last name is required';
if (!contactData.contactEmail?.trim()) return 'Email is required';
return null; return null;
}, [contactData]); }, [contactData]);
@@ -132,6 +134,8 @@ export function RegistrationProvider({ children }) {
const request = { const request = {
...contactData, ...contactData,
...businessData, ...businessData,
// Combine for server-side contactName field
contactName: [contactData.firstName, contactData.lastName].filter(Boolean).join(' '),
}; };
// Pre-fill email from auth if the user left it blank // Pre-fill email from auth if the user left it blank

View File

@@ -326,6 +326,16 @@ body {
Forms Forms
============================================================ */ ============================================================ */
.form-row {
display: flex;
gap: 12px;
}
.form-row .form-group {
flex: 1;
margin-bottom: 0;
}
.form-group { .form-group {
margin-bottom: 16px; margin-bottom: 16px;
} }