@freegamestore/games 0.4.0 → 0.6.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.
@@ -0,0 +1,10 @@
1
+ import type * as React from 'react';
2
+ /**
3
+ * Sign-in / avatar widget for the GameTopbar `actions` slot.
4
+ *
5
+ * When not signed in: shows a small "Sign in" text button.
6
+ * When signed in: shows the user's avatar + first name, with a
7
+ * dropdown containing "Sign out".
8
+ */
9
+ export declare function GameAuth(): React.JSX.Element;
10
+ //# sourceMappingURL=GameAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GameAuth.d.ts","sourceRoot":"","sources":["../src/GameAuth.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC;;;;;;GAMG;AACH,wBAAgB,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA2I5C"}
@@ -0,0 +1,108 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect } from 'react';
3
+ import { useAuth } from './useAuth.js';
4
+ /**
5
+ * Sign-in / avatar widget for the GameTopbar `actions` slot.
6
+ *
7
+ * When not signed in: shows a small "Sign in" text button.
8
+ * When signed in: shows the user's avatar + first name, with a
9
+ * dropdown containing "Sign out".
10
+ */
11
+ export function GameAuth() {
12
+ const { user, loading, signIn, signOut } = useAuth();
13
+ const [open, setOpen] = useState(false);
14
+ const ref = useRef(null);
15
+ // Close dropdown when clicking outside
16
+ useEffect(() => {
17
+ if (!open)
18
+ return;
19
+ const handler = (e) => {
20
+ if (ref.current && !ref.current.contains(e.target)) {
21
+ setOpen(false);
22
+ }
23
+ };
24
+ document.addEventListener('pointerdown', handler, true);
25
+ return () => document.removeEventListener('pointerdown', handler, true);
26
+ }, [open]);
27
+ if (loading)
28
+ return _jsx("div", {});
29
+ if (user === null) {
30
+ return (_jsx("button", { onClick: signIn, style: {
31
+ background: 'none',
32
+ border: 'none',
33
+ cursor: 'pointer',
34
+ fontFamily: '"Manrope", system-ui, sans-serif',
35
+ fontSize: '0.7rem',
36
+ fontWeight: 600,
37
+ color: 'var(--muted, #6b7280)',
38
+ padding: 0,
39
+ margin: 0,
40
+ // 44px minimum touch target
41
+ minWidth: '44px',
42
+ minHeight: '44px',
43
+ display: 'inline-flex',
44
+ alignItems: 'center',
45
+ justifyContent: 'center',
46
+ WebkitTapHighlightColor: 'transparent',
47
+ touchAction: 'manipulation',
48
+ }, children: "Sign in" }));
49
+ }
50
+ const firstName = user.name.split(' ')[0] ?? user.name;
51
+ return (_jsxs("div", { ref: ref, style: { position: 'relative' }, children: [_jsxs("button", { onClick: () => setOpen((v) => !v), style: {
52
+ background: 'none',
53
+ border: 'none',
54
+ cursor: 'pointer',
55
+ display: 'inline-flex',
56
+ alignItems: 'center',
57
+ gap: '0.35rem',
58
+ padding: 0,
59
+ margin: 0,
60
+ minWidth: '44px',
61
+ minHeight: '44px',
62
+ justifyContent: 'center',
63
+ WebkitTapHighlightColor: 'transparent',
64
+ touchAction: 'manipulation',
65
+ }, children: [_jsx("img", { src: user.avatar, alt: "", width: 24, height: 24, style: {
66
+ width: '24px',
67
+ height: '24px',
68
+ borderRadius: '50%',
69
+ objectFit: 'cover',
70
+ flexShrink: 0,
71
+ } }), _jsx("span", { style: {
72
+ fontFamily: '"Manrope", system-ui, sans-serif',
73
+ fontSize: '0.7rem',
74
+ fontWeight: 600,
75
+ color: 'var(--ink, #1a1a1a)',
76
+ whiteSpace: 'nowrap',
77
+ }, children: firstName })] }), open && (_jsx("div", { style: {
78
+ position: 'absolute',
79
+ top: '100%',
80
+ right: 0,
81
+ marginTop: '0.25rem',
82
+ background: 'var(--panel, #fff)',
83
+ border: '1px solid var(--line, #e5e5e5)',
84
+ borderRadius: '0.5rem',
85
+ boxShadow: '0 4px 12px rgba(0,0,0,0.1)',
86
+ zIndex: 100,
87
+ minWidth: '7rem',
88
+ }, children: _jsx("button", { onClick: () => {
89
+ setOpen(false);
90
+ signOut();
91
+ }, style: {
92
+ display: 'flex',
93
+ alignItems: 'center',
94
+ width: '100%',
95
+ background: 'none',
96
+ border: 'none',
97
+ cursor: 'pointer',
98
+ fontFamily: '"Manrope", system-ui, sans-serif',
99
+ fontSize: '0.7rem',
100
+ fontWeight: 600,
101
+ color: 'var(--ink, #1a1a1a)',
102
+ padding: '0.5rem 0.75rem',
103
+ minHeight: '44px',
104
+ WebkitTapHighlightColor: 'transparent',
105
+ touchAction: 'manipulation',
106
+ }, children: "Sign out" }) }))] }));
107
+ }
108
+ //# sourceMappingURL=GameAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GameAuth.js","sourceRoot":"","sources":["../src/GameAuth.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GameShell.d.ts","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6DAA6D;IAC7D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA8CjF"}
1
+ {"version":3,"file":"GameShell.d.ts","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6DAA6D;IAC7D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA6EjF"}
package/dist/GameShell.js CHANGED
@@ -40,6 +40,21 @@ export function GameShell({ topbar, children }) {
40
40
  minWidth: 0,
41
41
  position: 'relative',
42
42
  overflow: 'hidden',
43
- }, children: children })] }));
43
+ }, children: children }), _jsx("div", { style: {
44
+ flexShrink: 0,
45
+ paddingBottom: 'env(safe-area-inset-bottom, 0px)',
46
+ background: 'var(--panel, var(--paper))',
47
+ borderTop: '1px solid var(--line, #e5e5e5)',
48
+ textAlign: 'center',
49
+ }, children: _jsx("a", { href: "https://freegamestore.online", target: "_blank", rel: "noopener noreferrer", style: {
50
+ display: 'block',
51
+ padding: '0.15rem 0',
52
+ fontSize: '0.55rem',
53
+ fontFamily: '"Manrope", system-ui, sans-serif',
54
+ fontWeight: 600,
55
+ color: 'var(--muted, #999)',
56
+ textDecoration: 'none',
57
+ letterSpacing: '0.03em',
58
+ }, children: "freegamestore.online" }) })] }));
44
59
  }
