react-achievements 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -0
- package/dist/components/AchievementModal.d.ts +2 -1
- package/dist/components/BadgesModal.d.ts +2 -2
- package/dist/components/ConfettiWrapper.d.ts +2 -0
- package/dist/context/AchievementContext.d.ts +7 -11
- package/dist/index.cjs.js +165 -82
- package/dist/index.d.ts +3 -4
- package/dist/index.esm.js +167 -84
- package/dist/types.d.ts +17 -0
- package/package.json +1 -1
- package/src/components/AchievementModal.tsx +7 -4
- package/src/components/BadgesModal.tsx +8 -8
- package/src/components/ConfettiWrapper.tsx +13 -3
- package/src/context/AchievementContext.tsx +80 -49
- package/src/index.ts +11 -4
- package/src/{custom.d.ts → react-confetti.d.ts} +2 -4
- package/src/react-use.d.ts +4 -0
- package/src/types.ts +21 -0
- package/tsconfig.json +3 -1
- package/src/badges.ts +0 -24
- package/src/components/Achievement.tsx +0 -29
- package/src/components/Progress.tsx +0 -37
- package/src/levels.ts +0 -13
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
declare module 'react-confetti' {
|
|
2
2
|
import { ComponentType } from 'react';
|
|
3
3
|
|
|
4
|
-
interface ConfettiProps {
|
|
4
|
+
export interface ConfettiProps {
|
|
5
5
|
width?: number;
|
|
6
6
|
height?: number;
|
|
7
7
|
numberOfPieces?: number;
|
|
@@ -16,6 +16,4 @@ declare module 'react-confetti' {
|
|
|
16
16
|
|
|
17
17
|
const Confetti: ComponentType<ConfettiProps>;
|
|
18
18
|
export default Confetti;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
declare module 'react-use'
|
|
19
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type MetricValue = number | boolean | string | any;
|
|
2
|
+
|
|
3
|
+
export interface Metrics {
|
|
4
|
+
[key: string]: MetricValue;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface AchievementData {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
description: string;
|
|
11
|
+
icon: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface AchievementCondition {
|
|
15
|
+
check: (metricValue: MetricValue) => boolean;
|
|
16
|
+
data: AchievementData;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface AchievementConfig {
|
|
20
|
+
[metricKey: string]: AchievementCondition[];
|
|
21
|
+
}
|
package/tsconfig.json
CHANGED
|
@@ -105,5 +105,7 @@
|
|
|
105
105
|
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
|
106
106
|
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
|
107
107
|
},
|
|
108
|
-
"include": [
|
|
108
|
+
"include": [
|
|
109
|
+
"src",
|
|
110
|
+
"react-confetti.d.ts"]
|
|
109
111
|
}
|
package/src/badges.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export interface BadgeConfig {
|
|
2
|
-
id: string;
|
|
3
|
-
icon: string;
|
|
4
|
-
title: string;
|
|
5
|
-
description: string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const defaultBadges: BadgeConfig[] = [
|
|
9
|
-
{
|
|
10
|
-
id: 'beginner',
|
|
11
|
-
icon: '/path/to/beginner-icon.png',
|
|
12
|
-
title: 'Beginner',
|
|
13
|
-
description: 'Achieved beginner level',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
id: 'intermediate',
|
|
17
|
-
icon: '/path/to/intermediate-icon.png',
|
|
18
|
-
title: 'Intermediate',
|
|
19
|
-
description: 'Achieved intermediate level',
|
|
20
|
-
},
|
|
21
|
-
// Add more badges as needed
|
|
22
|
-
];
|
|
23
|
-
|
|
24
|
-
export { defaultBadges };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React, { useEffect } from 'react';
|
|
2
|
-
import { useAchievement } from '../context/AchievementContext';
|
|
3
|
-
|
|
4
|
-
interface AchievementProps {
|
|
5
|
-
metric: number;
|
|
6
|
-
threshold: number;
|
|
7
|
-
onAchieve: () => void;
|
|
8
|
-
message: string;
|
|
9
|
-
children: React.ReactNode;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const Achievement: React.FC<AchievementProps> = ({ metric, threshold, onAchieve, message, children }) => {
|
|
13
|
-
const { setMetric, achievedLevels, levels, handleAchieve } = useAchievement();
|
|
14
|
-
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
if (metric >= threshold && !achievedLevels.includes(threshold)) {
|
|
17
|
-
onAchieve();
|
|
18
|
-
const levelConfig = levels.find(level => level.threshold === threshold);
|
|
19
|
-
if (levelConfig) {
|
|
20
|
-
setMetric(metric);
|
|
21
|
-
handleAchieve(levelConfig.level, message);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}, [metric, threshold, onAchieve, achievedLevels, levels, message, setMetric, handleAchieve]);
|
|
25
|
-
|
|
26
|
-
return <>{children}</>;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export default React.memo(Achievement);
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { useAchievement } from '../context/AchievementContext';
|
|
3
|
-
|
|
4
|
-
interface ProgressProps {
|
|
5
|
-
style?: React.CSSProperties;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const Progress: React.FC<ProgressProps> = ({ style }) => {
|
|
9
|
-
const { metric, levels, achievedLevels } = useAchievement();
|
|
10
|
-
const maxLevel = levels[levels.length - 1];
|
|
11
|
-
const progress = (metric / maxLevel.threshold) * 100;
|
|
12
|
-
|
|
13
|
-
const containerStyle: React.CSSProperties = {
|
|
14
|
-
width: '100%',
|
|
15
|
-
backgroundColor: '#e0e0e0',
|
|
16
|
-
borderRadius: '8px',
|
|
17
|
-
overflow: 'hidden',
|
|
18
|
-
...style,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const barStyle: React.CSSProperties = {
|
|
22
|
-
width: `${progress}%`,
|
|
23
|
-
height: '20px',
|
|
24
|
-
backgroundColor: '#4caf50',
|
|
25
|
-
transition: 'width 0.5s ease-in-out',
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
return (
|
|
29
|
-
<div style={containerStyle}>
|
|
30
|
-
<div style={barStyle} role="progressbar" aria-valuenow={metric} aria-valuemin={0} aria-valuemax={maxLevel.threshold} />
|
|
31
|
-
<p>Level: {achievedLevels.length} / {levels.length}</p>
|
|
32
|
-
<p>Progress: {metric} / {maxLevel.threshold}</p>
|
|
33
|
-
</div>
|
|
34
|
-
);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export default React.memo(Progress);
|
package/src/levels.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export interface LevelConfig {
|
|
2
|
-
level: number;
|
|
3
|
-
threshold: number;
|
|
4
|
-
badgeId: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
const defaultLevels: LevelConfig[] = [
|
|
8
|
-
{ level: 1, threshold: 10, badgeId: 'beginner' },
|
|
9
|
-
{ level: 2, threshold: 50, badgeId: 'intermediate' },
|
|
10
|
-
// Add more levels as needed
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
export { defaultLevels };
|