Skip to content

Commit 618b1eb

Browse files
Merge pull request #27 from CS3219-AY2425S1/edit-profile
Update UI and Include Checks for Username
2 parents e936e31 + 26afae7 commit 618b1eb

File tree

3 files changed

+50
-32
lines changed

3 files changed

+50
-32
lines changed

Frontend/package-lock.json

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"@testing-library/user-event": "^13.5.0",
99
"axios": "^1.7.7",
1010
"bootstrap": "^5.3.3",
11+
"jwt-decode": "^4.0.0",
1112
"react": "^18.3.1",
1213
"react-bootstrap": "^2.10.4",
1314
"react-dom": "^18.3.1",

Frontend/src/components/user/EditProfile.jsx

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ function EditProfile() {
1212
const [errorMessage, setErrorMessage] = useState('');
1313
const [successMessage, setSuccessMessage] = useState('');
1414
const [usernameError, setUsernameError] = useState(false);
15-
const [emailError, setEmailError] = useState(false);
1615
const [passwordError, setPasswordError] = useState(false);
1716

1817
useEffect(() => {
@@ -21,6 +20,7 @@ function EditProfile() {
2120
const response = await userService.getUser(id,
2221
{ headers: { Authorization: `Bearer ${sessionStorage.getItem('jwt_token')}` } });
2322
setUserData(response.data);
23+
setEmail(response.data.data.email)
2424
}
2525
fetchUserData();
2626
}, [id]);
@@ -34,22 +34,30 @@ function EditProfile() {
3434
// Handle the user profile edit
3535
const newUser = {};
3636
if (username) newUser.username = username;
37-
if (email) newUser.email = email;
3837
if (password) newUser.password = password;
3938

4039
// Reset error messages
4140
setErrorMessage('');
4241
setSuccessMessage('');
4342
setUsernameError(false);
44-
setEmailError(false);
4543
setPasswordError(false);
4644

4745
// Validate inputs
48-
if (!username && !email && !password) {
46+
if (!username && !password) {
4947
setErrorMessage("Please fill in at least one field")
5048
return;
5149
}
5250

51+
const usernameRegex = /^[a-zA-Z0-9._]{3,20}$/;
52+
const isValidUsername = usernameRegex.test(username)
53+
54+
if(!isValidUsername) {
55+
console.log("username is not valid:", username)
56+
setUsernameError(true)
57+
setErrorMessage("Username can only contain letters, numbers, dots (.), and underscores (_), and must be between 3 and 20 characters long.")
58+
return;
59+
}
60+
5361
if (password !== confirmPassword) {
5462
setPasswordError(true);
5563
setErrorMessage('Passwords do not match');
@@ -72,7 +80,7 @@ function EditProfile() {
7280
case 409:
7381
setErrorMessage('Username or email already exists.');
7482
setUsernameError(true);
75-
setEmailError(true);
83+
// setEmailError(true);
7684
break;
7785
case 500:
7886
setErrorMessage('Server error. Please try again later.');
@@ -89,9 +97,24 @@ function EditProfile() {
8997
const goHome = () => navigate('/home')
9098
// Render user edit form based on userData
9199
return userData ? (
92-
<div>
93-
<h2>Edit Profile</h2>
94-
<div className="right-side">
100+
101+
<div style={{
102+
display: 'flex',
103+
justifyContent: 'center',
104+
alignItems: 'left',
105+
height: '100vh',
106+
textAlign: 'center', // Centers text within child elements
107+
margin: 30 // Ensures no default margin
108+
}}>
109+
<div style={{
110+
width: '100%', // Full width
111+
maxWidth: '600px', // Optional: limit width for better layout
112+
padding: '20px',
113+
backgroundColor: '#fff',
114+
borderRadius: '8px' // Optional: rounded corners
115+
}}>
116+
<h2 style={{textAlign: 'left'}}>Edit Profile</h2>
117+
<p style={{ textAlign: 'left'}}>Hi <strong>{email}</strong>, feel free to update any information below.</p>
95118
<div className="input-container">
96119
<form onSubmit={handleEditProfile}>
97120
<InputField
@@ -100,29 +123,18 @@ function EditProfile() {
100123
placeholder="Enter your username"
101124
value={username}
102125
onChange={(e) => {
103-
setUsername(e.target.value)
126+
setUsername(e.target.value);
104127
setUsernameError(false);
105128
}}
106129
error={usernameError}
107130
/>
108-
<InputField
109-
label="Email"
110-
type="email"
111-
placeholder="Enter your email"
112-
value={email}
113-
onChange={(e) => {
114-
setEmail(e.target.value)
115-
setEmailError(false);
116-
}}
117-
error={emailError}
118-
/>
119131
<InputField
120132
label="Password"
121133
type="password"
122134
placeholder="Enter your password"
123135
value={password}
124136
onChange={(e) => {
125-
setPassword(e.target.value)
137+
setPassword(e.target.value);
126138
setPasswordError(false);
127139
}}
128140
error={passwordError}
@@ -133,27 +145,23 @@ function EditProfile() {
133145
placeholder="Confirm your password"
134146
value={confirmPassword}
135147
onChange={(e) => {
136-
setConfirmPassword(e.target.value)
148+
setConfirmPassword(e.target.value);
137149
setPasswordError(false);
138150
}}
139151
error={passwordError}
140152
/>
141-
<div className='button-container'>
153+
<div className='button-container' style={{ display: 'flex', justifyContent: 'flex-end', marginTop: '20px' }}>
154+
<button type='button' onClick={goHome} className="create-account-link">
155+
Cancel
156+
</button>
142157
<button type="submit" className="signup-button">
143158
Change Profile Details
144159
</button>
145160
</div>
146-
<div className='button-container'>
147-
<button type={'button'} onClick={goHome} className="signup-button">
148-
Cancel
149-
</button>
150-
</div>
161+
151162
</form>
152-
<div className='notification'>
153-
{/* Success Message */}
163+
<div className='notification' style={{ marginTop: '5px', textAlign: 'center' }}>
154164
{successMessage && <p className="text-success mt-3">{successMessage}</p>}
155-
156-
{/* Error Message */}
157165
{errorMessage && <p className="text-danger mt-3">{errorMessage}</p>}
158166
</div>
159167
</div>

0 commit comments

Comments
 (0)