45
60
  //# sourceMappingURL=GameShell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GameShell.js","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":";AAaA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAkB;IAC5D,OAAO,CACL,eACE,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,cAAc;YAC1B,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,QAAQ;YAClB,uDAAuD;YACvD,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,OAAO;YACd,oEAAoE;YACpE,0DAA0D;YAC1D,gBAAgB,EAAE,MAAM;YACxB,UAAU,EAAE,MAAM;YAClB,kBAAkB,EAAE,MAAM;YAC1B,WAAW,EAAE,cAAc;SAC5B,aAEA,MAAM,KAAK,SAAS,IAAI,CACvB,cACE,KAAK,EAAE;oBACL,UAAU,EAAE,CAAC;oBACb,YAAY,EAAE,gCAAgC;oBAC9C,UAAU,EAAE,4BAA4B;iBACzC,YAEA,MAAM,GACH,CACP,EACD,cACE,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC;oBACP,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;oBACX,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,QAAQ;iBACnB,YAEA,QAAQ,GACL,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"GameShell.js","sourceRoot":"","sources":["../src/GameShell.tsx"],"names":[],"mappings":";AAaA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAkB;IAC5D,OAAO,CACL,eACE,KAAK,EAAE;YACL,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,cAAc;YAC1B,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,QAAQ;YAClB,uDAAuD;YACvD,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,OAAO;YACd,oEAAoE;YACpE,0DAA0D;YAC1D,gBAAgB,EAAE,MAAM;YACxB,UAAU,EAAE,MAAM;YAClB,kBAAkB,EAAE,MAAM;YAC1B,WAAW,EAAE,cAAc;SAC5B,aAEA,MAAM,KAAK,SAAS,IAAI,CACvB,cACE,KAAK,EAAE;oBACL,UAAU,EAAE,CAAC;oBACb,YAAY,EAAE,gCAAgC;oBAC9C,UAAU,EAAE,4BAA4B;iBACzC,YAEA,MAAM,GACH,CACP,EACD,cACE,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC;oBACP,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;oBACX,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,QAAQ;iBACnB,YAEA,QAAQ,GACL,EAKN,cACE,KAAK,EAAE;oBACL,UAAU,EAAE,CAAC;oBACb,aAAa,EAAE,kCAAkC;oBACjD,UAAU,EAAE,4BAA4B;oBACxC,SAAS,EAAE,gCAAgC;oBAC3C,SAAS,EAAE,QAAQ;iBACpB,YAED,YACE,IAAI,EAAC,8BAA8B,EACnC,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,KAAK,EAAE;wBACL,OAAO,EAAE,OAAO;wBAChB,OAAO,EAAE,WAAW;wBACpB,QAAQ,EAAE,SAAS;wBACnB,UAAU,EAAE,kCAAkC;wBAC9C,UAAU,EAAE,GAAG;wBACf,KAAK,EAAE,oBAAoB;wBAC3B,cAAc,EAAE,MAAM;wBACtB,aAAa,EAAE,QAAQ;qBACxB,qCAGC,GACA,IACF,CACP,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -15,4 +15,7 @@
