@sensiblestats/widget-react 0.77.0 → 0.78.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 +237 -221
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +100 -84
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -37,7 +37,7 @@ __export(index_exports, {
|
|
|
37
37
|
module.exports = __toCommonJS(index_exports);
|
|
38
38
|
|
|
39
39
|
// src/StatsWidget.tsx
|
|
40
|
-
var
|
|
40
|
+
var import_react55 = require("react");
|
|
41
41
|
var import_widget_sdk5 = require("@sensiblestats/widget-sdk");
|
|
42
42
|
|
|
43
43
|
// src/kickoff.ts
|
|
@@ -3144,11 +3144,26 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
|
3144
3144
|
}, [log, dismissPopup]);
|
|
3145
3145
|
}
|
|
3146
3146
|
|
|
3147
|
+
// src/openTelemetry.ts
|
|
3148
|
+
var import_react12 = require("react");
|
|
3149
|
+
function useOpenTelemetry(log, isOpen) {
|
|
3150
|
+
const openLoggedRef = (0, import_react12.useRef)(false);
|
|
3151
|
+
(0, import_react12.useEffect)(() => {
|
|
3152
|
+
if (!isOpen) {
|
|
3153
|
+
openLoggedRef.current = false;
|
|
3154
|
+
return;
|
|
3155
|
+
}
|
|
3156
|
+
if (openLoggedRef.current || !log) return;
|
|
3157
|
+
openLoggedRef.current = true;
|
|
3158
|
+
log.log({ name: "widget_open" });
|
|
3159
|
+
}, [log, isOpen]);
|
|
3160
|
+
}
|
|
3161
|
+
|
|
3147
3162
|
// src/components/ChatFab.tsx
|
|
3148
|
-
var
|
|
3163
|
+
var import_react14 = require("react");
|
|
3149
3164
|
|
|
3150
3165
|
// src/components/BrandMark.tsx
|
|
3151
|
-
var
|
|
3166
|
+
var import_react13 = require("react");
|
|
3152
3167
|
|
|
3153
3168
|
// src/assets/logo.ts
|
|
3154
3169
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
@@ -3211,7 +3226,7 @@ function DashboardIcon({ name }) {
|
|
|
3211
3226
|
// src/components/BrandMark.tsx
|
|
3212
3227
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
3213
3228
|
function BrandMark({ logoUrl, className }) {
|
|
3214
|
-
const [failed, setFailed] = (0,
|
|
3229
|
+
const [failed, setFailed] = (0, import_react13.useState)(false);
|
|
3215
3230
|
if (!logoUrl || failed) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SsMark, { className });
|
|
3216
3231
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3217
3232
|
}
|
|
@@ -3247,9 +3262,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
|
|
|
3247
3262
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
3248
3263
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
|
|
3249
3264
|
const bubble = popupText ?? greeting;
|
|
3250
|
-
const [intro, setIntro] = (0,
|
|
3251
|
-
const armedRef = (0,
|
|
3252
|
-
(0,
|
|
3265
|
+
const [intro, setIntro] = (0, import_react14.useState)(false);
|
|
3266
|
+
const armedRef = (0, import_react14.useRef)(introAllowed);
|
|
3267
|
+
(0, import_react14.useEffect)(() => {
|
|
3253
3268
|
if (armedRef.current && bubble) {
|
|
3254
3269
|
armedRef.current = false;
|
|
3255
3270
|
setIntro(true);
|
|
@@ -3263,10 +3278,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
3263
3278
|
}
|
|
3264
3279
|
|
|
3265
3280
|
// src/components/ChatPanel.tsx
|
|
3266
|
-
var
|
|
3281
|
+
var import_react54 = require("react");
|
|
3267
3282
|
|
|
3268
3283
|
// src/components/ChatHeader.tsx
|
|
3269
|
-
var
|
|
3284
|
+
var import_react15 = require("react");
|
|
3270
3285
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
3271
3286
|
function ChatHeader({
|
|
3272
3287
|
onClose,
|
|
@@ -3278,15 +3293,15 @@ function ChatHeader({
|
|
|
3278
3293
|
newConversationLabel = "New conversation",
|
|
3279
3294
|
moreOptionsLabel = "More options"
|
|
3280
3295
|
}) {
|
|
3281
|
-
const [menuOpen, setMenuOpen] = (0,
|
|
3282
|
-
const wrapRef = (0,
|
|
3283
|
-
const kebabRef = (0,
|
|
3284
|
-
const firstItemRef = (0,
|
|
3296
|
+
const [menuOpen, setMenuOpen] = (0, import_react15.useState)(false);
|
|
3297
|
+
const wrapRef = (0, import_react15.useRef)(null);
|
|
3298
|
+
const kebabRef = (0, import_react15.useRef)(null);
|
|
3299
|
+
const firstItemRef = (0, import_react15.useRef)(null);
|
|
3285
3300
|
const hasMenu = !!(canReset && onNewConversation);
|
|
3286
|
-
(0,
|
|
3301
|
+
(0, import_react15.useEffect)(() => {
|
|
3287
3302
|
if (menuOpen) firstItemRef.current?.focus();
|
|
3288
3303
|
}, [menuOpen]);
|
|
3289
|
-
(0,
|
|
3304
|
+
(0, import_react15.useEffect)(() => {
|
|
3290
3305
|
if (!menuOpen) return;
|
|
3291
3306
|
const onPointer = (e) => {
|
|
3292
3307
|
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
@@ -3342,7 +3357,7 @@ function ChatHeader({
|
|
|
3342
3357
|
}
|
|
3343
3358
|
|
|
3344
3359
|
// src/components/MessageList.tsx
|
|
3345
|
-
var
|
|
3360
|
+
var import_react33 = require("react");
|
|
3346
3361
|
|
|
3347
3362
|
// src/components/Markdown.tsx
|
|
3348
3363
|
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
@@ -3360,7 +3375,7 @@ function Markdown({ text }) {
|
|
|
3360
3375
|
}
|
|
3361
3376
|
|
|
3362
3377
|
// src/components/EntityCardList.tsx
|
|
3363
|
-
var
|
|
3378
|
+
var import_react16 = require("react");
|
|
3364
3379
|
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
3365
3380
|
var MAX_VISIBLE = 3;
|
|
3366
3381
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
@@ -3444,7 +3459,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
3444
3459
|
)) });
|
|
3445
3460
|
}
|
|
3446
3461
|
function EntityCardItem({ c }) {
|
|
3447
|
-
const [active, setActive] = (0,
|
|
3462
|
+
const [active, setActive] = (0, import_react16.useState)(0);
|
|
3448
3463
|
const hasBody = c.scopes.length > 0;
|
|
3449
3464
|
if (!hasBody) {
|
|
3450
3465
|
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 }) });
|
|
@@ -3458,7 +3473,7 @@ function EntityCardItem({ c }) {
|
|
|
3458
3473
|
] });
|
|
3459
3474
|
}
|
|
3460
3475
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
3461
|
-
const [expanded, setExpanded] = (0,
|
|
3476
|
+
const [expanded, setExpanded] = (0, import_react16.useState)(false);
|
|
3462
3477
|
if (cards.length === 0) return null;
|
|
3463
3478
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
3464
3479
|
const overflow = cards.length - MAX_VISIBLE;
|
|
@@ -3469,22 +3484,22 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
3469
3484
|
}
|
|
3470
3485
|
|
|
3471
3486
|
// src/components/AddToSlipButton.tsx
|
|
3472
|
-
var
|
|
3487
|
+
var import_react19 = require("react");
|
|
3473
3488
|
var import_widget_sdk4 = require("@sensiblestats/widget-sdk");
|
|
3474
3489
|
|
|
3475
3490
|
// src/slipStateContext.ts
|
|
3476
|
-
var
|
|
3477
|
-
var SlipStateContext = (0,
|
|
3491
|
+
var import_react17 = require("react");
|
|
3492
|
+
var SlipStateContext = (0, import_react17.createContext)(null);
|
|
3478
3493
|
function useSlipState() {
|
|
3479
|
-
return (0,
|
|
3494
|
+
return (0, import_react17.useContext)(SlipStateContext);
|
|
3480
3495
|
}
|
|
3481
3496
|
|
|
3482
3497
|
// src/components/Toast.tsx
|
|
3483
|
-
var
|
|
3498
|
+
var import_react18 = require("react");
|
|
3484
3499
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
3485
3500
|
var DISMISS_MS = 4e3;
|
|
3486
3501
|
function Toast({ toast, onDismiss }) {
|
|
3487
|
-
(0,
|
|
3502
|
+
(0, import_react18.useEffect)(() => {
|
|
3488
3503
|
if (!toast) return;
|
|
3489
3504
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
3490
3505
|
return () => clearTimeout(timer);
|
|
@@ -3502,10 +3517,10 @@ function withTimeout(value) {
|
|
|
3502
3517
|
]);
|
|
3503
3518
|
}
|
|
3504
3519
|
function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
|
|
3505
|
-
const [pending, setPending] = (0,
|
|
3506
|
-
const [settledLocal, setSettledLocal] = (0,
|
|
3507
|
-
const [toast, setToast] = (0,
|
|
3508
|
-
const dismiss = (0,
|
|
3520
|
+
const [pending, setPending] = (0, import_react19.useState)(false);
|
|
3521
|
+
const [settledLocal, setSettledLocal] = (0, import_react19.useState)(false);
|
|
3522
|
+
const [toast, setToast] = (0, import_react19.useState)(null);
|
|
3523
|
+
const dismiss = (0, import_react19.useCallback)(() => setToast(null), []);
|
|
3509
3524
|
const log = useEventLog();
|
|
3510
3525
|
const slipState = useSlipState();
|
|
3511
3526
|
const handler = slip.onAddToSlip;
|
|
@@ -3617,14 +3632,14 @@ function OddsMovementBadge({
|
|
|
3617
3632
|
}
|
|
3618
3633
|
|
|
3619
3634
|
// src/components/Crest.tsx
|
|
3620
|
-
var
|
|
3635
|
+
var import_react20 = require("react");
|
|
3621
3636
|
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
3622
3637
|
function initials2(name) {
|
|
3623
3638
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
3624
3639
|
}
|
|
3625
3640
|
function Crest2({ url, name, kind }) {
|
|
3626
3641
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
3627
|
-
const [failed, setFailed] = (0,
|
|
3642
|
+
const [failed, setFailed] = (0, import_react20.useState)(false);
|
|
3628
3643
|
if (url && !failed) {
|
|
3629
3644
|
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3630
3645
|
}
|
|
@@ -3632,7 +3647,7 @@ function Crest2({ url, name, kind }) {
|
|
|
3632
3647
|
}
|
|
3633
3648
|
|
|
3634
3649
|
// src/components/PinToggle.tsx
|
|
3635
|
-
var
|
|
3650
|
+
var import_react21 = require("react");
|
|
3636
3651
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
3637
3652
|
var PIN_GLYPHS = {
|
|
3638
3653
|
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" },
|
|
@@ -3640,8 +3655,8 @@ var PIN_GLYPHS = {
|
|
|
3640
3655
|
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" }
|
|
3641
3656
|
};
|
|
3642
3657
|
function PinToggle({ pin, monitor, ui, market }) {
|
|
3643
|
-
const [toast, setToast] = (0,
|
|
3644
|
-
const dismiss = (0,
|
|
3658
|
+
const [toast, setToast] = (0, import_react21.useState)(null);
|
|
3659
|
+
const dismiss = (0, import_react21.useCallback)(() => setToast(null), []);
|
|
3645
3660
|
const log = useEventLog();
|
|
3646
3661
|
if (!monitor || !monitor.enabled) return null;
|
|
3647
3662
|
const key = pinKey(pin);
|
|
@@ -3697,11 +3712,11 @@ function PinToggle({ pin, monitor, ui, market }) {
|
|
|
3697
3712
|
}
|
|
3698
3713
|
|
|
3699
3714
|
// src/components/PriceHistoryButton.tsx
|
|
3700
|
-
var
|
|
3715
|
+
var import_react22 = require("react");
|
|
3701
3716
|
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
3702
3717
|
function PriceHistoryButton({ selection, monitor, ui }) {
|
|
3703
|
-
const [toast, setToast] = (0,
|
|
3704
|
-
const dismiss = (0,
|
|
3718
|
+
const [toast, setToast] = (0, import_react22.useState)(null);
|
|
3719
|
+
const dismiss = (0, import_react22.useCallback)(() => setToast(null), []);
|
|
3705
3720
|
const log = useEventLog();
|
|
3706
3721
|
if (!monitor || !monitor.enabled) return null;
|
|
3707
3722
|
const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
|
|
@@ -3816,10 +3831,10 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
3816
3831
|
}
|
|
3817
3832
|
|
|
3818
3833
|
// src/presetToolsContext.ts
|
|
3819
|
-
var
|
|
3820
|
-
var PresetToolsContext = (0,
|
|
3834
|
+
var import_react23 = require("react");
|
|
3835
|
+
var PresetToolsContext = (0, import_react23.createContext)(null);
|
|
3821
3836
|
function usePresetTools() {
|
|
3822
|
-
return (0,
|
|
3837
|
+
return (0, import_react23.useContext)(PresetToolsContext);
|
|
3823
3838
|
}
|
|
3824
3839
|
|
|
3825
3840
|
// src/components/ComboCardList.tsx
|
|
@@ -3883,7 +3898,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
|
|
|
3883
3898
|
}
|
|
3884
3899
|
|
|
3885
3900
|
// src/components/MarketOddsCardList.tsx
|
|
3886
|
-
var
|
|
3901
|
+
var import_react24 = require("react");
|
|
3887
3902
|
|
|
3888
3903
|
// src/components/AllMarketsButton.tsx
|
|
3889
3904
|
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
@@ -3946,7 +3961,7 @@ function fmtHhMm(iso, locale) {
|
|
|
3946
3961
|
return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
|
|
3947
3962
|
}
|
|
3948
3963
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
3949
|
-
const [open, setOpen] = (0,
|
|
3964
|
+
const [open, setOpen] = (0, import_react24.useState)(false);
|
|
3950
3965
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
3951
3966
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
3952
3967
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
@@ -3956,9 +3971,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
3956
3971
|
const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
|
|
3957
3972
|
const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
|
|
3958
3973
|
const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
|
|
3959
|
-
const [, setStaleTick] = (0,
|
|
3974
|
+
const [, setStaleTick] = (0, import_react24.useState)(0);
|
|
3960
3975
|
const watchStale = live != null && !isClosed && !isStale;
|
|
3961
|
-
(0,
|
|
3976
|
+
(0, import_react24.useEffect)(() => {
|
|
3962
3977
|
if (!watchStale) return;
|
|
3963
3978
|
const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
|
|
3964
3979
|
return () => window.clearTimeout(id);
|
|
@@ -4037,7 +4052,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
|
|
|
4037
4052
|
}
|
|
4038
4053
|
|
|
4039
4054
|
// src/components/CompactOddsList.tsx
|
|
4040
|
-
var
|
|
4055
|
+
var import_react25 = require("react");
|
|
4041
4056
|
|
|
4042
4057
|
// src/compactList.ts
|
|
4043
4058
|
var COMPACT_MIN_CARDS = 3;
|
|
@@ -4151,11 +4166,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
|
|
|
4151
4166
|
] });
|
|
4152
4167
|
}
|
|
4153
4168
|
function CompactOddsList({ list, ui, slip, monitor }) {
|
|
4154
|
-
const [shown, setShown] = (0,
|
|
4169
|
+
const [shown, setShown] = (0, import_react25.useState)(COMPACT_PAGE);
|
|
4155
4170
|
const hidden = list.rowCount - shown;
|
|
4156
|
-
const [focusIndex, setFocusIndex] = (0,
|
|
4157
|
-
const focusRef = (0,
|
|
4158
|
-
(0,
|
|
4171
|
+
const [focusIndex, setFocusIndex] = (0, import_react25.useState)(null);
|
|
4172
|
+
const focusRef = (0, import_react25.useRef)(null);
|
|
4173
|
+
(0, import_react25.useEffect)(() => {
|
|
4159
4174
|
if (focusIndex !== null) focusRef.current?.focus();
|
|
4160
4175
|
}, [focusIndex]);
|
|
4161
4176
|
let left = shown;
|
|
@@ -4460,7 +4475,7 @@ function FixtureCard({ card }) {
|
|
|
4460
4475
|
}
|
|
4461
4476
|
|
|
4462
4477
|
// src/components/dashboard/CountdownCard.tsx
|
|
4463
|
-
var
|
|
4478
|
+
var import_react26 = require("react");
|
|
4464
4479
|
var import_jsx_runtime24 = require("react/jsx-runtime");
|
|
4465
4480
|
var DAY_MS = 864e5;
|
|
4466
4481
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -4479,12 +4494,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
4479
4494
|
function CountdownCard({ card }) {
|
|
4480
4495
|
const { data } = card;
|
|
4481
4496
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
4482
|
-
const [nowMs, setNowMs] = (0,
|
|
4483
|
-
const [reduced] = (0,
|
|
4497
|
+
const [nowMs, setNowMs] = (0, import_react26.useState)(() => Date.now());
|
|
4498
|
+
const [reduced] = (0, import_react26.useState)(
|
|
4484
4499
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
4485
4500
|
);
|
|
4486
4501
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
4487
|
-
(0,
|
|
4502
|
+
(0, import_react26.useEffect)(() => {
|
|
4488
4503
|
if (reduced) return;
|
|
4489
4504
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
4490
4505
|
return () => window.clearInterval(id);
|
|
@@ -4492,7 +4507,7 @@ function CountdownCard({ card }) {
|
|
|
4492
4507
|
const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
|
|
4493
4508
|
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "ss-w-fandash-countdown-top", children: [
|
|
4494
4509
|
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
|
|
4495
|
-
segments ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
|
|
4510
|
+
segments ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_react26.Fragment, { children: [
|
|
4496
4511
|
i > 0 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
|
|
4497
4512
|
/* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: "ss-w-fandash-countdown-seg", children: [
|
|
4498
4513
|
/* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
|
|
@@ -4503,7 +4518,7 @@ function CountdownCard({ card }) {
|
|
|
4503
4518
|
}
|
|
4504
4519
|
|
|
4505
4520
|
// src/components/dashboard/InjuriesCard.tsx
|
|
4506
|
-
var
|
|
4521
|
+
var import_react27 = require("react");
|
|
4507
4522
|
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
4508
4523
|
var SHOWN = 3;
|
|
4509
4524
|
function ColHead({ name, crestUrl }) {
|
|
@@ -4526,7 +4541,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
4526
4541
|
}
|
|
4527
4542
|
function InjuriesCard({ card, ui }) {
|
|
4528
4543
|
const { data } = card;
|
|
4529
|
-
const [expanded, setExpanded] = (0,
|
|
4544
|
+
const [expanded, setExpanded] = (0, import_react27.useState)(false);
|
|
4530
4545
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
4531
4546
|
const limit = expanded ? void 0 : SHOWN;
|
|
4532
4547
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
@@ -4632,7 +4647,7 @@ function LinksCard({ card }) {
|
|
|
4632
4647
|
}
|
|
4633
4648
|
|
|
4634
4649
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
4635
|
-
var
|
|
4650
|
+
var import_react28 = require("react");
|
|
4636
4651
|
var import_jsx_runtime31 = require("react/jsx-runtime");
|
|
4637
4652
|
function initials3(name) {
|
|
4638
4653
|
return name.trim().slice(0, 3).toUpperCase();
|
|
@@ -4642,7 +4657,7 @@ function PostMatchCrest({
|
|
|
4642
4657
|
name,
|
|
4643
4658
|
side
|
|
4644
4659
|
}) {
|
|
4645
|
-
const [failed, setFailed] = (0,
|
|
4660
|
+
const [failed, setFailed] = (0, import_react28.useState)(false);
|
|
4646
4661
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
4647
4662
|
if (url && !failed) {
|
|
4648
4663
|
return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -4841,10 +4856,10 @@ function RestingFormCard({ card }) {
|
|
|
4841
4856
|
}
|
|
4842
4857
|
|
|
4843
4858
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
4844
|
-
var
|
|
4859
|
+
var import_react30 = require("react");
|
|
4845
4860
|
|
|
4846
4861
|
// src/useLiveClock.ts
|
|
4847
|
-
var
|
|
4862
|
+
var import_react29 = require("react");
|
|
4848
4863
|
var TICK_MS = 6e4;
|
|
4849
4864
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
4850
4865
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -4853,10 +4868,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
4853
4868
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
4854
4869
|
}
|
|
4855
4870
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
4856
|
-
const [displayMinute, setDisplayMinute] = (0,
|
|
4871
|
+
const [displayMinute, setDisplayMinute] = (0, import_react29.useState)(
|
|
4857
4872
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
4858
4873
|
);
|
|
4859
|
-
(0,
|
|
4874
|
+
(0, import_react29.useEffect)(() => {
|
|
4860
4875
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
4861
4876
|
if (!clockRunning) return;
|
|
4862
4877
|
const id = window.setInterval(() => {
|
|
@@ -4873,7 +4888,7 @@ function initials5(name) {
|
|
|
4873
4888
|
return name.trim().slice(0, 3).toUpperCase();
|
|
4874
4889
|
}
|
|
4875
4890
|
function LiveCrest({ url, name, side }) {
|
|
4876
|
-
const [failed, setFailed] = (0,
|
|
4891
|
+
const [failed, setFailed] = (0, import_react30.useState)(false);
|
|
4877
4892
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
4878
4893
|
if (url && !failed) {
|
|
4879
4894
|
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -4892,7 +4907,7 @@ function LiveScoreCard({
|
|
|
4892
4907
|
}) {
|
|
4893
4908
|
const { data } = card;
|
|
4894
4909
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
4895
|
-
const seedRef = (0,
|
|
4910
|
+
const seedRef = (0, import_react30.useRef)(null);
|
|
4896
4911
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
4897
4912
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
4898
4913
|
}
|
|
@@ -4932,7 +4947,7 @@ function LiveScoreCard({
|
|
|
4932
4947
|
}
|
|
4933
4948
|
|
|
4934
4949
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
4935
|
-
var
|
|
4950
|
+
var import_react31 = require("react");
|
|
4936
4951
|
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
4937
4952
|
var SHOWN2 = 3;
|
|
4938
4953
|
function EventIcon({ type }) {
|
|
@@ -4974,7 +4989,7 @@ function EventRow({ e }) {
|
|
|
4974
4989
|
] });
|
|
4975
4990
|
}
|
|
4976
4991
|
function LiveTimelineCard({ card, ui }) {
|
|
4977
|
-
const [expanded, setExpanded] = (0,
|
|
4992
|
+
const [expanded, setExpanded] = (0, import_react31.useState)(false);
|
|
4978
4993
|
const events = card.data.events;
|
|
4979
4994
|
if (!events || events.length === 0) return null;
|
|
4980
4995
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -4999,7 +5014,7 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
4999
5014
|
}
|
|
5000
5015
|
|
|
5001
5016
|
// src/components/dashboard/MomentumWave.tsx
|
|
5002
|
-
var
|
|
5017
|
+
var import_react32 = require("react");
|
|
5003
5018
|
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
5004
5019
|
var WIDTH = 270;
|
|
5005
5020
|
var HEIGHT = 56;
|
|
@@ -5023,7 +5038,7 @@ function MomentumWave({
|
|
|
5023
5038
|
}) {
|
|
5024
5039
|
if (points.length === 0) return null;
|
|
5025
5040
|
const { area, line, lastLeftPct, lastTopPx } = buildPaths(points);
|
|
5026
|
-
const clipId = (0,
|
|
5041
|
+
const clipId = (0, import_react32.useId)();
|
|
5027
5042
|
const topClipId = `${clipId}-top`;
|
|
5028
5043
|
const bottomClipId = `${clipId}-bottom`;
|
|
5029
5044
|
const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
|
|
@@ -5216,11 +5231,11 @@ function turnAnchor(messages) {
|
|
|
5216
5231
|
}
|
|
5217
5232
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
5218
5233
|
const { state, send } = controller;
|
|
5219
|
-
const listRef = (0,
|
|
5220
|
-
const endRef = (0,
|
|
5221
|
-
const pinnedRef = (0,
|
|
5222
|
-
const anchoredTurnRef = (0,
|
|
5223
|
-
(0,
|
|
5234
|
+
const listRef = (0, import_react33.useRef)(null);
|
|
5235
|
+
const endRef = (0, import_react33.useRef)(null);
|
|
5236
|
+
const pinnedRef = (0, import_react33.useRef)(true);
|
|
5237
|
+
const anchoredTurnRef = (0, import_react33.useRef)(null);
|
|
5238
|
+
(0, import_react33.useEffect)(() => {
|
|
5224
5239
|
const anchor = turnAnchor(state.messages);
|
|
5225
5240
|
const list = listRef.current;
|
|
5226
5241
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -5277,13 +5292,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
5277
5292
|
}
|
|
5278
5293
|
|
|
5279
5294
|
// src/components/ChatInput.tsx
|
|
5280
|
-
var
|
|
5295
|
+
var import_react34 = require("react");
|
|
5281
5296
|
var import_jsx_runtime48 = require("react/jsx-runtime");
|
|
5282
|
-
var ChatInput = (0,
|
|
5283
|
-
const [value, setValue] = (0,
|
|
5284
|
-
const textareaRef = (0,
|
|
5285
|
-
const stopRef = (0,
|
|
5286
|
-
const textBoxWantsFocusRef = (0,
|
|
5297
|
+
var ChatInput = (0, import_react34.forwardRef)(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
|
|
5298
|
+
const [value, setValue] = (0, import_react34.useState)("");
|
|
5299
|
+
const textareaRef = (0, import_react34.useRef)(null);
|
|
5300
|
+
const stopRef = (0, import_react34.useRef)(null);
|
|
5301
|
+
const textBoxWantsFocusRef = (0, import_react34.useRef)(false);
|
|
5287
5302
|
const submit = () => {
|
|
5288
5303
|
if (disabled) return;
|
|
5289
5304
|
const t = value.trim();
|
|
@@ -5297,7 +5312,7 @@ var ChatInput = (0, import_react33.forwardRef)(function ChatInput2({ placeholder
|
|
|
5297
5312
|
submit();
|
|
5298
5313
|
}
|
|
5299
5314
|
};
|
|
5300
|
-
(0,
|
|
5315
|
+
(0, import_react34.useImperativeHandle)(ref, () => ({
|
|
5301
5316
|
focus() {
|
|
5302
5317
|
const box = textareaRef.current;
|
|
5303
5318
|
if (box && !box.disabled) {
|
|
@@ -5309,7 +5324,7 @@ var ChatInput = (0, import_react33.forwardRef)(function ChatInput2({ placeholder
|
|
|
5309
5324
|
stopRef.current?.focus();
|
|
5310
5325
|
}
|
|
5311
5326
|
}), []);
|
|
5312
|
-
(0,
|
|
5327
|
+
(0, import_react34.useEffect)(() => {
|
|
5313
5328
|
if (streaming || disabled || !textBoxWantsFocusRef.current) return;
|
|
5314
5329
|
textBoxWantsFocusRef.current = false;
|
|
5315
5330
|
const box = textareaRef.current;
|
|
@@ -5431,10 +5446,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
5431
5446
|
}
|
|
5432
5447
|
|
|
5433
5448
|
// src/components/LiveFactBlock.tsx
|
|
5434
|
-
var
|
|
5449
|
+
var import_react35 = require("react");
|
|
5435
5450
|
var import_jsx_runtime51 = require("react/jsx-runtime");
|
|
5436
5451
|
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
5437
|
-
const [expanded, setExpanded] = (0,
|
|
5452
|
+
const [expanded, setExpanded] = (0, import_react35.useState)(false);
|
|
5438
5453
|
const [current, ...earlier] = facts;
|
|
5439
5454
|
if (!current) return null;
|
|
5440
5455
|
const m = current.market;
|
|
@@ -5801,7 +5816,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
5801
5816
|
}
|
|
5802
5817
|
|
|
5803
5818
|
// src/components/GamesPanel.tsx
|
|
5804
|
-
var
|
|
5819
|
+
var import_react49 = require("react");
|
|
5805
5820
|
|
|
5806
5821
|
// src/components/GamesLoginWall.tsx
|
|
5807
5822
|
var import_jsx_runtime57 = require("react/jsx-runtime");
|
|
@@ -5810,7 +5825,7 @@ function GamesLoginWall({ ui }) {
|
|
|
5810
5825
|
}
|
|
5811
5826
|
|
|
5812
5827
|
// src/components/GamesHub.tsx
|
|
5813
|
-
var
|
|
5828
|
+
var import_react36 = require("react");
|
|
5814
5829
|
|
|
5815
5830
|
// src/components/games/ui/gameMeta.ts
|
|
5816
5831
|
function prettifyGameId(gameId) {
|
|
@@ -5995,8 +6010,8 @@ function pickHeroGame(games) {
|
|
|
5995
6010
|
}
|
|
5996
6011
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
5997
6012
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
5998
|
-
const [, setTick] = (0,
|
|
5999
|
-
(0,
|
|
6013
|
+
const [, setTick] = (0, import_react36.useState)(0);
|
|
6014
|
+
(0, import_react36.useEffect)(() => {
|
|
6000
6015
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
6001
6016
|
return () => clearInterval(id);
|
|
6002
6017
|
}, []);
|
|
@@ -6056,10 +6071,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
6056
6071
|
}
|
|
6057
6072
|
|
|
6058
6073
|
// src/components/GameScreenHost.tsx
|
|
6059
|
-
var
|
|
6074
|
+
var import_react48 = require("react");
|
|
6060
6075
|
|
|
6061
6076
|
// src/useGamePlay.ts
|
|
6062
|
-
var
|
|
6077
|
+
var import_react37 = require("react");
|
|
6063
6078
|
function toSubmitResult(payload) {
|
|
6064
6079
|
return {
|
|
6065
6080
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -6071,17 +6086,17 @@ function toSubmitResult(payload) {
|
|
|
6071
6086
|
};
|
|
6072
6087
|
}
|
|
6073
6088
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
6074
|
-
const [result, setResult] = (0,
|
|
6075
|
-
const [submitting, setSubmitting] = (0,
|
|
6076
|
-
const [rawStatus, setRawStatus] = (0,
|
|
6077
|
-
const inFlightRef = (0,
|
|
6078
|
-
const convRef = (0,
|
|
6089
|
+
const [result, setResult] = (0, import_react37.useState)(null);
|
|
6090
|
+
const [submitting, setSubmitting] = (0, import_react37.useState)(false);
|
|
6091
|
+
const [rawStatus, setRawStatus] = (0, import_react37.useState)(null);
|
|
6092
|
+
const inFlightRef = (0, import_react37.useRef)(false);
|
|
6093
|
+
const convRef = (0, import_react37.useRef)(conversation);
|
|
6079
6094
|
convRef.current = conversation;
|
|
6080
|
-
const optsRef = (0,
|
|
6095
|
+
const optsRef = (0, import_react37.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
|
|
6081
6096
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
6082
|
-
const resultRef = (0,
|
|
6097
|
+
const resultRef = (0, import_react37.useRef)(null);
|
|
6083
6098
|
resultRef.current = result;
|
|
6084
|
-
const refetch = (0,
|
|
6099
|
+
const refetch = (0, import_react37.useCallback)(async () => {
|
|
6085
6100
|
const conv = convRef.current;
|
|
6086
6101
|
if (!conv) return;
|
|
6087
6102
|
const opts = optsRef.current;
|
|
@@ -6097,7 +6112,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6097
6112
|
} catch {
|
|
6098
6113
|
}
|
|
6099
6114
|
}, []);
|
|
6100
|
-
const submit = (0,
|
|
6115
|
+
const submit = (0, import_react37.useCallback)(async (answerJson) => {
|
|
6101
6116
|
const conv = convRef.current;
|
|
6102
6117
|
if (!conv || inFlightRef.current) return;
|
|
6103
6118
|
inFlightRef.current = true;
|
|
@@ -6124,14 +6139,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6124
6139
|
setSubmitting(false);
|
|
6125
6140
|
}
|
|
6126
6141
|
}, [refetch]);
|
|
6127
|
-
const hydrate = (0,
|
|
6142
|
+
const hydrate = (0, import_react37.useCallback)(() => {
|
|
6128
6143
|
void refetch();
|
|
6129
6144
|
}, [refetch]);
|
|
6130
6145
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
6131
6146
|
}
|
|
6132
6147
|
|
|
6133
6148
|
// src/components/games/MysteryTigerGame.tsx
|
|
6134
|
-
var
|
|
6149
|
+
var import_react39 = require("react");
|
|
6135
6150
|
|
|
6136
6151
|
// src/components/games/nationFlags.ts
|
|
6137
6152
|
var FLAGS = {
|
|
@@ -6342,7 +6357,7 @@ function isNationCode(flag) {
|
|
|
6342
6357
|
}
|
|
6343
6358
|
|
|
6344
6359
|
// src/components/games/PlayerAvatar.tsx
|
|
6345
|
-
var
|
|
6360
|
+
var import_react38 = require("react");
|
|
6346
6361
|
var import_jsx_runtime63 = require("react/jsx-runtime");
|
|
6347
6362
|
function initialsOf(name) {
|
|
6348
6363
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
@@ -6360,7 +6375,7 @@ function PlayerAvatar({
|
|
|
6360
6375
|
imagePath,
|
|
6361
6376
|
className
|
|
6362
6377
|
}) {
|
|
6363
|
-
const [failed, setFailed] = (0,
|
|
6378
|
+
const [failed, setFailed] = (0, import_react38.useState)(false);
|
|
6364
6379
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
6365
6380
|
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
6366
6381
|
}
|
|
@@ -6626,8 +6641,8 @@ function MysteryTigerGame({
|
|
|
6626
6641
|
onBack
|
|
6627
6642
|
}) {
|
|
6628
6643
|
const t = ui.games.mysteryTiger;
|
|
6629
|
-
const [query, setQuery] = (0,
|
|
6630
|
-
const inputId = (0,
|
|
6644
|
+
const [query, setQuery] = (0, import_react39.useState)("");
|
|
6645
|
+
const inputId = (0, import_react39.useId)();
|
|
6631
6646
|
const clientState = parseClientState(result?.clientStateJson);
|
|
6632
6647
|
const guessResults = clientState?.guessResults ?? [];
|
|
6633
6648
|
const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
|
|
@@ -6888,13 +6903,13 @@ function HigherOrLowerGame({
|
|
|
6888
6903
|
}
|
|
6889
6904
|
|
|
6890
6905
|
// src/components/games/CareerPathGame.tsx
|
|
6891
|
-
var
|
|
6906
|
+
var import_react41 = require("react");
|
|
6892
6907
|
|
|
6893
6908
|
// src/components/games/ui/CrestShield.tsx
|
|
6894
|
-
var
|
|
6909
|
+
var import_react40 = require("react");
|
|
6895
6910
|
var import_jsx_runtime75 = require("react/jsx-runtime");
|
|
6896
6911
|
function CrestShield({ src, name, size = 28 }) {
|
|
6897
|
-
const [failed, setFailed] = (0,
|
|
6912
|
+
const [failed, setFailed] = (0, import_react40.useState)(false);
|
|
6898
6913
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
6899
6914
|
return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
6900
6915
|
}
|
|
@@ -6926,8 +6941,8 @@ function CareerPathGame({
|
|
|
6926
6941
|
}) {
|
|
6927
6942
|
const s = ui.games.careerPath;
|
|
6928
6943
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
6929
|
-
const [query, setQuery] = (0,
|
|
6930
|
-
const inputId = (0,
|
|
6944
|
+
const [query, setQuery] = (0, import_react41.useState)("");
|
|
6945
|
+
const inputId = (0, import_react41.useId)();
|
|
6931
6946
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
6932
6947
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
6933
6948
|
const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
|
|
@@ -7033,7 +7048,7 @@ function CareerPathGame({
|
|
|
7033
7048
|
}
|
|
7034
7049
|
|
|
7035
7050
|
// src/components/games/BeatTheGridGame.tsx
|
|
7036
|
-
var
|
|
7051
|
+
var import_react42 = __toESM(require("react"), 1);
|
|
7037
7052
|
|
|
7038
7053
|
// src/components/games/ui/OptionList.tsx
|
|
7039
7054
|
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
@@ -7122,10 +7137,10 @@ function SearchSheet({
|
|
|
7122
7137
|
ui
|
|
7123
7138
|
}) {
|
|
7124
7139
|
const s = ui.games.beatTheGrid;
|
|
7125
|
-
const [query, setQuery] = (0,
|
|
7126
|
-
const inputId = (0,
|
|
7127
|
-
const inputRef = (0,
|
|
7128
|
-
(0,
|
|
7140
|
+
const [query, setQuery] = (0, import_react42.useState)("");
|
|
7141
|
+
const inputId = (0, import_react42.useId)();
|
|
7142
|
+
const inputRef = (0, import_react42.useRef)(null);
|
|
7143
|
+
(0, import_react42.useEffect)(() => {
|
|
7129
7144
|
inputRef.current?.focus();
|
|
7130
7145
|
}, [row, col]);
|
|
7131
7146
|
const filtered = playerPool.filter(
|
|
@@ -7190,7 +7205,7 @@ function BeatTheGridGame({
|
|
|
7190
7205
|
}) {
|
|
7191
7206
|
const s = ui.games.beatTheGrid;
|
|
7192
7207
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
7193
|
-
const [activeCell, setActiveCell] = (0,
|
|
7208
|
+
const [activeCell, setActiveCell] = (0, import_react42.useState)(null);
|
|
7194
7209
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
7195
7210
|
const filledCells = clientState?.cells ?? [];
|
|
7196
7211
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -7264,7 +7279,7 @@ function BeatTheGridGame({
|
|
|
7264
7279
|
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { "aria-hidden": "true", children: abbr }),
|
|
7265
7280
|
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("span", { className: "ss-g-sr", children: rowLabel })
|
|
7266
7281
|
] });
|
|
7267
|
-
return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(
|
|
7282
|
+
return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(import_react42.default.Fragment, { children: [
|
|
7268
7283
|
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
|
|
7269
7284
|
cols.map((colLabel, colIdx) => {
|
|
7270
7285
|
const filled = findCellResult(filledCells, rowIdx, colIdx);
|
|
@@ -7345,7 +7360,7 @@ function BeatTheGridGame({
|
|
|
7345
7360
|
}
|
|
7346
7361
|
|
|
7347
7362
|
// src/components/games/GuessTheXiGame.tsx
|
|
7348
|
-
var
|
|
7363
|
+
var import_react43 = require("react");
|
|
7349
7364
|
|
|
7350
7365
|
// src/components/games/ui/PitchSvg.tsx
|
|
7351
7366
|
var import_jsx_runtime79 = require("react/jsx-runtime");
|
|
@@ -7434,8 +7449,8 @@ function GuessTheXiGame({
|
|
|
7434
7449
|
onBack
|
|
7435
7450
|
}) {
|
|
7436
7451
|
const t = ui.games.guessTheXi;
|
|
7437
|
-
const [query, setQuery] = (0,
|
|
7438
|
-
const inputId = (0,
|
|
7452
|
+
const [query, setQuery] = (0, import_react43.useState)("");
|
|
7453
|
+
const inputId = (0, import_react43.useId)();
|
|
7439
7454
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
7440
7455
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
7441
7456
|
const solved = clientState?.status === "solved";
|
|
@@ -7577,7 +7592,7 @@ function GuessTheXiGame({
|
|
|
7577
7592
|
}
|
|
7578
7593
|
|
|
7579
7594
|
// src/components/games/DailyQuizGame.tsx
|
|
7580
|
-
var
|
|
7595
|
+
var import_react44 = require("react");
|
|
7581
7596
|
var import_jsx_runtime81 = require("react/jsx-runtime");
|
|
7582
7597
|
function parseClientState6(json) {
|
|
7583
7598
|
if (!json) return null;
|
|
@@ -7618,8 +7633,8 @@ function DailyQuizGame({
|
|
|
7618
7633
|
}) {
|
|
7619
7634
|
const s = ui.games.dailyQuiz;
|
|
7620
7635
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
7621
|
-
const [selections, setSelections] = (0,
|
|
7622
|
-
const [page, setPage] = (0,
|
|
7636
|
+
const [selections, setSelections] = (0, import_react44.useState)(/* @__PURE__ */ new Map());
|
|
7637
|
+
const [page, setPage] = (0, import_react44.useState)(0);
|
|
7623
7638
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
7624
7639
|
const results = clientState?.results ?? [];
|
|
7625
7640
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
@@ -7729,7 +7744,7 @@ function DailyQuizGame({
|
|
|
7729
7744
|
}
|
|
7730
7745
|
|
|
7731
7746
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
7732
|
-
var
|
|
7747
|
+
var import_react45 = require("react");
|
|
7733
7748
|
var import_jsx_runtime82 = require("react/jsx-runtime");
|
|
7734
7749
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
7735
7750
|
function parseClientState7(json) {
|
|
@@ -7825,12 +7840,12 @@ function MatchdayPredictorGame({
|
|
|
7825
7840
|
onBack
|
|
7826
7841
|
}) {
|
|
7827
7842
|
const t = ui.games.predictor;
|
|
7828
|
-
const [homeScore, setHomeScore] = (0,
|
|
7829
|
-
const [awayScore, setAwayScore] = (0,
|
|
7830
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0,
|
|
7831
|
-
const [lastEdited, setLastEdited] = (0,
|
|
7832
|
-
const [query, setQuery] = (0,
|
|
7833
|
-
const searchId = (0,
|
|
7843
|
+
const [homeScore, setHomeScore] = (0, import_react45.useState)(0);
|
|
7844
|
+
const [awayScore, setAwayScore] = (0, import_react45.useState)(0);
|
|
7845
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react45.useState)(null);
|
|
7846
|
+
const [lastEdited, setLastEdited] = (0, import_react45.useState)("home");
|
|
7847
|
+
const [query, setQuery] = (0, import_react45.useState)("");
|
|
7848
|
+
const searchId = (0, import_react45.useId)();
|
|
7834
7849
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
7835
7850
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
7836
7851
|
const header = /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(
|
|
@@ -7997,7 +8012,7 @@ function MatchdayPredictorGame({
|
|
|
7997
8012
|
}
|
|
7998
8013
|
|
|
7999
8014
|
// src/components/games/StartingXiGame.tsx
|
|
8000
|
-
var
|
|
8015
|
+
var import_react46 = require("react");
|
|
8001
8016
|
var import_jsx_runtime83 = require("react/jsx-runtime");
|
|
8002
8017
|
var POINTS_PER_STARTER = 8;
|
|
8003
8018
|
var XI_SIZE = 11;
|
|
@@ -8041,10 +8056,10 @@ function StartingXiGame({
|
|
|
8041
8056
|
lockAtUtc
|
|
8042
8057
|
}) {
|
|
8043
8058
|
const t = ui.games.startingXi;
|
|
8044
|
-
const [slotPlayers, setSlotPlayers] = (0,
|
|
8045
|
-
const [active, setActive] = (0,
|
|
8046
|
-
const [query, setQuery] = (0,
|
|
8047
|
-
const searchId = (0,
|
|
8059
|
+
const [slotPlayers, setSlotPlayers] = (0, import_react46.useState)(() => Array(XI_SIZE).fill(null));
|
|
8060
|
+
const [active, setActive] = (0, import_react46.useState)(0);
|
|
8061
|
+
const [query, setQuery] = (0, import_react46.useState)("");
|
|
8062
|
+
const searchId = (0, import_react46.useId)();
|
|
8048
8063
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
8049
8064
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
8050
8065
|
const header = /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(
|
|
@@ -8183,7 +8198,7 @@ function StartingXiGame({
|
|
|
8183
8198
|
}
|
|
8184
8199
|
|
|
8185
8200
|
// src/components/games/StatLadderGame.tsx
|
|
8186
|
-
var
|
|
8201
|
+
var import_react47 = require("react");
|
|
8187
8202
|
var import_jsx_runtime84 = require("react/jsx-runtime");
|
|
8188
8203
|
function ladderClue(ladder) {
|
|
8189
8204
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
@@ -8220,9 +8235,9 @@ function StatLadderGame({
|
|
|
8220
8235
|
onBack
|
|
8221
8236
|
}) {
|
|
8222
8237
|
const t = ui.games.statLadder;
|
|
8223
|
-
const [query, setQuery] = (0,
|
|
8224
|
-
const [selectedId, setSelectedId] = (0,
|
|
8225
|
-
const searchId = (0,
|
|
8238
|
+
const [query, setQuery] = (0, import_react47.useState)("");
|
|
8239
|
+
const [selectedId, setSelectedId] = (0, import_react47.useState)(null);
|
|
8240
|
+
const searchId = (0, import_react47.useId)();
|
|
8226
8241
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
8227
8242
|
const revealed = clientState != null;
|
|
8228
8243
|
const header = /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
|
|
@@ -8428,8 +8443,8 @@ function GameScreenHost({
|
|
|
8428
8443
|
ui
|
|
8429
8444
|
}) {
|
|
8430
8445
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
8431
|
-
const [configJson, setConfigJson] = (0,
|
|
8432
|
-
(0,
|
|
8446
|
+
const [configJson, setConfigJson] = (0, import_react48.useState)(null);
|
|
8447
|
+
(0, import_react48.useEffect)(() => {
|
|
8433
8448
|
setConfigJson(null);
|
|
8434
8449
|
if (!conversation) return;
|
|
8435
8450
|
let cancelled = false;
|
|
@@ -8452,12 +8467,12 @@ function GameScreenHost({
|
|
|
8452
8467
|
fixtureId: fixtureId || void 0,
|
|
8453
8468
|
locale: ui.games.lang
|
|
8454
8469
|
});
|
|
8455
|
-
(0,
|
|
8470
|
+
(0, import_react48.useEffect)(() => {
|
|
8456
8471
|
if (conversation) hydrate();
|
|
8457
8472
|
}, [conversation, gameId]);
|
|
8458
|
-
const hydrateRef = (0,
|
|
8473
|
+
const hydrateRef = (0, import_react48.useRef)(hydrate);
|
|
8459
8474
|
hydrateRef.current = hydrate;
|
|
8460
|
-
(0,
|
|
8475
|
+
(0, import_react48.useEffect)(() => {
|
|
8461
8476
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
8462
8477
|
if (rawStatus !== "pending") return;
|
|
8463
8478
|
const timerId = setInterval(() => {
|
|
@@ -8592,8 +8607,8 @@ function GamesPanel({
|
|
|
8592
8607
|
leaderboard,
|
|
8593
8608
|
refreshHub
|
|
8594
8609
|
}) {
|
|
8595
|
-
const [selected, setSelected] = (0,
|
|
8596
|
-
(0,
|
|
8610
|
+
const [selected, setSelected] = (0, import_react49.useState)(null);
|
|
8611
|
+
(0, import_react49.useEffect)(() => {
|
|
8597
8612
|
ensureGamesFonts();
|
|
8598
8613
|
}, []);
|
|
8599
8614
|
if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(GamesLoginWall, { ui });
|
|
@@ -8624,7 +8639,7 @@ function GamesPanel({
|
|
|
8624
8639
|
}
|
|
8625
8640
|
|
|
8626
8641
|
// src/components/Leaderboard.tsx
|
|
8627
|
-
var
|
|
8642
|
+
var import_react50 = require("react");
|
|
8628
8643
|
|
|
8629
8644
|
// src/components/LeaderboardRow.tsx
|
|
8630
8645
|
var import_jsx_runtime88 = require("react/jsx-runtime");
|
|
@@ -8709,7 +8724,7 @@ function Leaderboard({
|
|
|
8709
8724
|
ui,
|
|
8710
8725
|
onPlay
|
|
8711
8726
|
}) {
|
|
8712
|
-
const [segment, setSegment] = (0,
|
|
8727
|
+
const [segment, setSegment] = (0, import_react50.useState)("weekly");
|
|
8713
8728
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
8714
8729
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
8715
8730
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
@@ -8789,10 +8804,10 @@ function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
|
|
|
8789
8804
|
}
|
|
8790
8805
|
|
|
8791
8806
|
// src/components/PresetSpeedDial.tsx
|
|
8792
|
-
var
|
|
8807
|
+
var import_react51 = require("react");
|
|
8793
8808
|
var import_jsx_runtime92 = require("react/jsx-runtime");
|
|
8794
8809
|
function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
|
|
8795
|
-
const pillsId = (0,
|
|
8810
|
+
const pillsId = (0, import_react51.useId)();
|
|
8796
8811
|
const tabIndex = expanded ? 0 : -1;
|
|
8797
8812
|
return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { ref: rootRef, className: "ss-w-dial", children: [
|
|
8798
8813
|
/* @__PURE__ */ (0, import_jsx_runtime92.jsxs)(
|
|
@@ -8826,16 +8841,16 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
|
|
|
8826
8841
|
}
|
|
8827
8842
|
|
|
8828
8843
|
// src/components/PresetTools.tsx
|
|
8829
|
-
var
|
|
8844
|
+
var import_react52 = require("react");
|
|
8830
8845
|
var import_jsx_runtime93 = require("react/jsx-runtime");
|
|
8831
8846
|
var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
8832
8847
|
function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
8833
|
-
const dialogRef = (0,
|
|
8834
|
-
const titleId = (0,
|
|
8835
|
-
(0,
|
|
8848
|
+
const dialogRef = (0, import_react52.useRef)(null);
|
|
8849
|
+
const titleId = (0, import_react52.useId)();
|
|
8850
|
+
(0, import_react52.useEffect)(() => {
|
|
8836
8851
|
dialogRef.current?.focus();
|
|
8837
8852
|
}, []);
|
|
8838
|
-
(0,
|
|
8853
|
+
(0, import_react52.useEffect)(() => {
|
|
8839
8854
|
const onKey = (e) => {
|
|
8840
8855
|
if (e.key !== "Escape") return;
|
|
8841
8856
|
e.stopPropagation();
|
|
@@ -8877,7 +8892,7 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
|
8877
8892
|
function fillTemplate(template, slots) {
|
|
8878
8893
|
return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
|
|
8879
8894
|
const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
|
|
8880
|
-
return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(
|
|
8895
|
+
return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(import_react52.Fragment, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
|
|
8881
8896
|
});
|
|
8882
8897
|
}
|
|
8883
8898
|
function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
|
|
@@ -8946,15 +8961,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
8946
8961
|
const totals = comboTotals(grid);
|
|
8947
8962
|
const legChoices = comboLegChoices(grid);
|
|
8948
8963
|
const count = FIXED_SINGLES_COUNT;
|
|
8949
|
-
const [maxPrice, setMaxPrice] = (0,
|
|
8950
|
-
const [minPrice, setMinPrice] = (0,
|
|
8951
|
-
const [start] = (0,
|
|
8952
|
-
const [total, setTotal] = (0,
|
|
8953
|
-
const [legs, setLegs] = (0,
|
|
8954
|
-
const [bigStart] = (0,
|
|
8955
|
-
const [bigTotal, setBigTotal] = (0,
|
|
8956
|
-
const [bigLegs, setBigLegs] = (0,
|
|
8957
|
-
const [announcement, setAnnouncement] = (0,
|
|
8964
|
+
const [maxPrice, setMaxPrice] = (0, import_react52.useState)(() => startSingles(grid.singles, limits, START.maxPrice, count));
|
|
8965
|
+
const [minPrice, setMinPrice] = (0, import_react52.useState)(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
|
|
8966
|
+
const [start] = (0, import_react52.useState)(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
|
|
8967
|
+
const [total, setTotal] = (0, import_react52.useState)(start.total);
|
|
8968
|
+
const [legs, setLegs] = (0, import_react52.useState)(start.legs);
|
|
8969
|
+
const [bigStart] = (0, import_react52.useState)(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
|
|
8970
|
+
const [bigTotal, setBigTotal] = (0, import_react52.useState)(bigStart.total);
|
|
8971
|
+
const [bigLegs, setBigLegs] = (0, import_react52.useState)(bigStart.legs);
|
|
8972
|
+
const [announcement, setAnnouncement] = (0, import_react52.useState)("");
|
|
8958
8973
|
const maxCell = findSingles(grid.singles, maxPrice, count);
|
|
8959
8974
|
const minCell = findSingles(grid.singlesFrom, minPrice, count);
|
|
8960
8975
|
const comboCell = findCombo(grid, total, legs);
|
|
@@ -8998,7 +9013,7 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
8998
9013
|
const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
|
|
8999
9014
|
const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
|
|
9000
9015
|
const markets = grid.markets ?? [];
|
|
9001
|
-
const [marketIdx, setMarketIdx] = (0,
|
|
9016
|
+
const [marketIdx, setMarketIdx] = (0, import_react52.useState)(0);
|
|
9002
9017
|
const marketCell = markets[marketIdx] ?? null;
|
|
9003
9018
|
const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
|
|
9004
9019
|
const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
|
|
@@ -9079,14 +9094,14 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9079
9094
|
function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
|
|
9080
9095
|
const totals = comboTotals(grid);
|
|
9081
9096
|
const legChoices = comboLegChoices(grid);
|
|
9082
|
-
const [start] = (0,
|
|
9083
|
-
const [total, setTotal] = (0,
|
|
9084
|
-
const [legs, setLegs] = (0,
|
|
9097
|
+
const [start] = (0, import_react52.useState)(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
|
|
9098
|
+
const [total, setTotal] = (0, import_react52.useState)(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
|
|
9099
|
+
const [legs, setLegs] = (0, import_react52.useState)(() => {
|
|
9085
9100
|
if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
|
|
9086
9101
|
const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
|
|
9087
9102
|
return legsForTotal(grid, nearest(totals, initialTotal), from);
|
|
9088
9103
|
});
|
|
9089
|
-
const [announcement, setAnnouncement] = (0,
|
|
9104
|
+
const [announcement, setAnnouncement] = (0, import_react52.useState)("");
|
|
9090
9105
|
const cell = findCombo(grid, total, legs);
|
|
9091
9106
|
const minLegs = legChoices[0] ?? legs;
|
|
9092
9107
|
const maxLegs = legChoices[legChoices.length - 1] ?? legs;
|
|
@@ -9119,7 +9134,7 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
|
|
|
9119
9134
|
}
|
|
9120
9135
|
|
|
9121
9136
|
// src/usePresetDial.ts
|
|
9122
|
-
var
|
|
9137
|
+
var import_react53 = require("react");
|
|
9123
9138
|
function sendInFlight(messages, isStreaming) {
|
|
9124
9139
|
const last = messages[messages.length - 1];
|
|
9125
9140
|
return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
|
|
@@ -9133,25 +9148,25 @@ function lastUserId(messages) {
|
|
|
9133
9148
|
}
|
|
9134
9149
|
var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
|
|
9135
9150
|
function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
|
|
9136
|
-
const [expanded, setExpanded] = (0,
|
|
9137
|
-
const fold = (0,
|
|
9138
|
-
const toggle = (0,
|
|
9151
|
+
const [expanded, setExpanded] = (0, import_react53.useState)(() => !sendInFlight(messages, isStreaming));
|
|
9152
|
+
const fold = (0, import_react53.useCallback)(() => setExpanded(false), []);
|
|
9153
|
+
const toggle = (0, import_react53.useCallback)(() => setExpanded((e) => !e), []);
|
|
9139
9154
|
const currentUserId = lastUserId(messages);
|
|
9140
|
-
const userIdRef = (0,
|
|
9141
|
-
(0,
|
|
9155
|
+
const userIdRef = (0, import_react53.useRef)(currentUserId);
|
|
9156
|
+
(0, import_react53.useEffect)(() => {
|
|
9142
9157
|
if (currentUserId === userIdRef.current) return;
|
|
9143
9158
|
userIdRef.current = currentUserId;
|
|
9144
9159
|
setExpanded(false);
|
|
9145
9160
|
}, [currentUserId]);
|
|
9146
|
-
const tabRef = (0,
|
|
9147
|
-
(0,
|
|
9161
|
+
const tabRef = (0, import_react53.useRef)(activeTab);
|
|
9162
|
+
(0, import_react53.useEffect)(() => {
|
|
9148
9163
|
if (activeTab === tabRef.current) return;
|
|
9149
9164
|
tabRef.current = activeTab;
|
|
9150
9165
|
setExpanded(false);
|
|
9151
9166
|
}, [activeTab]);
|
|
9152
|
-
const expandedRef = (0,
|
|
9167
|
+
const expandedRef = (0, import_react53.useRef)(expanded);
|
|
9153
9168
|
expandedRef.current = expanded;
|
|
9154
|
-
(0,
|
|
9169
|
+
(0, import_react53.useEffect)(() => {
|
|
9155
9170
|
const onEscape = (e) => {
|
|
9156
9171
|
const dial = dialRef.current;
|
|
9157
9172
|
if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
|
|
@@ -9164,7 +9179,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
|
|
|
9164
9179
|
window.addEventListener("keydown", onEscape, true);
|
|
9165
9180
|
return () => window.removeEventListener("keydown", onEscape, true);
|
|
9166
9181
|
}, [dialRef, dialButtonRef]);
|
|
9167
|
-
(0,
|
|
9182
|
+
(0, import_react53.useEffect)(() => {
|
|
9168
9183
|
if (!expanded) return;
|
|
9169
9184
|
const layer = layerRef.current;
|
|
9170
9185
|
const inDial = (e) => {
|
|
@@ -9219,8 +9234,8 @@ function markToolSeen() {
|
|
|
9219
9234
|
var import_jsx_runtime94 = require("react/jsx-runtime");
|
|
9220
9235
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
9221
9236
|
function useIsModal() {
|
|
9222
|
-
const [modal, setModal] = (0,
|
|
9223
|
-
(0,
|
|
9237
|
+
const [modal, setModal] = (0, import_react54.useState)(false);
|
|
9238
|
+
(0, import_react54.useEffect)(() => {
|
|
9224
9239
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
9225
9240
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
9226
9241
|
const sync = () => setModal(mql.matches);
|
|
@@ -9234,7 +9249,7 @@ var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden",
|
|
|
9234
9249
|
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation, presetGrid }) {
|
|
9235
9250
|
const { state, close, stop, send, reset } = controller;
|
|
9236
9251
|
const isModal = useIsModal();
|
|
9237
|
-
(0,
|
|
9252
|
+
(0, import_react54.useEffect)(() => {
|
|
9238
9253
|
const onKey = (e) => {
|
|
9239
9254
|
if (e.key === "Escape") close();
|
|
9240
9255
|
};
|
|
@@ -9249,17 +9264,17 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9249
9264
|
monitor?.setActiveTab("chat");
|
|
9250
9265
|
send(text, { grounding });
|
|
9251
9266
|
};
|
|
9252
|
-
(0,
|
|
9267
|
+
(0, import_react54.useEffect)(() => {
|
|
9253
9268
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
9254
9269
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
9255
9270
|
const onChatTab = !monitor || monitor.activeTab === "chat";
|
|
9256
|
-
const layerRef = (0,
|
|
9257
|
-
const dialRef = (0,
|
|
9258
|
-
const dialButtonRef = (0,
|
|
9259
|
-
const inputRef = (0,
|
|
9260
|
-
const focusAfterCloseRef = (0,
|
|
9261
|
-
const [tool, setTool] = (0,
|
|
9262
|
-
const [toolSeen, setToolSeen] = (0,
|
|
9271
|
+
const layerRef = (0, import_react54.useRef)(null);
|
|
9272
|
+
const dialRef = (0, import_react54.useRef)(null);
|
|
9273
|
+
const dialButtonRef = (0, import_react54.useRef)(null);
|
|
9274
|
+
const inputRef = (0, import_react54.useRef)(null);
|
|
9275
|
+
const focusAfterCloseRef = (0, import_react54.useRef)(null);
|
|
9276
|
+
const [tool, setTool] = (0, import_react54.useState)(null);
|
|
9277
|
+
const [toolSeen, setToolSeen] = (0, import_react54.useState)(readToolSeen);
|
|
9263
9278
|
const dial = usePresetDial({
|
|
9264
9279
|
layerRef,
|
|
9265
9280
|
dialRef,
|
|
@@ -9270,39 +9285,39 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9270
9285
|
});
|
|
9271
9286
|
const { fold } = dial;
|
|
9272
9287
|
const showDial = !!presetGrid && onChatTab && !tool;
|
|
9273
|
-
const openTool = (0,
|
|
9288
|
+
const openTool = (0, import_react54.useCallback)((next) => {
|
|
9274
9289
|
fold();
|
|
9275
9290
|
markToolSeen();
|
|
9276
9291
|
setToolSeen(true);
|
|
9277
9292
|
setTool(next);
|
|
9278
9293
|
}, [fold]);
|
|
9279
|
-
const onPill = (0,
|
|
9280
|
-
const toolsValue = (0,
|
|
9294
|
+
const onPill = (0, import_react54.useCallback)((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
|
|
9295
|
+
const toolsValue = (0, import_react54.useMemo)(
|
|
9281
9296
|
() => presetGrid ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
|
|
9282
9297
|
[presetGrid, openTool, ui.presets.changeCombo]
|
|
9283
9298
|
);
|
|
9284
|
-
const closeTool = (0,
|
|
9299
|
+
const closeTool = (0, import_react54.useCallback)(() => {
|
|
9285
9300
|
focusAfterCloseRef.current = "dial";
|
|
9286
9301
|
setTool(null);
|
|
9287
9302
|
}, []);
|
|
9288
|
-
const sendAsk = (0,
|
|
9303
|
+
const sendAsk = (0, import_react54.useCallback)((ask) => {
|
|
9289
9304
|
focusAfterCloseRef.current = "composer";
|
|
9290
9305
|
setTool(null);
|
|
9291
9306
|
monitor?.setActiveTab("chat");
|
|
9292
9307
|
send(ask.message, { displayText: ask.displayText, preset: ask.preset });
|
|
9293
9308
|
}, [monitor, send]);
|
|
9294
|
-
const formatKickoff = (0,
|
|
9309
|
+
const formatKickoff = (0, import_react54.useCallback)((kickoffUtc) => {
|
|
9295
9310
|
const k = ui.bettingKickoff(kickoffUtc);
|
|
9296
9311
|
return `${k.dayLabel} ${k.time}`;
|
|
9297
9312
|
}, [ui]);
|
|
9298
|
-
(0,
|
|
9313
|
+
(0, import_react54.useEffect)(() => {
|
|
9299
9314
|
if (tool) return;
|
|
9300
9315
|
const target = focusAfterCloseRef.current;
|
|
9301
9316
|
focusAfterCloseRef.current = null;
|
|
9302
9317
|
if (target === "dial") dialButtonRef.current?.focus();
|
|
9303
9318
|
else if (target === "composer") inputRef.current?.focus();
|
|
9304
9319
|
}, [tool]);
|
|
9305
|
-
(0,
|
|
9320
|
+
(0, import_react54.useEffect)(() => {
|
|
9306
9321
|
if (!tool || onChatTab && presetGrid) return;
|
|
9307
9322
|
focusAfterCloseRef.current = "composer";
|
|
9308
9323
|
setTool(null);
|
|
@@ -11100,24 +11115,24 @@ function injectStyles(root) {
|
|
|
11100
11115
|
function StatsWidget(props) {
|
|
11101
11116
|
const injectedClient = "client" in props ? props.client : void 0;
|
|
11102
11117
|
const cfg = props.config;
|
|
11103
|
-
const built = (0,
|
|
11104
|
-
const logger = (0,
|
|
11118
|
+
const built = (0, import_react55.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
|
|
11119
|
+
const logger = (0, import_react55.useMemo)(
|
|
11105
11120
|
() => built ? built.client.createEventLogger({
|
|
11106
11121
|
operatorUserId: cfg?.userContext?.operatorUserId,
|
|
11107
11122
|
anonymousUserId: cfg?.userContext?.anonymousUserId
|
|
11108
11123
|
}) : null,
|
|
11109
11124
|
[built?.client]
|
|
11110
11125
|
);
|
|
11111
|
-
const ui = (0,
|
|
11112
|
-
const rootRef = (0,
|
|
11113
|
-
const introDoneRef = (0,
|
|
11114
|
-
const markIntroDone = (0,
|
|
11126
|
+
const ui = (0, import_react55.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
11127
|
+
const rootRef = (0, import_react55.useRef)(null);
|
|
11128
|
+
const introDoneRef = (0, import_react55.useRef)(false);
|
|
11129
|
+
const markIntroDone = (0, import_react55.useCallback)(() => {
|
|
11115
11130
|
introDoneRef.current = true;
|
|
11116
11131
|
}, []);
|
|
11117
11132
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
11118
11133
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
11119
|
-
const [hasToday, setHasToday] = (0,
|
|
11120
|
-
const liveCardWatches = (0,
|
|
11134
|
+
const [hasToday, setHasToday] = (0, import_react55.useState)(false);
|
|
11135
|
+
const liveCardWatches = (0, import_react55.useMemo)(() => {
|
|
11121
11136
|
const seen = /* @__PURE__ */ new Set();
|
|
11122
11137
|
const out = [];
|
|
11123
11138
|
for (const msg of controller.state.messages) {
|
|
@@ -11139,15 +11154,15 @@ function StatsWidget(props) {
|
|
|
11139
11154
|
hasToday,
|
|
11140
11155
|
watches: liveCardWatches
|
|
11141
11156
|
});
|
|
11142
|
-
const getSchedule = (0,
|
|
11157
|
+
const getSchedule = (0, import_react55.useCallback)(
|
|
11143
11158
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
|
|
11144
11159
|
[built]
|
|
11145
11160
|
);
|
|
11146
|
-
const getStates = (0,
|
|
11161
|
+
const getStates = (0, import_react55.useCallback)(
|
|
11147
11162
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
11148
11163
|
[built]
|
|
11149
11164
|
);
|
|
11150
|
-
const pinnedMatchIds = (0,
|
|
11165
|
+
const pinnedMatchIds = (0, import_react55.useMemo)(
|
|
11151
11166
|
() => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
|
|
11152
11167
|
[monitor.pins]
|
|
11153
11168
|
);
|
|
@@ -11159,11 +11174,11 @@ function StatsWidget(props) {
|
|
|
11159
11174
|
pinnedMatchIds
|
|
11160
11175
|
});
|
|
11161
11176
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
11162
|
-
(0,
|
|
11177
|
+
(0, import_react55.useEffect)(() => {
|
|
11163
11178
|
setHasToday(todayHasContent);
|
|
11164
11179
|
}, [todayHasContent]);
|
|
11165
|
-
const prevLiveSnapshotRef = (0,
|
|
11166
|
-
(0,
|
|
11180
|
+
const prevLiveSnapshotRef = (0, import_react55.useRef)(monitor.snapshot);
|
|
11181
|
+
(0, import_react55.useEffect)(() => {
|
|
11167
11182
|
const snap = monitor.snapshot;
|
|
11168
11183
|
if (!snap || snap === prevLiveSnapshotRef.current) return;
|
|
11169
11184
|
prevLiveSnapshotRef.current = snap;
|
|
@@ -11199,14 +11214,14 @@ function StatsWidget(props) {
|
|
|
11199
11214
|
}, [monitor.snapshot]);
|
|
11200
11215
|
const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
11201
11216
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
11202
|
-
const getPricePresets = (0,
|
|
11217
|
+
const getPricePresets = (0, import_react55.useCallback)(
|
|
11203
11218
|
(locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
|
|
11204
11219
|
[built]
|
|
11205
11220
|
);
|
|
11206
11221
|
const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
|
|
11207
11222
|
const markTodayActivity = monitor.markTodayActivity;
|
|
11208
|
-
const prevLiveCountRef = (0,
|
|
11209
|
-
(0,
|
|
11223
|
+
const prevLiveCountRef = (0, import_react55.useRef)(0);
|
|
11224
|
+
(0, import_react55.useEffect)(() => {
|
|
11210
11225
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
11211
11226
|
prevLiveCountRef.current = discovery.liveCount;
|
|
11212
11227
|
if (rose) markTodayActivity();
|
|
@@ -11220,7 +11235,7 @@ function StatsWidget(props) {
|
|
|
11220
11235
|
closePanel: controller.close
|
|
11221
11236
|
});
|
|
11222
11237
|
const markAdded = hostEvents.markAdded;
|
|
11223
|
-
const slip = (0,
|
|
11238
|
+
const slip = (0, import_react55.useMemo)(
|
|
11224
11239
|
() => {
|
|
11225
11240
|
const handler = props.config?.onAddToSlip;
|
|
11226
11241
|
return {
|
|
@@ -11239,11 +11254,12 @@ function StatsWidget(props) {
|
|
|
11239
11254
|
},
|
|
11240
11255
|
[props.config?.onAddToSlip, controller.state.conversationId, markAdded]
|
|
11241
11256
|
);
|
|
11242
|
-
const onDashboardTap = (0,
|
|
11257
|
+
const onDashboardTap = (0, import_react55.useMemo)(
|
|
11243
11258
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
|
|
11244
11259
|
[built, logger]
|
|
11245
11260
|
);
|
|
11246
11261
|
const dismissPopup = usePopupTelemetry(logger, controller.state.isOpen, controller.state.popupText, controller.dismissPopup);
|
|
11262
|
+
useOpenTelemetry(logger, controller.state.isOpen);
|
|
11247
11263
|
const asks = bubbleAsks(controller.state.messages, ui.presets.standoutAsk).map((ask) => ({
|
|
11248
11264
|
label: ask.label,
|
|
11249
11265
|
onTap: () => runBubbleAsk(ask, {
|
|
@@ -11257,11 +11273,11 @@ function StatsWidget(props) {
|
|
|
11257
11273
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
11258
11274
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
11259
11275
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
11260
|
-
(0,
|
|
11276
|
+
(0, import_react55.useEffect)(() => {
|
|
11261
11277
|
if (!logger) return;
|
|
11262
11278
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
11263
11279
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
11264
|
-
(0,
|
|
11280
|
+
(0, import_react55.useEffect)(() => {
|
|
11265
11281
|
if (!logger) return;
|
|
11266
11282
|
logger.resume();
|
|
11267
11283
|
const onHide = () => {
|
|
@@ -11279,7 +11295,7 @@ function StatsWidget(props) {
|
|
|
11279
11295
|
logger.dispose();
|
|
11280
11296
|
};
|
|
11281
11297
|
}, [logger]);
|
|
11282
|
-
(0,
|
|
11298
|
+
(0, import_react55.useEffect)(() => {
|
|
11283
11299
|
if (!built || !ui.injectStyles) return;
|
|
11284
11300
|
const node = rootRef.current?.getRootNode();
|
|
11285
11301
|
if (node) injectStyles(node);
|