Skip to content

Commit 3f95b0b

Browse files
authored
Merge pull request #5698 from webkom/improve-trophies-profile
Improve trophies on profile
2 parents a26e62a + de0e995 commit 3f95b0b

File tree

5 files changed

+93
-29
lines changed

5 files changed

+93
-29
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
.showMore {
2+
display: flex;
3+
justify-content: center;
4+
height: 50px;
5+
width: 100%;
6+
position: absolute;
7+
bottom: 0;
8+
background-image: linear-gradient(
9+
rgba(0, 0, 0, 0%),
10+
var(--lego-card-color),
11+
var(--lego-card-color)
12+
);
13+
cursor: pointer;
14+
}
15+
16+
.showMoreIcon {
17+
padding: 3px;
18+
margin: 0;
19+
border-radius: 50%;
20+
background-color: var(--lego-card-color);
21+
}
22+
23+
.collapse {
24+
position: relative;
25+
overflow: hidden;
26+
transition: height var(--easing-medium);
27+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { Icon } from '@webkom/lego-bricks';
2+
import { useState, useRef } from 'react';
3+
import styles from './Collapsible.module.css';
4+
5+
type CollapsibleProps = {
6+
collapsedHeight: number;
7+
className: string;
8+
children: ReactNode[];
9+
};
10+
11+
const Collapsible = (props: CollapsibleProps) => {
12+
const { children, collapsedHeight, className } = props;
13+
14+
const [isOpened, setIsOpened] = useState(false);
15+
16+
const ref = useRef<HTMLDivElement>(null);
17+
const useCollapse = ref.current && collapsedHeight < ref.current.clientHeight;
18+
19+
return (
20+
<div
21+
className={styles.collapse}
22+
style={{
23+
height: !useCollapse
24+
? undefined
25+
: isOpened
26+
? ref.current.clientHeight + 50
27+
: collapsedHeight + 'px',
28+
}}
29+
>
30+
<div className={className} ref={ref}>
31+
{children}
32+
</div>
33+
{useCollapse && (
34+
<div className={styles.showMore}>
35+
<Icon
36+
onPress={() => {
37+
setIsOpened(!isOpened);
38+
}}
39+
name={isOpened ? 'chevron-up' : 'chevron-down'}
40+
className={styles.showMoreIcon}
41+
size={30}
42+
/>
43+
</div>
44+
)}
45+
</div>
46+
);
47+
};
48+
49+
export default Collapsible;

lego-webapp/pages/users/@username/_components/Achievements.tsx

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,18 @@ import {
77
Tooltip,
88
} from '@webkom/lego-bricks';
99
import moment from 'moment-timezone';
10-
import { useState, useMemo } from 'react';
10+
import { useMemo } from 'react';
11+
import Collapsible from '~/components/Collapsible/Collapsible';
1112
import { TitleWithRarity } from '~/pages/achievements/+Page';
1213
import AchievementsInfo from '~/utils/achievementConstants';
1314
import styles from './UserProfile.module.css';
1415
import type { Achievement } from '~/redux/models/User';
1516

16-
const MAX_ACHIEVEMENTS = 4;
17-
1817
export const Achievements = ({
1918
achievements,
2019
}: {
2120
achievements: Achievement[];
2221
}) => {
23-
const [showAll, setShowAll] = useState(false);
24-
2522
const sortedAchievements = useMemo(() => {
2623
return [...achievements].sort((a, b) => {
2724
if (
@@ -38,15 +35,11 @@ export const Achievements = ({
3835
});
3936
}, [achievements]);
4037

41-
const topAchievements = showAll
42-
? sortedAchievements
43-
: sortedAchievements.slice(0, MAX_ACHIEVEMENTS);
44-
4538
return (
4639
<div className={styles.achievements}>
4740
<h3>Trofeer</h3>
48-
<div className={styles.trophyContainer}>
49-
{topAchievements.map((e) => (
41+
<Collapsible className={styles.trophyContainer} collapsedHeight={230}>
42+
{sortedAchievements.map((e) => (
5043
<Tooltip
5144
key={AchievementsInfo[e.identifier][e.level].name}
5245
className={styles.trophy}
@@ -83,19 +76,7 @@ export const Achievements = ({
8376
</BaseCard>
8477
</Tooltip>
8578
))}
86-
</div>
87-
<Flex gap="var(--spacing-md)" className={styles.trophyLinks}>
88-
{achievements.length > MAX_ACHIEVEMENTS && (
89-
<Button
90-
onPress={() => {
91-
setShowAll((prev) => !prev);
92-
}}
93-
>
94-
{showAll ? 'Vis færre' : 'Vis alle'}
95-
</Button>
96-
)}
97-
<LinkButton href="/achievements/leaderboard">Topplister</LinkButton>
98-
</Flex>
79+
</Collapsible>
9980
</div>
10081
);
10182
};

lego-webapp/pages/users/@username/_components/GroupMemberships.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import cx from 'classnames';
33
import { groupBy, orderBy } from 'lodash-es';
44
import { CircleMinus } from 'lucide-react';
55
import moment from 'moment-timezone';
6+
import { useMemo } from 'react';
67
import { GroupType, type Dateish } from 'app/models';
78
import { CircularPicture } from '~/components/Image';
89
import Pill from '~/components/Pill';
@@ -65,10 +66,20 @@ export const GroupMemberships = ({
6566
],
6667
);
6768

69+
const sortedMembershipsAsPills = useMemo(
70+
() =>
71+
membershipsAsPills.toSorted((a, b) =>
72+
a.abakusGroup.name
73+
.toLowerCase()
74+
.localeCompare(b.abakusGroup.name.toLowerCase()),
75+
),
76+
[membershipsAsPills],
77+
);
78+
6879
return (
6980
<Flex column gap="var(--spacing-sm)" className={styles.rightContent}>
7081
<Flex wrap gap="var(--spacing-sm)">
71-
{membershipsAsPills.map((membership) => (
82+
{sortedMembershipsAsPills.map((membership) => (
7283
<GroupPill key={membership.id} group={membership.abakusGroup} />
7384
))}
7485
</Flex>

lego-webapp/pages/users/@username/_components/UserProfile.module.css

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,6 @@ img.frame {
151151
justify-content: space-between;
152152
}
153153

154-
.trophyLinks {
155-
margin-top: var(--spacing-md);
156-
}
157-
158154
.trophyImage {
159155
height: 100px;
160156
width: auto;

0 commit comments

Comments
 (0)