15
15
  export { GameShell, type GameShellProps } from './GameShell.js';
16
16
  export { GameTopbar, type GameTopbarProps, type GameTopbarStat, } from './GameTopbar.js';
17
17
  export { GameButton, type GameButtonProps, type GameButtonVariant, type GameButtonSize, } from './GameButton.js';
18
+ export { GameAuth } from './GameAuth.js';
19
+ export { useAuth, type User } from './useAuth.js';
20
+ export { useLeaderboard, type LeaderboardEntry, } from './useLeaderboard.js';
18
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -15,4 +15,7 @@
15
15
  export { GameShell } from './GameShell.js';
16
16
  export { GameTopbar, } from './GameTopbar.js';
17
17
  export { GameButton, } from './GameButton.js';
18
+ export { GameAuth } from './GameAuth.js';
19
+ export { useAuth } from './useAuth.js';
20
+ export { useLeaderboard, } from './useLeaderboard.js';
18
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,UAAU,GAGX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,GAIX,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,UAAU,GAGX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,UAAU,GAIX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAa,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,cAAc,GAEf,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface User {
2
+ id: string;
3
+ name: string;
4
+ avatar: string;
5
+ }
6
+ export declare function useAuth(): {
7
+ user: User | null;
8
+ loading: boolean;
9
+ signIn: () => void;
10
+ signOut: () => void;
11
+ };
12
+ //# sourceMappingURL=useAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,IAAI;IACzB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA4CA"}
@@ -0,0 +1,46 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ export function useAuth() {
3
+ const [user, setUser] = useState(null);
4
+ const [loading, setLoading] = useState(true);
5
+ useEffect(() => {
6
+ let cancelled = false;
7
+ fetch('https://auth.freegamestore.online/me', { credentials: 'include' })
8
+ .then((res) => {
9
+ if (!cancelled && res.ok)
10
+ return res.json();
11
+ return null;
12
+ })
13
+ .then((data) => {
14
+ if (!cancelled)
15
+ setUser(data);
16
+ })
17
+ .catch(() => {
18
+ // 401 or network error — user is not signed in
19
+ })
20
+ .finally(() => {
21
+ if (!cancelled)
22
+ setLoading(false);
23
+ });
24
+ return () => {
25
+ cancelled = true;
26
+ };
27
+ }, []);
28
+ const signIn = useCallback(() => {
29
+ window.location.href = `https://auth.freegamestore.online/login?redirect=${encodeURIComponent(window.location.href)}`;
30
+ }, []);
31
+ const signOut = useCallback(() => {
32
+ fetch('https://auth.freegamestore.online/logout', {
33
+ method: 'POST',
34
+ credentials: 'include',
35
+ })
36
+ .catch(() => {
37
+ // best-effort
38
+ })
39
+ .finally(() => {
40
+ setUser(null);
41
+ window.location.reload();
42
+ });
43
+ }, []);
44
+ return { user, loading, signIn, signOut };
45
+ }
46
+ //# sourceMappingURL=useAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../src/useAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAQzD,MAAM,UAAU,OAAO;IAMrB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,sCAAsC,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;aACtE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,IAAiB,EAAE,EAAE;YAC1B,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,+CAA+C;QACjD,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,SAAS;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,oDAAoD,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACxH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,KAAK,CAAC,0CAA0C,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,SAAS;SACvB,CAAC;aACC,KAAK,CAAC,GAAG,EAAE;YACV,cAAc;QAChB,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface LeaderboardEntry {
2
+ player_name: string;
3
+ score: number;
4
+ user_id?: string;
5
+ avatar_url?: string;
6
+ created_at: string;
7
+ }
8
+ export declare function useLeaderboard(gameId: string): {
9
+ topScores: LeaderboardEntry[];
10
+ recentScores: LeaderboardEntry[];
11
+ submitScore: (score: number) => Promise<{
12
+ ok: boolean;
13
+ rank?: number;
14
+ }>;
15
+ loading: boolean;
16
+ refresh: () => void;
17
+ };
18
+ //# sourceMappingURL=useLeaderboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLeaderboard.d.ts","sourceRoot":"","sources":["../src/useLeaderboard.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAC9C,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAiDA"}
@@ -0,0 +1,49 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ const API_BASE = 'https://freegamestore-leaderboard.serge-the-dev.workers.dev';
3
+ export function useLeaderboard(gameId) {
4
+ const [topScores, setTopScores] = useState([]);
5
+ const [recentScores, setRecentScores] = useState([]);
6
+ const [loading, setLoading] = useState(true);
7
+ const load = useCallback(() => {
8
+ setLoading(true);
9
+ Promise.all([
10
+ fetch(`${API_BASE}/scores/${gameId}?sort=top`, { credentials: 'include' })
11
+ .then((r) => (r.ok ? r.json() : []))
12
+ .catch(() => []),
13
+ fetch(`${API_BASE}/scores/${gameId}?sort=recent`, { credentials: 'include' })
14
+ .then((r) => (r.ok ? r.json() : []))
15
+ .catch(() => []),
16
+ ]).then(([top, recent]) => {
17
+ setTopScores(top);
18
+ setRecentScores(recent);
19
+ setLoading(false);
20
+ });
21
+ }, [gameId]);
22
+ useEffect(() => {
23
+ load();
24
+ }, [load]);
25
+ const submitScore = useCallback(async (score) => {
26
+ try {
27
+ const res = await fetch(`${API_BASE}/scores/${gameId}`, {
28
+ method: 'POST',
29
+ credentials: 'include',
30
+ headers: { 'Content-Type': 'application/json' },
31
+ body: JSON.stringify({ score }),
32
+ });
33
+ if (!res.ok)
34
+ return { ok: false };
35
+ const data = (await res.json());
36
+ // Refresh scores after submission
37
+ load();
38
+ const result = { ok: true };
39
+ if (data.rank !== undefined)
40
+ result.rank = data.rank;
41
+ return result;
42
+ }
43
+ catch {
44
+ return { ok: false };
45
+ }
46
+ }, [gameId, load]);
47
+ return { topScores, recentScores, submitScore, loading, refresh: load };
48
+ }
49
+ //# sourceMappingURL=useLeaderboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLeaderboard.js","sourceRoot":"","sources":["../src/useLeaderboard.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freegamestore/games",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Shared React UI primitives for games on FreeGameStore — GameShell, GameTopbar, etc. Brand-consistent, scroll-free.",
5
5
  "license": "MIT",
6
6
  "type": "module",