react-achievements 3.9.3 → 4.0.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 +148 -101
- package/dist/headless.cjs +317 -0
- package/dist/headless.cjs.map +1 -0
- package/dist/headless.d.ts +176 -0
- package/dist/headless.esm.js +222 -0
- package/dist/headless.esm.js.map +1 -0
- package/dist/index.cjs +839 -881
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +163 -153
- package/dist/index.esm.js +835 -883
- package/dist/index.esm.js.map +1 -1
- package/dist/web.cjs +1416 -0
- package/dist/web.cjs.map +1 -0
- package/dist/web.d.ts +534 -0
- package/dist/web.esm.js +1306 -0
- package/dist/web.esm.js.map +1 -0
- package/package.json +13 -28
- package/dist/types/__mocks__/confetti-wrapper.d.ts +0 -5
- package/dist/types/__mocks__/react-confetti.d.ts +0 -3
- package/dist/types/__mocks__/react-toastify.d.ts +0 -13
- package/dist/types/core/components/BadgesButton.d.ts +0 -25
- package/dist/types/core/components/BadgesButtonWithModal.d.ts +0 -53
- package/dist/types/core/components/BadgesModal.d.ts +0 -14
- package/dist/types/core/components/ConfettiWrapper.d.ts +0 -6
- package/dist/types/core/errors/AchievementErrors.d.ts +0 -55
- package/dist/types/core/hooks/useWindowSize.d.ts +0 -16
- package/dist/types/core/icons/defaultIcons.d.ts +0 -8
- package/dist/types/core/storage/AsyncStorageAdapter.d.ts +0 -48
- package/dist/types/core/storage/IndexedDBStorage.d.ts +0 -29
- package/dist/types/core/storage/LocalStorage.d.ts +0 -16
- package/dist/types/core/storage/MemoryStorage.d.ts +0 -11
- package/dist/types/core/storage/OfflineQueueStorage.d.ts +0 -42
- package/dist/types/core/storage/RestApiStorage.d.ts +0 -20
- package/dist/types/core/styles/defaultStyles.d.ts +0 -2
- package/dist/types/core/types.d.ts +0 -115
- package/dist/types/core/ui/BuiltInConfetti.d.ts +0 -7
- package/dist/types/core/ui/BuiltInModal.d.ts +0 -7
- package/dist/types/core/ui/BuiltInNotification.d.ts +0 -7
- package/dist/types/core/ui/LegacyWrappers.d.ts +0 -21
- package/dist/types/core/ui/interfaces.d.ts +0 -127
- package/dist/types/core/ui/legacyDetector.d.ts +0 -40
- package/dist/types/core/ui/themes.d.ts +0 -14
- package/dist/types/core/utils/configNormalizer.d.ts +0 -3
- package/dist/types/core/utils/dataExport.d.ts +0 -34
- package/dist/types/core/utils/dataImport.d.ts +0 -50
- package/dist/types/hooks/useAchievementEngine.d.ts +0 -36
- package/dist/types/hooks/useAchievements.d.ts +0 -1
- package/dist/types/hooks/useSimpleAchievements.d.ts +0 -63
- package/dist/types/index.d.ts +0 -36
- package/dist/types/providers/AchievementProvider.d.ts +0 -47
- package/dist/types/setupTests.d.ts +0 -1
- package/dist/types/utils/achievementHelpers.d.ts +0 -135
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import React from 'react';
|
|
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';
|
|
5
|
+
|
|
6
|
+
type AchievementMetricValue = number | string | boolean | Date | null | undefined;
|
|
7
|
+
type AchievementMetricArrayValue = AchievementMetricValue | AchievementMetricValue[];
|
|
8
|
+
interface AchievementMetrics {
|
|
9
|
+
[key: string]: AchievementMetricValue[];
|
|
10
|
+
}
|
|
11
|
+
interface AchievementDetails {
|
|
12
|
+
achievementId: string;
|
|
13
|
+
achievementTitle: string;
|
|
14
|
+
achievementDescription: string;
|
|
15
|
+
achievementIconKey?: string;
|
|
16
|
+
}
|
|
17
|
+
interface AchievementWithStatus extends AchievementDetails {
|
|
18
|
+
isUnlocked: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface AchievementCondition {
|
|
21
|
+
isConditionMet: (value: AchievementMetricArrayValue, state: AchievementState) => boolean;
|
|
22
|
+
achievementDetails: AchievementDetails | AchievementWithStatus;
|
|
23
|
+
}
|
|
24
|
+
interface AchievementConfiguration {
|
|
25
|
+
[key: string]: AchievementCondition[];
|
|
26
|
+
}
|
|
27
|
+
interface SimpleAchievementDetails {
|
|
28
|
+
title: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
icon?: string;
|
|
31
|
+
}
|
|
32
|
+
interface CustomAchievementDetails extends SimpleAchievementDetails {
|
|
33
|
+
condition: (metrics: Record<string, any>) => boolean;
|
|
34
|
+
}
|
|
35
|
+
interface SimpleAchievementConfig {
|
|
36
|
+
[metric: string]: {
|
|
37
|
+
[threshold: string]: SimpleAchievementDetails | CustomAchievementDetails;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
type AchievementConfigurationType = AchievementConfiguration | SimpleAchievementConfig;
|
|
41
|
+
interface InitialAchievementMetrics {
|
|
42
|
+
[key: string]: AchievementMetricValue;
|
|
43
|
+
}
|
|
44
|
+
interface AchievementState {
|
|
45
|
+
metrics: AchievementMetrics;
|
|
46
|
+
unlockedAchievements: string[];
|
|
47
|
+
}
|
|
48
|
+
interface AchievementStorage {
|
|
49
|
+
getMetrics(): AchievementMetrics;
|
|
50
|
+
setMetrics(metrics: AchievementMetrics): void;
|
|
51
|
+
getUnlockedAchievements(): string[];
|
|
52
|
+
setUnlockedAchievements(achievements: string[]): void;
|
|
53
|
+
clear(): void;
|
|
54
|
+
}
|
|
55
|
+
interface AsyncAchievementStorage {
|
|
56
|
+
getMetrics(): Promise<AchievementMetrics>;
|
|
57
|
+
setMetrics(metrics: AchievementMetrics): Promise<void>;
|
|
58
|
+
getUnlockedAchievements(): Promise<string[]>;
|
|
59
|
+
setUnlockedAchievements(achievements: string[]): Promise<void>;
|
|
60
|
+
clear(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
type AnyAchievementStorage = AchievementStorage | AsyncAchievementStorage;
|
|
63
|
+
declare function isAsyncStorage(storage: AnyAchievementStorage): storage is AsyncAchievementStorage;
|
|
64
|
+
/**
|
|
65
|
+
* @deprecated This type is outdated and will be removed in 4.2.
|
|
66
|
+
* Use AchievementContextType from 'react-achievements' instead.
|
|
67
|
+
*
|
|
68
|
+
* This legacy interface does not include the 'engine' property.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* // Old (deprecated)
|
|
73
|
+
* import { AchievementContextValue } from 'react-achievements';
|
|
74
|
+
*
|
|
75
|
+
* // New (recommended)
|
|
76
|
+
* import { AchievementContextType } from 'react-achievements';
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
interface AchievementContextValue {
|
|
80
|
+
updateMetrics: (metrics: AchievementMetrics | ((prev: AchievementMetrics) => AchievementMetrics)) => void;
|
|
81
|
+
unlockedAchievements: string[];
|
|
82
|
+
resetStorage: () => void;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
interface AchievementContextType {
|
|
86
|
+
update: (metrics: Record<string, any>) => void;
|
|
87
|
+
achievements: {
|
|
88
|
+
unlocked: string[];
|
|
89
|
+
all: Record<string, AchievementWithStatus$1>;
|
|
90
|
+
};
|
|
91
|
+
reset: () => void;
|
|
92
|
+
getState: () => {
|
|
93
|
+
metrics: Record<string, any>;
|
|
94
|
+
unlocked: string[];
|
|
95
|
+
};
|
|
96
|
+
exportData: () => string;
|
|
97
|
+
importData: (jsonString: string, options?: ImportOptions) => ImportResult;
|
|
98
|
+
getAllAchievements: () => AchievementWithStatus$1[];
|
|
99
|
+
engine: AchievementEngine;
|
|
100
|
+
icons: Record<string, string>;
|
|
101
|
+
/**
|
|
102
|
+
* @deprecated Use provider props or the presence of an injected engine directly.
|
|
103
|
+
* This compatibility flag will be removed in 4.2.
|
|
104
|
+
*/
|
|
105
|
+
_isLegacyPattern: boolean;
|
|
106
|
+
}
|
|
107
|
+
declare const AchievementContext: React.Context<AchievementContextType | undefined>;
|
|
108
|
+
interface AchievementProviderProps {
|
|
109
|
+
achievements?: AchievementConfigurationType$1;
|
|
110
|
+
storage?: AchievementStorage$1 | AsyncAchievementStorage$1 | StorageType;
|
|
111
|
+
restApiConfig?: RestApiStorageConfig;
|
|
112
|
+
eventMapping?: EventMapping;
|
|
113
|
+
engine?: AchievementEngine;
|
|
114
|
+
children: React.ReactNode;
|
|
115
|
+
icons?: Record<string, string>;
|
|
116
|
+
onError?: (error: AchievementError) => void;
|
|
117
|
+
/**
|
|
118
|
+
* @deprecated Built-in UI is the default in the web provider. This prop is a
|
|
119
|
+
* no-op and will be removed in 4.2.
|
|
120
|
+
*/
|
|
121
|
+
useBuiltInUI?: boolean;
|
|
122
|
+
}
|
|
123
|
+
declare const AchievementProvider: React.FC<AchievementProviderProps>;
|
|
124
|
+
|
|
125
|
+
declare const useAchievements: () => AchievementContextType;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* A simplified hook for achievement tracking.
|
|
129
|
+
* Provides the v4 happy path for direct metric updates plus explicit state names.
|
|
130
|
+
*/
|
|
131
|
+
declare const useSimpleAchievements: () => {
|
|
132
|
+
track: (metric: string, value: any) => void;
|
|
133
|
+
increment: (metric: string, amount?: number) => void;
|
|
134
|
+
trackMultiple: (metrics: Record<string, any>) => void;
|
|
135
|
+
unlockedIds: string[];
|
|
136
|
+
unlockedAchievements: achievements_engine.AchievementWithStatus[];
|
|
137
|
+
allAchievements: achievements_engine.AchievementWithStatus[];
|
|
138
|
+
unlockedCount: number;
|
|
139
|
+
totalCount: number;
|
|
140
|
+
metrics: Record<string, any>;
|
|
141
|
+
reset: () => void;
|
|
142
|
+
getState: () => {
|
|
143
|
+
metrics: Record<string, any>;
|
|
144
|
+
unlocked: string[];
|
|
145
|
+
};
|
|
146
|
+
exportData: () => string;
|
|
147
|
+
importData: (jsonString: string, options?: achievements_engine.ImportOptions) => achievements_engine.ImportResult;
|
|
148
|
+
getAllAchievements: () => achievements_engine.AchievementWithStatus[];
|
|
149
|
+
/**
|
|
150
|
+
* @deprecated Use `unlockedIds` instead. This alias will be removed in 4.2.
|
|
151
|
+
*/
|
|
152
|
+
unlocked: string[];
|
|
153
|
+
/**
|
|
154
|
+
* @deprecated Use `allAchievements` instead. This alias will be removed in 4.2.
|
|
155
|
+
*/
|
|
156
|
+
all: achievements_engine.AchievementWithStatus[];
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
declare const useAchievementState: () => {
|
|
160
|
+
unlockedIds: string[];
|
|
161
|
+
unlockedAchievements: achievements_engine.AchievementWithStatus[];
|
|
162
|
+
allAchievements: achievements_engine.AchievementWithStatus[];
|
|
163
|
+
unlockedCount: number;
|
|
164
|
+
totalCount: number;
|
|
165
|
+
metrics: Record<string, any>;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Access the active AchievementEngine instance.
|
|
170
|
+
*
|
|
171
|
+
* In v4 this works with both provider-created engines (`achievements` prop) and
|
|
172
|
+
* injected engines (`engine` prop).
|
|
173
|
+
*/
|
|
174
|
+
declare const useAchievementEngine: () => AchievementEngine;
|
|
175
|
+
|
|
176
|
+
export { AchievementCondition, AchievementConfiguration, AchievementConfigurationType, AchievementContext, AchievementContextType, AchievementContextValue, AchievementDetails, AchievementMetricArrayValue, AchievementMetricValue, AchievementMetrics, AchievementProvider, AchievementProviderProps, AchievementState, AchievementStorage, AchievementWithStatus, AnyAchievementStorage, AsyncAchievementStorage, CustomAchievementDetails, InitialAchievementMetrics, SimpleAchievementConfig, SimpleAchievementDetails, isAsyncStorage, useAchievementEngine, useAchievementState, useAchievements, useSimpleAchievements };
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import React, { createContext, useState, useCallback, useEffect, useContext } from 'react';
|
|
2
|
+
import { AchievementEngine } from 'achievements-engine';
|
|
3
|
+
export { AchievementBuilder, AchievementEngine, AchievementError, AsyncStorageAdapter, ConfigurationError, ImportValidationError, IndexedDBStorage, LocalStorage, MemoryStorage, OfflineQueueStorage, RestApiStorage, StorageError, StorageQuotaError, StorageType, SyncError, createConfigHash, exportAchievementData, importAchievementData, isAchievementError, isRecoverableError, isSimpleConfig, normalizeAchievements } from 'achievements-engine';
|
|
4
|
+
|
|
5
|
+
// Type guard to detect async storage
|
|
6
|
+
function isAsyncStorage(storage) {
|
|
7
|
+
// Check if methods return Promises
|
|
8
|
+
const testResult = storage.getMetrics();
|
|
9
|
+
return testResult && typeof testResult.then === 'function';
|
|
10
|
+
}
|
|
11
|
+
var StorageType;
|
|
12
|
+
(function (StorageType) {
|
|
13
|
+
StorageType["Local"] = "local";
|
|
14
|
+
StorageType["Memory"] = "memory";
|
|
15
|
+
StorageType["IndexedDB"] = "indexeddb";
|
|
16
|
+
StorageType["RestAPI"] = "restapi"; // Asynchronous REST API storage
|
|
17
|
+
})(StorageType || (StorageType = {}));
|
|
18
|
+
|
|
19
|
+
const warnedMessages = new Set();
|
|
20
|
+
function warnDeprecation(message) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
const isProduction = typeof globalThis !== 'undefined' &&
|
|
23
|
+
((_b = (_a = globalThis.process) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.NODE_ENV) === 'production';
|
|
24
|
+
if (isProduction || warnedMessages.has(message)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
warnedMessages.add(message);
|
|
28
|
+
console.warn(`[react-achievements] ${message}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const AchievementContext = createContext(undefined);
|
|
32
|
+
const getAllAchievementRecord = (engine) => {
|
|
33
|
+
return Object.fromEntries(engine.getAllAchievements().map((achievement) => [
|
|
34
|
+
achievement.achievementId,
|
|
35
|
+
achievement,
|
|
36
|
+
]));
|
|
37
|
+
};
|
|
38
|
+
const AchievementProvider = ({ achievements: achievementsConfig, storage = 'local', children, onError, useBuiltInUI, restApiConfig, engine: externalEngine, eventMapping, icons = {}, }) => {
|
|
39
|
+
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 4.2.');
|
|
41
|
+
}
|
|
42
|
+
if (achievementsConfig && externalEngine) {
|
|
43
|
+
throw new Error('Cannot provide both "achievements" and "engine" props to AchievementProvider.\n\n' +
|
|
44
|
+
'Choose one pattern:\n' +
|
|
45
|
+
'1. Direct metric tracking: <AchievementProvider achievements={config}>\n' +
|
|
46
|
+
'2. Event-based tracking: <AchievementProvider engine={myEngine}>');
|
|
47
|
+
}
|
|
48
|
+
const isProviderCreatedEngine = Boolean(achievementsConfig);
|
|
49
|
+
const [engine] = useState(() => {
|
|
50
|
+
if (externalEngine) {
|
|
51
|
+
return externalEngine;
|
|
52
|
+
}
|
|
53
|
+
if (!achievementsConfig) {
|
|
54
|
+
throw new Error('AchievementProvider requires either "achievements" or "engine" prop.\n\n' +
|
|
55
|
+
'1. Direct metric tracking: <AchievementProvider achievements={config}>\n' +
|
|
56
|
+
'2. Event-based tracking: <AchievementProvider engine={myEngine}>');
|
|
57
|
+
}
|
|
58
|
+
return new AchievementEngine({
|
|
59
|
+
achievements: achievementsConfig,
|
|
60
|
+
storage: storage,
|
|
61
|
+
restApiConfig,
|
|
62
|
+
onError: onError,
|
|
63
|
+
eventMapping,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
const [achievementState, setAchievementState] = useState(() => ({
|
|
67
|
+
unlocked: [...engine.getUnlocked()],
|
|
68
|
+
all: getAllAchievementRecord(engine),
|
|
69
|
+
}));
|
|
70
|
+
const syncAchievementState = useCallback(() => {
|
|
71
|
+
setAchievementState({
|
|
72
|
+
unlocked: [...engine.getUnlocked()],
|
|
73
|
+
all: getAllAchievementRecord(engine),
|
|
74
|
+
});
|
|
75
|
+
}, [engine]);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
return () => {
|
|
78
|
+
if (!externalEngine) {
|
|
79
|
+
engine.destroy();
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}, [engine, externalEngine]);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
const unsubscribeUnlocked = engine.on('achievement:unlocked', syncAchievementState);
|
|
85
|
+
const unsubscribeStateChanged = engine.on('state:changed', syncAchievementState);
|
|
86
|
+
return () => {
|
|
87
|
+
unsubscribeUnlocked();
|
|
88
|
+
unsubscribeStateChanged();
|
|
89
|
+
};
|
|
90
|
+
}, [engine, syncAchievementState]);
|
|
91
|
+
const update = (newMetrics) => {
|
|
92
|
+
engine.update(newMetrics);
|
|
93
|
+
};
|
|
94
|
+
const reset = () => {
|
|
95
|
+
engine.reset();
|
|
96
|
+
syncAchievementState();
|
|
97
|
+
};
|
|
98
|
+
const getState = () => {
|
|
99
|
+
const metrics = engine.getMetrics();
|
|
100
|
+
const unlocked = engine.getUnlocked();
|
|
101
|
+
const metricsInArrayFormat = {};
|
|
102
|
+
Object.entries(metrics).forEach(([key, value]) => {
|
|
103
|
+
metricsInArrayFormat[key] = Array.isArray(value) ? value : [value];
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
metrics: metricsInArrayFormat,
|
|
107
|
+
unlocked: [...unlocked],
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
const exportData = () => {
|
|
111
|
+
return engine.export();
|
|
112
|
+
};
|
|
113
|
+
const importData = (jsonString, options) => {
|
|
114
|
+
const result = engine.import(jsonString, options);
|
|
115
|
+
syncAchievementState();
|
|
116
|
+
return result;
|
|
117
|
+
};
|
|
118
|
+
const getAllAchievements = () => {
|
|
119
|
+
return engine.getAllAchievements();
|
|
120
|
+
};
|
|
121
|
+
return (React.createElement(AchievementContext.Provider, { value: {
|
|
122
|
+
update,
|
|
123
|
+
achievements: achievementState,
|
|
124
|
+
reset,
|
|
125
|
+
getState,
|
|
126
|
+
exportData,
|
|
127
|
+
importData,
|
|
128
|
+
getAllAchievements,
|
|
129
|
+
engine,
|
|
130
|
+
icons,
|
|
131
|
+
_isLegacyPattern: isProviderCreatedEngine,
|
|
132
|
+
} }, children));
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const useAchievements = () => {
|
|
136
|
+
const context = useContext(AchievementContext);
|
|
137
|
+
if (!context) {
|
|
138
|
+
throw new Error('useAchievements must be used within an AchievementProvider');
|
|
139
|
+
}
|
|
140
|
+
return context;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const useAchievementState = () => {
|
|
144
|
+
const { achievements, getAllAchievements, getState } = useAchievements();
|
|
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));
|
|
149
|
+
return {
|
|
150
|
+
unlockedIds,
|
|
151
|
+
unlockedAchievements,
|
|
152
|
+
allAchievements,
|
|
153
|
+
unlockedCount: unlockedIds.length,
|
|
154
|
+
totalCount: allAchievements.length,
|
|
155
|
+
metrics: getState().metrics,
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* A simplified hook for achievement tracking.
|
|
161
|
+
* Provides the v4 happy path for direct metric updates plus explicit state names.
|
|
162
|
+
*/
|
|
163
|
+
const useSimpleAchievements = () => {
|
|
164
|
+
const { update, reset, getState, exportData, importData } = useAchievements();
|
|
165
|
+
const achievementState = useAchievementState();
|
|
166
|
+
const track = (metric, value) => update({ [metric]: value });
|
|
167
|
+
const increment = (metric, amount = 1) => {
|
|
168
|
+
const currentState = getState();
|
|
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 });
|
|
175
|
+
};
|
|
176
|
+
const trackMultiple = (metrics) => update(metrics);
|
|
177
|
+
return {
|
|
178
|
+
track,
|
|
179
|
+
increment,
|
|
180
|
+
trackMultiple,
|
|
181
|
+
unlockedIds: achievementState.unlockedIds,
|
|
182
|
+
unlockedAchievements: achievementState.unlockedAchievements,
|
|
183
|
+
allAchievements: achievementState.allAchievements,
|
|
184
|
+
unlockedCount: achievementState.unlockedCount,
|
|
185
|
+
totalCount: achievementState.totalCount,
|
|
186
|
+
metrics: achievementState.metrics,
|
|
187
|
+
reset,
|
|
188
|
+
getState,
|
|
189
|
+
exportData,
|
|
190
|
+
importData,
|
|
191
|
+
getAllAchievements: () => achievementState.allAchievements,
|
|
192
|
+
/**
|
|
193
|
+
* @deprecated Use `unlockedIds` instead. This alias will be removed in 4.2.
|
|
194
|
+
*/
|
|
195
|
+
unlocked: achievementState.unlockedIds,
|
|
196
|
+
/**
|
|
197
|
+
* @deprecated Use `allAchievements` instead. This alias will be removed in 4.2.
|
|
198
|
+
*/
|
|
199
|
+
all: achievementState.allAchievements,
|
|
200
|
+
};
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Access the active AchievementEngine instance.
|
|
205
|
+
*
|
|
206
|
+
* In v4 this works with both provider-created engines (`achievements` prop) and
|
|
207
|
+
* injected engines (`engine` prop).
|
|
208
|
+
*/
|
|
209
|
+
const useAchievementEngine = () => {
|
|
210
|
+
const context = useContext(AchievementContext);
|
|
211
|
+
if (!context) {
|
|
212
|
+
throw new Error('useAchievementEngine must be used within an AchievementProvider.\n\n' +
|
|
213
|
+
'Wrap your component tree:\n' +
|
|
214
|
+
'<AchievementProvider achievements={achievements}>\n' +
|
|
215
|
+
' <YourComponent />\n' +
|
|
216
|
+
'</AchievementProvider>');
|
|
217
|
+
}
|
|
218
|
+
return context.engine;
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
export { AchievementContext, AchievementProvider, isAsyncStorage, useAchievementEngine, useAchievementState, useAchievements, useSimpleAchievements };
|
|
222
|
+
//# sourceMappingURL=headless.esm.js.map
|
|
@@ -0,0 +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":"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"}
|