253 lines
6.6 KiB
React
253 lines
6.6 KiB
React
import React, { useState, useEffect } from 'react';
|
|
import { useNavigate } from 'react-router-dom';
|
|
|
|
import { tokenService } from '../services/TokenService';
|
|
import { userApi } from '../api/loginApi';
|
|
import { APP_NAME } from '../constants/app';
|
|
|
|
import './ProfileForm.css';
|
|
|
|
const ProfileForm = () => {
|
|
const navigate = useNavigate();
|
|
const [activeView, setActiveView] = useState('profile');
|
|
const [subView, setSubView] = useState('details');
|
|
const [formData, setFormData] = useState({
|
|
firstname: '',
|
|
lastname: '',
|
|
phone: '',
|
|
username: '',
|
|
createdDate: new Date().toISOString().split('T')[0],
|
|
lastLoginDate: new Date().toISOString().split('T')[0],
|
|
});
|
|
|
|
const [passwordData, setPasswordData] = useState({
|
|
currentPassword: '',
|
|
newPassword: '',
|
|
confirmNewPassword: '',
|
|
});
|
|
|
|
useEffect(() => {
|
|
const fetchData = async () => {
|
|
const userId = tokenService.getUserId();
|
|
const response = await userApi.get_user_profile(userId);
|
|
|
|
if (response) {
|
|
const userProfile = response.data[0];
|
|
setFormData((prev) => ({
|
|
...prev,
|
|
firstname: userProfile.firstname,
|
|
lastname: userProfile.lastname,
|
|
phone: userProfile.phone_number,
|
|
username: userProfile.username,
|
|
createdDate: userProfile.created,
|
|
lastLoginDate: userProfile.last_login,
|
|
}));
|
|
} else {
|
|
console.error('Error getting user profile');
|
|
}
|
|
};
|
|
|
|
fetchData();
|
|
}, []);
|
|
|
|
const handleChange = (e) => {
|
|
const { name, value } = e.target;
|
|
setFormData({ ...formData, [name]: value });
|
|
};
|
|
|
|
const handlePasswordChange = (e) => {
|
|
const { name, value } = e.target;
|
|
setPasswordData((prev) => ({
|
|
...prev,
|
|
[name]: value,
|
|
}));
|
|
};
|
|
|
|
const handleNavClick = (view) => {
|
|
if (view === 'profile') {
|
|
navigate('/user/profile');
|
|
} else {
|
|
navigate(`/${view}`);
|
|
}
|
|
};
|
|
|
|
const handlePasswordSubmit = async (e) => {
|
|
e.preventDefault();
|
|
|
|
try {
|
|
const userId = tokenService.getUserId();
|
|
const currentPassword = passwordData.currentPassword;
|
|
const newPassword = passwordData.newPassword;
|
|
const confirmNewPassword = passwordData.confirmNewPassword;
|
|
|
|
const response = await userApi.update_password(
|
|
userId,
|
|
currentPassword,
|
|
newPassword,
|
|
confirmNewPassword
|
|
);
|
|
if (response) {
|
|
console.log('Successfully updated password');
|
|
} else {
|
|
console.error('Error updating password');
|
|
}
|
|
} catch (error) {
|
|
console.error('Login error:', error);
|
|
} finally {
|
|
}
|
|
};
|
|
|
|
const renderPasswordForm = () => (
|
|
<div className="profile-form">
|
|
<h2>Change Password</h2>
|
|
<form onSubmit={handlePasswordSubmit}>
|
|
<div>
|
|
<label htmlFor="currentPassword">Current Password</label>
|
|
<input
|
|
type="password"
|
|
id="currentPassword"
|
|
name="currentPassword"
|
|
value={passwordData.currentPassword}
|
|
onChange={handlePasswordChange}
|
|
required
|
|
/>
|
|
</div>
|
|
<div>
|
|
<label htmlFor="newPassword">New Password</label>
|
|
<input
|
|
type="password"
|
|
id="newPassword"
|
|
name="newPassword"
|
|
value={passwordData.newPassword}
|
|
onChange={handlePasswordChange}
|
|
required
|
|
/>
|
|
</div>
|
|
<div>
|
|
<label htmlFor="confirmNewPassword">Confirm New Password</label>
|
|
<input
|
|
type="password"
|
|
id="confirmNewPassword"
|
|
name="confirmNewPassword"
|
|
value={passwordData.confirmNewPassword}
|
|
onChange={handlePasswordChange}
|
|
required
|
|
/>
|
|
</div>
|
|
<button type="submit">Update Password</button>
|
|
<button type="button" onClick={() => setSubView('details')}>
|
|
Back to Profile
|
|
</button>
|
|
</form>
|
|
</div>
|
|
);
|
|
|
|
const renderProfileForm = () => (
|
|
<div className="profile-form">
|
|
<h2>User Profile</h2>
|
|
<form>
|
|
<div>
|
|
<label htmlFor="firstname">First Name</label>
|
|
<input
|
|
type="text"
|
|
id="firstname"
|
|
name="firstname"
|
|
value={formData.firstname}
|
|
onChange={handleChange}
|
|
readOnly
|
|
/>
|
|
</div>
|
|
<div>
|
|
<label htmlFor="lastname">Last Name</label>
|
|
<input
|
|
type="text"
|
|
id="lastname"
|
|
name="lastname"
|
|
value={formData.lastname}
|
|
onChange={handleChange}
|
|
readOnly
|
|
/>
|
|
</div>
|
|
<div>
|
|
<label htmlFor="phone">Phone</label>
|
|
<input
|
|
type="tel"
|
|
id="phone"
|
|
name="phone"
|
|
value={formData.phone}
|
|
onChange={handleChange}
|
|
readOnly
|
|
/>
|
|
</div>
|
|
<div>
|
|
<label htmlFor="username">Username</label>
|
|
<input
|
|
type="text"
|
|
id="username"
|
|
name="username"
|
|
value={formData.username}
|
|
onChange={handleChange}
|
|
readOnly
|
|
/>
|
|
</div>
|
|
<div>
|
|
<label htmlFor="createdDate">Created Date</label>
|
|
<input
|
|
type="text"
|
|
id="createdDate"
|
|
name="createdDate"
|
|
value={formData.createdDate}
|
|
readOnly
|
|
/>
|
|
</div>
|
|
<div>
|
|
<label htmlFor="lastLoginDate">Last Login Date</label>
|
|
<input
|
|
type="text"
|
|
id="lastLoginDate"
|
|
name="lastLoginDate"
|
|
value={formData.lastLoginDate}
|
|
readOnly
|
|
/>
|
|
</div>
|
|
</form>
|
|
|
|
<div>
|
|
<button type="button" onClick={() => setSubView('password')}>
|
|
Change Password
|
|
</button>
|
|
</div>
|
|
</div>
|
|
);
|
|
|
|
return (
|
|
<div className="dashboard-container">
|
|
{/* Navbar */}
|
|
<nav className="dashboard-nav">
|
|
<div className="nav-logo">
|
|
<span className="logo-text">{APP_NAME}</span>
|
|
</div>
|
|
<div className="nav-links">
|
|
<button
|
|
className={`nav-link ${activeView === 'dashboard' ? 'active' : ''}`}
|
|
onClick={() => handleNavClick('dashboard')}
|
|
>
|
|
Dashboard
|
|
</button>
|
|
<button
|
|
className={`nav-link ${activeView === 'profile' ? 'active' : ''}`}
|
|
onClick={() => handleNavClick('profile')}
|
|
>
|
|
Profile
|
|
</button>
|
|
</div>
|
|
</nav>
|
|
|
|
{/* Main Content */}
|
|
{subView === 'details' ? renderProfileForm() : renderPasswordForm()}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default ProfileForm;
|