212 lines
6.3 KiB
JavaScript
212 lines
6.3 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
|
import { useNavigate } from 'react-router-dom';
|
|
import './UserProfile.css';
|
|
|
|
function UserProfile() {
|
|
const [firstName, setFirstName] = useState('');
|
|
const [lastName, setLastName] = useState('');
|
|
const [email, setEmail] = useState('');
|
|
const [zipCode, setZipCode] = useState('');
|
|
const [selectedState, setSelectedState] = useState('');
|
|
const [areas, setAreas] = useState([]);
|
|
const [selectedArea, setSelectedArea] = useState('');
|
|
const navigate = useNavigate(); // Add navigation
|
|
const [loadingAreas, setLoadingAreas] = useState(false); // To show a loading spinner for areas
|
|
|
|
// Fetch areas when a state is selected
|
|
useEffect(() => {
|
|
if (!selectedState) {
|
|
setAreas([]); // Clear areas if no state is selected
|
|
return;
|
|
}
|
|
|
|
const fetchAreas = async () => {
|
|
setLoadingAreas(true);
|
|
try {
|
|
const response = await fetch(`/api/areas?state=${selectedState}`);
|
|
if (!response.ok) {
|
|
throw new Error('Failed to fetch areas');
|
|
}
|
|
const data = await response.json();
|
|
setAreas(data.areas); // Set the areas from the API response
|
|
} catch (error) {
|
|
console.error('Error fetching areas:', error);
|
|
setAreas([]); // Reset areas on error
|
|
} finally {
|
|
setLoadingAreas(false);
|
|
}
|
|
};
|
|
|
|
fetchAreas();
|
|
}, [selectedState]);
|
|
|
|
// Handle form submission
|
|
const handleFormSubmit = async (e) => {
|
|
e.preventDefault();
|
|
|
|
const profileData = {
|
|
firstName,
|
|
lastName,
|
|
email,
|
|
zipCode,
|
|
state: selectedState,
|
|
area: selectedArea,
|
|
};
|
|
|
|
try {
|
|
const response = await fetch('/api/user-profile', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(profileData),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error('Failed to save profile');
|
|
}
|
|
|
|
console.log('Profile saved successfully');
|
|
// Add success feedback for the user, if needed
|
|
navigate('/interest-inventory');
|
|
} catch (error) {
|
|
console.error('Error saving profile:', error);
|
|
}
|
|
};
|
|
|
|
|
|
const states = [
|
|
{ name: "Alabama", code: "AL" },
|
|
{ name: "Alaska", code: "AK" },
|
|
{ name: "Arizona", code: "AZ" },
|
|
{ name: "Arkansas", code: "AR" },
|
|
{ name: "California", code: "CA" },
|
|
{ name: "Colorado", code: "CO" },
|
|
{ name: "Connecticut", code: "CT" },
|
|
{ name: "Delaware", code: "DE" },
|
|
{ name: "Florida", code: "FL" },
|
|
{ name: "Georgia", code: "GA" },
|
|
{ name: "Hawaii", code: "HI" },
|
|
{ name: "Idaho", code: "ID" },
|
|
{ name: "Illinois", code: "IL" },
|
|
{ name: "Indiana", code: "IN" },
|
|
{ name: "Iowa", code: "IA" },
|
|
{ name: "Kansas", code: "KS" },
|
|
{ name: "Kentucky", code: "KY" },
|
|
{ name: "Louisiana", code: "LA" },
|
|
{ name: "Maine", code: "ME" },
|
|
{ name: "Maryland", code: "MD" },
|
|
{ name: "Massachusetts", code: "MA" },
|
|
{ name: "Michigan", code: "MI" },
|
|
{ name: "Minnesota", code: "MN" },
|
|
{ name: "Mississippi", code: "MS" },
|
|
{ name: "Missouri", code: "MO" },
|
|
{ name: "Montana", code: "MT" },
|
|
{ name: "Nebraska", code: "NE" },
|
|
{ name: "Nevada", code: "NV" },
|
|
{ name: "New Hampshire", code: "NH" },
|
|
{ name: "New Jersey", code: "NJ" },
|
|
{ name: "New Mexico", code: "NM" },
|
|
{ name: "New York", code: "NY" },
|
|
{ name: "North Carolina", code: "NC" },
|
|
{ name: "North Dakota", code: "ND" },
|
|
{ name: "Ohio", code: "OH" },
|
|
{ name: "Oklahoma", code: "OK" },
|
|
{ name: "Oregon", code: "OR" },
|
|
{ name: "Pennsylvania", code: "PA" },
|
|
{ name: "Rhode Island", code: "RI" },
|
|
{ name: "South Carolina", code: "SC" },
|
|
{ name: "South Dakota", code: "SD" },
|
|
{ name: "Tennessee", code: "TN" },
|
|
{ name: "Texas", code: "TX" },
|
|
{ name: "Utah", code: "UT" },
|
|
{ name: "Vermont", code: "VT" },
|
|
{ name: "Virginia", code: "VA" },
|
|
{ name: "Washington", code: "WA" },
|
|
{ name: "West Virginia", code: "WV" },
|
|
{ name: "Wisconsin", code: "WI" },
|
|
{ name: "Wyoming", code: "WY" }
|
|
];
|
|
|
|
|
|
return (
|
|
<div className="user-profile-container">
|
|
<h2>User Profile</h2>
|
|
<form onSubmit={handleFormSubmit}>
|
|
<div className="form-group">
|
|
<label>First Name:</label>
|
|
<input
|
|
type="text"
|
|
value={firstName}
|
|
onChange={(e) => setFirstName(e.target.value)}
|
|
required
|
|
/>
|
|
</div>
|
|
<div className="form-group">
|
|
<label>Last Name:</label>
|
|
<input
|
|
type="text"
|
|
value={lastName}
|
|
onChange={(e) => setLastName(e.target.value)}
|
|
required
|
|
/>
|
|
</div>
|
|
<div className="form-group">
|
|
<label>Email:</label>
|
|
<input
|
|
type="email"
|
|
value={email}
|
|
onChange={(e) => setEmail(e.target.value)}
|
|
required
|
|
/>
|
|
</div>
|
|
<div className="form-group">
|
|
<label>ZIP Code:</label>
|
|
<input
|
|
type="text"
|
|
value={zipCode}
|
|
onChange={(e) => setZipCode(e.target.value)}
|
|
required
|
|
/>
|
|
</div>
|
|
<div className="form-group">
|
|
<label>State:</label>
|
|
<select
|
|
value={selectedState}
|
|
onChange={(e) => setSelectedState(e.target.value)}
|
|
required
|
|
>
|
|
<option value="">Select a State</option>
|
|
{states.map((s) => (
|
|
<option key={s.code} value={s.code}>
|
|
{s.name}
|
|
</option>
|
|
))}
|
|
</select>
|
|
</div>
|
|
{loadingAreas ? (
|
|
<p>Loading areas...</p>
|
|
) : areas.length > 0 && (
|
|
<div className="form-group">
|
|
<label>Area:</label>
|
|
<select
|
|
value={selectedArea}
|
|
onChange={(e) => setSelectedArea(e.target.value)}
|
|
required
|
|
>
|
|
<option value="">Select an Area</option>
|
|
{areas.map((area, index) => (
|
|
<option key={index} value={area}>
|
|
{area}
|
|
</option>
|
|
))}
|
|
</select>
|
|
</div>
|
|
)}
|
|
<button type="submit">Save Profile</button>
|
|
</form>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default UserProfile; |