Skip to content

Commit 6a7d903

Browse files
Updated team members components
1 parent b880273 commit 6a7d903

4 files changed

Lines changed: 81 additions & 25 deletions

File tree

src/components/HGNHelpSkillsDashboard/CommunityMembersPage.jsx

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from 'react';
1+
import React, { useState, useMemo } from 'react';
22
import RankedUserList from './RankedUserList'; // wherever your RankedUserList is
33

44
const availableSkills = ['React', 'Redux', 'HTML', 'CSS', 'MongoDB', 'Database', 'Agile'];
@@ -12,23 +12,32 @@ function CommunityMembersPage() {
1212
);
1313
};
1414

15+
// EFFECTIVE SKILLS = what we pass to RankedUserList
16+
const effectiveSkills = useMemo(() => {
17+
return selectedSkills.length > 0 ? selectedSkills : availableSkills;
18+
}, [selectedSkills]);
19+
1520
return (
1621
<div>
17-
<h2>Select Skills to Filter Community Members</h2>
18-
<div style={{ display: 'flex', flexWrap: 'wrap', gap: '12px' }}>
19-
{availableSkills.map(skill => (
20-
<label key={skill}>
21-
<input
22-
type="checkbox"
23-
checked={selectedSkills.includes(skill)}
24-
onChange={() => handleCheckboxChange(skill)}
25-
/>
26-
{skill}
27-
</label>
28-
))}
22+
<h1>Community Members</h1>
23+
24+
<div style={{ marginBottom: 16 }}>
25+
<strong>Filter by skills:</strong>
26+
<div style={{ display: 'flex', gap: 10, marginTop: 8, flexWrap: 'wrap' }}>
27+
{availableSkills.map(skill => (
28+
<label key={skill} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
29+
<input
30+
type="checkbox"
31+
checked={selectedSkills.includes(skill)}
32+
onChange={() => handleCheckboxChange(skill)}
33+
/>
34+
{skill}
35+
</label>
36+
))}
37+
</div>
2938
</div>
3039

31-
{selectedSkills.length > 0 && <RankedUserList selectedSkills={selectedSkills} />}
40+
<RankedUserList selectedSkills={effectiveSkills} />
3241
</div>
3342
);
3443
}

src/components/HGNHelpSkillsDashboard/RankedUserList.jsx

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,56 @@ import axios from 'axios';
33
import UserCard from './UserCard';
44
import './style/UserCard.module.css';
55

6-
function RankedUserList({ selectedSkills }) {
6+
function RankedUserList({ selectedSkills = [] }) {
77
const [rankedUsers, setRankedUsers] = useState([]);
88
const [loading, setLoading] = useState(true);
9+
const [error, setError] = useState(null);
910

1011
useEffect(() => {
11-
if (!selectedSkills || selectedSkills.length === 0) return;
12+
let canceled = false;
1213

1314
const fetchRankedUsers = async () => {
1415
setLoading(true);
16+
setError(null);
17+
1518
try {
16-
const response = await axios.get('http://localhost:4500/api/hgnform/ranked', {
17-
params: { skills: selectedSkills.join(',') },
18-
});
19-
setRankedUsers(response.data);
19+
const params = {};
20+
if (Array.isArray(selectedSkills) && selectedSkills.length > 0) {
21+
params.skills = selectedSkills.join(',');
22+
}
23+
24+
const response = await axios.get('http://localhost:4500/api/hgnform/ranked', { params });
25+
26+
if (!canceled) {
27+
const data = response?.data || [];
28+
setRankedUsers(Array.isArray(data) ? data : []);
29+
}
2030
} catch (err) {
21-
// console.error('Error fetching ranked users:', err);
31+
console.error('Failed to fetch ranked users', err);
32+
if (!canceled) {
33+
setError(err);
34+
setRankedUsers([]);
35+
}
2236
} finally {
23-
setLoading(false);
37+
if (!canceled) setLoading(false);
2438
}
2539
};
2640

2741
fetchRankedUsers();
42+
43+
return () => {
44+
canceled = true;
45+
};
2846
}, [selectedSkills]);
2947

3048
if (loading) return <p>Loading ranked users...</p>;
49+
if (error) return <p>Failed to load users.</p>;
50+
if (!rankedUsers.length) return <p>No members found.</p>;
3151

3252
return (
3353
<div className="user-card-container">
3454
{rankedUsers.map(user => (
35-
<UserCard key={user._id} user={user} />
55+
<UserCard key={user._id || user.id || user.uuid} user={user} />
3656
))}
3757
</div>
3858
);

src/components/HGNHelpSkillsDashboard/UserCard.jsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
import React from 'react';
12
import styles from './style/UserCard.module.css';
23
import avatar from './style/avatar.png';
34
import emailIcon from './style/email_icon.png';
45
import slackIcon from './style/slack_icon.png';
56

7+
import { useSelector } from 'react-redux';
8+
69
function UserCard({ user }) {
10+
const darkMode = useSelector(state => state.theme?.darkMode);
711
const { name, email, slack, score, topSkills } = user;
812

913
const getScoreColor = userScore => {
@@ -12,7 +16,7 @@ function UserCard({ user }) {
1216
};
1317

1418
return (
15-
<div className={`${styles.userCard}`}>
19+
<div className={`${styles.userCard} ${darkMode ? styles.darkMode : ''}`}>
1620
<img src={avatar} alt="Avatar" className={`${styles.avatar}`} />
1721
<div className={`${styles.info}`}>
1822
<div className={`${styles.userName}`}>{name}</div>
@@ -41,7 +45,9 @@ function UserCard({ user }) {
4145

4246
<div className={`${styles.skillsSection}`}>
4347
<div className={`${styles.skillsLabel}`}>Top Skills:</div>
44-
<div className={`${styles.skillsText}`}>{topSkills.join(', ')}</div>
48+
<div className={`${styles.skillsText}`}>
49+
{Array.isArray(topSkills) ? topSkills.join(', ') : topSkills || ''}
50+
</div>
4551
</div>
4652
</div>
4753
</div>

src/components/HGNHelpSkillsDashboard/style/UserCard.module.css

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,24 @@
104104
line-height: 22px;
105105
word-wrap: break-word;
106106
}
107+
108+
.darkMode {
109+
color: #111 !important;
110+
-webkit-text-fill-color: #111 !important;
111+
}
112+
113+
.darkMode .contactLine,
114+
.darkMode .skillsText {
115+
color: #616161 !important;
116+
}
117+
118+
.darkMode .userName {
119+
color: black !important;
120+
}
121+
122+
.darkMode .scoreLine,
123+
.darkMode .scoreLabel,
124+
.darkMode .scoreValue,
125+
.darkMode .scoreMax {
126+
color: #111 !important;
127+
}

0 commit comments

Comments
 (0)