@sensiblestats/widget-react 0.61.2 → 0.62.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/CHANGELOG.md +17 -0
- package/dist/index.cjs +305 -177
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +220 -92
- package/dist/index.js.map +1 -1
- package/dist/styles.css +55 -0
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -36,7 +36,7 @@ __export(index_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(index_exports);
|
|
37
37
|
|
|
38
38
|
// src/StatsWidget.tsx
|
|
39
|
-
var
|
|
39
|
+
var import_react45 = require("react");
|
|
40
40
|
var import_widget_sdk5 = require("@sensiblestats/widget-sdk");
|
|
41
41
|
|
|
42
42
|
// src/kickoff.ts
|
|
@@ -651,6 +651,10 @@ var STRINGS = {
|
|
|
651
651
|
function resolveLocaleStrings(locale) {
|
|
652
652
|
return STRINGS[locale] ?? STRINGS.en;
|
|
653
653
|
}
|
|
654
|
+
function isEnglishLocale(locale) {
|
|
655
|
+
const lang = (locale ?? "").trim().toLowerCase().split(/[-_]/)[0] ?? "";
|
|
656
|
+
return lang === "en" || !Object.prototype.hasOwnProperty.call(STRINGS, lang);
|
|
657
|
+
}
|
|
654
658
|
|
|
655
659
|
// src/config.ts
|
|
656
660
|
function normalizeUi(cfg) {
|
|
@@ -660,6 +664,7 @@ function normalizeUi(cfg) {
|
|
|
660
664
|
accent: cfg.accent,
|
|
661
665
|
logoUrl: cfg.logoUrl,
|
|
662
666
|
headerTitle: cfg.headerTitle,
|
|
667
|
+
rawBettingLabels: isEnglishLocale(cfg.locale),
|
|
663
668
|
cta: cfg.cta,
|
|
664
669
|
surface: cfg.surface,
|
|
665
670
|
ink: cfg.ink,
|
|
@@ -775,6 +780,18 @@ function toUserContext(cfg) {
|
|
|
775
780
|
|
|
776
781
|
// src/slip.ts
|
|
777
782
|
var ADD_TO_SLIP_TIMEOUT_MS = 1e4;
|
|
783
|
+
var MAX_SELECTION = 64;
|
|
784
|
+
var MAX_LINE = 32;
|
|
785
|
+
var MAX_ODDS = 1e4;
|
|
786
|
+
function slipPickFields(selection, label, line) {
|
|
787
|
+
const fields = {};
|
|
788
|
+
if (Number.isSafeInteger(selection.matchId) && selection.matchId > 0) fields.matchId = selection.matchId;
|
|
789
|
+
if (label && label.trim() && label.length <= MAX_SELECTION) fields.selection = label;
|
|
790
|
+
if (line && line.trim() && line.length <= MAX_LINE) fields.line = line;
|
|
791
|
+
const odds = selection.oddsDecimal;
|
|
792
|
+
if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
|
|
793
|
+
return fields;
|
|
794
|
+
}
|
|
778
795
|
function wasAdded(result) {
|
|
779
796
|
if (!result) return true;
|
|
780
797
|
if (result.status === "price_changed") return result.accepted;
|
|
@@ -1061,6 +1078,8 @@ function toMarketOddsVM(card) {
|
|
|
1061
1078
|
return {
|
|
1062
1079
|
key: `${selection}:${str(r.line) ?? ""}:${i}`,
|
|
1063
1080
|
selection,
|
|
1081
|
+
selectionLabel: str(r.selectionLabel),
|
|
1082
|
+
line: str(r.line),
|
|
1064
1083
|
odds: price !== void 0 ? price.toFixed(2) : "",
|
|
1065
1084
|
oddsDecimal: price,
|
|
1066
1085
|
matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
|
|
@@ -1814,6 +1833,7 @@ function useLiveMonitor(opts) {
|
|
|
1814
1833
|
const inFlightRef = (0, import_react4.useRef)(false);
|
|
1815
1834
|
const timerRef = (0, import_react4.useRef)(void 0);
|
|
1816
1835
|
const disabledRef = (0, import_react4.useRef)(false);
|
|
1836
|
+
const mountedRef = (0, import_react4.useRef)(false);
|
|
1817
1837
|
const getLiveMonitorRef = (0, import_react4.useRef)(opts.getLiveMonitor);
|
|
1818
1838
|
getLiveMonitorRef.current = opts.getLiveMonitor;
|
|
1819
1839
|
const tick = (0, import_react4.useCallback)(async () => {
|
|
@@ -1821,6 +1841,7 @@ function useLiveMonitor(opts) {
|
|
|
1821
1841
|
inFlightRef.current = true;
|
|
1822
1842
|
try {
|
|
1823
1843
|
const snap = await getLiveMonitorRef.current(pinsRef.current);
|
|
1844
|
+
if (!mountedRef.current) return;
|
|
1824
1845
|
if (snap === null) {
|
|
1825
1846
|
disabledRef.current = true;
|
|
1826
1847
|
applySnapshot(null);
|
|
@@ -1842,10 +1863,16 @@ function useLiveMonitor(opts) {
|
|
|
1842
1863
|
});
|
|
1843
1864
|
scheduleRef.current = () => {
|
|
1844
1865
|
window.clearTimeout(timerRef.current);
|
|
1845
|
-
if (disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
|
|
1866
|
+
if (!mountedRef.current || disabledRef.current || pinsRef.current.length === 0 || document.visibilityState === "hidden") return;
|
|
1846
1867
|
const hinted = (snapshotRef.current?.nextPollSeconds ?? DEFAULT_POLL_MS / 1e3) * 1e3;
|
|
1847
1868
|
timerRef.current = window.setTimeout(() => void tick(), Math.max(MIN_POLL_MS, hinted));
|
|
1848
1869
|
};
|
|
1870
|
+
(0, import_react4.useEffect)(() => {
|
|
1871
|
+
mountedRef.current = true;
|
|
1872
|
+
return () => {
|
|
1873
|
+
mountedRef.current = false;
|
|
1874
|
+
};
|
|
1875
|
+
}, []);
|
|
1849
1876
|
const prevPinsLengthRef = (0, import_react4.useRef)(0);
|
|
1850
1877
|
(0, import_react4.useEffect)(() => {
|
|
1851
1878
|
const wasEmpty = prevPinsLengthRef.current === 0;
|
|
@@ -2240,11 +2267,34 @@ function useEventLog() {
|
|
|
2240
2267
|
return (0, import_react8.useContext)(EventLogContext);
|
|
2241
2268
|
}
|
|
2242
2269
|
|
|
2270
|
+
// src/popupTelemetry.ts
|
|
2271
|
+
var import_react9 = require("react");
|
|
2272
|
+
function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
2273
|
+
const shownRef = (0, import_react9.useRef)(/* @__PURE__ */ new Set());
|
|
2274
|
+
const closedTextRef = (0, import_react9.useRef)(null);
|
|
2275
|
+
(0, import_react9.useEffect)(() => {
|
|
2276
|
+
if (isOpen) {
|
|
2277
|
+
if (closedTextRef.current) log?.log({ name: "popup_opened" });
|
|
2278
|
+
closedTextRef.current = null;
|
|
2279
|
+
return;
|
|
2280
|
+
}
|
|
2281
|
+
closedTextRef.current = popupText;
|
|
2282
|
+
if (popupText && !shownRef.current.has(popupText)) {
|
|
2283
|
+
shownRef.current.add(popupText);
|
|
2284
|
+
log?.log({ name: "popup_shown" });
|
|
2285
|
+
}
|
|
2286
|
+
}, [log, isOpen, popupText]);
|
|
2287
|
+
return (0, import_react9.useCallback)(() => {
|
|
2288
|
+
log?.log({ name: "popup_dismissed" });
|
|
2289
|
+
dismissPopup();
|
|
2290
|
+
}, [log, dismissPopup]);
|
|
2291
|
+
}
|
|
2292
|
+
|
|
2243
2293
|
// src/components/ChatFab.tsx
|
|
2244
|
-
var
|
|
2294
|
+
var import_react11 = require("react");
|
|
2245
2295
|
|
|
2246
2296
|
// src/components/BrandMark.tsx
|
|
2247
|
-
var
|
|
2297
|
+
var import_react10 = require("react");
|
|
2248
2298
|
|
|
2249
2299
|
// src/assets/logo.ts
|
|
2250
2300
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
@@ -2293,7 +2343,7 @@ function DashboardIcon({ name }) {
|
|
|
2293
2343
|
// src/components/BrandMark.tsx
|
|
2294
2344
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
2295
2345
|
function BrandMark({ logoUrl, className }) {
|
|
2296
|
-
const [failed, setFailed] = (0,
|
|
2346
|
+
const [failed, setFailed] = (0, import_react10.useState)(false);
|
|
2297
2347
|
if (!logoUrl || failed) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SsMark, { className });
|
|
2298
2348
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
2299
2349
|
}
|
|
@@ -2318,9 +2368,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
|
|
|
2318
2368
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
2319
2369
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
|
|
2320
2370
|
const bubble = popupText ?? greeting;
|
|
2321
|
-
const [intro, setIntro] = (0,
|
|
2322
|
-
const armedRef = (0,
|
|
2323
|
-
(0,
|
|
2371
|
+
const [intro, setIntro] = (0, import_react11.useState)(false);
|
|
2372
|
+
const armedRef = (0, import_react11.useRef)(introAllowed);
|
|
2373
|
+
(0, import_react11.useEffect)(() => {
|
|
2324
2374
|
if (armedRef.current && bubble) {
|
|
2325
2375
|
armedRef.current = false;
|
|
2326
2376
|
setIntro(true);
|
|
@@ -2334,10 +2384,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
2334
2384
|
}
|
|
2335
2385
|
|
|
2336
2386
|
// src/components/ChatPanel.tsx
|
|
2337
|
-
var
|
|
2387
|
+
var import_react44 = require("react");
|
|
2338
2388
|
|
|
2339
2389
|
// src/components/ChatHeader.tsx
|
|
2340
|
-
var
|
|
2390
|
+
var import_react12 = require("react");
|
|
2341
2391
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
2342
2392
|
function ChatHeader({
|
|
2343
2393
|
onClose,
|
|
@@ -2349,15 +2399,15 @@ function ChatHeader({
|
|
|
2349
2399
|
newConversationLabel = "New conversation",
|
|
2350
2400
|
moreOptionsLabel = "More options"
|
|
2351
2401
|
}) {
|
|
2352
|
-
const [menuOpen, setMenuOpen] = (0,
|
|
2353
|
-
const wrapRef = (0,
|
|
2354
|
-
const kebabRef = (0,
|
|
2355
|
-
const firstItemRef = (0,
|
|
2402
|
+
const [menuOpen, setMenuOpen] = (0, import_react12.useState)(false);
|
|
2403
|
+
const wrapRef = (0, import_react12.useRef)(null);
|
|
2404
|
+
const kebabRef = (0, import_react12.useRef)(null);
|
|
2405
|
+
const firstItemRef = (0, import_react12.useRef)(null);
|
|
2356
2406
|
const hasMenu = !!(canReset && onNewConversation);
|
|
2357
|
-
(0,
|
|
2407
|
+
(0, import_react12.useEffect)(() => {
|
|
2358
2408
|
if (menuOpen) firstItemRef.current?.focus();
|
|
2359
2409
|
}, [menuOpen]);
|
|
2360
|
-
(0,
|
|
2410
|
+
(0, import_react12.useEffect)(() => {
|
|
2361
2411
|
if (!menuOpen) return;
|
|
2362
2412
|
const onPointer = (e) => {
|
|
2363
2413
|
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
@@ -2413,7 +2463,7 @@ function ChatHeader({
|
|
|
2413
2463
|
}
|
|
2414
2464
|
|
|
2415
2465
|
// src/components/MessageList.tsx
|
|
2416
|
-
var
|
|
2466
|
+
var import_react27 = require("react");
|
|
2417
2467
|
|
|
2418
2468
|
// src/components/Markdown.tsx
|
|
2419
2469
|
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
@@ -2431,7 +2481,7 @@ function Markdown({ text }) {
|
|
|
2431
2481
|
}
|
|
2432
2482
|
|
|
2433
2483
|
// src/components/EntityCardList.tsx
|
|
2434
|
-
var
|
|
2484
|
+
var import_react13 = require("react");
|
|
2435
2485
|
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
2436
2486
|
var MAX_VISIBLE = 3;
|
|
2437
2487
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
@@ -2515,7 +2565,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
2515
2565
|
)) });
|
|
2516
2566
|
}
|
|
2517
2567
|
function EntityCardItem({ c }) {
|
|
2518
|
-
const [active, setActive] = (0,
|
|
2568
|
+
const [active, setActive] = (0, import_react13.useState)(0);
|
|
2519
2569
|
const hasBody = c.scopes.length > 0;
|
|
2520
2570
|
if (!hasBody) {
|
|
2521
2571
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { c, showScopeCrest: false }) });
|
|
@@ -2529,7 +2579,7 @@ function EntityCardItem({ c }) {
|
|
|
2529
2579
|
] });
|
|
2530
2580
|
}
|
|
2531
2581
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
2532
|
-
const [expanded, setExpanded] = (0,
|
|
2582
|
+
const [expanded, setExpanded] = (0, import_react13.useState)(false);
|
|
2533
2583
|
if (cards.length === 0) return null;
|
|
2534
2584
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
2535
2585
|
const overflow = cards.length - MAX_VISIBLE;
|
|
@@ -2540,18 +2590,18 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
2540
2590
|
}
|
|
2541
2591
|
|
|
2542
2592
|
// src/components/BettingInsightList.tsx
|
|
2543
|
-
var
|
|
2593
|
+
var import_react18 = require("react");
|
|
2544
2594
|
|
|
2545
2595
|
// src/components/AddToSlipButton.tsx
|
|
2546
|
-
var
|
|
2596
|
+
var import_react15 = require("react");
|
|
2547
2597
|
var import_widget_sdk4 = require("@sensiblestats/widget-sdk");
|
|
2548
2598
|
|
|
2549
2599
|
// src/components/Toast.tsx
|
|
2550
|
-
var
|
|
2600
|
+
var import_react14 = require("react");
|
|
2551
2601
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
2552
2602
|
var DISMISS_MS = 4e3;
|
|
2553
2603
|
function Toast({ toast, onDismiss }) {
|
|
2554
|
-
(0,
|
|
2604
|
+
(0, import_react14.useEffect)(() => {
|
|
2555
2605
|
if (!toast) return;
|
|
2556
2606
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
2557
2607
|
return () => clearTimeout(timer);
|
|
@@ -2568,18 +2618,19 @@ function withTimeout(value) {
|
|
|
2568
2618
|
new Promise((_, reject) => setTimeout(() => reject(new Error("add-to-slip timed out")), ADD_TO_SLIP_TIMEOUT_MS))
|
|
2569
2619
|
]);
|
|
2570
2620
|
}
|
|
2571
|
-
function SlipButton({ selection, shownOdds,
|
|
2572
|
-
const [pending, setPending] = (0,
|
|
2573
|
-
const [settled, setSettled] = (0,
|
|
2574
|
-
const [toast, setToast] = (0,
|
|
2575
|
-
const dismiss = (0,
|
|
2621
|
+
function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui }) {
|
|
2622
|
+
const [pending, setPending] = (0, import_react15.useState)(false);
|
|
2623
|
+
const [settled, setSettled] = (0, import_react15.useState)(false);
|
|
2624
|
+
const [toast, setToast] = (0, import_react15.useState)(null);
|
|
2625
|
+
const dismiss = (0, import_react15.useCallback)(() => setToast(null), []);
|
|
2576
2626
|
const log = useEventLog();
|
|
2577
2627
|
const handler = slip.onAddToSlip;
|
|
2578
2628
|
if (!ui || !handler || !selection) return null;
|
|
2579
2629
|
const onClick = async () => {
|
|
2580
2630
|
setPending(true);
|
|
2631
|
+
const pick = slipPickFields(selection, ui.rawBettingLabels ? selectionLabel : void 0, line);
|
|
2581
2632
|
if (marketDeveloperName !== void 0) {
|
|
2582
|
-
log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName });
|
|
2633
|
+
log?.log({ name: "slip_click", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, ...pick });
|
|
2583
2634
|
}
|
|
2584
2635
|
try {
|
|
2585
2636
|
const raw = await withTimeout(Promise.resolve(handler(selection)));
|
|
@@ -2591,20 +2642,15 @@ function SlipButton({ selection, shownOdds, marketName, marketDeveloperName, sli
|
|
|
2591
2642
|
entityType: "market",
|
|
2592
2643
|
marketDeveloperName,
|
|
2593
2644
|
entityId: marketDeveloperName,
|
|
2594
|
-
outcome: slipOutcome(result)
|
|
2645
|
+
outcome: slipOutcome(result),
|
|
2646
|
+
...pick
|
|
2595
2647
|
});
|
|
2596
2648
|
}
|
|
2597
2649
|
setToast(resultToToast(result, shownOdds || selection.oddsDecimal.toFixed(2), ui));
|
|
2598
2650
|
setSettled(isTerminal(result));
|
|
2599
|
-
if (wasAdded(result) && slip.onMarketClicked) {
|
|
2600
|
-
try {
|
|
2601
|
-
slip.onMarketClicked(marketName);
|
|
2602
|
-
} catch {
|
|
2603
|
-
}
|
|
2604
|
-
}
|
|
2605
2651
|
} catch {
|
|
2606
2652
|
if (marketDeveloperName !== void 0) {
|
|
2607
|
-
log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout" });
|
|
2653
|
+
log?.log({ name: "slip_result", entityType: "market", marketDeveloperName, entityId: marketDeveloperName, outcome: "timeout", ...pick });
|
|
2608
2654
|
}
|
|
2609
2655
|
setToast({ kind: "error", text: ui.slipFailed });
|
|
2610
2656
|
} finally {
|
|
@@ -2632,8 +2678,9 @@ function AddToSlipButton({ it, slip, ui }) {
|
|
|
2632
2678
|
{
|
|
2633
2679
|
selection,
|
|
2634
2680
|
shownOdds: it.odds ?? "",
|
|
2635
|
-
marketName: it.market,
|
|
2636
2681
|
marketDeveloperName: it.marketDeveloperName,
|
|
2682
|
+
selectionLabel: it.selectionLabel,
|
|
2683
|
+
line: it.line,
|
|
2637
2684
|
slip,
|
|
2638
2685
|
ui
|
|
2639
2686
|
}
|
|
@@ -2662,14 +2709,14 @@ function OddsMovementBadge({
|
|
|
2662
2709
|
}
|
|
2663
2710
|
|
|
2664
2711
|
// src/components/Crest.tsx
|
|
2665
|
-
var
|
|
2712
|
+
var import_react16 = require("react");
|
|
2666
2713
|
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
2667
2714
|
function initials2(name) {
|
|
2668
2715
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
2669
2716
|
}
|
|
2670
2717
|
function Crest2({ url, name, kind }) {
|
|
2671
2718
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
2672
|
-
const [failed, setFailed] = (0,
|
|
2719
|
+
const [failed, setFailed] = (0, import_react16.useState)(false);
|
|
2673
2720
|
if (url && !failed) {
|
|
2674
2721
|
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
2675
2722
|
}
|
|
@@ -2677,7 +2724,7 @@ function Crest2({ url, name, kind }) {
|
|
|
2677
2724
|
}
|
|
2678
2725
|
|
|
2679
2726
|
// src/components/PinToggle.tsx
|
|
2680
|
-
var
|
|
2727
|
+
var import_react17 = require("react");
|
|
2681
2728
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
2682
2729
|
var PIN_GLYPHS = {
|
|
2683
2730
|
pin: { viewBox: "0 0 24 24", strokeWidth: 1.4, transform: "scale(1.5)", d: "M9.5 1.5 14.5 6.5 13 8l-.5-.5-3 3 .3 2.2-1.4 1.4L5.6 11.3l-3.3 3.3-1-1 3.3-3.3L1.9 7.5l1.4-1.4 2.2.3 3-3L8 2.9z" },
|
|
@@ -2685,8 +2732,8 @@ var PIN_GLYPHS = {
|
|
|
2685
2732
|
bookmark: { viewBox: "0 0 24 24", strokeWidth: 2, d: "M7 3h10a1.5 1.5 0 0 1 1.5 1.5V21l-6.5-3.6L5.5 21V4.5A1.5 1.5 0 0 1 7 3z" }
|
|
2686
2733
|
};
|
|
2687
2734
|
function PinToggle({ pin, monitor, ui }) {
|
|
2688
|
-
const [toast, setToast] = (0,
|
|
2689
|
-
const dismiss = (0,
|
|
2735
|
+
const [toast, setToast] = (0, import_react17.useState)(null);
|
|
2736
|
+
const dismiss = (0, import_react17.useCallback)(() => setToast(null), []);
|
|
2690
2737
|
const log = useEventLog();
|
|
2691
2738
|
if (!monitor || !monitor.enabled) return null;
|
|
2692
2739
|
const key = pinKey(pin);
|
|
@@ -2746,7 +2793,7 @@ function StatRows({ stats }) {
|
|
|
2746
2793
|
] }, `${s.label}:${s.value}`)) });
|
|
2747
2794
|
}
|
|
2748
2795
|
function ScopedStats({ scopes }) {
|
|
2749
|
-
const [active, setActive] = (0,
|
|
2796
|
+
const [active, setActive] = (0, import_react18.useState)(0);
|
|
2750
2797
|
const current = scopes[active] ?? scopes[0] ?? { key: "", label: "", stats: [] };
|
|
2751
2798
|
return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "ss-w-bi-scoped", children: [
|
|
2752
2799
|
/* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "ss-w-bi-scopes", role: "group", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("button", { type: "button", className: "ss-w-bi-chip", "aria-pressed": i === active, onClick: () => setActive(i), children: s.label }, s.key)) }),
|
|
@@ -2757,7 +2804,7 @@ function hasStatsContent(it) {
|
|
|
2757
2804
|
return !!it.scopes && it.scopes.length >= 2 || it.stats.length > 0;
|
|
2758
2805
|
}
|
|
2759
2806
|
function ReasonStrip({ it, ui }) {
|
|
2760
|
-
const [open, setOpen] = (0,
|
|
2807
|
+
const [open, setOpen] = (0, import_react18.useState)(false);
|
|
2761
2808
|
const log = useEventLog();
|
|
2762
2809
|
const hasScopes = !!it.scopes && it.scopes.length >= 2;
|
|
2763
2810
|
const hasStats = hasStatsContent(it);
|
|
@@ -2877,7 +2924,7 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
2877
2924
|
}
|
|
2878
2925
|
|
|
2879
2926
|
// src/components/MarketOddsCardList.tsx
|
|
2880
|
-
var
|
|
2927
|
+
var import_react19 = require("react");
|
|
2881
2928
|
var import_jsx_runtime14 = require("react/jsx-runtime");
|
|
2882
2929
|
function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
2883
2930
|
const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
|
|
@@ -2890,11 +2937,11 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
|
2890
2937
|
"\u2713 ",
|
|
2891
2938
|
ui.inSlipLabel
|
|
2892
2939
|
] }) : null,
|
|
2893
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SlipButton, { selection, shownOdds: row.odds,
|
|
2940
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui })
|
|
2894
2941
|
] });
|
|
2895
2942
|
}
|
|
2896
2943
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
2897
|
-
const [open, setOpen] = (0,
|
|
2944
|
+
const [open, setOpen] = (0, import_react19.useState)(false);
|
|
2898
2945
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
2899
2946
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
2900
2947
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
@@ -3062,7 +3109,37 @@ function ActionButtons({ actions, loading, disabled, onAct }) {
|
|
|
3062
3109
|
// src/components/dashboard/DashboardTile.tsx
|
|
3063
3110
|
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
3064
3111
|
var MAX_CRESTS = 3;
|
|
3065
|
-
|
|
3112
|
+
var ODDS_TAIL = /\s*·\s*@(\d+(?:\.\d+)?)\s*$/;
|
|
3113
|
+
function splitOdds(subtitle) {
|
|
3114
|
+
const m = ODDS_TAIL.exec(subtitle);
|
|
3115
|
+
return m ? { text: subtitle.slice(0, m.index), odds: m[1] } : { text: subtitle };
|
|
3116
|
+
}
|
|
3117
|
+
function HeroTile({ tile, onTap, oddsLabel }) {
|
|
3118
|
+
const crests = (tile.imageUrls ?? []).filter(Boolean).slice(0, 2);
|
|
3119
|
+
const sub = tile.subtitle ? splitOdds(tile.subtitle) : null;
|
|
3120
|
+
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("button", { type: "button", className: "ss-w-dash-tile ss-w-dash-tile--full ss-w-dash-hero", onClick: onTap, children: [
|
|
3121
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-top", children: [
|
|
3122
|
+
tile.badgeText ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-badge", children: tile.badgeText }) : null,
|
|
3123
|
+
sub?.odds ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-price", children: [
|
|
3124
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-g-sr", children: [
|
|
3125
|
+
oddsLabel,
|
|
3126
|
+
" "
|
|
3127
|
+
] }),
|
|
3128
|
+
sub.odds
|
|
3129
|
+
] }) : null,
|
|
3130
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-chevron", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ChevronIcon, {}) })
|
|
3131
|
+
] }),
|
|
3132
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-main", children: [
|
|
3133
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-visual", "aria-hidden": "true", children: crests.length > 0 ? crests.map((url, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-crest", style: { backgroundImage: `url(${url})` } }, `${url}-${i}`)) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-icon", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(DashboardIcon, { name: tile.icon }) }) }),
|
|
3134
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-dash-hero-body", children: [
|
|
3135
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-title", children: tile.title }),
|
|
3136
|
+
sub?.text ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-dash-hero-subtitle", children: sub.text }) : null
|
|
3137
|
+
] })
|
|
3138
|
+
] })
|
|
3139
|
+
] });
|
|
3140
|
+
}
|
|
3141
|
+
function DashboardTile({ tile, onTap, oddsLabel = "Odds" }) {
|
|
3142
|
+
if (tile.emphasis === "hero") return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(HeroTile, { tile, onTap, oddsLabel });
|
|
3066
3143
|
const spanClass = tile.span === "full" ? "ss-w-dash-tile--full" : "ss-w-dash-tile--half";
|
|
3067
3144
|
const crests = (tile.imageUrls ?? []).slice(0, MAX_CRESTS);
|
|
3068
3145
|
const hasMeta = Boolean(tile.badgeText) || crests.length > 0;
|
|
@@ -3095,13 +3172,13 @@ var LAYOUT_CLASSES = {
|
|
|
3095
3172
|
function layoutClass(layout) {
|
|
3096
3173
|
return Object.prototype.hasOwnProperty.call(LAYOUT_CLASSES, layout) ? LAYOUT_CLASSES[layout] : LAYOUT_CLASSES.goal;
|
|
3097
3174
|
}
|
|
3098
|
-
function GreetingDashboard({ dashboard, onTap }) {
|
|
3175
|
+
function GreetingDashboard({ dashboard, onTap, oddsLabel }) {
|
|
3099
3176
|
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: `ss-w-dash ${layoutClass(dashboard.layout)}`, children: [
|
|
3100
3177
|
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "ss-w-dash-head", children: [
|
|
3101
3178
|
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-title", children: dashboard.title }),
|
|
3102
3179
|
dashboard.subtitle ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-subtitle", children: dashboard.subtitle }) : null
|
|
3103
3180
|
] }),
|
|
3104
|
-
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DashboardTile, { tile: t, onTap: () => onTap(t, i) }, `${t.title}-${i}`)) }),
|
|
3181
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-dash-grid", children: dashboard.tiles.map((t, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(DashboardTile, { tile: t, onTap: () => onTap(t, i), oddsLabel }, `${t.title}-${i}`)) }),
|
|
3105
3182
|
dashboard.footerTip ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "ss-w-dash-foot", children: dashboard.footerTip }) : null
|
|
3106
3183
|
] });
|
|
3107
3184
|
}
|
|
@@ -3197,7 +3274,7 @@ function FixtureCard({ card }) {
|
|
|
3197
3274
|
}
|
|
3198
3275
|
|
|
3199
3276
|
// src/components/dashboard/CountdownCard.tsx
|
|
3200
|
-
var
|
|
3277
|
+
var import_react20 = require("react");
|
|
3201
3278
|
var import_jsx_runtime20 = require("react/jsx-runtime");
|
|
3202
3279
|
var DAY_MS = 864e5;
|
|
3203
3280
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -3216,12 +3293,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
3216
3293
|
function CountdownCard({ card }) {
|
|
3217
3294
|
const { data } = card;
|
|
3218
3295
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
3219
|
-
const [nowMs, setNowMs] = (0,
|
|
3220
|
-
const [reduced] = (0,
|
|
3296
|
+
const [nowMs, setNowMs] = (0, import_react20.useState)(() => Date.now());
|
|
3297
|
+
const [reduced] = (0, import_react20.useState)(
|
|
3221
3298
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
3222
3299
|
);
|
|
3223
3300
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
3224
|
-
(0,
|
|
3301
|
+
(0, import_react20.useEffect)(() => {
|
|
3225
3302
|
if (reduced) return;
|
|
3226
3303
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
3227
3304
|
return () => window.clearInterval(id);
|
|
@@ -3229,7 +3306,7 @@ function CountdownCard({ card }) {
|
|
|
3229
3306
|
const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
|
|
3230
3307
|
return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "ss-w-fandash-countdown-top", children: [
|
|
3231
3308
|
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
|
|
3232
|
-
segments ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
|
|
3309
|
+
segments ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react20.Fragment, { children: [
|
|
3233
3310
|
i > 0 ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
|
|
3234
3311
|
/* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("span", { className: "ss-w-fandash-countdown-seg", children: [
|
|
3235
3312
|
/* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
|
|
@@ -3240,7 +3317,7 @@ function CountdownCard({ card }) {
|
|
|
3240
3317
|
}
|
|
3241
3318
|
|
|
3242
3319
|
// src/components/dashboard/InjuriesCard.tsx
|
|
3243
|
-
var
|
|
3320
|
+
var import_react21 = require("react");
|
|
3244
3321
|
var import_jsx_runtime21 = require("react/jsx-runtime");
|
|
3245
3322
|
var SHOWN = 3;
|
|
3246
3323
|
function ColHead({ name, crestUrl }) {
|
|
@@ -3263,7 +3340,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
3263
3340
|
}
|
|
3264
3341
|
function InjuriesCard({ card, ui }) {
|
|
3265
3342
|
const { data } = card;
|
|
3266
|
-
const [expanded, setExpanded] = (0,
|
|
3343
|
+
const [expanded, setExpanded] = (0, import_react21.useState)(false);
|
|
3267
3344
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
3268
3345
|
const limit = expanded ? void 0 : SHOWN;
|
|
3269
3346
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
@@ -3369,7 +3446,7 @@ function LinksCard({ card }) {
|
|
|
3369
3446
|
}
|
|
3370
3447
|
|
|
3371
3448
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
3372
|
-
var
|
|
3449
|
+
var import_react22 = require("react");
|
|
3373
3450
|
var import_jsx_runtime27 = require("react/jsx-runtime");
|
|
3374
3451
|
function initials3(name) {
|
|
3375
3452
|
return name.trim().slice(0, 3).toUpperCase();
|
|
@@ -3379,7 +3456,7 @@ function PostMatchCrest({
|
|
|
3379
3456
|
name,
|
|
3380
3457
|
side
|
|
3381
3458
|
}) {
|
|
3382
|
-
const [failed, setFailed] = (0,
|
|
3459
|
+
const [failed, setFailed] = (0, import_react22.useState)(false);
|
|
3383
3460
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
3384
3461
|
if (url && !failed) {
|
|
3385
3462
|
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -3578,10 +3655,10 @@ function RestingFormCard({ card }) {
|
|
|
3578
3655
|
}
|
|
3579
3656
|
|
|
3580
3657
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
3581
|
-
var
|
|
3658
|
+
var import_react24 = require("react");
|
|
3582
3659
|
|
|
3583
3660
|
// src/useLiveClock.ts
|
|
3584
|
-
var
|
|
3661
|
+
var import_react23 = require("react");
|
|
3585
3662
|
var TICK_MS = 6e4;
|
|
3586
3663
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
3587
3664
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -3590,10 +3667,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
3590
3667
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
3591
3668
|
}
|
|
3592
3669
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
3593
|
-
const [displayMinute, setDisplayMinute] = (0,
|
|
3670
|
+
const [displayMinute, setDisplayMinute] = (0, import_react23.useState)(
|
|
3594
3671
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
3595
3672
|
);
|
|
3596
|
-
(0,
|
|
3673
|
+
(0, import_react23.useEffect)(() => {
|
|
3597
3674
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
3598
3675
|
if (!clockRunning) return;
|
|
3599
3676
|
const id = window.setInterval(() => {
|
|
@@ -3610,7 +3687,7 @@ function initials5(name) {
|
|
|
3610
3687
|
return name.trim().slice(0, 3).toUpperCase();
|
|
3611
3688
|
}
|
|
3612
3689
|
function LiveCrest({ url, name, side }) {
|
|
3613
|
-
const [failed, setFailed] = (0,
|
|
3690
|
+
const [failed, setFailed] = (0, import_react24.useState)(false);
|
|
3614
3691
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
3615
3692
|
if (url && !failed) {
|
|
3616
3693
|
return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -3629,7 +3706,7 @@ function LiveScoreCard({
|
|
|
3629
3706
|
}) {
|
|
3630
3707
|
const { data } = card;
|
|
3631
3708
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
3632
|
-
const seedRef = (0,
|
|
3709
|
+
const seedRef = (0, import_react24.useRef)(null);
|
|
3633
3710
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
3634
3711
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
3635
3712
|
}
|
|
@@ -3669,7 +3746,7 @@ function LiveScoreCard({
|
|
|
3669
3746
|
}
|
|
3670
3747
|
|
|
3671
3748
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
3672
|
-
var
|
|
3749
|
+
var import_react25 = require("react");
|
|
3673
3750
|
var import_jsx_runtime37 = require("react/jsx-runtime");
|
|
3674
3751
|
var SHOWN2 = 3;
|
|
3675
3752
|
function EventIcon({ type }) {
|
|
@@ -3711,7 +3788,7 @@ function EventRow({ e }) {
|
|
|
3711
3788
|
] });
|
|
3712
3789
|
}
|
|
3713
3790
|
function LiveTimelineCard({ card, ui }) {
|
|
3714
|
-
const [expanded, setExpanded] = (0,
|
|
3791
|
+
const [expanded, setExpanded] = (0, import_react25.useState)(false);
|
|
3715
3792
|
const events = card.data.events;
|
|
3716
3793
|
if (!events || events.length === 0) return null;
|
|
3717
3794
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -3736,7 +3813,7 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
3736
3813
|
}
|
|
3737
3814
|
|
|
3738
3815
|
// src/components/dashboard/MomentumWave.tsx
|
|
3739
|
-
var
|
|
3816
|
+
var import_react26 = require("react");
|
|
3740
3817
|
var import_jsx_runtime38 = require("react/jsx-runtime");
|
|
3741
3818
|
var WIDTH = 270;
|
|
3742
3819
|
var HEIGHT = 56;
|
|
@@ -3760,7 +3837,7 @@ function MomentumWave({
|
|
|
3760
3837
|
}) {
|
|
3761
3838
|
if (points.length === 0) return null;
|
|
3762
3839
|
const { area, line, lastLeftPct, lastTopPx } = buildPaths(points);
|
|
3763
|
-
const clipId = (0,
|
|
3840
|
+
const clipId = (0, import_react26.useId)();
|
|
3764
3841
|
const topClipId = `${clipId}-top`;
|
|
3765
3842
|
const bottomClipId = `${clipId}-bottom`;
|
|
3766
3843
|
const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
|
|
@@ -3918,7 +3995,7 @@ function ChatMessage({ message, disabled, onAct, onTap, ui, slip, monitor }) {
|
|
|
3918
3995
|
};
|
|
3919
3996
|
return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "ss-w-msg ss-w-bot", "data-msg-id": message.id, children: [
|
|
3920
3997
|
message.text && !message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Markdown, { text: message.text }) : null,
|
|
3921
|
-
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(GreetingDashboard, { dashboard: message.greetingDashboard, onTap }) : null,
|
|
3998
|
+
message.greetingDashboard && !message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(GreetingDashboard, { dashboard: message.greetingDashboard, onTap, oddsLabel: ui?.oddsLabel }) : null,
|
|
3922
3999
|
message.clubFanDashboard ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(ClubFanDashboard, { dashboard: message.clubFanDashboard, onTap: onFanDashboardTap, ui }) : null,
|
|
3923
4000
|
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(EntityCardList, { cards: message.cards, disabled, showLessLabel: ui?.showLess, showMoreLabel: ui?.showMore }),
|
|
3924
4001
|
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(BettingInsightList, { insights: message.insights, ui, slip, monitor }),
|
|
@@ -3951,11 +4028,11 @@ function turnAnchor(messages) {
|
|
|
3951
4028
|
}
|
|
3952
4029
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
3953
4030
|
const { state, send } = controller;
|
|
3954
|
-
const listRef = (0,
|
|
3955
|
-
const endRef = (0,
|
|
3956
|
-
const pinnedRef = (0,
|
|
3957
|
-
const anchoredTurnRef = (0,
|
|
3958
|
-
(0,
|
|
4031
|
+
const listRef = (0, import_react27.useRef)(null);
|
|
4032
|
+
const endRef = (0, import_react27.useRef)(null);
|
|
4033
|
+
const pinnedRef = (0, import_react27.useRef)(true);
|
|
4034
|
+
const anchoredTurnRef = (0, import_react27.useRef)(null);
|
|
4035
|
+
(0, import_react27.useEffect)(() => {
|
|
3959
4036
|
const anchor = turnAnchor(state.messages);
|
|
3960
4037
|
const list = listRef.current;
|
|
3961
4038
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -4011,10 +4088,10 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
4011
4088
|
}
|
|
4012
4089
|
|
|
4013
4090
|
// src/components/ChatInput.tsx
|
|
4014
|
-
var
|
|
4091
|
+
var import_react28 = require("react");
|
|
4015
4092
|
var import_jsx_runtime44 = require("react/jsx-runtime");
|
|
4016
4093
|
function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message" }) {
|
|
4017
|
-
const [value, setValue] = (0,
|
|
4094
|
+
const [value, setValue] = (0, import_react28.useState)("");
|
|
4018
4095
|
const submit = () => {
|
|
4019
4096
|
const t = value.trim();
|
|
4020
4097
|
if (!t) return;
|
|
@@ -4244,8 +4321,8 @@ function MonitorMatchCard({ match, promotedPins, monitor, ui, slip }) {
|
|
|
4244
4321
|
{
|
|
4245
4322
|
selection,
|
|
4246
4323
|
shownOdds: typeof row.market.price === "number" ? row.market.price.toFixed(2) : "",
|
|
4247
|
-
marketName: row.market.marketLabel,
|
|
4248
4324
|
marketDeveloperName: row.market.marketDeveloperName,
|
|
4325
|
+
selectionLabel: row.market.selectionLabel,
|
|
4249
4326
|
slip,
|
|
4250
4327
|
ui
|
|
4251
4328
|
}
|
|
@@ -4437,7 +4514,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
4437
4514
|
}
|
|
4438
4515
|
|
|
4439
4516
|
// src/components/GamesPanel.tsx
|
|
4440
|
-
var
|
|
4517
|
+
var import_react42 = require("react");
|
|
4441
4518
|
|
|
4442
4519
|
// src/components/GamesLoginWall.tsx
|
|
4443
4520
|
var import_jsx_runtime52 = require("react/jsx-runtime");
|
|
@@ -4446,7 +4523,7 @@ function GamesLoginWall({ ui }) {
|
|
|
4446
4523
|
}
|
|
4447
4524
|
|
|
4448
4525
|
// src/components/GamesHub.tsx
|
|
4449
|
-
var
|
|
4526
|
+
var import_react29 = require("react");
|
|
4450
4527
|
|
|
4451
4528
|
// src/components/games/ui/gameMeta.ts
|
|
4452
4529
|
function prettifyGameId(gameId) {
|
|
@@ -4631,8 +4708,8 @@ function pickHeroGame(games) {
|
|
|
4631
4708
|
}
|
|
4632
4709
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
4633
4710
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
4634
|
-
const [, setTick] = (0,
|
|
4635
|
-
(0,
|
|
4711
|
+
const [, setTick] = (0, import_react29.useState)(0);
|
|
4712
|
+
(0, import_react29.useEffect)(() => {
|
|
4636
4713
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
4637
4714
|
return () => clearInterval(id);
|
|
4638
4715
|
}, []);
|
|
@@ -4692,10 +4769,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
4692
4769
|
}
|
|
4693
4770
|
|
|
4694
4771
|
// src/components/GameScreenHost.tsx
|
|
4695
|
-
var
|
|
4772
|
+
var import_react41 = require("react");
|
|
4696
4773
|
|
|
4697
4774
|
// src/useGamePlay.ts
|
|
4698
|
-
var
|
|
4775
|
+
var import_react30 = require("react");
|
|
4699
4776
|
function toSubmitResult(payload) {
|
|
4700
4777
|
return {
|
|
4701
4778
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -4707,17 +4784,17 @@ function toSubmitResult(payload) {
|
|
|
4707
4784
|
};
|
|
4708
4785
|
}
|
|
4709
4786
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
4710
|
-
const [result, setResult] = (0,
|
|
4711
|
-
const [submitting, setSubmitting] = (0,
|
|
4712
|
-
const [rawStatus, setRawStatus] = (0,
|
|
4713
|
-
const inFlightRef = (0,
|
|
4714
|
-
const convRef = (0,
|
|
4787
|
+
const [result, setResult] = (0, import_react30.useState)(null);
|
|
4788
|
+
const [submitting, setSubmitting] = (0, import_react30.useState)(false);
|
|
4789
|
+
const [rawStatus, setRawStatus] = (0, import_react30.useState)(null);
|
|
4790
|
+
const inFlightRef = (0, import_react30.useRef)(false);
|
|
4791
|
+
const convRef = (0, import_react30.useRef)(conversation);
|
|
4715
4792
|
convRef.current = conversation;
|
|
4716
|
-
const optsRef = (0,
|
|
4793
|
+
const optsRef = (0, import_react30.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
|
|
4717
4794
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
4718
|
-
const resultRef = (0,
|
|
4795
|
+
const resultRef = (0, import_react30.useRef)(null);
|
|
4719
4796
|
resultRef.current = result;
|
|
4720
|
-
const refetch = (0,
|
|
4797
|
+
const refetch = (0, import_react30.useCallback)(async () => {
|
|
4721
4798
|
const conv = convRef.current;
|
|
4722
4799
|
if (!conv) return;
|
|
4723
4800
|
const opts = optsRef.current;
|
|
@@ -4733,7 +4810,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
4733
4810
|
} catch {
|
|
4734
4811
|
}
|
|
4735
4812
|
}, []);
|
|
4736
|
-
const submit = (0,
|
|
4813
|
+
const submit = (0, import_react30.useCallback)(async (answerJson) => {
|
|
4737
4814
|
const conv = convRef.current;
|
|
4738
4815
|
if (!conv || inFlightRef.current) return;
|
|
4739
4816
|
inFlightRef.current = true;
|
|
@@ -4760,14 +4837,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
4760
4837
|
setSubmitting(false);
|
|
4761
4838
|
}
|
|
4762
4839
|
}, [refetch]);
|
|
4763
|
-
const hydrate = (0,
|
|
4840
|
+
const hydrate = (0, import_react30.useCallback)(() => {
|
|
4764
4841
|
void refetch();
|
|
4765
4842
|
}, [refetch]);
|
|
4766
4843
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
4767
4844
|
}
|
|
4768
4845
|
|
|
4769
4846
|
// src/components/games/MysteryTigerGame.tsx
|
|
4770
|
-
var
|
|
4847
|
+
var import_react32 = require("react");
|
|
4771
4848
|
|
|
4772
4849
|
// src/components/games/nationFlags.ts
|
|
4773
4850
|
var FLAGS = {
|
|
@@ -4978,7 +5055,7 @@ function isNationCode(flag) {
|
|
|
4978
5055
|
}
|
|
4979
5056
|
|
|
4980
5057
|
// src/components/games/PlayerAvatar.tsx
|
|
4981
|
-
var
|
|
5058
|
+
var import_react31 = require("react");
|
|
4982
5059
|
var import_jsx_runtime58 = require("react/jsx-runtime");
|
|
4983
5060
|
function initialsOf(name) {
|
|
4984
5061
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
@@ -4996,7 +5073,7 @@ function PlayerAvatar({
|
|
|
4996
5073
|
imagePath,
|
|
4997
5074
|
className
|
|
4998
5075
|
}) {
|
|
4999
|
-
const [failed, setFailed] = (0,
|
|
5076
|
+
const [failed, setFailed] = (0, import_react31.useState)(false);
|
|
5000
5077
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
5001
5078
|
return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
5002
5079
|
}
|
|
@@ -5211,8 +5288,8 @@ function MysteryTigerGame({
|
|
|
5211
5288
|
onBack
|
|
5212
5289
|
}) {
|
|
5213
5290
|
const t = ui.games.mysteryTiger;
|
|
5214
|
-
const [query, setQuery] = (0,
|
|
5215
|
-
const inputId = (0,
|
|
5291
|
+
const [query, setQuery] = (0, import_react32.useState)("");
|
|
5292
|
+
const inputId = (0, import_react32.useId)();
|
|
5216
5293
|
const clientState = parseClientState(result?.clientStateJson);
|
|
5217
5294
|
const guessResults = clientState?.guessResults ?? [];
|
|
5218
5295
|
const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
|
|
@@ -5487,13 +5564,13 @@ function HigherOrLowerGame({
|
|
|
5487
5564
|
}
|
|
5488
5565
|
|
|
5489
5566
|
// src/components/games/CareerPathGame.tsx
|
|
5490
|
-
var
|
|
5567
|
+
var import_react34 = require("react");
|
|
5491
5568
|
|
|
5492
5569
|
// src/components/games/ui/CrestShield.tsx
|
|
5493
|
-
var
|
|
5570
|
+
var import_react33 = require("react");
|
|
5494
5571
|
var import_jsx_runtime69 = require("react/jsx-runtime");
|
|
5495
5572
|
function CrestShield({ src, name, size = 28 }) {
|
|
5496
|
-
const [failed, setFailed] = (0,
|
|
5573
|
+
const [failed, setFailed] = (0, import_react33.useState)(false);
|
|
5497
5574
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
5498
5575
|
return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
5499
5576
|
}
|
|
@@ -5525,8 +5602,8 @@ function CareerPathGame({
|
|
|
5525
5602
|
}) {
|
|
5526
5603
|
const s = ui.games.careerPath;
|
|
5527
5604
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
5528
|
-
const [query, setQuery] = (0,
|
|
5529
|
-
const inputId = (0,
|
|
5605
|
+
const [query, setQuery] = (0, import_react34.useState)("");
|
|
5606
|
+
const inputId = (0, import_react34.useId)();
|
|
5530
5607
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
5531
5608
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
5532
5609
|
const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
|
|
@@ -5561,7 +5638,7 @@ function CareerPathGame({
|
|
|
5561
5638
|
/* @__PURE__ */ (0, import_jsx_runtime70.jsx)(GameHeader, { title, eyebrow: s.eyebrow, right, onBack, backLabel: ui.back }),
|
|
5562
5639
|
/* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "ss-g-body", children: [
|
|
5563
5640
|
/* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "ss-g-cp-card", children: [
|
|
5564
|
-
/* @__PURE__ */ (0, import_jsx_runtime70.jsx)(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
|
|
5641
|
+
isOver && clientState?.revealedPlayerName ? /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(PlayerAvatar, { className: "ss-g-cp-photo", name: clientState.revealedPlayerName, imagePath: clientState.revealedPlayerImagePath }) : /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(Silhouette, { size: 64, variant: isOver ? "default" : "mystery" }),
|
|
5565
5642
|
/* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "ss-g-cp-card-text", children: [
|
|
5566
5643
|
/* @__PURE__ */ (0, import_jsx_runtime70.jsx)("span", { className: "ss-g-cp-card-title", children: isOver && clientState?.revealedPlayerName ? clientState.revealedPlayerName : s.mysteryPlayer }),
|
|
5567
5644
|
clientState?.hintLine ? /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("span", { className: "ss-g-cp-hint", children: clientState.hintLine }) : !isOver ? /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("span", { className: "ss-g-cp-locks", children: [
|
|
@@ -5645,7 +5722,7 @@ function CareerPathGame({
|
|
|
5645
5722
|
}
|
|
5646
5723
|
|
|
5647
5724
|
// src/components/games/BeatTheGridGame.tsx
|
|
5648
|
-
var
|
|
5725
|
+
var import_react35 = __toESM(require("react"), 1);
|
|
5649
5726
|
var import_jsx_runtime71 = require("react/jsx-runtime");
|
|
5650
5727
|
function criterionIconKind(label, key) {
|
|
5651
5728
|
const l = (key ?? label).toLowerCase();
|
|
@@ -5726,10 +5803,10 @@ function SearchSheet({
|
|
|
5726
5803
|
ui
|
|
5727
5804
|
}) {
|
|
5728
5805
|
const s = ui.games.beatTheGrid;
|
|
5729
|
-
const [query, setQuery] = (0,
|
|
5730
|
-
const inputId = (0,
|
|
5731
|
-
const inputRef = (0,
|
|
5732
|
-
(0,
|
|
5806
|
+
const [query, setQuery] = (0, import_react35.useState)("");
|
|
5807
|
+
const inputId = (0, import_react35.useId)();
|
|
5808
|
+
const inputRef = (0, import_react35.useRef)(null);
|
|
5809
|
+
(0, import_react35.useEffect)(() => {
|
|
5733
5810
|
inputRef.current?.focus();
|
|
5734
5811
|
}, [row, col]);
|
|
5735
5812
|
const filtered = playerPool.filter(
|
|
@@ -5794,7 +5871,7 @@ function BeatTheGridGame({
|
|
|
5794
5871
|
}) {
|
|
5795
5872
|
const s = ui.games.beatTheGrid;
|
|
5796
5873
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
5797
|
-
const [activeCell, setActiveCell] = (0,
|
|
5874
|
+
const [activeCell, setActiveCell] = (0, import_react35.useState)(null);
|
|
5798
5875
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
5799
5876
|
const filledCells = clientState?.cells ?? [];
|
|
5800
5877
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -5868,7 +5945,7 @@ function BeatTheGridGame({
|
|
|
5868
5945
|
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { "aria-hidden": "true", children: abbr }),
|
|
5869
5946
|
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("span", { className: "ss-g-sr", children: rowLabel })
|
|
5870
5947
|
] });
|
|
5871
|
-
return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
|
|
5948
|
+
return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_react35.default.Fragment, { children: [
|
|
5872
5949
|
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
|
|
5873
5950
|
cols.map((colLabel, colIdx) => {
|
|
5874
5951
|
const filled = findCellResult(filledCells, rowIdx, colIdx);
|
|
@@ -5949,7 +6026,7 @@ function BeatTheGridGame({
|
|
|
5949
6026
|
}
|
|
5950
6027
|
|
|
5951
6028
|
// src/components/games/GuessTheXiGame.tsx
|
|
5952
|
-
var
|
|
6029
|
+
var import_react36 = require("react");
|
|
5953
6030
|
|
|
5954
6031
|
// src/components/games/ui/PitchSvg.tsx
|
|
5955
6032
|
var import_jsx_runtime72 = require("react/jsx-runtime");
|
|
@@ -5977,7 +6054,8 @@ function toRows(positions) {
|
|
|
5977
6054
|
bucket.push(p);
|
|
5978
6055
|
byRow.set(rowKey, bucket);
|
|
5979
6056
|
});
|
|
5980
|
-
|
|
6057
|
+
const col = (p) => Number(p.slot?.split(":")[1]) || 0;
|
|
6058
|
+
return [...byRow.keys()].sort((a, b) => b - a).map((k) => [...byRow.get(k)].sort((a, b) => col(b) - col(a)));
|
|
5981
6059
|
}
|
|
5982
6060
|
function formationLabel(rowsAttackFirst) {
|
|
5983
6061
|
if (rowsAttackFirst.length < 2) return "";
|
|
@@ -6037,8 +6115,8 @@ function GuessTheXiGame({
|
|
|
6037
6115
|
onBack
|
|
6038
6116
|
}) {
|
|
6039
6117
|
const t = ui.games.guessTheXi;
|
|
6040
|
-
const [query, setQuery] = (0,
|
|
6041
|
-
const inputId = (0,
|
|
6118
|
+
const [query, setQuery] = (0, import_react36.useState)("");
|
|
6119
|
+
const inputId = (0, import_react36.useId)();
|
|
6042
6120
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
6043
6121
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
6044
6122
|
const solved = clientState?.status === "solved";
|
|
@@ -6179,7 +6257,7 @@ function GuessTheXiGame({
|
|
|
6179
6257
|
}
|
|
6180
6258
|
|
|
6181
6259
|
// src/components/games/DailyQuizGame.tsx
|
|
6182
|
-
var
|
|
6260
|
+
var import_react37 = require("react");
|
|
6183
6261
|
var import_jsx_runtime74 = require("react/jsx-runtime");
|
|
6184
6262
|
function parseClientState6(json) {
|
|
6185
6263
|
if (!json) return null;
|
|
@@ -6220,8 +6298,8 @@ function DailyQuizGame({
|
|
|
6220
6298
|
}) {
|
|
6221
6299
|
const s = ui.games.dailyQuiz;
|
|
6222
6300
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
6223
|
-
const [selections, setSelections] = (0,
|
|
6224
|
-
const [page, setPage] = (0,
|
|
6301
|
+
const [selections, setSelections] = (0, import_react37.useState)(/* @__PURE__ */ new Map());
|
|
6302
|
+
const [page, setPage] = (0, import_react37.useState)(0);
|
|
6225
6303
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
6226
6304
|
const results = clientState?.results ?? [];
|
|
6227
6305
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
@@ -6331,7 +6409,7 @@ function DailyQuizGame({
|
|
|
6331
6409
|
}
|
|
6332
6410
|
|
|
6333
6411
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
6334
|
-
var
|
|
6412
|
+
var import_react38 = require("react");
|
|
6335
6413
|
var import_jsx_runtime75 = require("react/jsx-runtime");
|
|
6336
6414
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
6337
6415
|
function parseClientState7(json) {
|
|
@@ -6427,12 +6505,12 @@ function MatchdayPredictorGame({
|
|
|
6427
6505
|
onBack
|
|
6428
6506
|
}) {
|
|
6429
6507
|
const t = ui.games.predictor;
|
|
6430
|
-
const [homeScore, setHomeScore] = (0,
|
|
6431
|
-
const [awayScore, setAwayScore] = (0,
|
|
6432
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0,
|
|
6433
|
-
const [lastEdited, setLastEdited] = (0,
|
|
6434
|
-
const [query, setQuery] = (0,
|
|
6435
|
-
const searchId = (0,
|
|
6508
|
+
const [homeScore, setHomeScore] = (0, import_react38.useState)(0);
|
|
6509
|
+
const [awayScore, setAwayScore] = (0, import_react38.useState)(0);
|
|
6510
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react38.useState)(null);
|
|
6511
|
+
const [lastEdited, setLastEdited] = (0, import_react38.useState)("home");
|
|
6512
|
+
const [query, setQuery] = (0, import_react38.useState)("");
|
|
6513
|
+
const searchId = (0, import_react38.useId)();
|
|
6436
6514
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
6437
6515
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
6438
6516
|
const header = /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
|
|
@@ -6599,7 +6677,7 @@ function MatchdayPredictorGame({
|
|
|
6599
6677
|
}
|
|
6600
6678
|
|
|
6601
6679
|
// src/components/games/StartingXiGame.tsx
|
|
6602
|
-
var
|
|
6680
|
+
var import_react39 = require("react");
|
|
6603
6681
|
var import_jsx_runtime76 = require("react/jsx-runtime");
|
|
6604
6682
|
var POINTS_PER_STARTER = 8;
|
|
6605
6683
|
var XI_SIZE = 11;
|
|
@@ -6643,10 +6721,10 @@ function StartingXiGame({
|
|
|
6643
6721
|
lockAtUtc
|
|
6644
6722
|
}) {
|
|
6645
6723
|
const t = ui.games.startingXi;
|
|
6646
|
-
const [slotPlayers, setSlotPlayers] = (0,
|
|
6647
|
-
const [active, setActive] = (0,
|
|
6648
|
-
const [query, setQuery] = (0,
|
|
6649
|
-
const searchId = (0,
|
|
6724
|
+
const [slotPlayers, setSlotPlayers] = (0, import_react39.useState)(() => Array(XI_SIZE).fill(null));
|
|
6725
|
+
const [active, setActive] = (0, import_react39.useState)(0);
|
|
6726
|
+
const [query, setQuery] = (0, import_react39.useState)("");
|
|
6727
|
+
const searchId = (0, import_react39.useId)();
|
|
6650
6728
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
6651
6729
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
6652
6730
|
const header = /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
@@ -6785,7 +6863,7 @@ function StartingXiGame({
|
|
|
6785
6863
|
}
|
|
6786
6864
|
|
|
6787
6865
|
// src/components/games/StatLadderGame.tsx
|
|
6788
|
-
var
|
|
6866
|
+
var import_react40 = require("react");
|
|
6789
6867
|
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
6790
6868
|
function ladderClue(ladder) {
|
|
6791
6869
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
@@ -6822,9 +6900,9 @@ function StatLadderGame({
|
|
|
6822
6900
|
onBack
|
|
6823
6901
|
}) {
|
|
6824
6902
|
const t = ui.games.statLadder;
|
|
6825
|
-
const [query, setQuery] = (0,
|
|
6826
|
-
const [selectedId, setSelectedId] = (0,
|
|
6827
|
-
const searchId = (0,
|
|
6903
|
+
const [query, setQuery] = (0, import_react40.useState)("");
|
|
6904
|
+
const [selectedId, setSelectedId] = (0, import_react40.useState)(null);
|
|
6905
|
+
const searchId = (0, import_react40.useId)();
|
|
6828
6906
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
6829
6907
|
const revealed = clientState != null;
|
|
6830
6908
|
const header = /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
|
|
@@ -7029,8 +7107,8 @@ function GameScreenHost({
|
|
|
7029
7107
|
ui
|
|
7030
7108
|
}) {
|
|
7031
7109
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
7032
|
-
const [configJson, setConfigJson] = (0,
|
|
7033
|
-
(0,
|
|
7110
|
+
const [configJson, setConfigJson] = (0, import_react41.useState)(null);
|
|
7111
|
+
(0, import_react41.useEffect)(() => {
|
|
7034
7112
|
setConfigJson(null);
|
|
7035
7113
|
if (!conversation) return;
|
|
7036
7114
|
let cancelled = false;
|
|
@@ -7053,12 +7131,12 @@ function GameScreenHost({
|
|
|
7053
7131
|
fixtureId: fixtureId || void 0,
|
|
7054
7132
|
locale: ui.games.lang
|
|
7055
7133
|
});
|
|
7056
|
-
(0,
|
|
7134
|
+
(0, import_react41.useEffect)(() => {
|
|
7057
7135
|
if (conversation) hydrate();
|
|
7058
7136
|
}, [conversation, gameId]);
|
|
7059
|
-
const hydrateRef = (0,
|
|
7137
|
+
const hydrateRef = (0, import_react41.useRef)(hydrate);
|
|
7060
7138
|
hydrateRef.current = hydrate;
|
|
7061
|
-
(0,
|
|
7139
|
+
(0, import_react41.useEffect)(() => {
|
|
7062
7140
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
7063
7141
|
if (rawStatus !== "pending") return;
|
|
7064
7142
|
const timerId = setInterval(() => {
|
|
@@ -7193,8 +7271,8 @@ function GamesPanel({
|
|
|
7193
7271
|
leaderboard,
|
|
7194
7272
|
refreshHub
|
|
7195
7273
|
}) {
|
|
7196
|
-
const [selected, setSelected] = (0,
|
|
7197
|
-
(0,
|
|
7274
|
+
const [selected, setSelected] = (0, import_react42.useState)(null);
|
|
7275
|
+
(0, import_react42.useEffect)(() => {
|
|
7198
7276
|
ensureGamesFonts();
|
|
7199
7277
|
}, []);
|
|
7200
7278
|
if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(GamesLoginWall, { ui });
|
|
@@ -7225,7 +7303,7 @@ function GamesPanel({
|
|
|
7225
7303
|
}
|
|
7226
7304
|
|
|
7227
7305
|
// src/components/Leaderboard.tsx
|
|
7228
|
-
var
|
|
7306
|
+
var import_react43 = require("react");
|
|
7229
7307
|
|
|
7230
7308
|
// src/components/LeaderboardRow.tsx
|
|
7231
7309
|
var import_jsx_runtime81 = require("react/jsx-runtime");
|
|
@@ -7310,7 +7388,7 @@ function Leaderboard({
|
|
|
7310
7388
|
ui,
|
|
7311
7389
|
onPlay
|
|
7312
7390
|
}) {
|
|
7313
|
-
const [segment, setSegment] = (0,
|
|
7391
|
+
const [segment, setSegment] = (0, import_react43.useState)("weekly");
|
|
7314
7392
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
7315
7393
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
7316
7394
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
@@ -7393,8 +7471,8 @@ function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
|
|
|
7393
7471
|
var import_jsx_runtime85 = require("react/jsx-runtime");
|
|
7394
7472
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
7395
7473
|
function useIsModal() {
|
|
7396
|
-
const [modal, setModal] = (0,
|
|
7397
|
-
(0,
|
|
7474
|
+
const [modal, setModal] = (0, import_react44.useState)(false);
|
|
7475
|
+
(0, import_react44.useEffect)(() => {
|
|
7398
7476
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
7399
7477
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
7400
7478
|
const sync = () => setModal(mql.matches);
|
|
@@ -7407,7 +7485,7 @@ function useIsModal() {
|
|
|
7407
7485
|
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation }) {
|
|
7408
7486
|
const { state, close, stop, send, reset } = controller;
|
|
7409
7487
|
const isModal = useIsModal();
|
|
7410
|
-
(0,
|
|
7488
|
+
(0, import_react44.useEffect)(() => {
|
|
7411
7489
|
const onKey = (e) => {
|
|
7412
7490
|
if (e.key === "Escape") close();
|
|
7413
7491
|
};
|
|
@@ -7418,7 +7496,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
7418
7496
|
monitor?.setActiveTab("chat");
|
|
7419
7497
|
send(text);
|
|
7420
7498
|
};
|
|
7421
|
-
(0,
|
|
7499
|
+
(0, import_react44.useEffect)(() => {
|
|
7422
7500
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
7423
7501
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
7424
7502
|
return /* @__PURE__ */ (0, import_jsx_runtime85.jsxs)("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
@@ -8029,6 +8107,59 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8029
8107
|
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(2) { background: color-mix(in srgb, #3a82f6 10%, var(--ss-w-panel)); }
|
|
8030
8108
|
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(3) { background: color-mix(in srgb, #f5a623 10%, var(--ss-w-panel)); }
|
|
8031
8109
|
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(4) { background: color-mix(in srgb, #a855f7 10%, var(--ss-w-panel)); }
|
|
8110
|
+
/* A hero tile would take the first tint position; count only regular tiles where \`of S\` parses. */
|
|
8111
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(1 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #34c759 10%, var(--ss-w-panel)); }
|
|
8112
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(2 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #3a82f6 10%, var(--ss-w-panel)); }
|
|
8113
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(3 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #f5a623 10%, var(--ss-w-panel)); }
|
|
8114
|
+
.ss-w-dash--discovery .ss-w-dash-tile:nth-child(4 of :not(.ss-w-dash-hero)) { background: color-mix(in srgb, #a855f7 10%, var(--ss-w-panel)); }
|
|
8115
|
+
|
|
8116
|
+
/* Hero: the personalized lead tile. Declared after the layout rules and at three-class
|
|
8117
|
+
specificity so it keeps one look in every layout -- no market rail, no goal pill, no
|
|
8118
|
+
discovery tint or stacking. Colours derive from accent/panel/ink so an operator surface
|
|
8119
|
+
and dark mode both work without their own rules. */
|
|
8120
|
+
.ss-w-dash .ss-w-dash-grid .ss-w-dash-hero {
|
|
8121
|
+
display: flex; flex-direction: column; align-items: stretch; gap: 10px;
|
|
8122
|
+
padding: 12px 14px 14px; border-radius: 16px;
|
|
8123
|
+
border: 1px solid color-mix(in srgb, var(--ss-w-accent) 38%, var(--ss-w-line));
|
|
8124
|
+
background:
|
|
8125
|
+
radial-gradient(120% 140% at 0% 0%, color-mix(in srgb, var(--ss-w-accent) 18%, transparent) 0%, transparent 60%),
|
|
8126
|
+
var(--ss-w-panel);
|
|
8127
|
+
box-shadow: 0 10px 24px -18px color-mix(in srgb, var(--ss-w-accent) 80%, transparent);
|
|
8128
|
+
}
|
|
8129
|
+
.ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:hover { border-color: var(--ss-w-accent); }
|
|
8130
|
+
.ss-w-dash .ss-w-dash-grid .ss-w-dash-hero:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
|
|
8131
|
+
.ss-w-dash-hero-top { display: flex; align-items: center; gap: 8px; min-height: 20px; }
|
|
8132
|
+
.ss-w-dash-hero-badge {
|
|
8133
|
+
font-size: 10.5px; font-weight: 750; letter-spacing: .06em; text-transform: uppercase;
|
|
8134
|
+
color: var(--ss-w-panel); background: color-mix(in srgb, var(--ss-w-accent) 45%, var(--ss-w-ink)); border-radius: 999px; padding: 3px 10px;
|
|
8135
|
+
white-space: nowrap;
|
|
8136
|
+
}
|
|
8137
|
+
.ss-w-dash-hero-chevron { flex: none; width: 14px; height: 14px; color: var(--ss-w-faint); }
|
|
8138
|
+
.ss-w-dash-hero-badge { margin-right: auto; }
|
|
8139
|
+
.ss-w-dash-hero-chevron:only-child { margin-left: auto; }
|
|
8140
|
+
.ss-w-dash-hero-main { display: flex; align-items: center; gap: 12px; min-width: 0; }
|
|
8141
|
+
.ss-w-dash-hero-visual { flex: none; display: flex; align-items: center; }
|
|
8142
|
+
.ss-w-dash-hero-crest {
|
|
8143
|
+
width: 40px; height: 40px; border-radius: 50%;
|
|
8144
|
+
background-color: color-mix(in srgb, var(--ss-w-ink) 4%, var(--ss-w-panel));
|
|
8145
|
+
background-size: 72%; background-position: center; background-repeat: no-repeat;
|
|
8146
|
+
box-shadow: 0 0 0 2px var(--ss-w-panel), 0 0 0 3px color-mix(in srgb, var(--ss-w-ink) 10%, var(--ss-w-panel));
|
|
8147
|
+
}
|
|
8148
|
+
.ss-w-dash-hero-crest + .ss-w-dash-hero-crest { margin-left: -8px; }
|
|
8149
|
+
.ss-w-dash-hero-icon {
|
|
8150
|
+
display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%; font-size: 22px;
|
|
8151
|
+
background: color-mix(in srgb, var(--ss-w-accent) 14%, var(--ss-w-panel));
|
|
8152
|
+
}
|
|
8153
|
+
.ss-w-dash-hero-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
|
|
8154
|
+
.ss-w-dash-hero-title { font-size: 15.5px; font-weight: 700; line-height: 1.25; color: var(--ss-w-ink); overflow-wrap: anywhere; }
|
|
8155
|
+
.ss-w-dash-hero-subtitle { font-size: 12px; color: var(--ss-w-faint); overflow-wrap: anywhere; }
|
|
8156
|
+
.ss-w-dash-hero-price {
|
|
8157
|
+
flex: none; margin-left: auto;
|
|
8158
|
+
font-family: ui-monospace, monospace; font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 750; line-height: 1;
|
|
8159
|
+
color: color-mix(in srgb, var(--ss-w-accent) 45%, var(--ss-w-ink)); padding: 5px 9px; border-radius: 8px;
|
|
8160
|
+
background: color-mix(in srgb, var(--ss-w-accent) 12%, var(--ss-w-panel));
|
|
8161
|
+
border: 1px solid color-mix(in srgb, var(--ss-w-accent) 30%, var(--ss-w-panel));
|
|
8162
|
+
}
|
|
8032
8163
|
|
|
8033
8164
|
/* club fan pre-match dashboard */
|
|
8034
8165
|
.ss-w-fandash { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
|
|
@@ -8533,6 +8664,8 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8533
8664
|
.ss-g-mt-portrait .ss-g-sil { font-size: 46px; }
|
|
8534
8665
|
.ss-g-mt-photo { width: 132px; height: 132px; margin-bottom: 30px; border-radius: 50%; overflow: hidden; display: grid; place-items: center; background: var(--ss-g-accent-tint); color: var(--ss-w-accent); font: 800 40px var(--ss-g-font-display); }
|
|
8535
8666
|
.ss-g-mt-photo img { width: 100%; height: 100%; object-fit: cover; }
|
|
8667
|
+
.ss-g-cp-photo { width: 64px; height: 64px; flex: none; border-radius: 50%; overflow: hidden; display: grid; place-items: center; background: var(--ss-g-accent-tint); color: var(--ss-w-accent); font: 800 22px var(--ss-g-font-display); }
|
|
8668
|
+
.ss-g-cp-photo img { width: 100%; height: 100%; object-fit: cover; }
|
|
8536
8669
|
.ss-g-mt-reveal-name { position: absolute; bottom: 6px; left: 12px; right: 12px; text-align: center; font: 800 20px var(--ss-g-font-display); text-transform: uppercase; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
8537
8670
|
.ss-g-mt-known { display: grid; gap: 6px; padding: 12px; }
|
|
8538
8671
|
.ss-g-mt-known-cell { display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 0; }
|
|
@@ -8925,23 +9058,23 @@ function injectStyles(root) {
|
|
|
8925
9058
|
function StatsWidget(props) {
|
|
8926
9059
|
const injectedClient = "client" in props ? props.client : void 0;
|
|
8927
9060
|
const cfg = props.config;
|
|
8928
|
-
const built = (0,
|
|
8929
|
-
const logger = (0,
|
|
9061
|
+
const built = (0, import_react45.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
|
|
9062
|
+
const logger = (0, import_react45.useMemo)(
|
|
8930
9063
|
() => built ? built.client.createEventLogger({
|
|
8931
9064
|
operatorUserId: cfg?.userContext?.operatorUserId,
|
|
8932
9065
|
anonymousUserId: cfg?.userContext?.anonymousUserId
|
|
8933
9066
|
}) : null,
|
|
8934
9067
|
[built?.client]
|
|
8935
9068
|
);
|
|
8936
|
-
const ui = (0,
|
|
8937
|
-
const rootRef = (0,
|
|
8938
|
-
const introDoneRef = (0,
|
|
8939
|
-
const markIntroDone = (0,
|
|
9069
|
+
const ui = (0, import_react45.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
9070
|
+
const rootRef = (0, import_react45.useRef)(null);
|
|
9071
|
+
const introDoneRef = (0, import_react45.useRef)(false);
|
|
9072
|
+
const markIntroDone = (0, import_react45.useCallback)(() => {
|
|
8940
9073
|
introDoneRef.current = true;
|
|
8941
9074
|
}, []);
|
|
8942
9075
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
8943
9076
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
8944
|
-
const [hasToday, setHasToday] = (0,
|
|
9077
|
+
const [hasToday, setHasToday] = (0, import_react45.useState)(false);
|
|
8945
9078
|
const monitor = useLiveMonitor({
|
|
8946
9079
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
|
|
8947
9080
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|
|
@@ -8949,15 +9082,15 @@ function StatsWidget(props) {
|
|
|
8949
9082
|
isOpen: controller.state.isOpen,
|
|
8950
9083
|
hasToday
|
|
8951
9084
|
});
|
|
8952
|
-
const getSchedule = (0,
|
|
9085
|
+
const getSchedule = (0, import_react45.useCallback)(
|
|
8953
9086
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
|
|
8954
9087
|
[built]
|
|
8955
9088
|
);
|
|
8956
|
-
const getStates = (0,
|
|
9089
|
+
const getStates = (0, import_react45.useCallback)(
|
|
8957
9090
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
8958
9091
|
[built]
|
|
8959
9092
|
);
|
|
8960
|
-
const pinnedMatchIds = (0,
|
|
9093
|
+
const pinnedMatchIds = (0, import_react45.useMemo)(
|
|
8961
9094
|
() => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
|
|
8962
9095
|
[monitor.pins]
|
|
8963
9096
|
);
|
|
@@ -8969,19 +9102,19 @@ function StatsWidget(props) {
|
|
|
8969
9102
|
pinnedMatchIds
|
|
8970
9103
|
});
|
|
8971
9104
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
8972
|
-
(0,
|
|
9105
|
+
(0, import_react45.useEffect)(() => {
|
|
8973
9106
|
setHasToday(todayHasContent);
|
|
8974
9107
|
}, [todayHasContent]);
|
|
8975
9108
|
const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
8976
9109
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
8977
9110
|
const markTodayActivity = monitor.markTodayActivity;
|
|
8978
|
-
const prevLiveCountRef = (0,
|
|
8979
|
-
(0,
|
|
9111
|
+
const prevLiveCountRef = (0, import_react45.useRef)(0);
|
|
9112
|
+
(0, import_react45.useEffect)(() => {
|
|
8980
9113
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
8981
9114
|
prevLiveCountRef.current = discovery.liveCount;
|
|
8982
9115
|
if (rose) markTodayActivity();
|
|
8983
9116
|
}, [discovery.liveCount, markTodayActivity]);
|
|
8984
|
-
const slip = (0,
|
|
9117
|
+
const slip = (0, import_react45.useMemo)(
|
|
8985
9118
|
() => {
|
|
8986
9119
|
const handler = props.config?.onAddToSlip;
|
|
8987
9120
|
return {
|
|
@@ -8993,29 +9126,24 @@ function StatsWidget(props) {
|
|
|
8993
9126
|
if (wasAdded(result)) monitor.markInSlip(sel.matchOddsId);
|
|
8994
9127
|
return result;
|
|
8995
9128
|
}),
|
|
8996
|
-
conversationId: controller.state.conversationId ?? void 0
|
|
8997
|
-
onMarketClicked: (marketName) => {
|
|
8998
|
-
try {
|
|
8999
|
-
void built?.conversation.sendSignal({ signalType: "InsightMarketClicked", entityType: "Market", entityName: marketName }).catch(() => void 0);
|
|
9000
|
-
} catch {
|
|
9001
|
-
}
|
|
9002
|
-
}
|
|
9129
|
+
conversationId: controller.state.conversationId ?? void 0
|
|
9003
9130
|
};
|
|
9004
9131
|
},
|
|
9005
|
-
[props.config?.onAddToSlip, controller.state.conversationId,
|
|
9132
|
+
[props.config?.onAddToSlip, controller.state.conversationId, monitor.markInSlip]
|
|
9006
9133
|
);
|
|
9007
|
-
const onDashboardTap = (0,
|
|
9134
|
+
const onDashboardTap = (0, import_react45.useMemo)(
|
|
9008
9135
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
|
|
9009
9136
|
[built, logger]
|
|
9010
9137
|
);
|
|
9138
|
+
const dismissPopup = usePopupTelemetry(logger, controller.state.isOpen, controller.state.popupText, controller.dismissPopup);
|
|
9011
9139
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
9012
9140
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
9013
9141
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
9014
|
-
(0,
|
|
9142
|
+
(0, import_react45.useEffect)(() => {
|
|
9015
9143
|
if (!logger) return;
|
|
9016
9144
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
9017
9145
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
9018
|
-
(0,
|
|
9146
|
+
(0, import_react45.useEffect)(() => {
|
|
9019
9147
|
if (!logger) return;
|
|
9020
9148
|
const onHide = () => {
|
|
9021
9149
|
logger.flushOnHide();
|
|
@@ -9032,7 +9160,7 @@ function StatsWidget(props) {
|
|
|
9032
9160
|
logger.dispose();
|
|
9033
9161
|
};
|
|
9034
9162
|
}, [logger]);
|
|
9035
|
-
(0,
|
|
9163
|
+
(0, import_react45.useEffect)(() => {
|
|
9036
9164
|
if (!built || !ui.injectStyles) return;
|
|
9037
9165
|
const node = rootRef.current?.getRootNode();
|
|
9038
9166
|
if (node) injectStyles(node);
|
|
@@ -9061,7 +9189,7 @@ function StatsWidget(props) {
|
|
|
9061
9189
|
popupText: controller.state.popupText,
|
|
9062
9190
|
logoUrl: ui.logoUrl,
|
|
9063
9191
|
onOpen: controller.open,
|
|
9064
|
-
onDismissPopup:
|
|
9192
|
+
onDismissPopup: dismissPopup,
|
|
9065
9193
|
dismissLabel: ui.dismissGreeting,
|
|
9066
9194
|
introAllowed: !introDoneRef.current,
|
|
9067
9195
|
onIntroStart: markIntroDone
|