Skip to content

Commit cc74359

Browse files
committed
remove the intersection observer from achievementProgress, removed timeline.css file and rewrite its code to tailwindCss code, implemented achievement schine animation in achievement and achievement components
1 parent 01ec2eb commit cc74359

File tree

3 files changed

+47
-141
lines changed

3 files changed

+47
-141
lines changed

packages/app/src/app/dashboard/_components/achievementProgress.tsx

+14-37
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
"use client";
22

3-
import React, { useEffect, useRef, useState } from "react";
3+
import React from "react";
44
import { ScrollArea } from "@/components/ui/scroll-area";
55
import { Avatar, AvatarImage } from "@/components/ui/avatar";
66
import { BanIcon } from "lucide-react";
77
import { Achievement as PrsimaAchievement } from "@prisma/client";
88
import { Achievement } from "@/types/achievement";
9-
import "../timeline.css";
109

1110
interface Props {
1211
userAchievements: PrsimaAchievement[];
@@ -34,36 +33,8 @@ export default function AchievementProgress({
3433
return (
3534
<ScrollArea className="rounded-md h-[300px] border-2 border-primary p-4 mt-10">
3635
<h3 className="text-primary font-special">Achievement Progress</h3>
37-
<div className="timeline">
36+
<div className="relative my-[20px] flex flex-col justify-center items-center">
3837
{updatedAllAch.map((achievement) => {
39-
const timelineItemRef = useRef<HTMLDivElement>(null);
40-
41-
const [isVisible, setIsVisible] = useState<boolean>(false);
42-
43-
useEffect(() => {
44-
const observer = new IntersectionObserver(
45-
(entries) => {
46-
const [entry] = entries;
47-
setIsVisible(entry.isIntersecting);
48-
},
49-
{
50-
root: null,
51-
rootMargin: "-20px",
52-
threshold: 0.1, // Adjust this threshold as per your needs
53-
}
54-
);
55-
56-
if (timelineItemRef.current) {
57-
observer.observe(timelineItemRef.current);
58-
}
59-
60-
return () => {
61-
if (timelineItemRef.current) {
62-
observer.unobserve(timelineItemRef.current);
63-
}
64-
};
65-
}, [timelineItemRef]);
66-
6738
const isUnlocked = userAchievements.some(
6839
(userAchievement) =>
6940
userAchievement.achievementType === achievement.type
@@ -73,22 +44,28 @@ export default function AchievementProgress({
7344

7445
return (
7546
<div
76-
ref={timelineItemRef}
7747
key={achievement.type}
7848
id={itemId}
79-
className={`timeline-item ${isUnlocked ? "unlocked" : "locked"} ${
80-
isVisible && "animate-fade"
81-
} shadow-lg shadow-accent opacity-100 `}
49+
style={
50+
isUnlocked
51+
? {
52+
backgroundImage: "var(--achievement-progress-gradient)",
53+
}
54+
: {}
55+
}
56+
className={`relative h-[62px] p-[3px] mb-[20px] rounded-sm cursor-pointer w-1/2 lg:w-1/4 ${
57+
isUnlocked ? "animate-gradient bg-achievement" : "bg-red-500"
58+
} shadow-lg shadow-accent even:ml-[50%] odd:mr-[50%]`}
8259
>
83-
<div className="timeline-content">
60+
<div className="flex items-center justify-center text-center w-full h-full bg-accent rounded-md">
8461
{isUnlocked ? (
8562
<Avatar>
8663
<AvatarImage src={achievement.image} />
8764
</Avatar>
8865
) : (
8966
<BanIcon className="text-primary" />
9067
)}
91-
<p>{achievement.name}</p>
68+
<p className="m-0 pl-[3px]">{achievement.name}</p>
9269
</div>
9370
</div>
9471
);

packages/app/src/app/dashboard/timeline.css

-78
This file was deleted.

packages/app/src/components/achievement.tsx

+33-26
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,39 @@ export const AchievementCard = ({
1616
};
1717
}) => {
1818
return (
19-
<li className="flex items-center justify-between bg-accent p-3 sm:p-4 md:px-6 md:py-3 rounded-sm">
20-
<div className="flex-1 flex flex-col gap-2">
21-
<h3 className="text-xl font-bold">{achievement.name}</h3>
22-
{achievement.description && (
23-
<p className="text-sm text-muted-foreground">
24-
{achievement.description}
19+
<li
20+
className="p-[5px] rounded-sm cursor-pointer animate-gradient bg-achievement"
21+
style={{
22+
backgroundImage: "var(--achievement-progress-gradient)",
23+
}}
24+
>
25+
<div className="w-full h-full flex items-center justify-between bg-accent p-3 sm:p-4 md:px-6 md:py-3">
26+
<div className="flex-1 flex flex-col gap-2">
27+
<h3 className="text-xl font-bold">{achievement.name}</h3>
28+
{achievement.description && (
29+
<p className="text-sm text-muted-foreground">
30+
{achievement.description}
31+
</p>
32+
)}
33+
<p className="flex items-center text-xs text-accent-foreground">
34+
<Icons.trophy className="w-4 h-4 mr-2" />
35+
<span>
36+
Unlocked:{" "}
37+
<time dateTime={achievement.unlockedAt.toISOString()}>
38+
{achievement.unlockedAt.toLocaleDateString()}
39+
</time>
40+
</span>
2541
</p>
26-
)}
27-
<p className="flex items-center text-xs text-accent-foreground">
28-
<Icons.trophy className="w-4 h-4 mr-2" />
29-
<span>
30-
Unlocked:{" "}
31-
<time dateTime={achievement.unlockedAt.toISOString()}>
32-
{achievement.unlockedAt.toLocaleDateString()}
33-
</time>
34-
</span>
35-
</p>
36-
</div>
37-
<div className="w-13 h-13 md:w-20 md:h-20">
38-
<Image
39-
src={achievement.image}
40-
width={50}
41-
height={50}
42-
alt={`Achievement: ${achievement.name}`}
43-
className="w-full max-w-full object-cover"
44-
/>
42+
</div>
43+
<div className="w-13 h-13 md:w-20 md:h-20">
44+
<Image
45+
src={achievement.image}
46+
width={50}
47+
height={50}
48+
alt={`Achievement: ${achievement.name}`}
49+
className="w-full max-w-full object-cover"
50+
/>
51+
</div>
4552
</div>
4653
</li>
4754
);
@@ -78,7 +85,7 @@ export function unlockAchievement({
7885
}) {
7986
toast({
8087
description: (
81-
<div className="flex flex-col gap-4">
88+
<div className="flex justify-center items-center flex-col gap-4">
8289
<div className="flex items-center gap-2 text-lg md:text-xl">
8390
<UnlockIcon className="text-accent-foreground" />{" "}
8491
<span className="text-muted-foreground">Unlocked:</span>{" "}

0 commit comments

Comments
 (0)