estatesfunding/ef-ui/src/components/UserProfile.jsx

368 lines
14 KiB
React
Raw Normal View History

2024-09-30 15:39:00 +00:00
import { useState, useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";
import { updateUser } from "../redux/features/authSlice";
import { useNavigate } from "react-router-dom";
import FileBase from "react-file-base64";
2024-10-22 06:43:35 +00:00
import { toast } from "react-toastify";
2024-09-30 15:39:00 +00:00
const UserProfile = () => {
2024-10-22 06:43:35 +00:00
const { user, isLoading } = useSelector((state) => state.auth);
2024-09-30 15:39:00 +00:00
const dispatch = useDispatch();
const navigate = useNavigate();
const [formData, setFormData] = useState({
userId: user?.result?.userId || "",
title: user?.result?.title || "",
firstName: user?.result?.firstName || "",
middleName: user?.result?.middleName || "",
lastName: user?.result?.lastName || "",
email: user?.result?.email || "",
aboutme: user?.result?.aboutme || "",
2024-10-01 12:44:18 +00:00
city: user?.result?.city || "",
state: user?.result?.state || "",
county: user?.result?.county || "",
zip: user?.result?.zip || "",
2024-09-30 15:39:00 +00:00
profileImage: user?.result?.profileImage || "", // For storing the image
});
useEffect(() => {
if (user) {
setFormData({
userId: user.result.userId,
title: user.result.title,
firstName: user.result.firstName,
middleName: user.result.middleName,
lastName: user.result.lastName,
email: user.result.email,
aboutme: user.result.aboutme,
2024-10-01 12:44:18 +00:00
city: user.result.city,
state: user.result.state,
county: user.result.county,
zip: user.result.zip,
2024-09-30 15:39:00 +00:00
profileImage: user.result.profileImage,
});
}
}, [user]);
const handleChange = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const handleImageDelete = () => {
setFormData({ ...formData, profileImage: "" }); // Reset the profileImage field
};
2024-10-22 06:43:35 +00:00
2024-09-30 15:39:00 +00:00
const handleSubmit = (e) => {
e.preventDefault();
2024-10-22 06:43:35 +00:00
dispatch(updateUser({formData, toast, navigate})); // Dispatching updateUser with form data
2024-09-30 15:39:00 +00:00
};
return (
<>
<form onSubmit={handleSubmit}>
<div className="col-4">
Title
<select
className="form-floating mb-3 form-control"
aria-label="Default select example"
name="title"
value={formData.title}
onChange={handleChange}
>
<option value="None">Please Select Title</option>
<option value="Dr">Dr</option>
<option value="Prof">Prof</option>
<option value="Mr">Mr</option>
<option value="Miss">Miss</option>
</select>
</div>
<div className="col-4">
<div className="form-floating mb-3">
First Name
<input
type="text"
className="form-control"
placeholder="First Name"
required="required"
name="firstName"
value={formData.firstName}
onChange={handleChange}
/>
</div>
</div>
<div className="col-4">
<div className="form-floating mb-3">
Middle Name
<input
type="text"
className="form-control"
placeholder="Middle Name"
required="required"
name="middleName"
value={formData.middleName}
onChange={handleChange}
/>
</div>
</div>
<div className="col-4">
<div className="form-floating mb-3">
Last Name
<input
type="text"
className="form-control"
placeholder="Last Name"
required="required"
name="lastName"
value={formData.lastName}
onChange={handleChange}
/>
</div>
</div>
<div className="col-4">
<div className="form-floating mb-3">
Email
<input
type="text"
className="form-control"
placeholder="Email"
required="required"
name="email"
value={formData.email}
onChange={handleChange}
disabled
/>
</div>
</div>
<div className="col-4">
<div className="form-floating mb-3">
About me
<textarea
type="text"
id="aboutme"
name="aboutme"
className="form-control h-100"
value={formData.aboutme}
onChange={handleChange}
/>
</div>
</div>
2024-10-01 12:44:18 +00:00
<div className="col-4">
<div className="form-floating mb-3">
City
<input
type="text"
className="form-control"
name="city"
placeholder="city"
value={formData.city}
onChange={handleChange}
required
/>
</div>
</div>
<div className="col-md-4">
<div className="form-floating mb-3">
State
<select
className="form-floating mb-3 form-control"
name="state"
value={formData.state}
onChange={handleChange}
required
>
<option value="">Please Select State</option>
<option value="Alaska">Alaska</option>
<option value="Alabama">Alabama</option>
<option value="Arkansas">Arkansas</option>
<option value="Arizona">Arizona</option>
<option value="California">California</option>
<option value="Colorado">Colorado</option>
<option value="Connecticut">Connecticut</option>
<option value="District Of Columbia">
District Of Columbia
</option>
<option value="Delaware">Delaware</option>
<option value="Florida">Florida</option>
<option value="Georgia">Georgia</option>
<option value="Hawaii">Hawaii</option>
<option value="Iowa">Iowa</option>
<option value="Idaho">Idaho</option>
<option value="Illinois">Illinois</option>
<option value="Indiana">Indiana</option>
<option value="Kansas">Kansas</option>
<option value="Kentucky">Kentucky</option>
<option value="Louisiana">Louisiana</option>
<option value="Massachusetts">Massachusetts</option>
<option value="Maryland">Maryland</option>
<option value="Michigan">Michigan</option>
<option value="Minnesota">Minnesota</option>
<option value="Missouri">Missouri</option>
<option value="Mississippi">Mississippi</option>
<option value="Montana">Montana</option>
<option value="North Carolina">North Carolina</option>
<option value="North Dakota">North Dakota</option>
<option value="Nebraska">Nebraska</option>
<option value="New Hampshire">New Hampshire</option>
<option value="New Jersey">New Jersey</option>
<option value="New Mexico">New Mexico</option>
<option value="Nevada">Nevada</option>
<option value="New York">New York</option>
<option value="Ohio">Ohio</option>
<option value="Oklahoma">Oklahoma</option>
<option value="Oregon">Oregon</option>
<option value="Pennsylvania">Pennsylvania</option>
<option value="Rhode Island">Rhode Island</option>
<option value="South Carolina">South Carolina</option>
<option value="South Dakota">South Dakota</option>
<option value="Tennessee">Tennessee</option>
<option value="Texas">Texas</option>
<option value="Utah">Utah</option>
<option value="Virginia">Virginia</option>
<option value="Vermont">Vermont</option>
<option value="Washington">Washington</option>
<option value="Wisconsin">Wisconsin</option>
<option value="West Virginia">West Virginia</option>
<option value="Wyoming">Wyoming</option>
</select>
</div>
</div>
<div className="col-md-4">
County
<select
className="form-floating mb-3 form-control"
name="county"
value={formData.county}
onChange={handleChange}
required
>
<option value="">Please Select County</option>
<option value="Abbeville">Abbeville</option>
<option value="Aiken">Aiken</option>
<option value="Allendale">Allendale</option>
<option value="Anderson">Anderson</option>
<option value="Bamberg">Bamberg</option>
<option value="Barnwell">Barnwell</option>
<option value="Beaufort">Beaufort</option>
<option value="Berkeley">Berkeley</option>
<option value="Calhoun">Calhoun</option>
<option value="Charleston">Charleston</option>
<option value="Cherokee">Cherokee</option>
<option value="Chester">Chester</option>
<option value="Chesterfield">Chesterfield</option>
<option value="Clarendon">Clarendon</option>
<option value="Colleton">Colleton</option>
<option value="Darlington">Darlington</option>
<option value="Dillon">Dillon</option>
<option value="Dorchester">Dorchester</option>
<option value="Edgefield">Edgefield</option>
<option value="Fairfield">Fairfield</option>
<option value="Florence">Florence</option>
<option value="Georgetown">Georgetown</option>
<option value="Greenville">Greenville</option>
<option value="Greenwood">Greenwood</option>
<option value="Hampton">Hampton</option>
<option value="Horry">Horry</option>
<option value="Jasper">Jasper</option>
<option value="Kershaw">Kershaw</option>
<option value="Lancaster">Lancaster</option>
<option value="Laurens">Laurens</option>
<option value="Lee">Lee</option>
<option value="Lexington">Lexington</option>
<option value="Marion">Marion</option>
<option value="Marlboro">Marlboro</option>
<option value="McCormick">McCormick</option>
<option value="Newberry">Newberry</option>
<option value="Oconee">Oconee</option>
<option value="Orangeburg">Orangeburg</option>
<option value="Pickens">Pickens</option>
<option value="Richland">Richland</option>
<option value="Saluda">Saluda</option>
<option value="Spartanburg">Spartanburg</option>
<option value="Sumter">Sumter</option>
<option value="Union">Union</option>
<option value="Williamsburg">Williamsburg</option>
<option value="York">York</option>
</select>
</div>
<div className="col-4">
<div className="form-floating mb-3">
Zip
<input
type="text"
className="form-control"
name="zip"
placeholder="zip"
value={formData.zip}
onChange={handleChange}
required
/>
</div>
</div>
2024-09-30 15:39:00 +00:00
{/* Profile Image Upload Section */}
<div className="col-4">
<label>Profile Image</label>
<div className="mb-3">
<FileBase
type="file"
multiple={false}
onDone={({ base64 }) =>
setFormData({ ...formData, profileImage: base64 })
}
/>
</div>
</div>
{/* Display Preview of Uploaded Image */}
{formData.profileImage && (
<div className="col-4 mb-3">
<img
src={formData.profileImage}
alt="Profile Preview"
style={{ width: "150px", height: "150px", borderRadius: "50%" }}
/>
{/* Delete Image Button */}
<button
type="button"
className="btn btn-danger mt-2"
onClick={handleImageDelete}
>
Delete Image
</button>
</div>
)}
<div className="col-12">
<div className="d-grid">
<button
className="btn btn-primary btn-lg"
type="submit"
style={{
backgroundColor: "#fda417",
border: "#fda417",
}}
disabled={isLoading}
>
{isLoading ? "Updating..." : "Update"}
</button>
</div>
</div>
2024-10-22 06:43:35 +00:00
2024-09-30 15:39:00 +00:00
</form>
</>
);
};
export default UserProfile;