react-achievements 4.1.1 → 4.3.0
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 +6 -5
- package/dist/headless.cjs +37 -50
- package/dist/headless.cjs.map +1 -1
- package/dist/headless.d.ts +11 -10
- package/dist/headless.esm.js +37 -50
- package/dist/headless.esm.js.map +1 -1
- package/dist/index.cjs +223 -128
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +36 -16
- package/dist/index.esm.js +224 -129
- package/dist/index.esm.js.map +1 -1
- package/dist/web.cjs +223 -128
- package/dist/web.cjs.map +1 -1
- package/dist/web.d.ts +36 -16
- package/dist/web.esm.js +224 -129
- package/dist/web.esm.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/react-achievements) [-blue.svg)](./LICENSE) [](https://www.typescriptlang.org/)
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://github.com/dave-b-b/react-achievements/raw/main/assets/Demo.mov">
|
|
10
|
+
<a href="https://github.com/dave-b-b/react-achievements/raw/main/assets/Demo-v4-3.mov">
|
|
11
11
|
<img
|
|
12
|
-
src="https://raw.githubusercontent.com/dave-b-b/react-achievements/main/assets/demo.gif"
|
|
13
|
-
alt="React Achievements demo showing achievement progress and a LearnQuest achievements modal"
|
|
12
|
+
src="https://raw.githubusercontent.com/dave-b-b/react-achievements/main/assets/demo-v4-3.gif"
|
|
13
|
+
alt="React Achievements 4.3 demo showing achievement progress, unlock notifications, and a compact LearnQuest achievements modal"
|
|
14
14
|
width="900"
|
|
15
15
|
/>
|
|
16
16
|
</a>
|
|
@@ -126,6 +126,7 @@ Provider-level icons and UI options are shared across notifications, widgets, mo
|
|
|
126
126
|
icons={{ login: '🔑', streak: '🔥' }}
|
|
127
127
|
ui={{
|
|
128
128
|
theme: 'minimal',
|
|
129
|
+
notificationDuration: 8000,
|
|
129
130
|
NotificationComponent: MyNotification,
|
|
130
131
|
ModalComponent: MyAchievementsModal,
|
|
131
132
|
ConfettiComponent: MyConfetti,
|
|
@@ -150,7 +151,7 @@ const {
|
|
|
150
151
|
} = useSimpleAchievements();
|
|
151
152
|
```
|
|
152
153
|
|
|
153
|
-
Deprecated aliases from v3, including `unlocked`, remain available until
|
|
154
|
+
Deprecated aliases from v3, including `unlocked` and `all`, remain available until 5.0.
|
|
154
155
|
|
|
155
156
|
## Event-Based Tracking
|
|
156
157
|
|
|
@@ -239,7 +240,7 @@ React Native UI components are not included in the web package; use `achievement
|
|
|
239
240
|
- `AchievementsWidget` replaces the legacy manual `BadgesButtonWithModal` setup.
|
|
240
241
|
- `useSimpleAchievements()` now returns `unlockedIds`, `unlockedAchievements`, and `allAchievements`.
|
|
241
242
|
- External UI peer dependencies are no longer required.
|
|
242
|
-
- Deprecated v3 component names remain as compatibility wrappers until
|
|
243
|
+
- Deprecated v3 component names remain as compatibility wrappers until 5.0.
|
|
243
244
|
|
|
244
245
|
## License
|
|
245
246
|
|
package/dist/headless.cjs
CHANGED
|
@@ -30,15 +30,12 @@ function warnDeprecation(message) {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
const AchievementContext = React.createContext(undefined);
|
|
33
|
-
const getAllAchievementRecord = (
|
|
34
|
-
return Object.fromEntries(
|
|
35
|
-
achievement.achievementId,
|
|
36
|
-
achievement,
|
|
37
|
-
]));
|
|
33
|
+
const getAllAchievementRecord = (achievements) => {
|
|
34
|
+
return Object.fromEntries(achievements.map((achievement) => [achievement.achievementId, achievement]));
|
|
38
35
|
};
|
|
39
36
|
const AchievementProvider = ({ achievements: achievementsConfig, storage = 'local', children, onError, useBuiltInUI, restApiConfig, engine: externalEngine, eventMapping, icons = {}, }) => {
|
|
40
37
|
if (useBuiltInUI !== undefined) {
|
|
41
|
-
warnDeprecation('`useBuiltInUI` is deprecated and is now a no-op because built-in UI is the default. It will be removed in
|
|
38
|
+
warnDeprecation('`useBuiltInUI` is deprecated and is now a no-op because built-in UI is the default. It will be removed in 5.0.');
|
|
42
39
|
}
|
|
43
40
|
if (achievementsConfig && externalEngine) {
|
|
44
41
|
throw new Error('Cannot provide both "achievements" and "engine" props to AchievementProvider.\n\n' +
|
|
@@ -64,15 +61,9 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
64
61
|
eventMapping,
|
|
65
62
|
});
|
|
66
63
|
});
|
|
67
|
-
const [
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}));
|
|
71
|
-
const syncAchievementState = React.useCallback(() => {
|
|
72
|
-
setAchievementState({
|
|
73
|
-
unlocked: [...engine.getUnlocked()],
|
|
74
|
-
all: getAllAchievementRecord(engine),
|
|
75
|
-
});
|
|
64
|
+
const [achievementSnapshot, setAchievementSnapshot] = React.useState(() => engine.getSnapshot());
|
|
65
|
+
const syncAchievementState = React.useCallback((snapshot) => {
|
|
66
|
+
setAchievementSnapshot(snapshot || engine.getSnapshot());
|
|
76
67
|
}, [engine]);
|
|
77
68
|
React.useEffect(() => {
|
|
78
69
|
return () => {
|
|
@@ -82,10 +73,17 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
82
73
|
};
|
|
83
74
|
}, [engine, externalEngine]);
|
|
84
75
|
React.useEffect(() => {
|
|
85
|
-
|
|
86
|
-
const unsubscribeStateChanged = engine.on('state:changed',
|
|
76
|
+
let isMounted = true;
|
|
77
|
+
const unsubscribeStateChanged = engine.on('state:changed', (event) => {
|
|
78
|
+
syncAchievementState(event);
|
|
79
|
+
});
|
|
80
|
+
engine.ready().then(() => {
|
|
81
|
+
if (isMounted) {
|
|
82
|
+
syncAchievementState();
|
|
83
|
+
}
|
|
84
|
+
});
|
|
87
85
|
return () => {
|
|
88
|
-
|
|
86
|
+
isMounted = false;
|
|
89
87
|
unsubscribeStateChanged();
|
|
90
88
|
};
|
|
91
89
|
}, [engine, syncAchievementState]);
|
|
@@ -94,18 +92,12 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
94
92
|
};
|
|
95
93
|
const reset = () => {
|
|
96
94
|
engine.reset();
|
|
97
|
-
syncAchievementState();
|
|
98
95
|
};
|
|
99
96
|
const getState = () => {
|
|
100
|
-
const
|
|
101
|
-
const unlocked = engine.getUnlocked();
|
|
102
|
-
const metricsInArrayFormat = {};
|
|
103
|
-
Object.entries(metrics).forEach(([key, value]) => {
|
|
104
|
-
metricsInArrayFormat[key] = Array.isArray(value) ? value : [value];
|
|
105
|
-
});
|
|
97
|
+
const snapshot = engine.getSnapshot();
|
|
106
98
|
return {
|
|
107
|
-
metrics:
|
|
108
|
-
unlocked:
|
|
99
|
+
metrics: snapshot.metrics,
|
|
100
|
+
unlocked: snapshot.unlockedIds,
|
|
109
101
|
};
|
|
110
102
|
};
|
|
111
103
|
const exportData = () => {
|
|
@@ -117,11 +109,16 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
117
109
|
return result;
|
|
118
110
|
};
|
|
119
111
|
const getAllAchievements = () => {
|
|
120
|
-
return engine.
|
|
112
|
+
return engine.getSnapshot().allAchievements;
|
|
113
|
+
};
|
|
114
|
+
const achievements = {
|
|
115
|
+
unlocked: achievementSnapshot.unlockedIds,
|
|
116
|
+
all: getAllAchievementRecord(achievementSnapshot.allAchievements),
|
|
121
117
|
};
|
|
122
118
|
return (React.createElement(AchievementContext.Provider, { value: {
|
|
123
119
|
update,
|
|
124
|
-
achievements
|
|
120
|
+
achievements,
|
|
121
|
+
snapshot: achievementSnapshot,
|
|
125
122
|
reset,
|
|
126
123
|
getState,
|
|
127
124
|
exportData,
|
|
@@ -142,18 +139,14 @@ const useAchievements = () => {
|
|
|
142
139
|
};
|
|
143
140
|
|
|
144
141
|
const useAchievementState = () => {
|
|
145
|
-
const {
|
|
146
|
-
const allAchievements = getAllAchievements();
|
|
147
|
-
const unlockedIds = achievements.unlocked;
|
|
148
|
-
const unlockedAchievementSet = new Set(unlockedIds);
|
|
149
|
-
const unlockedAchievements = allAchievements.filter((achievement) => unlockedAchievementSet.has(achievement.achievementId));
|
|
142
|
+
const { snapshot } = useAchievements();
|
|
150
143
|
return {
|
|
151
|
-
unlockedIds,
|
|
152
|
-
unlockedAchievements,
|
|
153
|
-
allAchievements,
|
|
154
|
-
unlockedCount:
|
|
155
|
-
totalCount:
|
|
156
|
-
metrics:
|
|
144
|
+
unlockedIds: snapshot.unlockedIds,
|
|
145
|
+
unlockedAchievements: snapshot.unlockedAchievements,
|
|
146
|
+
allAchievements: snapshot.allAchievements,
|
|
147
|
+
unlockedCount: snapshot.unlockedCount,
|
|
148
|
+
totalCount: snapshot.totalCount,
|
|
149
|
+
metrics: snapshot.metrics,
|
|
157
150
|
};
|
|
158
151
|
};
|
|
159
152
|
|
|
@@ -162,17 +155,11 @@ const useAchievementState = () => {
|
|
|
162
155
|
* Provides the v4 happy path for direct metric updates plus explicit state names.
|
|
163
156
|
*/
|
|
164
157
|
const useSimpleAchievements = () => {
|
|
165
|
-
const { update, reset, getState, exportData, importData } = useAchievements();
|
|
158
|
+
const { update, reset, getState, exportData, importData, engine } = useAchievements();
|
|
166
159
|
const achievementState = useAchievementState();
|
|
167
160
|
const track = (metric, value) => update({ [metric]: value });
|
|
168
161
|
const increment = (metric, amount = 1) => {
|
|
169
|
-
|
|
170
|
-
const currentMetricArray = currentState.metrics[metric] || [0];
|
|
171
|
-
const currentValue = Array.isArray(currentMetricArray)
|
|
172
|
-
? currentMetricArray[0]
|
|
173
|
-
: currentMetricArray;
|
|
174
|
-
const newValue = (typeof currentValue === 'number' ? currentValue : 0) + amount;
|
|
175
|
-
update({ [metric]: newValue });
|
|
162
|
+
return engine.increment(metric, amount);
|
|
176
163
|
};
|
|
177
164
|
const trackMultiple = (metrics) => update(metrics);
|
|
178
165
|
return {
|
|
@@ -191,11 +178,11 @@ const useSimpleAchievements = () => {
|
|
|
191
178
|
importData,
|
|
192
179
|
getAllAchievements: () => achievementState.allAchievements,
|
|
193
180
|
/**
|
|
194
|
-
* @deprecated Use `unlockedIds` instead. This alias will be removed in
|
|
181
|
+
* @deprecated Use `unlockedIds` instead. This alias will be removed in 5.0.
|
|
195
182
|
*/
|
|
196
183
|
unlocked: achievementState.unlockedIds,
|
|
197
184
|
/**
|
|
198
|
-
* @deprecated Use `allAchievements` instead. This alias will be removed in
|
|
185
|
+
* @deprecated Use `allAchievements` instead. This alias will be removed in 5.0.
|
|
199
186
|
*/
|
|
200
187
|
all: achievementState.allAchievements,
|
|
201
188
|
};
|
package/dist/headless.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless.cjs","sources":["../src/core/types.ts","../src/core/utils/deprecation.ts","../src/providers/AchievementProvider.tsx","../src/hooks/useAchievements.ts","../src/hooks/useAchievementState.ts","../src/hooks/useSimpleAchievements.ts","../src/hooks/useAchievementEngine.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":["createContext","useState","AchievementEngine","useCallback","useEffect","useContext"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"headless.cjs","sources":["../src/core/types.ts","../src/core/utils/deprecation.ts","../src/providers/AchievementProvider.tsx","../src/hooks/useAchievements.ts","../src/hooks/useAchievementState.ts","../src/hooks/useSimpleAchievements.ts","../src/hooks/useAchievementEngine.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":["createContext","useState","AchievementEngine","useCallback","useEffect","useContext"],"mappings":"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"}
|
package/dist/headless.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import * as achievements_engine from 'achievements-engine';
|
|
3
|
-
import { AchievementWithStatus as AchievementWithStatus$1, ImportOptions, ImportResult, AchievementEngine, AchievementConfigurationType as AchievementConfigurationType$1, AchievementStorage as AchievementStorage$1, AsyncAchievementStorage as AsyncAchievementStorage$1, StorageType, RestApiStorageConfig, EventMapping, AchievementError } from 'achievements-engine';
|
|
4
|
-
export { AchievementBuilder, AchievementEngine, AchievementEngineApi, AchievementError, AchievementUnlockedEvent, AsyncStorageAdapter, AwardDetails, ConfigurationError, EngineConfig, EngineEvent, ErrorEvent, EventMapping, ExportedData, ImportOptions, ImportResult, ImportValidationError, IndexedDBStorage, LocalStorage, MemoryStorage, MetricUpdatedEvent, MetricUpdater, OfflineQueueStorage, RestApiStorage, RestApiStorageConfig, StateChangedEvent, StorageError, StorageQuotaError, StorageType, SyncError, UnsubscribeFn, createConfigHash, exportAchievementData, importAchievementData, isAchievementError, isRecoverableError, isSimpleConfig, normalizeAchievements } from 'achievements-engine';
|
|
3
|
+
import { AchievementWithStatus as AchievementWithStatus$1, AchievementSnapshot, ImportOptions, ImportResult, AchievementEngine, AchievementConfigurationType as AchievementConfigurationType$1, AchievementStorage as AchievementStorage$1, AsyncAchievementStorage as AsyncAchievementStorage$1, StorageType, RestApiStorageConfig, EventMapping, AchievementError } from 'achievements-engine';
|
|
4
|
+
export { AchievementBuilder, AchievementEngine, AchievementEngineApi, AchievementError, AchievementSnapshot, AchievementUnlockedEvent, AchievementUpdateResult, AsyncStorageAdapter, AwardDetails, ConfigurationError, EngineConfig, EngineEvent, ErrorEvent, EventMapping, ExportedData, ImportOptions, ImportResult, ImportValidationError, IndexedDBStorage, LocalStorage, MemoryStorage, MetricUpdatedEvent, MetricUpdater, OfflineQueueStorage, RestApiStorage, RestApiStorageConfig, StateChangedEvent, StorageError, StorageQuotaError, StorageType, SyncError, UnsubscribeFn, createConfigHash, exportAchievementData, importAchievementData, isAchievementError, isRecoverableError, isSimpleConfig, normalizeAchievements } from 'achievements-engine';
|
|
5
5
|
|
|
6
6
|
type AchievementMetricValue = number | string | boolean | Date | null | undefined;
|
|
7
7
|
type AchievementMetricArrayValue = AchievementMetricValue | AchievementMetricValue[];
|
|
@@ -62,7 +62,7 @@ interface AsyncAchievementStorage {
|
|
|
62
62
|
type AnyAchievementStorage = AchievementStorage | AsyncAchievementStorage;
|
|
63
63
|
declare function isAsyncStorage(storage: AnyAchievementStorage): storage is AsyncAchievementStorage;
|
|
64
64
|
/**
|
|
65
|
-
* @deprecated This type is outdated and will be removed in
|
|
65
|
+
* @deprecated This type is outdated and will be removed in 5.0.
|
|
66
66
|
* Use AchievementContextType from 'react-achievements' instead.
|
|
67
67
|
*
|
|
68
68
|
* This legacy interface does not include the 'engine' property.
|
|
@@ -88,6 +88,7 @@ interface AchievementContextType {
|
|
|
88
88
|
unlocked: string[];
|
|
89
89
|
all: Record<string, AchievementWithStatus$1>;
|
|
90
90
|
};
|
|
91
|
+
snapshot: AchievementSnapshot;
|
|
91
92
|
reset: () => void;
|
|
92
93
|
getState: () => {
|
|
93
94
|
metrics: Record<string, any>;
|
|
@@ -100,7 +101,7 @@ interface AchievementContextType {
|
|
|
100
101
|
icons: Record<string, string>;
|
|
101
102
|
/**
|
|
102
103
|
* @deprecated Use provider props or the presence of an injected engine directly.
|
|
103
|
-
* This compatibility flag will be removed in
|
|
104
|
+
* This compatibility flag will be removed in 5.0.
|
|
104
105
|
*/
|
|
105
106
|
_isLegacyPattern: boolean;
|
|
106
107
|
}
|
|
@@ -116,7 +117,7 @@ interface AchievementProviderProps {
|
|
|
116
117
|
onError?: (error: AchievementError) => void;
|
|
117
118
|
/**
|
|
118
119
|
* @deprecated Built-in UI is the default in the web provider. This prop is a
|
|
119
|
-
* no-op and will be removed in
|
|
120
|
+
* no-op and will be removed in 5.0.
|
|
120
121
|
*/
|
|
121
122
|
useBuiltInUI?: boolean;
|
|
122
123
|
}
|
|
@@ -130,14 +131,14 @@ declare const useAchievements: () => AchievementContextType;
|
|
|
130
131
|
*/
|
|
131
132
|
declare const useSimpleAchievements: () => {
|
|
132
133
|
track: (metric: string, value: any) => void;
|
|
133
|
-
increment: (metric: string, amount?: number) =>
|
|
134
|
+
increment: (metric: string, amount?: number) => achievements_engine.AchievementUpdateResult;
|
|
134
135
|
trackMultiple: (metrics: Record<string, any>) => void;
|
|
135
136
|
unlockedIds: string[];
|
|
136
137
|
unlockedAchievements: achievements_engine.AchievementWithStatus[];
|
|
137
138
|
allAchievements: achievements_engine.AchievementWithStatus[];
|
|
138
139
|
unlockedCount: number;
|
|
139
140
|
totalCount: number;
|
|
140
|
-
metrics:
|
|
141
|
+
metrics: achievements_engine.AchievementMetrics;
|
|
141
142
|
reset: () => void;
|
|
142
143
|
getState: () => {
|
|
143
144
|
metrics: Record<string, any>;
|
|
@@ -147,11 +148,11 @@ declare const useSimpleAchievements: () => {
|
|
|
147
148
|
importData: (jsonString: string, options?: achievements_engine.ImportOptions) => achievements_engine.ImportResult;
|
|
148
149
|
getAllAchievements: () => achievements_engine.AchievementWithStatus[];
|
|
149
150
|
/**
|
|
150
|
-
* @deprecated Use `unlockedIds` instead. This alias will be removed in
|
|
151
|
+
* @deprecated Use `unlockedIds` instead. This alias will be removed in 5.0.
|
|
151
152
|
*/
|
|
152
153
|
unlocked: string[];
|
|
153
154
|
/**
|
|
154
|
-
* @deprecated Use `allAchievements` instead. This alias will be removed in
|
|
155
|
+
* @deprecated Use `allAchievements` instead. This alias will be removed in 5.0.
|
|
155
156
|
*/
|
|
156
157
|
all: achievements_engine.AchievementWithStatus[];
|
|
157
158
|
};
|
|
@@ -162,7 +163,7 @@ declare const useAchievementState: () => {
|
|
|
162
163
|
allAchievements: achievements_engine.AchievementWithStatus[];
|
|
163
164
|
unlockedCount: number;
|
|
164
165
|
totalCount: number;
|
|
165
|
-
metrics:
|
|
166
|
+
metrics: achievements_engine.AchievementMetrics;
|
|
166
167
|
};
|
|
167
168
|
|
|
168
169
|
/**
|
package/dist/headless.esm.js
CHANGED
|
@@ -29,15 +29,12 @@ function warnDeprecation(message) {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const AchievementContext = createContext(undefined);
|
|
32
|
-
const getAllAchievementRecord = (
|
|
33
|
-
return Object.fromEntries(
|
|
34
|
-
achievement.achievementId,
|
|
35
|
-
achievement,
|
|
36
|
-
]));
|
|
32
|
+
const getAllAchievementRecord = (achievements) => {
|
|
33
|
+
return Object.fromEntries(achievements.map((achievement) => [achievement.achievementId, achievement]));
|
|
37
34
|
};
|
|
38
35
|
const AchievementProvider = ({ achievements: achievementsConfig, storage = 'local', children, onError, useBuiltInUI, restApiConfig, engine: externalEngine, eventMapping, icons = {}, }) => {
|
|
39
36
|
if (useBuiltInUI !== undefined) {
|
|
40
|
-
warnDeprecation('`useBuiltInUI` is deprecated and is now a no-op because built-in UI is the default. It will be removed in
|
|
37
|
+
warnDeprecation('`useBuiltInUI` is deprecated and is now a no-op because built-in UI is the default. It will be removed in 5.0.');
|
|
41
38
|
}
|
|
42
39
|
if (achievementsConfig && externalEngine) {
|
|
43
40
|
throw new Error('Cannot provide both "achievements" and "engine" props to AchievementProvider.\n\n' +
|
|
@@ -63,15 +60,9 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
63
60
|
eventMapping,
|
|
64
61
|
});
|
|
65
62
|
});
|
|
66
|
-
const [
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}));
|
|
70
|
-
const syncAchievementState = useCallback(() => {
|
|
71
|
-
setAchievementState({
|
|
72
|
-
unlocked: [...engine.getUnlocked()],
|
|
73
|
-
all: getAllAchievementRecord(engine),
|
|
74
|
-
});
|
|
63
|
+
const [achievementSnapshot, setAchievementSnapshot] = useState(() => engine.getSnapshot());
|
|
64
|
+
const syncAchievementState = useCallback((snapshot) => {
|
|
65
|
+
setAchievementSnapshot(snapshot || engine.getSnapshot());
|
|
75
66
|
}, [engine]);
|
|
76
67
|
useEffect(() => {
|
|
77
68
|
return () => {
|
|
@@ -81,10 +72,17 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
81
72
|
};
|
|
82
73
|
}, [engine, externalEngine]);
|
|
83
74
|
useEffect(() => {
|
|
84
|
-
|
|
85
|
-
const unsubscribeStateChanged = engine.on('state:changed',
|
|
75
|
+
let isMounted = true;
|
|
76
|
+
const unsubscribeStateChanged = engine.on('state:changed', (event) => {
|
|
77
|
+
syncAchievementState(event);
|
|
78
|
+
});
|
|
79
|
+
engine.ready().then(() => {
|
|
80
|
+
if (isMounted) {
|
|
81
|
+
syncAchievementState();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
86
84
|
return () => {
|
|
87
|
-
|
|
85
|
+
isMounted = false;
|
|
88
86
|
unsubscribeStateChanged();
|
|
89
87
|
};
|
|
90
88
|
}, [engine, syncAchievementState]);
|
|
@@ -93,18 +91,12 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
93
91
|
};
|
|
94
92
|
const reset = () => {
|
|
95
93
|
engine.reset();
|
|
96
|
-
syncAchievementState();
|
|
97
94
|
};
|
|
98
95
|
const getState = () => {
|
|
99
|
-
const
|
|
100
|
-
const unlocked = engine.getUnlocked();
|
|
101
|
-
const metricsInArrayFormat = {};
|
|
102
|
-
Object.entries(metrics).forEach(([key, value]) => {
|
|
103
|
-
metricsInArrayFormat[key] = Array.isArray(value) ? value : [value];
|
|
104
|
-
});
|
|
96
|
+
const snapshot = engine.getSnapshot();
|
|
105
97
|
return {
|
|
106
|
-
metrics:
|
|
107
|
-
unlocked:
|
|
98
|
+
metrics: snapshot.metrics,
|
|
99
|
+
unlocked: snapshot.unlockedIds,
|
|
108
100
|
};
|
|
109
101
|
};
|
|
110
102
|
const exportData = () => {
|
|
@@ -116,11 +108,16 @@ const AchievementProvider = ({ achievements: achievementsConfig, storage = 'loca
|
|
|
116
108
|
return result;
|
|
117
109
|
};
|
|
118
110
|
const getAllAchievements = () => {
|
|
119
|
-
return engine.
|
|
111
|
+
return engine.getSnapshot().allAchievements;
|
|
112
|
+
};
|
|
113
|
+
const achievements = {
|
|
114
|
+
unlocked: achievementSnapshot.unlockedIds,
|
|
115
|
+
all: getAllAchievementRecord(achievementSnapshot.allAchievements),
|
|
120
116
|
};
|
|
121
117
|
return (React.createElement(AchievementContext.Provider, { value: {
|
|
122
118
|
update,
|
|
123
|
-
achievements
|
|
119
|
+
achievements,
|
|
120
|
+
snapshot: achievementSnapshot,
|
|
124
121
|
reset,
|
|
125
122
|
getState,
|
|
126
123
|
exportData,
|
|
@@ -141,18 +138,14 @@ const useAchievements = () => {
|
|
|
141
138
|
};
|
|
142
139
|
|
|
143
140
|
const useAchievementState = () => {
|
|
144
|
-
const {
|
|
145
|
-
const allAchievements = getAllAchievements();
|
|
146
|
-
const unlockedIds = achievements.unlocked;
|
|
147
|
-
const unlockedAchievementSet = new Set(unlockedIds);
|
|
148
|
-
const unlockedAchievements = allAchievements.filter((achievement) => unlockedAchievementSet.has(achievement.achievementId));
|
|
141
|
+
const { snapshot } = useAchievements();
|
|
149
142
|
return {
|
|
150
|
-
unlockedIds,
|
|
151
|
-
unlockedAchievements,
|
|
152
|
-
allAchievements,
|
|
153
|
-
unlockedCount:
|
|
154
|
-
totalCount:
|
|
155
|
-
metrics:
|
|
143
|
+
unlockedIds: snapshot.unlockedIds,
|
|
144
|
+
unlockedAchievements: snapshot.unlockedAchievements,
|
|
145
|
+
allAchievements: snapshot.allAchievements,
|
|
146
|
+
unlockedCount: snapshot.unlockedCount,
|
|
147
|
+
totalCount: snapshot.totalCount,
|
|
148
|
+
metrics: snapshot.metrics,
|
|
156
149
|
};
|
|
157
150
|
};
|
|
158
151
|
|
|
@@ -161,17 +154,11 @@ const useAchievementState = () => {
|
|
|
161
154
|
* Provides the v4 happy path for direct metric updates plus explicit state names.
|
|
162
155
|
*/
|
|
163
156
|
const useSimpleAchievements = () => {
|
|
164
|
-
const { update, reset, getState, exportData, importData } = useAchievements();
|
|
157
|
+
const { update, reset, getState, exportData, importData, engine } = useAchievements();
|
|
165
158
|
const achievementState = useAchievementState();
|
|
166
159
|
const track = (metric, value) => update({ [metric]: value });
|
|
167
160
|
const increment = (metric, amount = 1) => {
|
|
168
|
-
|
|
169
|
-
const currentMetricArray = currentState.metrics[metric] || [0];
|
|
170
|
-
const currentValue = Array.isArray(currentMetricArray)
|
|
171
|
-
? currentMetricArray[0]
|
|
172
|
-
: currentMetricArray;
|
|
173
|
-
const newValue = (typeof currentValue === 'number' ? currentValue : 0) + amount;
|
|
174
|
-
update({ [metric]: newValue });
|
|
161
|
+
return engine.increment(metric, amount);
|
|
175
162
|
};
|
|
176
163
|
const trackMultiple = (metrics) => update(metrics);
|
|
177
164
|
return {
|
|
@@ -190,11 +177,11 @@ const useSimpleAchievements = () => {
|
|
|
190
177
|
importData,
|
|
191
178
|
getAllAchievements: () => achievementState.allAchievements,
|
|
192
179
|
/**
|
|
193
|
-
* @deprecated Use `unlockedIds` instead. This alias will be removed in
|
|
180
|
+
* @deprecated Use `unlockedIds` instead. This alias will be removed in 5.0.
|
|
194
181
|
*/
|
|
195
182
|
unlocked: achievementState.unlockedIds,
|
|
196
183
|
/**
|
|
197
|
-
* @deprecated Use `allAchievements` instead. This alias will be removed in
|
|
184
|
+
* @deprecated Use `allAchievements` instead. This alias will be removed in 5.0.
|
|
198
185
|
*/
|
|
199
186
|
all: achievementState.allAchievements,
|
|
200
187
|
};
|
package/dist/headless.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless.esm.js","sources":["../src/core/types.ts","../src/core/utils/deprecation.ts","../src/providers/AchievementProvider.tsx","../src/hooks/useAchievements.ts","../src/hooks/useAchievementState.ts","../src/hooks/useSimpleAchievements.ts","../src/hooks/useAchievementEngine.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"headless.esm.js","sources":["../src/core/types.ts","../src/core/utils/deprecation.ts","../src/providers/AchievementProvider.tsx","../src/hooks/useAchievements.ts","../src/hooks/useAchievementState.ts","../src/hooks/useSimpleAchievements.ts","../src/hooks/useAchievementEngine.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|