fansunited-frontend-core 0.0.52 → 0.0.53

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
@@ -98,6 +98,7 @@ import {
98
98
  BetslipOutcomeLabels,
99
99
  BetslipLabels,
100
100
  BetslipProps,
101
+ BetslipState,
101
102
  PredictorBetslipConfig,
102
103
  } from "fansunited-frontend-core";
103
104
  ```
@@ -268,8 +269,10 @@ initializeI18n("en");
268
269
 
269
270
  `betslipApi` is a singleton command bus that lets any code — including code that runs **before the `<Betslip />` widget mounts** — add or remove selections programmatically. Pre-mount calls are queued and replayed automatically once the widget registers.
270
271
 
272
+ > **Important:** Always import `betslipApi` from `fansunited-frontend-components`, not from `fansunited-frontend-core`. The Betslip widget bundles its own copy of the command bus; importing from the components package guarantees you use the same singleton instance the widget is listening on.
273
+
271
274
  ```tsx
272
- import { betslipApi } from "fansunited-frontend-core";
275
+ import { betslipApi } from "fansunited-frontend-components";
273
276
 
274
277
  // Add a selection. If the same eventId + market already exists, the outcome is replaced.
275
278
  betslipApi.setSelection("fb:m:451678:FT_1X2:1");
@@ -280,6 +283,38 @@ betslipApi.removeSelection("fb:m:451678:FT_1X2:1");
280
283
 
281
284
  **Selection ID format:** `"{eventId}:{market}:{outcome}"`, for example `"fb:m:451678:FT_1X2:1"`.
282
285
 
286
+ #### Reading betslip state
287
+
288
+ `betslipApi` also exposes the current betslip state through a snapshot accessor and a reactive subscription:
289
+
290
+ ```tsx
291
+ import { betslipApi } from "fansunited-frontend-components";
292
+ import type { BetslipState } from "fansunited-frontend-components";
293
+
294
+ // One-shot snapshot — returns the last known state immediately
295
+ const { selections, stake, totalOdds } = betslipApi.getState();
296
+
297
+ // Reactive subscription — fires whenever selections, stake, or odds change
298
+ const unsubscribe = betslipApi.subscribe((state: BetslipState) => {
299
+ console.log("selections:", state.selections.length);
300
+ console.log("stake:", state.stake);
301
+ console.log("totalOdds:", state.totalOdds);
302
+ });
303
+
304
+ // Call unsubscribe() to stop receiving updates
305
+ unsubscribe();
306
+ ```
307
+
308
+ **`BetslipState` shape:**
309
+
310
+ ```ts
311
+ interface BetslipState {
312
+ selections: BetslipSelectionInput[]; // current raw selections
313
+ stake: number; // parsed numeric stake (0 when empty)
314
+ totalOdds: number; // product of all selection decimal odds (0 when no selections)
315
+ }
316
+ ```
317
+
283
318
  The typical integration pattern is:
284
319
 
