@sensiblestats/widget-react 0.64.0 → 0.65.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 +11 -0
- package/dist/index.cjs +273 -351
- 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 +113 -191
- package/dist/index.js.map +1 -1
- package/dist/styles.css +2 -17
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/StatsWidget.tsx
|
|
2
|
-
import { useCallback as useCallback11, useEffect as useEffect20, useMemo as useMemo4, useRef as useRef16, useState as
|
|
2
|
+
import { useCallback as useCallback11, useEffect as useEffect20, useMemo as useMemo4, useRef as useRef16, useState as useState39 } from "react";
|
|
3
3
|
import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
|
|
4
4
|
|
|
5
5
|
// src/kickoff.ts
|
|
@@ -32,8 +32,6 @@ var STRINGS = {
|
|
|
32
32
|
retry: "Retry",
|
|
33
33
|
showLess: "Show less",
|
|
34
34
|
showMore: (n) => `Show ${n} more`,
|
|
35
|
-
showStats: "Show stats",
|
|
36
|
-
hideStats: "Hide stats",
|
|
37
35
|
oddsLabel: "Odds",
|
|
38
36
|
liveLabel: "Live",
|
|
39
37
|
marketFloorLabel: "Market price \xB7 not a value pick",
|
|
@@ -94,7 +92,6 @@ var STRINGS = {
|
|
|
94
92
|
liveFactAsk: "Ask about this",
|
|
95
93
|
liveFactEarlier: (n) => `Earlier facts (${n})`,
|
|
96
94
|
liveFactHideEarlier: "Hide earlier facts",
|
|
97
|
-
accordionValueLabel: "Value",
|
|
98
95
|
accordionRetry: "Couldn't load odds \u2014 tap to retry",
|
|
99
96
|
accordionSuspended: "Suspended",
|
|
100
97
|
tabToday: "Today",
|
|
@@ -333,8 +330,6 @@ var STRINGS = {
|
|
|
333
330
|
retry: "Tekrar dene",
|
|
334
331
|
showLess: "Daha az g\xF6ster",
|
|
335
332
|
showMore: (n) => `${n} tane daha g\xF6ster`,
|
|
336
|
-
showStats: "\u0130statistikleri g\xF6ster",
|
|
337
|
-
hideStats: "\u0130statistikleri gizle",
|
|
338
333
|
oddsLabel: "Oran",
|
|
339
334
|
liveLabel: "Canl\u0131",
|
|
340
335
|
marketFloorLabel: "Piyasa oran\u0131 \xB7 de\u011Fer bahsi de\u011Fil",
|
|
@@ -395,7 +390,6 @@ var STRINGS = {
|
|
|
395
390
|
liveFactAsk: "Bunu sor",
|
|
396
391
|
liveFactEarlier: (n) => `\xD6nceki bilgiler (${n})`,
|
|
397
392
|
liveFactHideEarlier: "\xD6nceki bilgileri gizle",
|
|
398
|
-
accordionValueLabel: "De\u011Fer",
|
|
399
393
|
accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
|
|
400
394
|
accordionSuspended: "Ask\u0131da",
|
|
401
395
|
tabToday: "Bug\xFCn",
|
|
@@ -662,8 +656,6 @@ function normalizeUi(cfg) {
|
|
|
662
656
|
retry: strings.retry,
|
|
663
657
|
showLess: strings.showLess,
|
|
664
658
|
showMore: strings.showMore,
|
|
665
|
-
showStats: strings.showStats,
|
|
666
|
-
hideStats: strings.hideStats,
|
|
667
659
|
oddsLabel: strings.oddsLabel,
|
|
668
660
|
liveLabel: strings.liveLabel,
|
|
669
661
|
marketFloorLabel: strings.marketFloorLabel,
|
|
@@ -724,7 +716,6 @@ function normalizeUi(cfg) {
|
|
|
724
716
|
liveFactAsk: strings.liveFactAsk,
|
|
725
717
|
liveFactEarlier: strings.liveFactEarlier,
|
|
726
718
|
liveFactHideEarlier: strings.liveFactHideEarlier,
|
|
727
|
-
accordionValueLabel: strings.accordionValueLabel,
|
|
728
719
|
accordionRetry: strings.accordionRetry,
|
|
729
720
|
accordionSuspended: strings.accordionSuspended,
|
|
730
721
|
tabGames: strings.tabGames,
|
|
@@ -815,10 +806,10 @@ function resultToToast(result, shownOdds, ui) {
|
|
|
815
806
|
}
|
|
816
807
|
|
|
817
808
|
// src/useHostEvents.ts
|
|
818
|
-
import { useCallback as useCallback4, useEffect as useEffect11, useMemo, useRef as useRef7, useState as
|
|
809
|
+
import { useCallback as useCallback4, useEffect as useEffect11, useMemo, useRef as useRef7, useState as useState32 } from "react";
|
|
819
810
|
|
|
820
811
|
// src/components/ChatPanel.tsx
|
|
821
|
-
import { useEffect as useEffect10, useState as
|
|
812
|
+
import { useEffect as useEffect10, useState as useState31 } from "react";
|
|
822
813
|
|
|
823
814
|
// src/components/ChatHeader.tsx
|
|
824
815
|
import { useEffect, useRef, useState as useState2 } from "react";
|
|
@@ -1078,16 +1069,6 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
1078
1069
|
] });
|
|
1079
1070
|
}
|
|
1080
1071
|
|
|
1081
|
-
// src/components/BettingInsightList.tsx
|
|
1082
|
-
import { useState as useState7 } from "react";
|
|
1083
|
-
|
|
1084
|
-
// src/eventLogContext.ts
|
|
1085
|
-
import { createContext, useContext } from "react";
|
|
1086
|
-
var EventLogContext = createContext(null);
|
|
1087
|
-
function useEventLog() {
|
|
1088
|
-
return useContext(EventLogContext);
|
|
1089
|
-
}
|
|
1090
|
-
|
|
1091
1072
|
// src/components/AddToSlipButton.tsx
|
|
1092
1073
|
import { useCallback, useState as useState4 } from "react";
|
|
1093
1074
|
import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
|
|
@@ -1211,7 +1192,6 @@ function toInsightVM(insight) {
|
|
|
1211
1192
|
const away = str(insight.awayTeamName);
|
|
1212
1193
|
const fixture = home && away ? `${home} vs ${away}` : void 0;
|
|
1213
1194
|
const competition = str(insight.competitionName);
|
|
1214
|
-
const scopes = Array.isArray(insight.scopes) ? insight.scopes.map((s) => ({ key: str(s.key), label: str(s.label), stats: readStatCells(s.stats) })).filter((s) => !!s.key && !!s.label) : void 0;
|
|
1215
1195
|
const previousValue = insight.odds?.previousValue;
|
|
1216
1196
|
const previous = typeof previousValue === "number" && Number.isFinite(previousValue) ? previousValue : void 0;
|
|
1217
1197
|
const direction = insight.odds?.movementDirection === "shortened" || insight.odds?.movementDirection === "drifted" ? insight.odds.movementDirection : void 0;
|
|
@@ -1226,9 +1206,7 @@ function toInsightVM(insight) {
|
|
|
1226
1206
|
phase: str(insight.phase),
|
|
1227
1207
|
fixture,
|
|
1228
1208
|
competition,
|
|
1229
|
-
scopes,
|
|
1230
1209
|
text: str(insight.text) ?? "",
|
|
1231
|
-
stats: readStatCells(insight.stats),
|
|
1232
1210
|
disclaimer: str(insight.disclaimer),
|
|
1233
1211
|
matchId: typeof insight.matchId === "number" ? insight.matchId : 0,
|
|
1234
1212
|
matchOddsId,
|
|
@@ -1365,6 +1343,13 @@ function marketOddsRowToSlipSelection(vm, row, conversationId) {
|
|
|
1365
1343
|
return selection;
|
|
1366
1344
|
}
|
|
1367
1345
|
|
|
1346
|
+
// src/eventLogContext.ts
|
|
1347
|
+
import { createContext, useContext } from "react";
|
|
1348
|
+
var EventLogContext = createContext(null);
|
|
1349
|
+
function useEventLog() {
|
|
1350
|
+
return useContext(EventLogContext);
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1368
1353
|
// src/slipStateContext.ts
|
|
1369
1354
|
import { createContext as createContext2, useContext as useContext2 } from "react";
|
|
1370
1355
|
var SlipStateContext = createContext2(null);
|
|
@@ -1726,55 +1711,11 @@ function MatchLink({ matchId, home, away, detail, className, as: Tag = "span", c
|
|
|
1726
1711
|
|
|
1727
1712
|
// src/components/BettingInsightList.tsx
|
|
1728
1713
|
import { Fragment, jsx as jsx12, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
1729
|
-
function
|
|
1730
|
-
|
|
1731
|
-
/* @__PURE__ */ jsx12("span", { className: "ss-w-bi-row-lbl", children: s.label }),
|
|
1732
|
-
/* @__PURE__ */ jsx12("span", { className: "ss-w-bi-row-num", children: s.value })
|
|
1733
|
-
] }, `${s.label}:${s.value}`)) });
|
|
1734
|
-
}
|
|
1735
|
-
function ScopedStats({ scopes }) {
|
|
1736
|
-
const [active, setActive] = useState7(0);
|
|
1737
|
-
const current = scopes[active] ?? scopes[0] ?? { key: "", label: "", stats: [] };
|
|
1738
|
-
return /* @__PURE__ */ jsxs7("div", { className: "ss-w-bi-scoped", children: [
|
|
1739
|
-
/* @__PURE__ */ jsx12("div", { className: "ss-w-bi-scopes", role: "group", children: scopes.map((s, i) => /* @__PURE__ */ jsx12("button", { type: "button", className: "ss-w-bi-chip", "aria-pressed": i === active, onClick: () => setActive(i), children: s.label }, s.key)) }),
|
|
1740
|
-
/* @__PURE__ */ jsx12(StatRows, { stats: current.stats }, current.key)
|
|
1741
|
-
] });
|
|
1742
|
-
}
|
|
1743
|
-
function hasStatsContent(it) {
|
|
1744
|
-
return !!it.scopes && it.scopes.length >= 2 || it.stats.length > 0;
|
|
1745
|
-
}
|
|
1746
|
-
function ReasonStrip({ it, ui }) {
|
|
1747
|
-
const [open, setOpen] = useState7(false);
|
|
1748
|
-
const log = useEventLog();
|
|
1749
|
-
const hasScopes = !!it.scopes && it.scopes.length >= 2;
|
|
1750
|
-
const hasStats = hasStatsContent(it);
|
|
1751
|
-
const hasText = !!it.text;
|
|
1752
|
-
if (!hasText && !hasStats) return null;
|
|
1753
|
-
const expandable = hasStats || (it.text?.length ?? 0) > 90;
|
|
1754
|
-
const onToggle = () => {
|
|
1755
|
-
setOpen((v) => {
|
|
1756
|
-
const next = !v;
|
|
1757
|
-
if (next) log?.log({ name: "insight_expand", entityType: "match", entityId: String(it.matchId) });
|
|
1758
|
-
return next;
|
|
1759
|
-
});
|
|
1760
|
-
};
|
|
1714
|
+
function ReasonStrip({ it }) {
|
|
1715
|
+
if (!it.text) return null;
|
|
1761
1716
|
return /* @__PURE__ */ jsxs7("div", { className: "ss-w-bi-reason", children: [
|
|
1762
1717
|
/* @__PURE__ */ jsx12("span", { className: "ss-w-bi-chart", "aria-hidden": "true" }),
|
|
1763
|
-
/* @__PURE__ */
|
|
1764
|
-
hasText ? /* @__PURE__ */ jsx12("p", { className: `ss-w-bi-text${open ? "" : " ss-w-bi-text-clamp"}`, children: it.text }) : null,
|
|
1765
|
-
open && hasStats ? hasScopes ? /* @__PURE__ */ jsx12(ScopedStats, { scopes: it.scopes }) : /* @__PURE__ */ jsx12(StatRows, { stats: it.stats }) : null
|
|
1766
|
-
] }),
|
|
1767
|
-
expandable ? /* @__PURE__ */ jsx12(
|
|
1768
|
-
"button",
|
|
1769
|
-
{
|
|
1770
|
-
type: "button",
|
|
1771
|
-
className: "ss-w-bi-expand",
|
|
1772
|
-
"aria-expanded": open,
|
|
1773
|
-
"aria-label": open ? ui?.hideStats ?? "Hide stats" : ui?.showStats ?? "Show stats",
|
|
1774
|
-
onClick: onToggle,
|
|
1775
|
-
children: /* @__PURE__ */ jsx12("span", { className: `ss-w-bi-arrow${open ? " ss-w-bi-arrow-open" : ""}`, "aria-hidden": "true" })
|
|
1776
|
-
}
|
|
1777
|
-
) : null
|
|
1718
|
+
/* @__PURE__ */ jsx12("p", { className: "ss-w-bi-text", children: it.text })
|
|
1778
1719
|
] });
|
|
1779
1720
|
}
|
|
1780
1721
|
function CardFixture({ it }) {
|
|
@@ -1854,7 +1795,7 @@ function InsightCard({ it, ui, slip, monitor }) {
|
|
|
1854
1795
|
] })
|
|
1855
1796
|
] }),
|
|
1856
1797
|
it.isMarketFloor ? /* @__PURE__ */ jsx12("span", { className: "ss-w-bi-floor", children: ui?.marketFloorLabel ?? "Market price \xB7 not a value pick" }) : null,
|
|
1857
|
-
/* @__PURE__ */ jsx12(ReasonStrip, { it
|
|
1798
|
+
/* @__PURE__ */ jsx12(ReasonStrip, { it }),
|
|
1858
1799
|
it.disclaimer ? /* @__PURE__ */ jsx12("p", { className: "ss-w-bi-disc", children: it.disclaimer }) : null
|
|
1859
1800
|
] });
|
|
1860
1801
|
}
|
|
@@ -1864,7 +1805,7 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
1864
1805
|
}
|
|
1865
1806
|
|
|
1866
1807
|
// src/components/MarketOddsCardList.tsx
|
|
1867
|
-
import { useState as
|
|
1808
|
+
import { useState as useState7 } from "react";
|
|
1868
1809
|
import { Fragment as Fragment2, jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1869
1810
|
function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
1870
1811
|
const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
|
|
@@ -1881,7 +1822,7 @@ function OddsRow({ vm, row, ui, slip, inSlipIds }) {
|
|
|
1881
1822
|
] });
|
|
1882
1823
|
}
|
|
1883
1824
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
1884
|
-
const [open, setOpen] =
|
|
1825
|
+
const [open, setOpen] = useState7(false);
|
|
1885
1826
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
1886
1827
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
1887
1828
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
@@ -2214,7 +2155,7 @@ function FixtureCard({ card }) {
|
|
|
2214
2155
|
}
|
|
2215
2156
|
|
|
2216
2157
|
// src/components/dashboard/CountdownCard.tsx
|
|
2217
|
-
import { Fragment as Fragment6, useEffect as useEffect3, useState as
|
|
2158
|
+
import { Fragment as Fragment6, useEffect as useEffect3, useState as useState8 } from "react";
|
|
2218
2159
|
import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2219
2160
|
var DAY_MS = 864e5;
|
|
2220
2161
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -2233,8 +2174,8 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
2233
2174
|
function CountdownCard({ card }) {
|
|
2234
2175
|
const { data } = card;
|
|
2235
2176
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
2236
|
-
const [nowMs, setNowMs] =
|
|
2237
|
-
const [reduced] =
|
|
2177
|
+
const [nowMs, setNowMs] = useState8(() => Date.now());
|
|
2178
|
+
const [reduced] = useState8(
|
|
2238
2179
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
2239
2180
|
);
|
|
2240
2181
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
@@ -2257,7 +2198,7 @@ function CountdownCard({ card }) {
|
|
|
2257
2198
|
}
|
|
2258
2199
|
|
|
2259
2200
|
// src/components/dashboard/InjuriesCard.tsx
|
|
2260
|
-
import { useState as
|
|
2201
|
+
import { useState as useState9 } from "react";
|
|
2261
2202
|
import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
2262
2203
|
var SHOWN = 3;
|
|
2263
2204
|
function ColHead({ name, crestUrl }) {
|
|
@@ -2280,7 +2221,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
2280
2221
|
}
|
|
2281
2222
|
function InjuriesCard({ card, ui }) {
|
|
2282
2223
|
const { data } = card;
|
|
2283
|
-
const [expanded, setExpanded] =
|
|
2224
|
+
const [expanded, setExpanded] = useState9(false);
|
|
2284
2225
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
2285
2226
|
const limit = expanded ? void 0 : SHOWN;
|
|
2286
2227
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
@@ -2386,7 +2327,7 @@ function LinksCard({ card }) {
|
|
|
2386
2327
|
}
|
|
2387
2328
|
|
|
2388
2329
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
2389
|
-
import { useState as
|
|
2330
|
+
import { useState as useState10 } from "react";
|
|
2390
2331
|
import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2391
2332
|
function initials3(name) {
|
|
2392
2333
|
return name.trim().slice(0, 3).toUpperCase();
|
|
@@ -2396,7 +2337,7 @@ function PostMatchCrest({
|
|
|
2396
2337
|
name,
|
|
2397
2338
|
side
|
|
2398
2339
|
}) {
|
|
2399
|
-
const [failed, setFailed] =
|
|
2340
|
+
const [failed, setFailed] = useState10(false);
|
|
2400
2341
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
2401
2342
|
if (url && !failed) {
|
|
2402
2343
|
return /* @__PURE__ */ jsx26("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -2595,10 +2536,10 @@ function RestingFormCard({ card }) {
|
|
|
2595
2536
|
}
|
|
2596
2537
|
|
|
2597
2538
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
2598
|
-
import { useRef as useRef2, useState as
|
|
2539
|
+
import { useRef as useRef2, useState as useState12 } from "react";
|
|
2599
2540
|
|
|
2600
2541
|
// src/useLiveClock.ts
|
|
2601
|
-
import { useEffect as useEffect4, useState as
|
|
2542
|
+
import { useEffect as useEffect4, useState as useState11 } from "react";
|
|
2602
2543
|
var TICK_MS = 6e4;
|
|
2603
2544
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
2604
2545
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -2607,7 +2548,7 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
2607
2548
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
2608
2549
|
}
|
|
2609
2550
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
2610
|
-
const [displayMinute, setDisplayMinute] =
|
|
2551
|
+
const [displayMinute, setDisplayMinute] = useState11(
|
|
2611
2552
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
2612
2553
|
);
|
|
2613
2554
|
useEffect4(() => {
|
|
@@ -2627,7 +2568,7 @@ function initials5(name) {
|
|
|
2627
2568
|
return name.trim().slice(0, 3).toUpperCase();
|
|
2628
2569
|
}
|
|
2629
2570
|
function LiveCrest({ url, name, side }) {
|
|
2630
|
-
const [failed, setFailed] =
|
|
2571
|
+
const [failed, setFailed] = useState12(false);
|
|
2631
2572
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
2632
2573
|
if (url && !failed) {
|
|
2633
2574
|
return /* @__PURE__ */ jsx35("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -2686,7 +2627,7 @@ function LiveScoreCard({
|
|
|
2686
2627
|
}
|
|
2687
2628
|
|
|
2688
2629
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
2689
|
-
import { useState as
|
|
2630
|
+
import { useState as useState13 } from "react";
|
|
2690
2631
|
import { jsx as jsx36, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2691
2632
|
var SHOWN2 = 3;
|
|
2692
2633
|
function EventIcon({ type }) {
|
|
@@ -2728,7 +2669,7 @@ function EventRow({ e }) {
|
|
|
2728
2669
|
] });
|
|
2729
2670
|
}
|
|
2730
2671
|
function LiveTimelineCard({ card, ui }) {
|
|
2731
|
-
const [expanded, setExpanded] =
|
|
2672
|
+
const [expanded, setExpanded] = useState13(false);
|
|
2732
2673
|
const events = card.data.events;
|
|
2733
2674
|
if (!events || events.length === 0) return null;
|
|
2734
2675
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -3028,10 +2969,10 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
3028
2969
|
}
|
|
3029
2970
|
|
|
3030
2971
|
// src/components/ChatInput.tsx
|
|
3031
|
-
import { useState as
|
|
2972
|
+
import { useState as useState14 } from "react";
|
|
3032
2973
|
import { jsx as jsx43, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
3033
2974
|
function ChatInput({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message" }) {
|
|
3034
|
-
const [value, setValue] =
|
|
2975
|
+
const [value, setValue] = useState14("");
|
|
3035
2976
|
const submit = () => {
|
|
3036
2977
|
const t = value.trim();
|
|
3037
2978
|
if (!t) return;
|
|
@@ -3133,11 +3074,7 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
3133
3074
|
children: ui.accordionRetry
|
|
3134
3075
|
}
|
|
3135
3076
|
),
|
|
3136
|
-
entry?.block?.insight?.text && /* @__PURE__ */
|
|
3137
|
-
/* @__PURE__ */ jsx45("span", { className: "ss-w-acc-badge", children: ui.accordionValueLabel }),
|
|
3138
|
-
" ",
|
|
3139
|
-
entry.block.insight.text
|
|
3140
|
-
] }),
|
|
3077
|
+
entry?.block?.insight?.text && /* @__PURE__ */ jsx45("div", { className: "ss-w-acc-insight", children: entry.block.insight.text }),
|
|
3141
3078
|
entry?.block?.card && /* @__PURE__ */ jsx45(
|
|
3142
3079
|
MarketOddsCardList,
|
|
3143
3080
|
{
|
|
@@ -3155,10 +3092,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
3155
3092
|
}
|
|
3156
3093
|
|
|
3157
3094
|
// src/components/LiveFactBlock.tsx
|
|
3158
|
-
import { useState as
|
|
3095
|
+
import { useState as useState15 } from "react";
|
|
3159
3096
|
import { jsx as jsx46, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
3160
3097
|
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
3161
|
-
const [expanded, setExpanded] =
|
|
3098
|
+
const [expanded, setExpanded] = useState15(false);
|
|
3162
3099
|
const [current, ...earlier] = facts;
|
|
3163
3100
|
if (!current) return null;
|
|
3164
3101
|
const m = current.market;
|
|
@@ -3545,7 +3482,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
3545
3482
|
}
|
|
3546
3483
|
|
|
3547
3484
|
// src/components/GamesPanel.tsx
|
|
3548
|
-
import { useEffect as useEffect9, useState as
|
|
3485
|
+
import { useEffect as useEffect9, useState as useState29 } from "react";
|
|
3549
3486
|
|
|
3550
3487
|
// src/components/GamesLoginWall.tsx
|
|
3551
3488
|
import { jsx as jsx52 } from "react/jsx-runtime";
|
|
@@ -3554,7 +3491,7 @@ function GamesLoginWall({ ui }) {
|
|
|
3554
3491
|
}
|
|
3555
3492
|
|
|
3556
3493
|
// src/components/GamesHub.tsx
|
|
3557
|
-
import { useEffect as useEffect6, useState as
|
|
3494
|
+
import { useEffect as useEffect6, useState as useState16 } from "react";
|
|
3558
3495
|
|
|
3559
3496
|
// src/components/games/ui/gameMeta.ts
|
|
3560
3497
|
function prettifyGameId(gameId) {
|
|
@@ -3739,7 +3676,7 @@ function pickHeroGame(games) {
|
|
|
3739
3676
|
}
|
|
3740
3677
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
3741
3678
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
3742
|
-
const [, setTick] =
|
|
3679
|
+
const [, setTick] = useState16(0);
|
|
3743
3680
|
useEffect6(() => {
|
|
3744
3681
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
3745
3682
|
return () => clearInterval(id);
|
|
@@ -3800,10 +3737,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
3800
3737
|
}
|
|
3801
3738
|
|
|
3802
3739
|
// src/components/GameScreenHost.tsx
|
|
3803
|
-
import { useEffect as useEffect8, useRef as useRef6, useState as
|
|
3740
|
+
import { useEffect as useEffect8, useRef as useRef6, useState as useState28 } from "react";
|
|
3804
3741
|
|
|
3805
3742
|
// src/useGamePlay.ts
|
|
3806
|
-
import { useCallback as useCallback3, useRef as useRef4, useState as
|
|
3743
|
+
import { useCallback as useCallback3, useRef as useRef4, useState as useState17 } from "react";
|
|
3807
3744
|
function toSubmitResult(payload) {
|
|
3808
3745
|
return {
|
|
3809
3746
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -3815,9 +3752,9 @@ function toSubmitResult(payload) {
|
|
|
3815
3752
|
};
|
|
3816
3753
|
}
|
|
3817
3754
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
3818
|
-
const [result, setResult] =
|
|
3819
|
-
const [submitting, setSubmitting] =
|
|
3820
|
-
const [rawStatus, setRawStatus] =
|
|
3755
|
+
const [result, setResult] = useState17(null);
|
|
3756
|
+
const [submitting, setSubmitting] = useState17(false);
|
|
3757
|
+
const [rawStatus, setRawStatus] = useState17(null);
|
|
3821
3758
|
const inFlightRef = useRef4(false);
|
|
3822
3759
|
const convRef = useRef4(conversation);
|
|
3823
3760
|
convRef.current = conversation;
|
|
@@ -3875,7 +3812,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
3875
3812
|
}
|
|
3876
3813
|
|
|
3877
3814
|
// src/components/games/MysteryTigerGame.tsx
|
|
3878
|
-
import { useState as
|
|
3815
|
+
import { useState as useState19, useId as useId2 } from "react";
|
|
3879
3816
|
|
|
3880
3817
|
// src/components/games/nationFlags.ts
|
|
3881
3818
|
var FLAGS = {
|
|
@@ -4086,7 +4023,7 @@ function isNationCode(flag) {
|
|
|
4086
4023
|
}
|
|
4087
4024
|
|
|
4088
4025
|
// src/components/games/PlayerAvatar.tsx
|
|
4089
|
-
import { useState as
|
|
4026
|
+
import { useState as useState18 } from "react";
|
|
4090
4027
|
import { jsx as jsx58 } from "react/jsx-runtime";
|
|
4091
4028
|
function initialsOf(name) {
|
|
4092
4029
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
@@ -4104,7 +4041,7 @@ function PlayerAvatar({
|
|
|
4104
4041
|
imagePath,
|
|
4105
4042
|
className
|
|
4106
4043
|
}) {
|
|
4107
|
-
const [failed, setFailed] =
|
|
4044
|
+
const [failed, setFailed] = useState18(false);
|
|
4108
4045
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
4109
4046
|
return /* @__PURE__ */ jsx58("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx58("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx58("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
4110
4047
|
}
|
|
@@ -4319,7 +4256,7 @@ function MysteryTigerGame({
|
|
|
4319
4256
|
onBack
|
|
4320
4257
|
}) {
|
|
4321
4258
|
const t = ui.games.mysteryTiger;
|
|
4322
|
-
const [query, setQuery] =
|
|
4259
|
+
const [query, setQuery] = useState19("");
|
|
4323
4260
|
const inputId = useId2();
|
|
4324
4261
|
const clientState = parseClientState(result?.clientStateJson);
|
|
4325
4262
|
const guessResults = clientState?.guessResults ?? [];
|
|
@@ -4595,13 +4532,13 @@ function HigherOrLowerGame({
|
|
|
4595
4532
|
}
|
|
4596
4533
|
|
|
4597
4534
|
// src/components/games/CareerPathGame.tsx
|
|
4598
|
-
import { useState as
|
|
4535
|
+
import { useState as useState21, useId as useId3 } from "react";
|
|
4599
4536
|
|
|
4600
4537
|
// src/components/games/ui/CrestShield.tsx
|
|
4601
|
-
import { useState as
|
|
4538
|
+
import { useState as useState20 } from "react";
|
|
4602
4539
|
import { jsx as jsx69 } from "react/jsx-runtime";
|
|
4603
4540
|
function CrestShield({ src, name, size = 28 }) {
|
|
4604
|
-
const [failed, setFailed] =
|
|
4541
|
+
const [failed, setFailed] = useState20(false);
|
|
4605
4542
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
4606
4543
|
return /* @__PURE__ */ jsx69("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
4607
4544
|
}
|
|
@@ -4633,7 +4570,7 @@ function CareerPathGame({
|
|
|
4633
4570
|
}) {
|
|
4634
4571
|
const s = ui.games.careerPath;
|
|
4635
4572
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
4636
|
-
const [query, setQuery] =
|
|
4573
|
+
const [query, setQuery] = useState21("");
|
|
4637
4574
|
const inputId = useId3();
|
|
4638
4575
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
4639
4576
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
@@ -4753,7 +4690,7 @@ function CareerPathGame({
|
|
|
4753
4690
|
}
|
|
4754
4691
|
|
|
4755
4692
|
// src/components/games/BeatTheGridGame.tsx
|
|
4756
|
-
import React, { useEffect as useEffect7, useId as useId4, useRef as useRef5, useState as
|
|
4693
|
+
import React, { useEffect as useEffect7, useId as useId4, useRef as useRef5, useState as useState22 } from "react";
|
|
4757
4694
|
import { Fragment as Fragment14, jsx as jsx71, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
4758
4695
|
function criterionIconKind(label, key) {
|
|
4759
4696
|
const l = (key ?? label).toLowerCase();
|
|
@@ -4834,7 +4771,7 @@ function SearchSheet({
|
|
|
4834
4771
|
ui
|
|
4835
4772
|
}) {
|
|
4836
4773
|
const s = ui.games.beatTheGrid;
|
|
4837
|
-
const [query, setQuery] =
|
|
4774
|
+
const [query, setQuery] = useState22("");
|
|
4838
4775
|
const inputId = useId4();
|
|
4839
4776
|
const inputRef = useRef5(null);
|
|
4840
4777
|
useEffect7(() => {
|
|
@@ -4902,7 +4839,7 @@ function BeatTheGridGame({
|
|
|
4902
4839
|
}) {
|
|
4903
4840
|
const s = ui.games.beatTheGrid;
|
|
4904
4841
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
4905
|
-
const [activeCell, setActiveCell] =
|
|
4842
|
+
const [activeCell, setActiveCell] = useState22(null);
|
|
4906
4843
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
4907
4844
|
const filledCells = clientState?.cells ?? [];
|
|
4908
4845
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -5057,7 +4994,7 @@ function BeatTheGridGame({
|
|
|
5057
4994
|
}
|
|
5058
4995
|
|
|
5059
4996
|
// src/components/games/GuessTheXiGame.tsx
|
|
5060
|
-
import { useState as
|
|
4997
|
+
import { useState as useState23, useId as useId5 } from "react";
|
|
5061
4998
|
|
|
5062
4999
|
// src/components/games/ui/PitchSvg.tsx
|
|
5063
5000
|
import { Fragment as Fragment15, jsx as jsx72, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
@@ -5146,7 +5083,7 @@ function GuessTheXiGame({
|
|
|
5146
5083
|
onBack
|
|
5147
5084
|
}) {
|
|
5148
5085
|
const t = ui.games.guessTheXi;
|
|
5149
|
-
const [query, setQuery] =
|
|
5086
|
+
const [query, setQuery] = useState23("");
|
|
5150
5087
|
const inputId = useId5();
|
|
5151
5088
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
5152
5089
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
@@ -5288,7 +5225,7 @@ function GuessTheXiGame({
|
|
|
5288
5225
|
}
|
|
5289
5226
|
|
|
5290
5227
|
// src/components/games/DailyQuizGame.tsx
|
|
5291
|
-
import { useState as
|
|
5228
|
+
import { useState as useState24 } from "react";
|
|
5292
5229
|
import { Fragment as Fragment17, jsx as jsx74, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
5293
5230
|
function parseClientState6(json) {
|
|
5294
5231
|
if (!json) return null;
|
|
@@ -5329,8 +5266,8 @@ function DailyQuizGame({
|
|
|
5329
5266
|
}) {
|
|
5330
5267
|
const s = ui.games.dailyQuiz;
|
|
5331
5268
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
5332
|
-
const [selections, setSelections] =
|
|
5333
|
-
const [page, setPage] =
|
|
5269
|
+
const [selections, setSelections] = useState24(/* @__PURE__ */ new Map());
|
|
5270
|
+
const [page, setPage] = useState24(0);
|
|
5334
5271
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
5335
5272
|
const results = clientState?.results ?? [];
|
|
5336
5273
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
@@ -5440,7 +5377,7 @@ function DailyQuizGame({
|
|
|
5440
5377
|
}
|
|
5441
5378
|
|
|
5442
5379
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
5443
|
-
import { useId as useId6, useState as
|
|
5380
|
+
import { useId as useId6, useState as useState25 } from "react";
|
|
5444
5381
|
import { jsx as jsx75, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
5445
5382
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
5446
5383
|
function parseClientState7(json) {
|
|
@@ -5536,11 +5473,11 @@ function MatchdayPredictorGame({
|
|
|
5536
5473
|
onBack
|
|
5537
5474
|
}) {
|
|
5538
5475
|
const t = ui.games.predictor;
|
|
5539
|
-
const [homeScore, setHomeScore] =
|
|
5540
|
-
const [awayScore, setAwayScore] =
|
|
5541
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] =
|
|
5542
|
-
const [lastEdited, setLastEdited] =
|
|
5543
|
-
const [query, setQuery] =
|
|
5476
|
+
const [homeScore, setHomeScore] = useState25(0);
|
|
5477
|
+
const [awayScore, setAwayScore] = useState25(0);
|
|
5478
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = useState25(null);
|
|
5479
|
+
const [lastEdited, setLastEdited] = useState25("home");
|
|
5480
|
+
const [query, setQuery] = useState25("");
|
|
5544
5481
|
const searchId = useId6();
|
|
5545
5482
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
5546
5483
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -5708,7 +5645,7 @@ function MatchdayPredictorGame({
|
|
|
5708
5645
|
}
|
|
5709
5646
|
|
|
5710
5647
|
// src/components/games/StartingXiGame.tsx
|
|
5711
|
-
import { useId as useId7, useState as
|
|
5648
|
+
import { useId as useId7, useState as useState26 } from "react";
|
|
5712
5649
|
import { Fragment as Fragment18, jsx as jsx76, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
5713
5650
|
var POINTS_PER_STARTER = 8;
|
|
5714
5651
|
var XI_SIZE = 11;
|
|
@@ -5752,9 +5689,9 @@ function StartingXiGame({
|
|
|
5752
5689
|
lockAtUtc
|
|
5753
5690
|
}) {
|
|
5754
5691
|
const t = ui.games.startingXi;
|
|
5755
|
-
const [slotPlayers, setSlotPlayers] =
|
|
5756
|
-
const [active, setActive] =
|
|
5757
|
-
const [query, setQuery] =
|
|
5692
|
+
const [slotPlayers, setSlotPlayers] = useState26(() => Array(XI_SIZE).fill(null));
|
|
5693
|
+
const [active, setActive] = useState26(0);
|
|
5694
|
+
const [query, setQuery] = useState26("");
|
|
5758
5695
|
const searchId = useId7();
|
|
5759
5696
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
5760
5697
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -5894,7 +5831,7 @@ function StartingXiGame({
|
|
|
5894
5831
|
}
|
|
5895
5832
|
|
|
5896
5833
|
// src/components/games/StatLadderGame.tsx
|
|
5897
|
-
import { useId as useId8, useState as
|
|
5834
|
+
import { useId as useId8, useState as useState27 } from "react";
|
|
5898
5835
|
import { jsx as jsx77, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
5899
5836
|
function ladderClue(ladder) {
|
|
5900
5837
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
@@ -5931,8 +5868,8 @@ function StatLadderGame({
|
|
|
5931
5868
|
onBack
|
|
5932
5869
|
}) {
|
|
5933
5870
|
const t = ui.games.statLadder;
|
|
5934
|
-
const [query, setQuery] =
|
|
5935
|
-
const [selectedId, setSelectedId] =
|
|
5871
|
+
const [query, setQuery] = useState27("");
|
|
5872
|
+
const [selectedId, setSelectedId] = useState27(null);
|
|
5936
5873
|
const searchId = useId8();
|
|
5937
5874
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
5938
5875
|
const revealed = clientState != null;
|
|
@@ -6138,7 +6075,7 @@ function GameScreenHost({
|
|
|
6138
6075
|
ui
|
|
6139
6076
|
}) {
|
|
6140
6077
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
6141
|
-
const [configJson, setConfigJson] =
|
|
6078
|
+
const [configJson, setConfigJson] = useState28(null);
|
|
6142
6079
|
useEffect8(() => {
|
|
6143
6080
|
setConfigJson(null);
|
|
6144
6081
|
if (!conversation) return;
|
|
@@ -6302,7 +6239,7 @@ function GamesPanel({
|
|
|
6302
6239
|
leaderboard,
|
|
6303
6240
|
refreshHub
|
|
6304
6241
|
}) {
|
|
6305
|
-
const [selected, setSelected] =
|
|
6242
|
+
const [selected, setSelected] = useState29(null);
|
|
6306
6243
|
useEffect9(() => {
|
|
6307
6244
|
ensureGamesFonts();
|
|
6308
6245
|
}, []);
|
|
@@ -6334,7 +6271,7 @@ function GamesPanel({
|
|
|
6334
6271
|
}
|
|
6335
6272
|
|
|
6336
6273
|
// src/components/Leaderboard.tsx
|
|
6337
|
-
import { useState as
|
|
6274
|
+
import { useState as useState30 } from "react";
|
|
6338
6275
|
|
|
6339
6276
|
// src/components/LeaderboardRow.tsx
|
|
6340
6277
|
import { jsx as jsx81, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
@@ -6419,7 +6356,7 @@ function Leaderboard({
|
|
|
6419
6356
|
ui,
|
|
6420
6357
|
onPlay
|
|
6421
6358
|
}) {
|
|
6422
|
-
const [segment, setSegment] =
|
|
6359
|
+
const [segment, setSegment] = useState30("weekly");
|
|
6423
6360
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
6424
6361
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
6425
6362
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
@@ -6502,7 +6439,7 @@ function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
|
|
|
6502
6439
|
import { jsx as jsx85, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
6503
6440
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
6504
6441
|
function useIsModal() {
|
|
6505
|
-
const [modal, setModal] =
|
|
6442
|
+
const [modal, setModal] = useState31(false);
|
|
6506
6443
|
useEffect10(() => {
|
|
6507
6444
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
6508
6445
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
@@ -6803,8 +6740,8 @@ function toSlipEvent(name, entry) {
|
|
|
6803
6740
|
// src/useHostEvents.ts
|
|
6804
6741
|
function useHostEvents(opts) {
|
|
6805
6742
|
const { host, operatorId, currentUser, logger, isOpen, closePanel, onOpenMatch, openMatchLabel } = opts;
|
|
6806
|
-
const [added, setAdded] =
|
|
6807
|
-
const [settled, setSettled] =
|
|
6743
|
+
const [added, setAdded] = useState32({});
|
|
6744
|
+
const [settled, setSettled] = useState32({});
|
|
6808
6745
|
const markAdded = useCallback4((matchOddsId) => {
|
|
6809
6746
|
setAdded((prev) => prev[matchOddsId] ? prev : { ...prev, [matchOddsId]: true });
|
|
6810
6747
|
}, []);
|
|
@@ -7406,12 +7343,12 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
|
|
|
7406
7343
|
}
|
|
7407
7344
|
|
|
7408
7345
|
// src/useLiveMonitor.ts
|
|
7409
|
-
import { useCallback as useCallback6, useEffect as useEffect14, useRef as useRef10, useState as
|
|
7346
|
+
import { useCallback as useCallback6, useEffect as useEffect14, useRef as useRef10, useState as useState34 } from "react";
|
|
7410
7347
|
|
|
7411
7348
|
// src/useTabs.ts
|
|
7412
|
-
import { useState as
|
|
7349
|
+
import { useState as useState33 } from "react";
|
|
7413
7350
|
function useTabs(initial = "chat") {
|
|
7414
|
-
const [activeTab, setActiveTab] =
|
|
7351
|
+
const [activeTab, setActiveTab] = useState33(initial);
|
|
7415
7352
|
return { activeTab, setActiveTab };
|
|
7416
7353
|
}
|
|
7417
7354
|
|
|
@@ -7436,18 +7373,18 @@ function phaseForPin(snapshot, pin) {
|
|
|
7436
7373
|
}
|
|
7437
7374
|
function useLiveMonitor(opts) {
|
|
7438
7375
|
const sessionIdRef = useRef10(crypto.randomUUID());
|
|
7439
|
-
const [pins, setPins] =
|
|
7440
|
-
const [store] =
|
|
7441
|
-
const [enabled, setEnabled] =
|
|
7442
|
-
const [snapshot, setSnapshotState] =
|
|
7376
|
+
const [pins, setPins] = useState34([]);
|
|
7377
|
+
const [store] = useState34(() => createPinStore(opts.storageKey, sessionIdRef.current, setPins));
|
|
7378
|
+
const [enabled, setEnabled] = useState34(true);
|
|
7379
|
+
const [snapshot, setSnapshotState] = useState34(null);
|
|
7443
7380
|
const { activeTab, setActiveTab: setActiveTabState } = useTabs("chat");
|
|
7444
|
-
const [chatDot, setChatDot] =
|
|
7445
|
-
const [matchesDot, setMatchesDot] =
|
|
7446
|
-
const [oddsDot, setOddsDot] =
|
|
7447
|
-
const [todayDot, setTodayDot] =
|
|
7448
|
-
const [lastViewedPrices, setLastViewedPrices] =
|
|
7449
|
-
const [openMarket, setOpenMarket] =
|
|
7450
|
-
const [marketOdds, setMarketOdds] =
|
|
7381
|
+
const [chatDot, setChatDot] = useState34(false);
|
|
7382
|
+
const [matchesDot, setMatchesDot] = useState34(false);
|
|
7383
|
+
const [oddsDot, setOddsDot] = useState34(false);
|
|
7384
|
+
const [todayDot, setTodayDot] = useState34(false);
|
|
7385
|
+
const [lastViewedPrices, setLastViewedPrices] = useState34({});
|
|
7386
|
+
const [openMarket, setOpenMarket] = useState34({});
|
|
7387
|
+
const [marketOdds, setMarketOdds] = useState34({});
|
|
7451
7388
|
const pinsRef = useRef10(pins);
|
|
7452
7389
|
pinsRef.current = pins;
|
|
7453
7390
|
const activeTabRef = useRef10(activeTab);
|
|
@@ -7688,7 +7625,7 @@ function useLiveMonitor(opts) {
|
|
|
7688
7625
|
}
|
|
7689
7626
|
|
|
7690
7627
|
// src/useMatchDiscovery.ts
|
|
7691
|
-
import { useCallback as useCallback7, useEffect as useEffect15, useMemo as useMemo3, useRef as useRef11, useState as
|
|
7628
|
+
import { useCallback as useCallback7, useEffect as useEffect15, useMemo as useMemo3, useRef as useRef11, useState as useState35 } from "react";
|
|
7692
7629
|
|
|
7693
7630
|
// src/scheduleCache.ts
|
|
7694
7631
|
var PREFIX = "ss-w-schedule:";
|
|
@@ -7776,11 +7713,11 @@ function localDateOf(now) {
|
|
|
7776
7713
|
return `${y}-${m}-${d}`;
|
|
7777
7714
|
}
|
|
7778
7715
|
function useMatchDiscovery(opts) {
|
|
7779
|
-
const [groups, setGroups] =
|
|
7780
|
-
const [states, setStates] =
|
|
7781
|
-
const [failures, setFailures] =
|
|
7782
|
-
const [expanded, setExpanded] =
|
|
7783
|
-
const [touched, setTouched] =
|
|
7716
|
+
const [groups, setGroups] = useState35([]);
|
|
7717
|
+
const [states, setStates] = useState35({});
|
|
7718
|
+
const [failures, setFailures] = useState35(0);
|
|
7719
|
+
const [expanded, setExpanded] = useState35({});
|
|
7720
|
+
const [touched, setTouched] = useState35({});
|
|
7784
7721
|
const groupsRef = useRef11(groups);
|
|
7785
7722
|
groupsRef.current = groups;
|
|
7786
7723
|
const statesRef = useRef11(states);
|
|
@@ -7788,7 +7725,7 @@ function useMatchDiscovery(opts) {
|
|
|
7788
7725
|
const getStatesRef = useRef11(opts.getStates);
|
|
7789
7726
|
getStatesRef.current = opts.getStates;
|
|
7790
7727
|
const pinnedKey = opts.pinnedMatchIds.join(",");
|
|
7791
|
-
const [localDate, setLocalDate] =
|
|
7728
|
+
const [localDate, setLocalDate] = useState35(() => localDateOf(/* @__PURE__ */ new Date()));
|
|
7792
7729
|
useEffect15(() => {
|
|
7793
7730
|
const id = setInterval(() => {
|
|
7794
7731
|
const next = localDateOf(/* @__PURE__ */ new Date());
|
|
@@ -7869,17 +7806,17 @@ function useMatchDiscovery(opts) {
|
|
|
7869
7806
|
}
|
|
7870
7807
|
|
|
7871
7808
|
// src/useGames.ts
|
|
7872
|
-
import { useCallback as useCallback8, useEffect as useEffect16, useRef as useRef12, useState as
|
|
7809
|
+
import { useCallback as useCallback8, useEffect as useEffect16, useRef as useRef12, useState as useState36 } from "react";
|
|
7873
7810
|
var GAMES_POLL_MS = 6e4;
|
|
7874
7811
|
var DEFAULT_TZ = "Europe/London";
|
|
7875
7812
|
function computeGameDay(timezone) {
|
|
7876
7813
|
return new Intl.DateTimeFormat("en-CA", { timeZone: timezone }).format(/* @__PURE__ */ new Date());
|
|
7877
7814
|
}
|
|
7878
7815
|
function useGames(conversation, { activeTab, operatorTimezone }) {
|
|
7879
|
-
const [enabled, setEnabled] =
|
|
7880
|
-
const [games, setGames] =
|
|
7881
|
-
const [loading, setLoading] =
|
|
7882
|
-
const [refreshCount, setRefreshCount] =
|
|
7816
|
+
const [enabled, setEnabled] = useState36(false);
|
|
7817
|
+
const [games, setGames] = useState36([]);
|
|
7818
|
+
const [loading, setLoading] = useState36(false);
|
|
7819
|
+
const [refreshCount, setRefreshCount] = useState36(0);
|
|
7883
7820
|
const inFlightRef = useRef12(false);
|
|
7884
7821
|
const hardOffRef = useRef12(false);
|
|
7885
7822
|
const conversationRef = useRef12(conversation);
|
|
@@ -7937,11 +7874,11 @@ function useGames(conversation, { activeTab, operatorTimezone }) {
|
|
|
7937
7874
|
}
|
|
7938
7875
|
|
|
7939
7876
|
// src/useLeaderboard.ts
|
|
7940
|
-
import { useCallback as useCallback9, useEffect as useEffect17, useRef as useRef13, useState as
|
|
7877
|
+
import { useCallback as useCallback9, useEffect as useEffect17, useRef as useRef13, useState as useState37 } from "react";
|
|
7941
7878
|
function useLeaderboard(conversation, { activeTab }) {
|
|
7942
|
-
const [data, setData] =
|
|
7943
|
-
const [loading, setLoading] =
|
|
7944
|
-
const [refreshCount, setRefreshCount] =
|
|
7879
|
+
const [data, setData] = useState37(null);
|
|
7880
|
+
const [loading, setLoading] = useState37(false);
|
|
7881
|
+
const [refreshCount, setRefreshCount] = useState37(0);
|
|
7945
7882
|
const inFlightRef = useRef13(false);
|
|
7946
7883
|
const conversationRef = useRef13(conversation);
|
|
7947
7884
|
conversationRef.current = conversation;
|
|
@@ -7998,7 +7935,7 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
|
7998
7935
|
}
|
|
7999
7936
|
|
|
8000
7937
|
// src/components/ChatFab.tsx
|
|
8001
|
-
import { useEffect as useEffect19, useRef as useRef15, useState as
|
|
7938
|
+
import { useEffect as useEffect19, useRef as useRef15, useState as useState38 } from "react";
|
|
8002
7939
|
|
|
8003
7940
|
// src/components/GreetingBubble.tsx
|
|
8004
7941
|
import { jsx as jsx86, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
@@ -8020,7 +7957,7 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss" }) {
|
|
|
8020
7957
|
import { jsx as jsx87, jsxs as jsxs71 } from "react/jsx-runtime";
|
|
8021
7958
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart }) {
|
|
8022
7959
|
const bubble = popupText ?? greeting;
|
|
8023
|
-
const [intro, setIntro] =
|
|
7960
|
+
const [intro, setIntro] = useState38(false);
|
|
8024
7961
|
const armedRef = useRef15(introAllowed);
|
|
8025
7962
|
useEffect19(() => {
|
|
8026
7963
|
if (armedRef.current && bubble) {
|
|
@@ -8396,7 +8333,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8396
8333
|
.ss-w-bi-book { font-size: 9.5px; color: var(--ss-w-faint); }
|
|
8397
8334
|
.ss-w-bi-pick-row .ss-w-slip { flex: none; }
|
|
8398
8335
|
|
|
8399
|
-
/* row 3: bar-chart glyph + reasoning prose
|
|
8336
|
+
/* row 3: bar-chart glyph + reasoning prose, in a subtle strip */
|
|
8400
8337
|
.ss-w-bi-reason { display: flex; align-items: flex-start; gap: 8px; background: var(--ss-w-bubble); border-radius: 10px; padding: 8px 10px; }
|
|
8401
8338
|
.ss-w-bi-chart { flex: none; width: 13px; height: 12px; margin-top: 2px; opacity: .55;
|
|
8402
8339
|
background:
|
|
@@ -8405,23 +8342,8 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8405
8342
|
linear-gradient(var(--ss-w-accent), var(--ss-w-accent)) right / 3px 75% no-repeat;
|
|
8406
8343
|
background-position: left bottom, center bottom, right bottom;
|
|
8407
8344
|
}
|
|
8408
|
-
.ss-w-bi-
|
|
8409
|
-
.ss-w-bi-text { font-size: 12px; line-height: 1.45; color: var(--ss-w-ink); }
|
|
8410
|
-
.ss-w-bi-text-clamp { display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
|
8411
|
-
.ss-w-bi-expand { flex: none; align-self: center; display: grid; place-items: center; width: 22px; height: 22px; margin: -2px -4px -2px 0; background: none; border: none; color: var(--ss-w-faint); cursor: pointer; }
|
|
8412
|
-
.ss-w-bi-expand:hover { color: var(--ss-w-ink); }
|
|
8413
|
-
.ss-w-bi-arrow { width: 7px; height: 7px; border-right: 1.6px solid currentColor; border-top: 1.6px solid currentColor; transform: rotate(45deg); transition: transform .15s ease; }
|
|
8414
|
-
.ss-w-bi-arrow-open { transform: rotate(135deg); }
|
|
8415
|
-
.ss-w-bi-rows { display: flex; flex-direction: column; }
|
|
8416
|
-
.ss-w-bi-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 5px 0; border-top: 1px solid var(--ss-w-line); }
|
|
8417
|
-
.ss-w-bi-row:first-child { border-top: none; }
|
|
8418
|
-
.ss-w-bi-row-lbl { font-size: 11.5px; color: var(--ss-w-faint); min-width: 0; }
|
|
8419
|
-
.ss-w-bi-row-num { font-family: ui-monospace, monospace; font-weight: 700; font-variant-numeric: tabular-nums; font-size: 13px; flex: none; color: var(--ss-w-ink); }
|
|
8345
|
+
.ss-w-bi-text { flex: 1; min-width: 0; font-size: 12px; line-height: 1.45; color: var(--ss-w-ink); }
|
|
8420
8346
|
.ss-w-bi-disc { font-size: 10px; font-style: italic; color: var(--ss-w-faint); }
|
|
8421
|
-
.ss-w-bi-scoped { display: flex; flex-direction: column; gap: 8px; }
|
|
8422
|
-
.ss-w-bi-scopes { display: inline-flex; align-items: center; gap: 2px; flex-wrap: wrap; align-self: flex-start; background: var(--ss-w-bubble); border: 1px solid var(--ss-w-line); border-radius: 9px; padding: 2px; }
|
|
8423
|
-
.ss-w-bi-chip { font-size: 11px; font-weight: 600; border: none; border-radius: 7px; padding: 4px 10px; color: var(--ss-w-faint); background: none; cursor: pointer; }
|
|
8424
|
-
.ss-w-bi-chip[aria-pressed="true"] { color: var(--ss-w-ink); background: var(--ss-w-panel); box-shadow: 0 1px 2px rgba(0,0,0,.08); }
|
|
8425
8347
|
|
|
8426
8348
|
/* market odds card */
|
|
8427
8349
|
.ss-w-mocards { display: flex; flex-direction: column; gap: 7px; }
|
|
@@ -9578,7 +9500,7 @@ function StatsWidget(props) {
|
|
|
9578
9500
|
}, []);
|
|
9579
9501
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
9580
9502
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
9581
|
-
const [hasToday, setHasToday] =
|
|
9503
|
+
const [hasToday, setHasToday] = useState39(false);
|
|
9582
9504
|
const monitor = useLiveMonitor({
|
|
9583
9505
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
|
|
9584
9506
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|