@playbasis-ai/qwikcard-sdk 2.3.4
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/CHANGELOG.md +142 -0
- package/LICENSE +21 -0
- package/README.md +267 -0
- package/SDK_HANDOVER_GUIDE.md +129 -0
- package/dist/PlaybasisProvider.d.ts +19 -0
- package/dist/PlaybasisProvider.d.ts.map +1 -0
- package/dist/PlaybasisProvider.js +24 -0
- package/dist/QwikCardApp.d.ts +9 -0
- package/dist/QwikCardApp.d.ts.map +1 -0
- package/dist/QwikCardApp.js +210 -0
- package/dist/api/client.d.ts +66 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +196 -0
- package/dist/components/Badge.d.ts +8 -0
- package/dist/components/Badge.d.ts.map +1 -0
- package/dist/components/Badge.js +34 -0
- package/dist/components/BadgeIcon.d.ts +10 -0
- package/dist/components/BadgeIcon.d.ts.map +1 -0
- package/dist/components/BadgeIcon.js +51 -0
- package/dist/components/Button.d.ts +10 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +40 -0
- package/dist/components/GradientCard.d.ts +9 -0
- package/dist/components/GradientCard.d.ts.map +1 -0
- package/dist/components/GradientCard.js +28 -0
- package/dist/components/PointsBalance.d.ts +8 -0
- package/dist/components/PointsBalance.d.ts.map +1 -0
- package/dist/components/PointsBalance.js +85 -0
- package/dist/components/ProgressBar.d.ts +8 -0
- package/dist/components/ProgressBar.d.ts.map +1 -0
- package/dist/components/ProgressBar.js +41 -0
- package/dist/components/QuestProgress.d.ts +10 -0
- package/dist/components/QuestProgress.d.ts.map +1 -0
- package/dist/components/QuestProgress.js +94 -0
- package/dist/components/RadialGauge.d.ts +8 -0
- package/dist/components/RadialGauge.d.ts.map +1 -0
- package/dist/components/RadialGauge.js +53 -0
- package/dist/components/RewardCard.d.ts +10 -0
- package/dist/components/RewardCard.d.ts.map +1 -0
- package/dist/components/RewardCard.js +64 -0
- package/dist/components/RulesModal.d.ts +7 -0
- package/dist/components/RulesModal.d.ts.map +1 -0
- package/dist/components/RulesModal.js +106 -0
- package/dist/hooks/useBadges.d.ts +12 -0
- package/dist/hooks/useBadges.d.ts.map +1 -0
- package/dist/hooks/useBadges.js +42 -0
- package/dist/hooks/usePoints.d.ts +13 -0
- package/dist/hooks/usePoints.d.ts.map +1 -0
- package/dist/hooks/usePoints.js +70 -0
- package/dist/hooks/useQuests.d.ts +12 -0
- package/dist/hooks/useQuests.d.ts.map +1 -0
- package/dist/hooks/useQuests.js +41 -0
- package/dist/hooks/useQwikApp.d.ts +16 -0
- package/dist/hooks/useQwikApp.d.ts.map +1 -0
- package/dist/hooks/useQwikApp.js +42 -0
- package/dist/hooks/useRewards.d.ts +12 -0
- package/dist/hooks/useRewards.d.ts.map +1 -0
- package/dist/hooks/useRewards.js +56 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/theme/context.d.ts +8 -0
- package/dist/theme/context.d.ts.map +1 -0
- package/dist/theme/context.js +8 -0
- package/dist/theme/tokens.d.ts +35 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +33 -0
- package/dist/types/index.d.ts +119 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/web/widgetAssets.d.ts +4 -0
- package/dist/web/widgetAssets.d.ts.map +1 -0
- package/dist/web/widgetAssets.js +5 -0
- package/dist/web/widgetHtml.d.ts +2 -0
- package/dist/web/widgetHtml.d.ts.map +1 -0
- package/dist/web/widgetHtml.js +299 -0
- package/dist/web/widgetTypes.d.ts +128 -0
- package/dist/web/widgetTypes.d.ts.map +1 -0
- package/dist/web/widgetTypes.js +1 -0
- package/package.json +86 -0
- package/src/PlaybasisProvider.tsx +72 -0
- package/src/QwikCardApp.tsx +302 -0
- package/src/api/client.ts +307 -0
- package/src/components/Badge.tsx +51 -0
- package/src/components/BadgeIcon.tsx +97 -0
- package/src/components/Button.tsx +70 -0
- package/src/components/GradientCard.tsx +49 -0
- package/src/components/PointsBalance.tsx +122 -0
- package/src/components/ProgressBar.tsx +65 -0
- package/src/components/QuestProgress.tsx +153 -0
- package/src/components/RadialGauge.tsx +101 -0
- package/src/components/RewardCard.tsx +123 -0
- package/src/components/RulesModal.tsx +171 -0
- package/src/hooks/useBadges.ts +59 -0
- package/src/hooks/usePoints.ts +91 -0
- package/src/hooks/useQuests.ts +60 -0
- package/src/hooks/useQwikApp.ts +49 -0
- package/src/hooks/useRewards.ts +74 -0
- package/src/index.ts +34 -0
- package/src/theme/context.tsx +17 -0
- package/src/theme/tokens.ts +68 -0
- package/src/types/index.ts +176 -0
- package/src/web/widgetAssets.d.ts +3 -0
- package/src/web/widgetAssets.ts +6 -0
- package/src/web/widgetHtml.ts +302 -0
- package/src/web/widgetTypes.ts +146 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { usePlaybasis } from '../PlaybasisProvider';
|
|
3
|
+
export function usePoints() {
|
|
4
|
+
const { client, playerId } = usePlaybasis();
|
|
5
|
+
const [balances, setBalances] = useState([]);
|
|
6
|
+
const [loading, setLoading] = useState(true);
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
const fetchBalances = useCallback(async () => {
|
|
9
|
+
if (!playerId) {
|
|
10
|
+
setBalances([]);
|
|
11
|
+
setLoading(false);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
setLoading(true);
|
|
15
|
+
setError(null);
|
|
16
|
+
try {
|
|
17
|
+
const playerBalances = await client.getBalances(playerId);
|
|
18
|
+
setBalances(playerBalances);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
setError(err instanceof Error ? err : new Error('Failed to fetch balances'));
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
setLoading(false);
|
|
25
|
+
}
|
|
26
|
+
}, [client, playerId]);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
fetchBalances();
|
|
29
|
+
}, [fetchBalances]);
|
|
30
|
+
const earn = useCallback(async (currency, amount, reason) => {
|
|
31
|
+
if (!playerId)
|
|
32
|
+
return null;
|
|
33
|
+
try {
|
|
34
|
+
const balance = await client.earnPoints({
|
|
35
|
+
playerId,
|
|
36
|
+
currency,
|
|
37
|
+
amount,
|
|
38
|
+
reason,
|
|
39
|
+
});
|
|
40
|
+
// Update local state
|
|
41
|
+
setBalances((prev) => {
|
|
42
|
+
const idx = prev.findIndex((b) => b.currency === currency);
|
|
43
|
+
if (idx >= 0) {
|
|
44
|
+
const updated = [...prev];
|
|
45
|
+
updated[idx] = balance;
|
|
46
|
+
return updated;
|
|
47
|
+
}
|
|
48
|
+
return [...prev, balance];
|
|
49
|
+
});
|
|
50
|
+
return balance;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
setError(err instanceof Error ? err : new Error('Failed to earn points'));
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}, [client, playerId]);
|
|
57
|
+
// Helper getters for common currencies
|
|
58
|
+
const xp = balances.find((b) => b.currency === 'xp')?.balance ?? 0;
|
|
59
|
+
const qwikCoins = balances.find((b) => b.currency === 'coins')?.balance ?? 0;
|
|
60
|
+
return {
|
|
61
|
+
balances,
|
|
62
|
+
xp,
|
|
63
|
+
qwikCoins,
|
|
64
|
+
loading,
|
|
65
|
+
error,
|
|
66
|
+
refresh: fetchBalances,
|
|
67
|
+
earn,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export default usePoints;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Quest } from '../types';
|
|
2
|
+
interface UseQuestsReturn {
|
|
3
|
+
quests: Quest[];
|
|
4
|
+
completedQuests: Quest[];
|
|
5
|
+
activeQuests: Quest[];
|
|
6
|
+
loading: boolean;
|
|
7
|
+
error: Error | null;
|
|
8
|
+
refresh: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare function useQuests(): UseQuestsReturn;
|
|
11
|
+
export default useQuests;
|
|
12
|
+
//# sourceMappingURL=useQuests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuests.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuests.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,UAAU,eAAe;IACvB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,eAAe,EAAE,KAAK,EAAE,CAAC;IACzB,YAAY,EAAE,KAAK,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,SAAS,IAAI,eAAe,CA2C3C;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { usePlaybasis } from '../PlaybasisProvider';
|
|
3
|
+
export function useQuests() {
|
|
4
|
+
const { client, playerId } = usePlaybasis();
|
|
5
|
+
const [quests, setQuests] = useState([]);
|
|
6
|
+
const [loading, setLoading] = useState(true);
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
const fetchQuests = useCallback(async () => {
|
|
9
|
+
if (!playerId) {
|
|
10
|
+
setQuests([]);
|
|
11
|
+
setLoading(false);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
setLoading(true);
|
|
15
|
+
setError(null);
|
|
16
|
+
try {
|
|
17
|
+
const playerQuests = await client.getPlayerQuests(playerId);
|
|
18
|
+
setQuests(playerQuests);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
setError(err instanceof Error ? err : new Error('Failed to fetch quests'));
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
setLoading(false);
|
|
25
|
+
}
|
|
26
|
+
}, [client, playerId]);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
fetchQuests();
|
|
29
|
+
}, [fetchQuests]);
|
|
30
|
+
const activeQuests = quests.filter((q) => q.status === 'in_progress' || q.status === 'not_started');
|
|
31
|
+
const completedQuests = quests.filter((q) => q.status === 'completed');
|
|
32
|
+
return {
|
|
33
|
+
quests,
|
|
34
|
+
activeQuests,
|
|
35
|
+
completedQuests,
|
|
36
|
+
loading,
|
|
37
|
+
error,
|
|
38
|
+
refresh: fetchQuests,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export default useQuests;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates and aggregates all SDK data hooks.
|
|
3
|
+
* Use this to ensure the "App" has all necessary data loaded.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useQwikApp(): {
|
|
6
|
+
isReady: boolean;
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
refreshAll: () => Promise<void>;
|
|
9
|
+
data: {
|
|
10
|
+
balances: import("..").PointBalance[];
|
|
11
|
+
quests: import("..").Quest[];
|
|
12
|
+
rewards: import("..").Reward[];
|
|
13
|
+
badges: import("..").Badge[];
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=useQwikApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQwikApp.d.ts","sourceRoot":"","sources":["../../src/hooks/useQwikApp.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,UAAU;;;;;;;;;;EAoCzB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { usePlaybasis } from '../PlaybasisProvider';
|
|
3
|
+
import { usePoints } from './usePoints';
|
|
4
|
+
import { useQuests } from './useQuests';
|
|
5
|
+
import { useRewards } from './useRewards';
|
|
6
|
+
import { useBadges } from './useBadges';
|
|
7
|
+
/**
|
|
8
|
+
* Validates and aggregates all SDK data hooks.
|
|
9
|
+
* Use this to ensure the "App" has all necessary data loaded.
|
|
10
|
+
*/
|
|
11
|
+
export function useQwikApp() {
|
|
12
|
+
const { client, playerId } = usePlaybasis();
|
|
13
|
+
const { balances, refresh: refreshPoints, loading: loadingPoints } = usePoints();
|
|
14
|
+
const { quests, loading: loadingQuests } = useQuests();
|
|
15
|
+
const { rewards, loading: loadingRewards } = useRewards();
|
|
16
|
+
const { badges, loading: loadingBadges } = useBadges();
|
|
17
|
+
const [isReady, setIsReady] = useState(false);
|
|
18
|
+
// Check if critical data is loaded
|
|
19
|
+
const isLoading = loadingPoints || loadingQuests || loadingRewards || loadingBadges;
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!isLoading && playerId) {
|
|
22
|
+
setIsReady(true);
|
|
23
|
+
}
|
|
24
|
+
}, [isLoading, playerId]);
|
|
25
|
+
const refreshAll = async () => {
|
|
26
|
+
await Promise.all([
|
|
27
|
+
refreshPoints(),
|
|
28
|
+
// Add other refresh methods if exposed by hooks
|
|
29
|
+
]);
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
isReady,
|
|
33
|
+
isLoading,
|
|
34
|
+
refreshAll,
|
|
35
|
+
data: {
|
|
36
|
+
balances,
|
|
37
|
+
quests,
|
|
38
|
+
rewards,
|
|
39
|
+
badges,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Reward, RedemptionResult } from '../types';
|
|
2
|
+
interface UseRewardsReturn {
|
|
3
|
+
rewards: Reward[];
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: Error | null;
|
|
6
|
+
refresh: () => Promise<void>;
|
|
7
|
+
redeem: (rewardId: string) => Promise<RedemptionResult>;
|
|
8
|
+
redeeming: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function useRewards(): UseRewardsReturn;
|
|
11
|
+
export default useRewards;
|
|
12
|
+
//# sourceMappingURL=useRewards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRewards.d.ts","sourceRoot":"","sources":["../../src/hooks/useRewards.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEzD,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACxD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAyD7C;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { usePlaybasis } from '../PlaybasisProvider';
|
|
3
|
+
export function useRewards() {
|
|
4
|
+
const { client, playerId } = usePlaybasis();
|
|
5
|
+
const [rewards, setRewards] = useState([]);
|
|
6
|
+
const [loading, setLoading] = useState(true);
|
|
7
|
+
const [redeeming, setRedeeming] = useState(false);
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
const fetchRewards = useCallback(async () => {
|
|
10
|
+
setLoading(true);
|
|
11
|
+
setError(null);
|
|
12
|
+
try {
|
|
13
|
+
const allRewards = await client.getRewards();
|
|
14
|
+
setRewards(allRewards);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
setError(err instanceof Error ? err : new Error('Failed to fetch rewards'));
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
setLoading(false);
|
|
21
|
+
}
|
|
22
|
+
}, [client]);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
fetchRewards();
|
|
25
|
+
}, [fetchRewards]);
|
|
26
|
+
const redeem = useCallback(async (rewardId) => {
|
|
27
|
+
if (!playerId) {
|
|
28
|
+
return { success: false, message: 'No player ID set' };
|
|
29
|
+
}
|
|
30
|
+
setRedeeming(true);
|
|
31
|
+
try {
|
|
32
|
+
const result = await client.redeemReward(playerId, rewardId);
|
|
33
|
+
// Refresh rewards after redemption
|
|
34
|
+
await fetchRewards();
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return {
|
|
39
|
+
success: false,
|
|
40
|
+
message: err instanceof Error ? err.message : 'Redemption failed',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
setRedeeming(false);
|
|
45
|
+
}
|
|
46
|
+
}, [client, playerId, fetchRewards]);
|
|
47
|
+
return {
|
|
48
|
+
rewards,
|
|
49
|
+
loading,
|
|
50
|
+
error,
|
|
51
|
+
refresh: fetchRewards,
|
|
52
|
+
redeem,
|
|
53
|
+
redeeming,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export default useRewards;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbasis SDK for QwikCard College Rewards
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
export { PlaybasisProvider, usePlaybasis } from './PlaybasisProvider';
|
|
7
|
+
export { PlaybasisClient } from './api/client';
|
|
8
|
+
export { useQuests } from './hooks/useQuests';
|
|
9
|
+
export { useRewards } from './hooks/useRewards';
|
|
10
|
+
export { useBadges } from './hooks/useBadges';
|
|
11
|
+
export { usePoints } from './hooks/usePoints';
|
|
12
|
+
export { QuestProgress } from './components/QuestProgress';
|
|
13
|
+
export { RewardCard } from './components/RewardCard';
|
|
14
|
+
export { BadgeIcon } from './components/BadgeIcon';
|
|
15
|
+
export { PointsBalance } from './components/PointsBalance';
|
|
16
|
+
export * from './theme/context';
|
|
17
|
+
export * from './theme/tokens';
|
|
18
|
+
export * from './components/GradientCard';
|
|
19
|
+
export * from './components/Badge';
|
|
20
|
+
export * from './components/Button';
|
|
21
|
+
export * from './components/ProgressBar';
|
|
22
|
+
export * from './components/RadialGauge';
|
|
23
|
+
export * from './components/RulesModal';
|
|
24
|
+
export { QwikCardApp } from './QwikCardApp';
|
|
25
|
+
export { useQwikApp } from './hooks/useQwikApp';
|
|
26
|
+
export * from './types';
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AAGxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,cAAc,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbasis SDK for QwikCard College Rewards
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
export { PlaybasisProvider, usePlaybasis } from './PlaybasisProvider';
|
|
7
|
+
export { PlaybasisClient } from './api/client';
|
|
8
|
+
export { useQuests } from './hooks/useQuests';
|
|
9
|
+
export { useRewards } from './hooks/useRewards';
|
|
10
|
+
export { useBadges } from './hooks/useBadges';
|
|
11
|
+
export { usePoints } from './hooks/usePoints';
|
|
12
|
+
export { QuestProgress } from './components/QuestProgress';
|
|
13
|
+
export { RewardCard } from './components/RewardCard';
|
|
14
|
+
export { BadgeIcon } from './components/BadgeIcon';
|
|
15
|
+
export { PointsBalance } from './components/PointsBalance';
|
|
16
|
+
// Theme
|
|
17
|
+
export * from './theme/context';
|
|
18
|
+
export * from './theme/tokens';
|
|
19
|
+
// New Components
|
|
20
|
+
export * from './components/GradientCard';
|
|
21
|
+
export * from './components/Badge'; // Exports StatBadge
|
|
22
|
+
export * from './components/Button';
|
|
23
|
+
export * from './components/ProgressBar';
|
|
24
|
+
export * from './components/RadialGauge';
|
|
25
|
+
export * from './components/RulesModal';
|
|
26
|
+
// App
|
|
27
|
+
export { QwikCardApp } from './QwikCardApp';
|
|
28
|
+
export { useQwikApp } from './hooks/useQwikApp';
|
|
29
|
+
export * from './types';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { QwikTheme } from './tokens';
|
|
3
|
+
export declare const ThemeProvider: ({ children, theme, }: {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
theme?: QwikTheme;
|
|
6
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare const useTheme: () => QwikTheme;
|
|
8
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/theme/context.tsx"],"names":[],"mappings":"AAAA,OAAc,EAA6B,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAC;AAIhD,eAAO,MAAM,aAAa,GAAI,sBAG3B;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,4CAEA,CAAC;AAEF,eAAO,MAAM,QAAQ,iBAAiC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
import { qwikTheme } from './tokens';
|
|
4
|
+
const ThemeContext = createContext(qwikTheme);
|
|
5
|
+
export const ThemeProvider = ({ children, theme = qwikTheme, }) => {
|
|
6
|
+
return _jsx(ThemeContext.Provider, { value: theme, children: children });
|
|
7
|
+
};
|
|
8
|
+
export const useTheme = () => useContext(ThemeContext);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface ColorTokens {
|
|
2
|
+
primary: string;
|
|
3
|
+
secondary: string;
|
|
4
|
+
background: string;
|
|
5
|
+
surface: string;
|
|
6
|
+
text: {
|
|
7
|
+
primary: string;
|
|
8
|
+
secondary: string;
|
|
9
|
+
onPrimary: string;
|
|
10
|
+
};
|
|
11
|
+
gradients: {
|
|
12
|
+
sunset: [string, string, string, string];
|
|
13
|
+
card: [string, string, string];
|
|
14
|
+
button: [string, string];
|
|
15
|
+
glass: [string, string];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface QwikTheme {
|
|
19
|
+
colors: ColorTokens;
|
|
20
|
+
spacing: {
|
|
21
|
+
xs: number;
|
|
22
|
+
s: number;
|
|
23
|
+
m: number;
|
|
24
|
+
l: number;
|
|
25
|
+
xl: number;
|
|
26
|
+
};
|
|
27
|
+
borderRadius: {
|
|
28
|
+
s: number;
|
|
29
|
+
m: number;
|
|
30
|
+
l: number;
|
|
31
|
+
xl: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export declare const qwikTheme: QwikTheme;
|
|
35
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/theme/tokens.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,SAAS,EAAE;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,YAAY,EAAE;QACZ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED,eAAO,MAAM,SAAS,EAAE,SAgCvB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const qwikTheme = {
|
|
2
|
+
colors: {
|
|
3
|
+
primary: '#FF4500', // OrangeRed
|
|
4
|
+
secondary: '#FFD4C8', // Pale Coral
|
|
5
|
+
background: '#0F1419', // Deep dark
|
|
6
|
+
surface: 'rgba(255, 255, 255, 0.08)',
|
|
7
|
+
text: {
|
|
8
|
+
primary: '#FFFFFF',
|
|
9
|
+
secondary: '#94A3B8',
|
|
10
|
+
onPrimary: '#FFFFFF',
|
|
11
|
+
},
|
|
12
|
+
gradients: {
|
|
13
|
+
// Smoother sunset: Pink -> Orange -> Gold -> Purple
|
|
14
|
+
sunset: ['#FF69B4', '#FF8C00', '#FFD700', '#DA70D6'],
|
|
15
|
+
card: ['rgba(255, 255, 255, 0.1)', 'rgba(255, 255, 255, 0.05)', 'rgba(255, 255, 255, 0)'],
|
|
16
|
+
button: ['#FF4500', '#FF69B4'],
|
|
17
|
+
glass: ['rgba(255, 255, 255, 0.15)', 'rgba(255, 255, 255, 0.05)'],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
spacing: {
|
|
21
|
+
xs: 4,
|
|
22
|
+
s: 8,
|
|
23
|
+
m: 16,
|
|
24
|
+
l: 24,
|
|
25
|
+
xl: 32,
|
|
26
|
+
},
|
|
27
|
+
borderRadius: {
|
|
28
|
+
s: 8,
|
|
29
|
+
m: 12,
|
|
30
|
+
l: 16,
|
|
31
|
+
xl: 24,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript types for QwikCard SDK
|
|
3
|
+
*/
|
|
4
|
+
export interface Player {
|
|
5
|
+
id: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
metadata?: PlayerMetadata;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface PlayerMetadata {
|
|
13
|
+
externalId?: string;
|
|
14
|
+
qwikTag?: string;
|
|
15
|
+
collegeName?: string;
|
|
16
|
+
qwikGoals?: string[];
|
|
17
|
+
workStatus?: string;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface PointBalance {
|
|
21
|
+
currency: string;
|
|
22
|
+
balance: number;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export type Currency = 'xp' | 'coins';
|
|
26
|
+
export interface Quest {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
status: QuestStatus;
|
|
31
|
+
progress: number;
|
|
32
|
+
target: number;
|
|
33
|
+
rewards: QuestReward[];
|
|
34
|
+
expiresAt?: string;
|
|
35
|
+
completedAt?: string;
|
|
36
|
+
}
|
|
37
|
+
export type QuestStatus = 'not_started' | 'in_progress' | 'completed' | 'expired';
|
|
38
|
+
export interface QuestReward {
|
|
39
|
+
type: 'points' | 'badge' | 'reward';
|
|
40
|
+
currency?: string;
|
|
41
|
+
amount?: number;
|
|
42
|
+
badgeId?: string;
|
|
43
|
+
rewardId?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface Badge {
|
|
46
|
+
id: string;
|
|
47
|
+
name: string;
|
|
48
|
+
description: string;
|
|
49
|
+
imageUrl?: string;
|
|
50
|
+
earnedAt?: string;
|
|
51
|
+
isEarned: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface Reward {
|
|
54
|
+
id: string;
|
|
55
|
+
name: string;
|
|
56
|
+
description: string;
|
|
57
|
+
imageUrl?: string;
|
|
58
|
+
cost: number;
|
|
59
|
+
currency: string;
|
|
60
|
+
available: boolean;
|
|
61
|
+
expiresAt?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface RedemptionResult {
|
|
64
|
+
success: boolean;
|
|
65
|
+
redemptionId?: string;
|
|
66
|
+
code?: string;
|
|
67
|
+
message?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface LeaderboardEntry {
|
|
70
|
+
playerId: string;
|
|
71
|
+
displayName: string;
|
|
72
|
+
rank: number;
|
|
73
|
+
score: number;
|
|
74
|
+
metadata?: PlayerMetadata;
|
|
75
|
+
}
|
|
76
|
+
export interface PlayerRank {
|
|
77
|
+
playerId: string;
|
|
78
|
+
rank: number;
|
|
79
|
+
score: number;
|
|
80
|
+
above: LeaderboardEntry[];
|
|
81
|
+
below: LeaderboardEntry[];
|
|
82
|
+
}
|
|
83
|
+
export type QwikCardEventType = 'card.purchase' | 'card.deposit' | 'card.atm' | 'qwikit.sent' | 'qwikit.received' | 'referral.signup' | 'profile.complete';
|
|
84
|
+
export interface TrackEventInput {
|
|
85
|
+
type: QwikCardEventType;
|
|
86
|
+
playerId: string;
|
|
87
|
+
referenceId?: string;
|
|
88
|
+
data?: Record<string, unknown>;
|
|
89
|
+
}
|
|
90
|
+
export interface CardPurchaseData {
|
|
91
|
+
i2cTransId: string;
|
|
92
|
+
amount: number;
|
|
93
|
+
mcc?: string;
|
|
94
|
+
category?: string;
|
|
95
|
+
merchant?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface QwikItData {
|
|
98
|
+
recipientPlayerId: string;
|
|
99
|
+
amount: number;
|
|
100
|
+
senderQwikTag?: string;
|
|
101
|
+
recipientQwikTag?: string;
|
|
102
|
+
}
|
|
103
|
+
export interface ApiResponse<T> {
|
|
104
|
+
success: boolean;
|
|
105
|
+
data?: T;
|
|
106
|
+
error?: ApiError;
|
|
107
|
+
}
|
|
108
|
+
export interface ApiError {
|
|
109
|
+
code: string;
|
|
110
|
+
message: string;
|
|
111
|
+
details?: Record<string, unknown>;
|
|
112
|
+
}
|
|
113
|
+
export interface PaginatedResponse<T> {
|
|
114
|
+
items: T[];
|
|
115
|
+
total: number;
|
|
116
|
+
cursor?: string;
|
|
117
|
+
hasMore: boolean;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|