infinite-games-sdk 0.0.2 → 0.0.3

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 CHANGED
@@ -59,6 +59,64 @@ const tokenType = session.getTokenType(urlToken);
59
59
  // 'ott' | 'table_id' | 'expired_jwt' | 'unknown'
60
60
  ```
61
61
 
62
+ ## useGameLauncher
63
+
64
+ React hook that handles the complete game launch flow: wallet connection, session creation, URL management, and iframe communication.
65
+
66
+ ```typescript
67
+ import { useGameLauncher } from 'infinite-games-sdk';
68
+ import { useSearchParams } from 'react-router-dom';
69
+ import { useAuth } from './hooks/useAuth';
70
+
71
+ function Blackjack() {
72
+ const { wallet, launch } = useAuth();
73
+ const [searchParams, setSearchParams] = useSearchParams();
74
+
75
+ const {
76
+ iframeSrc,
77
+ iframeHeight,
78
+ error,
79
+ isLoading,
80
+ showConnectPrompt,
81
+ retry,
82
+ } = useGameLauncher(
83
+ {
84
+ gameType: 'blackjack',
85
+ defaultOrigin: 'https://blackjackdev.infiniteedgers.com',
86
+ // Optional: for local development
87
+ localOrigin: 'http://localhost:3001',
88
+ useLocal: false,
89
+ },
90
+ {
91
+ wallet,
92
+ launch,
93
+ getSearchParams: () => searchParams,
94
+ setSearchParams: (params, opts) => setSearchParams(params, opts),
95
+ }
96
+ );
97
+
98
+ if (iframeSrc) {
99
+ return (
100
+ <iframe
101
+ src={iframeSrc}
102
+ style={{ height: iframeHeight ?? '100vh', width: '100%' }}
103
+ />
104
+ );
105
+ }
106
+
107
+ if (showConnectPrompt) return <div>Connect your wallet to play</div>;
108
+ if (error) return <div>Error: {error} <button onClick={retry}>Retry</button></div>;
109
+ if (isLoading) return <div>Launching...</div>;
110
+ }
111
+ ```
112
+
113
+ The hook automatically:
114
+ - Handles URL tokens for shareable links and spectator mode
115
+ - Launches new sessions when wallet is connected
116
+ - Listens for iframe messages (table creation, height updates)
117
+ - Updates URL params when tables are created
118
+ - Manages loading, error, and retry states
119
+
62
120
  ## HistoryClient
63
121
 
64
122
  ### React hook for game sync and spectating
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  export { SessionClient } from './session';
2
2
  export { HistoryClient, useHistoryClient } from './history';
3
+ export { useGameLauncher } from './launcher';
3
4
  export { looksLikeJwt, isOneTimeToken, isTableId } from './session/tokens';
4
5
  export { toBackendScale, fromBackendScale, SCALE_FACTOR } from './utils/scale';
6
+ export { getCompatibleCoinType, VALID_COINS } from './launcher';
5
7
  export { AuthError } from './errors';
6
8
  export type { SessionConfig, LaunchParams, LaunchResult, TokenType, InitializeResult, } from './session/types';
7
9
  export type { HistoryConfig, GameEvent, BetUpdate } from './history/types';
10
+ export type { GameLauncherConfig, UseGameLauncherOptions, GameLauncherState, WalletState, LaunchMutation, } from './launcher';
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG/E,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AuthError = exports.SCALE_FACTOR = exports.fromBackendScale = exports.toBackendScale = exports.isTableId = exports.isOneTimeToken = exports.looksLikeJwt = exports.useHistoryClient = exports.HistoryClient = exports.SessionClient = void 0;
3
+ exports.AuthError = exports.VALID_COINS = exports.getCompatibleCoinType = exports.SCALE_FACTOR = exports.fromBackendScale = exports.toBackendScale = exports.isTableId = exports.isOneTimeToken = exports.looksLikeJwt = exports.useGameLauncher = exports.useHistoryClient = exports.HistoryClient = exports.SessionClient = void 0;
4
4
  // Clients
5
5
  var session_1 = require("./session");
6
6
  Object.defineProperty(exports, "SessionClient", { enumerable: true, get: function () { return session_1.SessionClient; } });
7
7
  var history_1 = require("./history");
8
8
  Object.defineProperty(exports, "HistoryClient", { enumerable: true, get: function () { return history_1.HistoryClient; } });
9
9
  Object.defineProperty(exports, "useHistoryClient", { enumerable: true, get: function () { return history_1.useHistoryClient; } });
10
+ // Hooks
11
+ var launcher_1 = require("./launcher");
12
+ Object.defineProperty(exports, "useGameLauncher", { enumerable: true, get: function () { return launcher_1.useGameLauncher; } });
10
13
  // Utilities
11
14
  var tokens_1 = require("./session/tokens");
12
15
  Object.defineProperty(exports, "looksLikeJwt", { enumerable: true, get: function () { return tokens_1.looksLikeJwt; } });
@@ -16,6 +19,9 @@ var scale_1 = require("./utils/scale");
16
19
  Object.defineProperty(exports, "toBackendScale", { enumerable: true, get: function () { return scale_1.toBackendScale; } });
17
20
  Object.defineProperty(exports, "fromBackendScale", { enumerable: true, get: function () { return scale_1.fromBackendScale; } });
18
21
  Object.defineProperty(exports, "SCALE_FACTOR", { enumerable: true, get: function () { return scale_1.SCALE_FACTOR; } });
22
+ var launcher_2 = require("./launcher");
23
+ Object.defineProperty(exports, "getCompatibleCoinType", { enumerable: true, get: function () { return launcher_2.getCompatibleCoinType; } });
24
+ Object.defineProperty(exports, "VALID_COINS", { enumerable: true, get: function () { return launcher_2.VALID_COINS; } });
19
25
  // Errors
20
26
  var errors_1 = require("./errors");
21
27
  Object.defineProperty(exports, "AuthError", { enumerable: true, get: function () { return errors_1.AuthError; } });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,UAAU;AACV,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,qCAA4D;AAAnD,wGAAA,aAAa,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAExC,YAAY;AACZ,2CAA2E;AAAlE,sGAAA,YAAY,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,mGAAA,SAAS,OAAA;AAChD,uCAA+E;AAAtE,uGAAA,cAAc,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAAE,qGAAA,YAAY,OAAA;AAEvD,SAAS;AACT,mCAAqC;AAA5B,mGAAA,SAAS,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,UAAU;AACV,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,qCAA4D;AAAnD,wGAAA,aAAa,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAExC,QAAQ;AACR,uCAA6C;AAApC,2GAAA,eAAe,OAAA;AAExB,YAAY;AACZ,2CAA2E;AAAlE,sGAAA,YAAY,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,mGAAA,SAAS,OAAA;AAChD,uCAA+E;AAAtE,uGAAA,cAAc,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAAE,qGAAA,YAAY,OAAA;AACvD,uCAAgE;AAAvD,iHAAA,qBAAqB,OAAA;AAAE,uGAAA,WAAW,OAAA;AAE3C,SAAS;AACT,mCAAqC;AAA5B,mGAAA,SAAS,OAAA"}
@@ -0,0 +1,4 @@
1
+ export { useGameLauncher } from './useGameLauncher';
2
+ export type { GameLauncherConfig, UseGameLauncherOptions, GameLauncherState, WalletState, LaunchMutation, } from './types';
3
+ export { getCompatibleCoinType, VALID_COINS } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/launcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VALID_COINS = exports.getCompatibleCoinType = exports.useGameLauncher = void 0;
4
+ var useGameLauncher_1 = require("./useGameLauncher");
5
+ Object.defineProperty(exports, "useGameLauncher", { enumerable: true, get: function () { return useGameLauncher_1.useGameLauncher; } });
6
+ var types_1 = require("./types");
7
+ Object.defineProperty(exports, "getCompatibleCoinType", { enumerable: true, get: function () { return types_1.getCompatibleCoinType; } });
8
+ Object.defineProperty(exports, "VALID_COINS", { enumerable: true, get: function () { return types_1.VALID_COINS; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/launcher/index.ts"],"names":[],"mappings":";;;AAAA,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AAQxB,iCAA6D;AAApD,8GAAA,qBAAqB,OAAA;AAAE,oGAAA,WAAW,OAAA"}
@@ -0,0 +1,59 @@
1
+ export interface WalletState {
2
+ address: string | null;
3
+ connected: boolean;
4
+ chain: string | null;
5
+ }
6
+ export interface LaunchMutation {
7
+ mutateAsync: (params: {
8
+ gameType: string;
9
+ }) => Promise<{
10
+ origin: string;
11
+ token: string;
12
+ chain: string;
13
+ }>;
14
+ reset: () => void;
15
+ }
16
+ export interface GameLauncherConfig {
17
+ /** Game type identifier (e.g., 'baccarat', 'blackjack', 'range') */
18
+ gameType: string;
19
+ /** Default game origin URL (used when no token in URL) */
20
+ defaultOrigin: string;
21
+ /** Optional local development origin */
22
+ localOrigin?: string;
23
+ /** Use local origin instead of production */
24
+ useLocal?: boolean;
25
+ /** Message type for table creation events (e.g., 'baccarat-table-created') */
26
+ tableCreatedMessageType?: string;
27
+ }
28
+ export interface UseGameLauncherOptions {
29
+ /** Wallet state from useWallet() */
30
+ wallet: WalletState;
31
+ /** Launch mutation from useAuth() */
32
+ launch: LaunchMutation;
33
+ /** Function to get current URL search params */
34
+ getSearchParams: () => URLSearchParams;
35
+ /** Function to set URL search params */
36
+ setSearchParams: (params: Record<string, string>, options?: {
37
+ replace?: boolean;
38
+ }) => void;
39
+ }
40
+ export interface GameLauncherState {
41
+ /** Ready-to-use iframe src URL, or null if not ready */
42
+ iframeSrc: string | null;
43
+ /** Current iframe height from postMessage, or null */
44
+ iframeHeight: number | null;
45
+ /** Current iframe origin for security checks */
46
+ iframeOrigin: string | null;
47
+ /** Error message if launch failed */
48
+ error: string | null;
49
+ /** Whether the game is currently loading */
50
+ isLoading: boolean;
51
+ /** Whether the user needs to connect their wallet */
52
+ showConnectPrompt: boolean;
53
+ /** Retry the launch after an error */
54
+ retry: () => void;
55
+ }
56
+ export declare const VALID_COINS: Record<string, string[]>;
57
+ /** Get coin type: use URL param if compatible with chain, otherwise default */
58
+ export declare function getCompatibleCoinType(chain: string, urlCoinType: string | null): string;
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/launcher/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QACrD,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,qCAAqC;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,gDAAgD;IAChD,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,wCAAwC;IACxC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5F;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sDAAsD;IACtD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gDAAgD;IAChD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qCAAqC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4CAA4C;IAC5C,SAAS,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sCAAsC;IACtC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAGD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAGhD,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvF"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VALID_COINS = void 0;
4
+ exports.getCompatibleCoinType = getCompatibleCoinType;
5
+ // Valid coin types per chain
6
+ exports.VALID_COINS = {
7
+ sui: ['sui/sui', 'sui/usdc'],
8
+ solana: ['solana/sol', 'solana/usdc'],
9
+ };
10
+ /** Get coin type: use URL param if compatible with chain, otherwise default */
11
+ function getCompatibleCoinType(chain, urlCoinType) {
12
+ const defaultCoin = chain === 'solana' ? 'solana/sol' : 'sui/sui';
13
+ if (!urlCoinType)
14
+ return defaultCoin;
15
+ const validCoins = exports.VALID_COINS[chain] ?? [];
16
+ if (validCoins.includes(urlCoinType))
17
+ return urlCoinType;
18
+ return defaultCoin;
19
+ }
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/launcher/types.ts"],"names":[],"mappings":";;;AA+DA,sDAMC;AAbD,6BAA6B;AAChB,QAAA,WAAW,GAA6B;IACnD,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC5B,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC;CACtC,CAAC;AAEF,+EAA+E;AAC/E,SAAgB,qBAAqB,CAAC,KAAa,EAAE,WAA0B;IAC7E,MAAM,WAAW,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,CAAC,WAAW;QAAE,OAAO,WAAW,CAAC;IACrC,MAAM,UAAU,GAAG,mBAAW,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IACzD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { GameLauncherConfig, UseGameLauncherOptions, GameLauncherState } from './types';
2
+ export declare function useGameLauncher(config: GameLauncherConfig, options: UseGameLauncherOptions): GameLauncherState;
3
+ //# sourceMappingURL=useGameLauncher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGameLauncher.d.ts","sourceRoot":"","sources":["../../src/launcher/useGameLauncher.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EAElB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,eAAe,CAC7B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CAyInB"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useGameLauncher = useGameLauncher;
4
+ const react_1 = require("react");
5
+ const types_1 = require("./types");
6
+ function useGameLauncher(config, options) {
7
+ const { gameType, defaultOrigin, localOrigin, useLocal = false, tableCreatedMessageType } = config;
8
+ const { wallet, launch, getSearchParams, setSearchParams } = options;
9
+ const { mutateAsync: launchGame, reset } = launch;
10
+ // Derive the message type from gameType if not provided
11
+ const tableCreatedType = tableCreatedMessageType ?? `${gameType}-table-created`;
12
+ // Get URL params
13
+ const searchParams = getSearchParams();
14
+ const tokenParam = searchParams.get('token');
15
+ const urlCoinType = searchParams.get('coinType');
16
+ const [iframeOrigin, setIframeOrigin] = (0, react_1.useState)(null);
17
+ const [sessionToken, setSessionToken] = (0, react_1.useState)(null);
18
+ const [launchError, setLaunchError] = (0, react_1.useState)(null);
19
+ const [launchCoinType, setLaunchCoinType] = (0, react_1.useState)(null);
20
+ const [iframeHeight, setIframeHeight] = (0, react_1.useState)(null);
21
+ const launchInProgress = (0, react_1.useRef)(false);
22
+ // Determine the origin to use
23
+ const resolvedOrigin = useLocal && localOrigin ? localOrigin : defaultOrigin;
24
+ // Main launch effect
25
+ (0, react_1.useEffect)(() => {
26
+ async function run() {
27
+ // Load directly from URL token (shareable link or spectator)
28
+ if (tokenParam) {
29
+ if (sessionToken === tokenParam)
30
+ return;
31
+ setLaunchError(null);
32
+ setSessionToken(tokenParam);
33
+ setIframeOrigin(resolvedOrigin);
34
+ setLaunchCoinType(null); // Will be set by iframe message
35
+ return;
36
+ }
37
+ // Need wallet to launch
38
+ if (!wallet.address || !wallet.connected || !wallet.chain) {
39
+ setSessionToken(null);
40
+ setIframeOrigin(null);
41
+ setLaunchError(null);
42
+ setLaunchCoinType(null);
43
+ return;
44
+ }
45
+ // Skip if already have session, error, or launch in progress
46
+ if (sessionToken || launchError || launchInProgress.current)
47
+ return;
48
+ launchInProgress.current = true;
49
+ try {
50
+ const { origin, token, chain } = await launchGame({ gameType });
51
+ setSessionToken(token);
52
+ setIframeOrigin(useLocal && localOrigin ? localOrigin : origin);
53
+ // Use selected coin type if compatible, otherwise default
54
+ setLaunchCoinType((0, types_1.getCompatibleCoinType)(chain, urlCoinType));
55
+ }
56
+ catch (error) {
57
+ setLaunchError(error instanceof Error ? error.message : String(error));
58
+ }
59
+ finally {
60
+ launchInProgress.current = false;
61
+ }
62
+ }
63
+ run();
64
+ }, [
65
+ wallet.address,
66
+ wallet.connected,
67
+ wallet.chain,
68
+ sessionToken,
69
+ launchError,
70
+ launchGame,
71
+ tokenParam,
72
+ urlCoinType,
73
+ gameType,
74
+ resolvedOrigin,
75
+ useLocal,
76
+ localOrigin,
77
+ ]);
78
+ // Handle iframe messages
79
+ (0, react_1.useEffect)(() => {
80
+ const handleMessage = (event) => {
81
+ if (!iframeOrigin || event.origin !== iframeOrigin)
82
+ return;
83
+ if (event.data?.type === tableCreatedType && event.data.tableId) {
84
+ // Table created - include coinType so selector shows correct coin (disabled)
85
+ const coinType = event.data.coinType || launchCoinType;
86
+ const newParams = { token: event.data.tableId };
87
+ if (coinType)
88
+ newParams.coinType = coinType;
89
+ setSessionToken(event.data.tableId);
90
+ setLaunchCoinType(null);
91
+ setSearchParams(newParams, { replace: true });
92
+ }
93
+ if (event.data?.type === 'table-info' && event.data.coinType) {
94
+ // Existing table loaded - set coinType in URL so selector shows correct coin
95
+ const currentToken = getSearchParams().get('token');
96
+ if (currentToken) {
97
+ setSearchParams({ token: currentToken, coinType: event.data.coinType }, { replace: true });
98
+ }
99
+ }
100
+ if (event.data?.type === 'iframe-height' && event.data.height) {
101
+ setIframeHeight(event.data.height);
102
+ }
103
+ };
104
+ window.addEventListener('message', handleMessage);
105
+ return () => window.removeEventListener('message', handleMessage);
106
+ }, [iframeOrigin, launchCoinType, tableCreatedType, getSearchParams, setSearchParams]);
107
+ const retry = (0, react_1.useCallback)(() => {
108
+ launchInProgress.current = false;
109
+ setSessionToken(null);
110
+ setIframeOrigin(null);
111
+ setLaunchError(null);
112
+ setLaunchCoinType(null);
113
+ reset();
114
+ }, [reset]);
115
+ const iframeSrc = (0, react_1.useMemo)(() => {
116
+ if (!iframeOrigin || !sessionToken)
117
+ return null;
118
+ const url = new URL('/', iframeOrigin);
119
+ url.searchParams.set('token', sessionToken);
120
+ if (launchCoinType)
121
+ url.searchParams.set('coinType', launchCoinType);
122
+ return url.toString();
123
+ }, [iframeOrigin, sessionToken, launchCoinType]);
124
+ // Determine UI state
125
+ const showConnectPrompt = !tokenParam && !wallet.connected;
126
+ const isLoading = !showConnectPrompt && !launchError && !iframeSrc;
127
+ return {
128
+ iframeSrc,
129
+ iframeHeight,
130
+ iframeOrigin,
131
+ error: launchError,
132
+ isLoading,
133
+ showConnectPrompt,
134
+ retry,
135
+ };
136
+ }
137
+ //# sourceMappingURL=useGameLauncher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGameLauncher.js","sourceRoot":"","sources":["../../src/launcher/useGameLauncher.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinite-games-sdk",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Infinite Games SDK",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",