285
320
  ```tsx
@@ -287,9 +322,9 @@ The typical integration pattern is:
287
322
  <Betslip sdk={sdk} language="en" />
288
323
 
289
324
  // 2. From anywhere in your app — e.g. a match card — call betslipApi
290
- import { betslipApi } from "fansunited-frontend-core";
325
+ import { betslipApi } from "fansunited-frontend-components";
291
326
 
292
- function MatchCard({ eventId, market, outcome, participantOne, participantTwo }) {
327
+ function MatchCard({ eventId, market, outcome }) {
293
328
  const selectionId = `${eventId}:${market}:${outcome}`;
294
329
 
295
330
  return (
@@ -1,10 +1,21 @@
1
+ import { BetslipSelectionInput } from '../interfaces/interfaces';
2
+
3
+ export interface BetslipState {
4
+ selections: BetslipSelectionInput[];
5
+ stake: number;
6
+ totalOdds: number;
7
+ }
1
8
  interface BetslipApi {
2
9
  /** Upsert a selection. If the same eventId + market already exists, the outcome is replaced. */
3
10
  setSelection(id: string): void;
4
11
  /** Remove a selection by its exact id ("eventId:market:outcome"). No-op if not present. */
5
12
  removeSelection(id: string): void;
13
+ /** Returns a snapshot of the current betslip state. */
14
+ getState(): BetslipState;
15
+ /** Subscribe to state changes. Returns an unsubscribe function. */
16
+ subscribe(listener: (state: BetslipState) => void): () => void;
6
17
  }
7
- type Handler = BetslipApi;
18
+ type Handler = Pick<BetslipApi, "setSelection" | "removeSelection">;
8
19
  /**
9
20
  * Singleton command bus. BetslipShell registers its internal state handlers on mount
10
21
  * (_mount) and clears them on unmount (_unmount). Calls made before mount are queued
@@ -14,12 +25,18 @@ type Handler = BetslipApi;
14
25
  declare class BetslipBus implements BetslipApi {
15
26
  private handler;
16
27
  private queue;
28
+ private listeners;
29
+ private lastState;
17
30
  /** Called by BetslipShell on mount. Replays any queued pre-mount calls. */
18
31
  _mount(h: Handler): void;
19
32
  /** Called by BetslipShell on unmount. */
20
33
  _unmount(): void;
34
+ /** Called by BetslipStateBridge whenever context state changes. */
35
+ _notify(state: BetslipState): void;
21
36
  setSelection(id: string): void;
22
37
  removeSelection(id: string): void;
38
+ getState(): BetslipState;
39
+ subscribe(listener: (state: BetslipState) => void): () => void;
23
40
  }
24
41
  export declare const betslipApi: BetslipBus;
25
42
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"betslipApi.d.ts","sourceRoot":"","sources":["../../src/api/betslipApi.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IAClB,gGAAgG;IAChG,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,2FAA2F;IAC3F,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,KAAK,OAAO,GAAG,UAAU,CAAC;AAE1B;;;;;GAKG;AACH,cAAM,UAAW,YAAW,UAAU;IACpC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,KAAK,CAAyB;IAEtC,2EAA2E;IAC3E,MAAM,CAAC,CAAC,EAAE,OAAO;IAMjB,yCAAyC;IACzC,QAAQ;IAIR,YAAY,CAAC,EAAE,EAAE,MAAM;IAMvB,eAAe,CAAC,EAAE,EAAE,MAAM;CAG3B;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
1
+ {"version":3,"file":"betslipApi.d.ts","sourceRoot":"","sources":["../../src/api/betslipApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,gGAAgG;IAChG,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,2FAA2F;IAC3F,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,uDAAuD;IACvD,QAAQ,IAAI,YAAY,CAAC;IACzB,mEAAmE;IACnE,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAChE;AAED,KAAK,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,iBAAiB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,cAAM,UAAW,YAAW,UAAU;IACpC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,SAAS,CAAiD;IAClE,OAAO,CAAC,SAAS,CAA4D;IAE7E,2EAA2E;IAC3E,MAAM,CAAC,CAAC,EAAE,OAAO;IAMjB,yCAAyC;IACzC,QAAQ;IAIR,mEAAmE;IACnE,OAAO,CAAC,KAAK,EAAE,YAAY;IAK3B,YAAY,CAAC,EAAE,EAAE,MAAM;IAMvB,eAAe,CAAC,EAAE,EAAE,MAAM;IAI1B,QAAQ,IAAI,YAAY;IAIxB,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI;CAI/D;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
package/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export declare const version: string;
2
2
  export * from './constants/constants';
3
3
  export { betslipApi } from './api/betslipApi';
4
+ export type { BetslipState } from './api/betslipApi';
4
5
  export * from './functions/functions';
5
6
  export * from './interfaces/interfaces';
6
7
  export * from './types/types';
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}