@sensiblestats/widget-react 0.84.0 → 0.85.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 +800 -389
- 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 +763 -352
- package/dist/index.js.map +1 -1
- package/dist/styles.css +23 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/StatsWidget.tsx
|
|
2
|
-
import { useCallback as
|
|
2
|
+
import { useCallback as useCallback23, useEffect as useEffect34, useMemo as useMemo6, useRef as useRef31, useState as useState53 } from "react";
|
|
3
3
|
import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
|
|
4
4
|
|
|
5
5
|
// src/kickoff.ts
|
|
@@ -119,6 +119,38 @@ var STRINGS = {
|
|
|
119
119
|
clubFixturesEmpty: "No fixtures yet.",
|
|
120
120
|
clubStandingsEmpty: "Standings are not available yet.",
|
|
121
121
|
clubSquadEmpty: "Squad is not available yet.",
|
|
122
|
+
footRight: "Right",
|
|
123
|
+
footLeft: "Left",
|
|
124
|
+
footBoth: "Both",
|
|
125
|
+
positionGoalkeeper: "Goalkeeper",
|
|
126
|
+
positionDefender: "Defender",
|
|
127
|
+
positionMidfielder: "Midfielder",
|
|
128
|
+
positionAttacker: "Attacker",
|
|
129
|
+
tabRecords: "Records",
|
|
130
|
+
clubSquadStatsEmpty: "Squad stats are not available yet.",
|
|
131
|
+
clubPlayerDetailEmpty: "Player details are not available.",
|
|
132
|
+
clubRecordsEmpty: "Club records are not available yet.",
|
|
133
|
+
squadViewRoster: "Roster",
|
|
134
|
+
squadViewStats: "Stats",
|
|
135
|
+
statColApps: "Apps",
|
|
136
|
+
statColGoals: "Goals",
|
|
137
|
+
statColAssists: "Assists",
|
|
138
|
+
statColRating: "Rating",
|
|
139
|
+
statColMinutes: "Minutes",
|
|
140
|
+
statColYellow: "Yellow cards",
|
|
141
|
+
statColRed: "Red cards",
|
|
142
|
+
statColXg: "xG",
|
|
143
|
+
statColShots: "Shots",
|
|
144
|
+
detailNationality: "Nationality",
|
|
145
|
+
detailAge: "Age",
|
|
146
|
+
detailHeight: "Height",
|
|
147
|
+
detailFoot: "Foot",
|
|
148
|
+
detailSeason: "Season {season}",
|
|
149
|
+
clubPlayerBack: "Back",
|
|
150
|
+
recordsTopScorers: "Top scorers",
|
|
151
|
+
recordsMostAppearances: "Most appearances",
|
|
152
|
+
recordsMostAssists: "Most assists",
|
|
153
|
+
recordsSince: "Since {season}",
|
|
122
154
|
standingsColClub: "Club",
|
|
123
155
|
standingsColPlayed: "P",
|
|
124
156
|
standingsColWon: "W",
|
|
@@ -500,6 +532,38 @@ var STRINGS = {
|
|
|
500
532
|
clubFixturesEmpty: "Hen\xFCz fikst\xFCr yok.",
|
|
501
533
|
clubStandingsEmpty: "Puan durumu hen\xFCz mevcut de\u011Fil.",
|
|
502
534
|
clubSquadEmpty: "Kadro hen\xFCz mevcut de\u011Fil.",
|
|
535
|
+
footRight: "Sa\u011F",
|
|
536
|
+
footLeft: "Sol",
|
|
537
|
+
footBoth: "\u0130ki ayak",
|
|
538
|
+
positionGoalkeeper: "Kaleci",
|
|
539
|
+
positionDefender: "Defans",
|
|
540
|
+
positionMidfielder: "Orta saha",
|
|
541
|
+
positionAttacker: "Forvet",
|
|
542
|
+
tabRecords: "Rekorlar",
|
|
543
|
+
clubSquadStatsEmpty: "Kadro istatistikleri hen\xFCz mevcut de\u011Fil.",
|
|
544
|
+
clubPlayerDetailEmpty: "Oyuncu bilgileri mevcut de\u011Fil.",
|
|
545
|
+
clubRecordsEmpty: "Kul\xFCp rekorlar\u0131 hen\xFCz mevcut de\u011Fil.",
|
|
546
|
+
squadViewRoster: "Kadro",
|
|
547
|
+
squadViewStats: "\u0130statistik",
|
|
548
|
+
statColApps: "Ma\xE7",
|
|
549
|
+
statColGoals: "Gol",
|
|
550
|
+
statColAssists: "Asist",
|
|
551
|
+
statColRating: "Puan",
|
|
552
|
+
statColMinutes: "Dakika",
|
|
553
|
+
statColYellow: "Sar\u0131 kart",
|
|
554
|
+
statColRed: "K\u0131rm\u0131z\u0131 kart",
|
|
555
|
+
statColXg: "xG",
|
|
556
|
+
statColShots: "\u015Eut",
|
|
557
|
+
detailNationality: "Uyruk",
|
|
558
|
+
detailAge: "Ya\u015F",
|
|
559
|
+
detailHeight: "Boy",
|
|
560
|
+
detailFoot: "Ayak",
|
|
561
|
+
detailSeason: "{season} sezonu",
|
|
562
|
+
clubPlayerBack: "Geri",
|
|
563
|
+
recordsTopScorers: "En \xE7ok gol atanlar",
|
|
564
|
+
recordsMostAppearances: "En \xE7ok ma\xE7 yapanlar",
|
|
565
|
+
recordsMostAssists: "En \xE7ok asist yapanlar",
|
|
566
|
+
recordsSince: "{season} sezonundan beri",
|
|
503
567
|
standingsColClub: "Tak\u0131m",
|
|
504
568
|
standingsColPlayed: "O",
|
|
505
569
|
standingsColWon: "G",
|
|
@@ -878,6 +942,38 @@ function normalizeUi(cfg) {
|
|
|
878
942
|
clubFixturesEmpty: strings.clubFixturesEmpty,
|
|
879
943
|
clubStandingsEmpty: strings.clubStandingsEmpty,
|
|
880
944
|
clubSquadEmpty: strings.clubSquadEmpty,
|
|
945
|
+
footRight: strings.footRight,
|
|
946
|
+
footLeft: strings.footLeft,
|
|
947
|
+
footBoth: strings.footBoth,
|
|
948
|
+
positionGoalkeeper: strings.positionGoalkeeper,
|
|
949
|
+
positionDefender: strings.positionDefender,
|
|
950
|
+
positionMidfielder: strings.positionMidfielder,
|
|
951
|
+
positionAttacker: strings.positionAttacker,
|
|
952
|
+
tabRecords: strings.tabRecords,
|
|
953
|
+
clubSquadStatsEmpty: strings.clubSquadStatsEmpty,
|
|
954
|
+
clubPlayerDetailEmpty: strings.clubPlayerDetailEmpty,
|
|
955
|
+
clubRecordsEmpty: strings.clubRecordsEmpty,
|
|
956
|
+
squadViewRoster: strings.squadViewRoster,
|
|
957
|
+
squadViewStats: strings.squadViewStats,
|
|
958
|
+
statColApps: strings.statColApps,
|
|
959
|
+
statColGoals: strings.statColGoals,
|
|
960
|
+
statColAssists: strings.statColAssists,
|
|
961
|
+
statColRating: strings.statColRating,
|
|
962
|
+
statColMinutes: strings.statColMinutes,
|
|
963
|
+
statColYellow: strings.statColYellow,
|
|
964
|
+
statColRed: strings.statColRed,
|
|
965
|
+
statColXg: strings.statColXg,
|
|
966
|
+
statColShots: strings.statColShots,
|
|
967
|
+
detailNationality: strings.detailNationality,
|
|
968
|
+
detailAge: strings.detailAge,
|
|
969
|
+
detailHeight: strings.detailHeight,
|
|
970
|
+
detailFoot: strings.detailFoot,
|
|
971
|
+
detailSeason: strings.detailSeason,
|
|
972
|
+
clubPlayerBack: strings.clubPlayerBack,
|
|
973
|
+
recordsTopScorers: strings.recordsTopScorers,
|
|
974
|
+
recordsMostAppearances: strings.recordsMostAppearances,
|
|
975
|
+
recordsMostAssists: strings.recordsMostAssists,
|
|
976
|
+
recordsSince: strings.recordsSince,
|
|
881
977
|
standingsColClub: strings.standingsColClub,
|
|
882
978
|
standingsColPlayed: strings.standingsColPlayed,
|
|
883
979
|
standingsColWon: strings.standingsColWon,
|
|
@@ -3243,8 +3339,83 @@ function useClubSquad(conversation, { activeTab, enabled }) {
|
|
|
3243
3339
|
return { data, loading: effectiveLoading, refresh };
|
|
3244
3340
|
}
|
|
3245
3341
|
|
|
3342
|
+
// src/useClubSquadStats.ts
|
|
3343
|
+
import { useCallback as useCallback10, useEffect as useEffect11, useRef as useRef11, useState as useState10 } from "react";
|
|
3344
|
+
function useClubSquadStats(conversation, { activeTab, enabled }) {
|
|
3345
|
+
const [data, setData] = useState10(null);
|
|
3346
|
+
const [seasonName, setSeasonName] = useState10(null);
|
|
3347
|
+
const [loading, setLoading] = useState10(false);
|
|
3348
|
+
const [refreshCount, setRefreshCount] = useState10(0);
|
|
3349
|
+
const inFlightRef = useRef11(false);
|
|
3350
|
+
const conversationRef = useRef11(conversation);
|
|
3351
|
+
conversationRef.current = conversation;
|
|
3352
|
+
useEffect11(() => {
|
|
3353
|
+
if (activeTab !== "squad" || !enabled) return;
|
|
3354
|
+
let active = true;
|
|
3355
|
+
const doFetch = async () => {
|
|
3356
|
+
const conv = conversationRef.current;
|
|
3357
|
+
if (!conv || inFlightRef.current) return;
|
|
3358
|
+
inFlightRef.current = true;
|
|
3359
|
+
setLoading(true);
|
|
3360
|
+
try {
|
|
3361
|
+
const result = await conv.getClubSquadStats();
|
|
3362
|
+
if (active) {
|
|
3363
|
+
setData(result?.players ?? null);
|
|
3364
|
+
setSeasonName(result?.seasonName ?? null);
|
|
3365
|
+
}
|
|
3366
|
+
} catch {
|
|
3367
|
+
} finally {
|
|
3368
|
+
inFlightRef.current = false;
|
|
3369
|
+
if (active) setLoading(false);
|
|
3370
|
+
}
|
|
3371
|
+
};
|
|
3372
|
+
void doFetch();
|
|
3373
|
+
return () => {
|
|
3374
|
+
active = false;
|
|
3375
|
+
inFlightRef.current = false;
|
|
3376
|
+
};
|
|
3377
|
+
}, [activeTab, enabled, refreshCount]);
|
|
3378
|
+
const refresh = useCallback10(() => {
|
|
3379
|
+
setRefreshCount((c) => c + 1);
|
|
3380
|
+
}, []);
|
|
3381
|
+
const effectiveLoading = loading || activeTab === "squad" && enabled && data === null;
|
|
3382
|
+
return { data, seasonName, loading: effectiveLoading, refresh };
|
|
3383
|
+
}
|
|
3384
|
+
|
|
3385
|
+
// src/useClubPlayerDetail.ts
|
|
3386
|
+
import { useCallback as useCallback11, useRef as useRef12, useState as useState11 } from "react";
|
|
3387
|
+
function useClubPlayerDetail(conversation) {
|
|
3388
|
+
const [data, setData] = useState11(null);
|
|
3389
|
+
const [loading, setLoading] = useState11(false);
|
|
3390
|
+
const requestSeqRef = useRef12(0);
|
|
3391
|
+
const conversationRef = useRef12(conversation);
|
|
3392
|
+
conversationRef.current = conversation;
|
|
3393
|
+
const fetch = useCallback11((playerId) => {
|
|
3394
|
+
const conv = conversationRef.current;
|
|
3395
|
+
if (!conv) return;
|
|
3396
|
+
const seq = ++requestSeqRef.current;
|
|
3397
|
+
setData(null);
|
|
3398
|
+
setLoading(true);
|
|
3399
|
+
void (async () => {
|
|
3400
|
+
try {
|
|
3401
|
+
const result = await conv.getClubPlayerDetail(playerId);
|
|
3402
|
+
if (seq === requestSeqRef.current) setData(result);
|
|
3403
|
+
} catch {
|
|
3404
|
+
} finally {
|
|
3405
|
+
if (seq === requestSeqRef.current) setLoading(false);
|
|
3406
|
+
}
|
|
3407
|
+
})();
|
|
3408
|
+
}, []);
|
|
3409
|
+
const clear = useCallback11(() => {
|
|
3410
|
+
requestSeqRef.current++;
|
|
3411
|
+
setData(null);
|
|
3412
|
+
setLoading(false);
|
|
3413
|
+
}, []);
|
|
3414
|
+
return { data, loading, fetch, clear };
|
|
3415
|
+
}
|
|
3416
|
+
|
|
3246
3417
|
// src/usePresetGrid.ts
|
|
3247
|
-
import { useEffect as
|
|
3418
|
+
import { useEffect as useEffect12, useRef as useRef13, useState as useState12 } from "react";
|
|
3248
3419
|
|
|
3249
3420
|
// src/presetGrid.ts
|
|
3250
3421
|
var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
|
|
@@ -3387,22 +3558,22 @@ function marketDisplay(cell, s) {
|
|
|
3387
3558
|
// src/usePresetGrid.ts
|
|
3388
3559
|
var GRID_MAX_AGE_MS = 6e5;
|
|
3389
3560
|
function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
|
|
3390
|
-
const [grid, setGrid] =
|
|
3391
|
-
const keptRef =
|
|
3392
|
-
const localeRef =
|
|
3393
|
-
const inFlightRef =
|
|
3394
|
-
const mountedRef =
|
|
3395
|
-
const getRef =
|
|
3561
|
+
const [grid, setGrid] = useState12(null);
|
|
3562
|
+
const keptRef = useRef13(null);
|
|
3563
|
+
const localeRef = useRef13(locale);
|
|
3564
|
+
const inFlightRef = useRef13(false);
|
|
3565
|
+
const mountedRef = useRef13(true);
|
|
3566
|
+
const getRef = useRef13(getPricePresets);
|
|
3396
3567
|
getRef.current = getPricePresets;
|
|
3397
|
-
const nowRef =
|
|
3568
|
+
const nowRef = useRef13(now);
|
|
3398
3569
|
nowRef.current = now;
|
|
3399
|
-
|
|
3570
|
+
useEffect12(() => {
|
|
3400
3571
|
mountedRef.current = true;
|
|
3401
3572
|
return () => {
|
|
3402
3573
|
mountedRef.current = false;
|
|
3403
3574
|
};
|
|
3404
3575
|
}, []);
|
|
3405
|
-
|
|
3576
|
+
useEffect12(() => {
|
|
3406
3577
|
if (localeRef.current !== locale) {
|
|
3407
3578
|
localeRef.current = locale;
|
|
3408
3579
|
keptRef.current = null;
|
|
@@ -3452,11 +3623,11 @@ function useEventLog() {
|
|
|
3452
3623
|
}
|
|
3453
3624
|
|
|
3454
3625
|
// src/popupTelemetry.ts
|
|
3455
|
-
import { useCallback as
|
|
3626
|
+
import { useCallback as useCallback12, useEffect as useEffect13, useRef as useRef14 } from "react";
|
|
3456
3627
|
function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
3457
|
-
const shownRef =
|
|
3458
|
-
const closedTextRef =
|
|
3459
|
-
|
|
3628
|
+
const shownRef = useRef14(/* @__PURE__ */ new Set());
|
|
3629
|
+
const closedTextRef = useRef14(null);
|
|
3630
|
+
useEffect13(() => {
|
|
3460
3631
|
if (isOpen) {
|
|
3461
3632
|
if (closedTextRef.current) log?.log({ name: "popup_opened" });
|
|
3462
3633
|
closedTextRef.current = null;
|
|
@@ -3468,17 +3639,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
|
3468
3639
|
log?.log({ name: "popup_shown" });
|
|
3469
3640
|
}
|
|
3470
3641
|
}, [log, isOpen, popupText]);
|
|
3471
|
-
return
|
|
3642
|
+
return useCallback12(() => {
|
|
3472
3643
|
log?.log({ name: "popup_dismissed" });
|
|
3473
3644
|
dismissPopup();
|
|
3474
3645
|
}, [log, dismissPopup]);
|
|
3475
3646
|
}
|
|
3476
3647
|
|
|
3477
3648
|
// src/openTelemetry.ts
|
|
3478
|
-
import { useEffect as
|
|
3649
|
+
import { useEffect as useEffect14, useRef as useRef15 } from "react";
|
|
3479
3650
|
function useOpenTelemetry(log, isOpen) {
|
|
3480
|
-
const openLoggedRef =
|
|
3481
|
-
|
|
3651
|
+
const openLoggedRef = useRef15(false);
|
|
3652
|
+
useEffect14(() => {
|
|
3482
3653
|
if (!isOpen) {
|
|
3483
3654
|
openLoggedRef.current = false;
|
|
3484
3655
|
return;
|
|
@@ -3490,10 +3661,10 @@ function useOpenTelemetry(log, isOpen) {
|
|
|
3490
3661
|
}
|
|
3491
3662
|
|
|
3492
3663
|
// src/components/ChatFab.tsx
|
|
3493
|
-
import { useEffect as
|
|
3664
|
+
import { useEffect as useEffect15, useRef as useRef16, useState as useState14 } from "react";
|
|
3494
3665
|
|
|
3495
3666
|
// src/components/BrandMark.tsx
|
|
3496
|
-
import { useState as
|
|
3667
|
+
import { useState as useState13 } from "react";
|
|
3497
3668
|
|
|
3498
3669
|
// src/assets/logo.ts
|
|
3499
3670
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
@@ -3556,7 +3727,7 @@ function DashboardIcon({ name }) {
|
|
|
3556
3727
|
// src/components/BrandMark.tsx
|
|
3557
3728
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
3558
3729
|
function BrandMark({ logoUrl, className }) {
|
|
3559
|
-
const [failed, setFailed] =
|
|
3730
|
+
const [failed, setFailed] = useState13(false);
|
|
3560
3731
|
if (!logoUrl || failed) return /* @__PURE__ */ jsx2(SsMark, { className });
|
|
3561
3732
|
return /* @__PURE__ */ jsx2("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3562
3733
|
}
|
|
@@ -3592,9 +3763,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
|
|
|
3592
3763
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
3593
3764
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
|
|
3594
3765
|
const bubble = popupText ?? greeting;
|
|
3595
|
-
const [intro, setIntro] =
|
|
3596
|
-
const armedRef =
|
|
3597
|
-
|
|
3766
|
+
const [intro, setIntro] = useState14(false);
|
|
3767
|
+
const armedRef = useRef16(introAllowed);
|
|
3768
|
+
useEffect15(() => {
|
|
3598
3769
|
if (armedRef.current && bubble) {
|
|
3599
3770
|
armedRef.current = false;
|
|
3600
3771
|
setIntro(true);
|
|
@@ -3608,10 +3779,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
3608
3779
|
}
|
|
3609
3780
|
|
|
3610
3781
|
// src/components/ChatPanel.tsx
|
|
3611
|
-
import { useCallback as
|
|
3782
|
+
import { useCallback as useCallback22, useEffect as useEffect33, useLayoutEffect, useMemo as useMemo5, useRef as useRef30, useState as useState52 } from "react";
|
|
3612
3783
|
|
|
3613
3784
|
// src/components/ChatHeader.tsx
|
|
3614
|
-
import { useEffect as
|
|
3785
|
+
import { useEffect as useEffect16, useRef as useRef17, useState as useState15 } from "react";
|
|
3615
3786
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
3616
3787
|
function ChatHeader({
|
|
3617
3788
|
onClose,
|
|
@@ -3623,15 +3794,15 @@ function ChatHeader({
|
|
|
3623
3794
|
newConversationLabel = "New conversation",
|
|
3624
3795
|
moreOptionsLabel = "More options"
|
|
3625
3796
|
}) {
|
|
3626
|
-
const [menuOpen, setMenuOpen] =
|
|
3627
|
-
const wrapRef =
|
|
3628
|
-
const kebabRef =
|
|
3629
|
-
const firstItemRef =
|
|
3797
|
+
const [menuOpen, setMenuOpen] = useState15(false);
|
|
3798
|
+
const wrapRef = useRef17(null);
|
|
3799
|
+
const kebabRef = useRef17(null);
|
|
3800
|
+
const firstItemRef = useRef17(null);
|
|
3630
3801
|
const hasMenu = !!(canReset && onNewConversation);
|
|
3631
|
-
|
|
3802
|
+
useEffect16(() => {
|
|
3632
3803
|
if (menuOpen) firstItemRef.current?.focus();
|
|
3633
3804
|
}, [menuOpen]);
|
|
3634
|
-
|
|
3805
|
+
useEffect16(() => {
|
|
3635
3806
|
if (!menuOpen) return;
|
|
3636
3807
|
const onPointer = (e) => {
|
|
3637
3808
|
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
@@ -3687,7 +3858,7 @@ function ChatHeader({
|
|
|
3687
3858
|
}
|
|
3688
3859
|
|
|
3689
3860
|
// src/components/MessageList.tsx
|
|
3690
|
-
import { useEffect as
|
|
3861
|
+
import { useEffect as useEffect22, useRef as useRef20 } from "react";
|
|
3691
3862
|
|
|
3692
3863
|
// src/components/Markdown.tsx
|
|
3693
3864
|
import ReactMarkdown from "react-markdown";
|
|
@@ -3705,7 +3876,7 @@ function Markdown({ text }) {
|
|
|
3705
3876
|
}
|
|
3706
3877
|
|
|
3707
3878
|
// src/components/EntityCardList.tsx
|
|
3708
|
-
import { useState as
|
|
3879
|
+
import { useState as useState16 } from "react";
|
|
3709
3880
|
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
3710
3881
|
var MAX_VISIBLE = 3;
|
|
3711
3882
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
@@ -3789,7 +3960,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
3789
3960
|
)) });
|
|
3790
3961
|
}
|
|
3791
3962
|
function EntityCardItem({ c }) {
|
|
3792
|
-
const [active, setActive] =
|
|
3963
|
+
const [active, setActive] = useState16(0);
|
|
3793
3964
|
const hasBody = c.scopes.length > 0;
|
|
3794
3965
|
if (!hasBody) {
|
|
3795
3966
|
return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
|
|
@@ -3803,7 +3974,7 @@ function EntityCardItem({ c }) {
|
|
|
3803
3974
|
] });
|
|
3804
3975
|
}
|
|
3805
3976
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
3806
|
-
const [expanded, setExpanded] =
|
|
3977
|
+
const [expanded, setExpanded] = useState16(false);
|
|
3807
3978
|
if (cards.length === 0) return null;
|
|
3808
3979
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
3809
3980
|
const overflow = cards.length - MAX_VISIBLE;
|
|
@@ -3814,10 +3985,10 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
3814
3985
|
}
|
|
3815
3986
|
|
|
3816
3987
|
// src/components/AddToSlipButton.tsx
|
|
3817
|
-
import { useCallback as
|
|
3988
|
+
import { useCallback as useCallback14, useState as useState17 } from "react";
|
|
3818
3989
|
|
|
3819
3990
|
// src/slipAdd.ts
|
|
3820
|
-
import { useCallback as
|
|
3991
|
+
import { useCallback as useCallback13 } from "react";
|
|
3821
3992
|
import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
|
|
3822
3993
|
|
|
3823
3994
|
// src/slipStateContext.ts
|
|
@@ -3839,7 +4010,7 @@ function useSlipAdd(slip, ui) {
|
|
|
3839
4010
|
const slipState = useSlipState();
|
|
3840
4011
|
const handler = slip.onAddToSlip;
|
|
3841
4012
|
const rawLabels = !!ui?.rawBettingLabels;
|
|
3842
|
-
return
|
|
4013
|
+
return useCallback13(async (selection, { marketDeveloperName, selectionLabel, line }) => {
|
|
3843
4014
|
if (!handler) return { kind: "failed" };
|
|
3844
4015
|
const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
|
|
3845
4016
|
if (marketDeveloperName !== void 0) {
|
|
@@ -3876,11 +4047,11 @@ function useSlipAdd(slip, ui) {
|
|
|
3876
4047
|
}
|
|
3877
4048
|
|
|
3878
4049
|
// src/components/Toast.tsx
|
|
3879
|
-
import { useEffect as
|
|
4050
|
+
import { useEffect as useEffect17 } from "react";
|
|
3880
4051
|
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
3881
4052
|
var DISMISS_MS = 4e3;
|
|
3882
4053
|
function Toast({ toast, onDismiss }) {
|
|
3883
|
-
|
|
4054
|
+
useEffect17(() => {
|
|
3884
4055
|
if (!toast) return;
|
|
3885
4056
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
3886
4057
|
return () => clearTimeout(timer);
|
|
@@ -3892,10 +4063,10 @@ function Toast({ toast, onDismiss }) {
|
|
|
3892
4063
|
// src/components/AddToSlipButton.tsx
|
|
3893
4064
|
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
3894
4065
|
function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
|
|
3895
|
-
const [pending, setPending] =
|
|
3896
|
-
const [settledLocal, setSettledLocal] =
|
|
3897
|
-
const [toast, setToast] =
|
|
3898
|
-
const dismiss =
|
|
4066
|
+
const [pending, setPending] = useState17(false);
|
|
4067
|
+
const [settledLocal, setSettledLocal] = useState17(false);
|
|
4068
|
+
const [toast, setToast] = useState17(null);
|
|
4069
|
+
const dismiss = useCallback14(() => setToast(null), []);
|
|
3899
4070
|
const add = useSlipAdd(slip, ui);
|
|
3900
4071
|
const slipState = useSlipState();
|
|
3901
4072
|
const handler = slip.onAddToSlip;
|
|
@@ -3983,14 +4154,14 @@ function OddsMovementBadge({
|
|
|
3983
4154
|
}
|
|
3984
4155
|
|
|
3985
4156
|
// src/components/Crest.tsx
|
|
3986
|
-
import { useState as
|
|
4157
|
+
import { useState as useState18 } from "react";
|
|
3987
4158
|
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
3988
4159
|
function initials2(name) {
|
|
3989
4160
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
3990
4161
|
}
|
|
3991
4162
|
function Crest2({ url, name, kind }) {
|
|
3992
4163
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
3993
|
-
const [failed, setFailed] =
|
|
4164
|
+
const [failed, setFailed] = useState18(false);
|
|
3994
4165
|
if (url && !failed) {
|
|
3995
4166
|
return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3996
4167
|
}
|
|
@@ -3998,7 +4169,7 @@ function Crest2({ url, name, kind }) {
|
|
|
3998
4169
|
}
|
|
3999
4170
|
|
|
4000
4171
|
// src/components/PinToggle.tsx
|
|
4001
|
-
import { useCallback as
|
|
4172
|
+
import { useCallback as useCallback15, useState as useState19 } from "react";
|
|
4002
4173
|
import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
4003
4174
|
var PIN_GLYPHS = {
|
|
4004
4175
|
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" },
|
|
@@ -4006,8 +4177,8 @@ var PIN_GLYPHS = {
|
|
|
4006
4177
|
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" }
|
|
4007
4178
|
};
|
|
4008
4179
|
function PinToggle({ pin, monitor, ui, market }) {
|
|
4009
|
-
const [toast, setToast] =
|
|
4010
|
-
const dismiss =
|
|
4180
|
+
const [toast, setToast] = useState19(null);
|
|
4181
|
+
const dismiss = useCallback15(() => setToast(null), []);
|
|
4011
4182
|
const log = useEventLog();
|
|
4012
4183
|
if (!monitor || !monitor.enabled) return null;
|
|
4013
4184
|
const key = pinKey(pin);
|
|
@@ -4064,11 +4235,11 @@ function PinToggle({ pin, monitor, ui, market }) {
|
|
|
4064
4235
|
}
|
|
4065
4236
|
|
|
4066
4237
|
// src/components/PriceHistoryButton.tsx
|
|
4067
|
-
import { useCallback as
|
|
4238
|
+
import { useCallback as useCallback16, useState as useState20 } from "react";
|
|
4068
4239
|
import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
4069
4240
|
function PriceHistoryButton({ selection, monitor, ui }) {
|
|
4070
|
-
const [toast, setToast] =
|
|
4071
|
-
const dismiss =
|
|
4241
|
+
const [toast, setToast] = useState20(null);
|
|
4242
|
+
const dismiss = useCallback16(() => setToast(null), []);
|
|
4072
4243
|
const log = useEventLog();
|
|
4073
4244
|
if (!monitor || !monitor.enabled) return null;
|
|
4074
4245
|
const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
|
|
@@ -4183,15 +4354,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
4183
4354
|
}
|
|
4184
4355
|
|
|
4185
4356
|
// src/components/AddAllToSlipButton.tsx
|
|
4186
|
-
import { useCallback as
|
|
4357
|
+
import { useCallback as useCallback17, useState as useState21 } from "react";
|
|
4187
4358
|
import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
4188
4359
|
function AddAllToSlipButton({ legs, slip, ui }) {
|
|
4189
4360
|
const add = useSlipAdd(slip, ui);
|
|
4190
4361
|
const slipState = useSlipState();
|
|
4191
|
-
const [pending, setPending] =
|
|
4192
|
-
const [settledLocal, setSettledLocal] =
|
|
4193
|
-
const [toast, setToast] =
|
|
4194
|
-
const dismiss =
|
|
4362
|
+
const [pending, setPending] = useState21(false);
|
|
4363
|
+
const [settledLocal, setSettledLocal] = useState21({});
|
|
4364
|
+
const [toast, setToast] = useState21(null);
|
|
4365
|
+
const dismiss = useCallback17(() => setToast(null), []);
|
|
4195
4366
|
if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
|
|
4196
4367
|
const settled = slipState ? slipState.settled : settledLocal;
|
|
4197
4368
|
const open = legs.filter((leg) => !settled[leg.matchOddsId]);
|
|
@@ -4301,7 +4472,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
|
|
|
4301
4472
|
}
|
|
4302
4473
|
|
|
4303
4474
|
// src/components/MarketOddsCardList.tsx
|
|
4304
|
-
import { useEffect as
|
|
4475
|
+
import { useEffect as useEffect18, useState as useState22 } from "react";
|
|
4305
4476
|
|
|
4306
4477
|
// src/components/AllMarketsButton.tsx
|
|
4307
4478
|
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
@@ -4364,7 +4535,7 @@ function fmtHhMm(iso, locale) {
|
|
|
4364
4535
|
return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
|
|
4365
4536
|
}
|
|
4366
4537
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
4367
|
-
const [open, setOpen] =
|
|
4538
|
+
const [open, setOpen] = useState22(false);
|
|
4368
4539
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
4369
4540
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
4370
4541
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
@@ -4374,9 +4545,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
4374
4545
|
const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
|
|
4375
4546
|
const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
|
|
4376
4547
|
const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
|
|
4377
|
-
const [, setStaleTick] =
|
|
4548
|
+
const [, setStaleTick] = useState22(0);
|
|
4378
4549
|
const watchStale = live != null && !isClosed && !isStale;
|
|
4379
|
-
|
|
4550
|
+
useEffect18(() => {
|
|
4380
4551
|
if (!watchStale) return;
|
|
4381
4552
|
const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
|
|
4382
4553
|
return () => window.clearTimeout(id);
|
|
@@ -4455,7 +4626,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
|
|
|
4455
4626
|
}
|
|
4456
4627
|
|
|
4457
4628
|
// src/components/CompactOddsList.tsx
|
|
4458
|
-
import { useEffect as
|
|
4629
|
+
import { useEffect as useEffect19, useRef as useRef18, useState as useState23 } from "react";
|
|
4459
4630
|
|
|
4460
4631
|
// src/compactList.ts
|
|
4461
4632
|
var COMPACT_MIN_CARDS = 3;
|
|
@@ -4569,11 +4740,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
|
|
|
4569
4740
|
] });
|
|
4570
4741
|
}
|
|
4571
4742
|
function CompactOddsList({ list, ui, slip, monitor }) {
|
|
4572
|
-
const [shown, setShown] =
|
|
4743
|
+
const [shown, setShown] = useState23(COMPACT_PAGE);
|
|
4573
4744
|
const hidden = list.rowCount - shown;
|
|
4574
|
-
const [focusIndex, setFocusIndex] =
|
|
4575
|
-
const focusRef =
|
|
4576
|
-
|
|
4745
|
+
const [focusIndex, setFocusIndex] = useState23(null);
|
|
4746
|
+
const focusRef = useRef18(null);
|
|
4747
|
+
useEffect19(() => {
|
|
4577
4748
|
if (focusIndex !== null) focusRef.current?.focus();
|
|
4578
4749
|
}, [focusIndex]);
|
|
4579
4750
|
let left = shown;
|
|
@@ -4878,7 +5049,7 @@ function FixtureCard({ card }) {
|
|
|
4878
5049
|
}
|
|
4879
5050
|
|
|
4880
5051
|
// src/components/dashboard/CountdownCard.tsx
|
|
4881
|
-
import { Fragment as Fragment6, useEffect as
|
|
5052
|
+
import { Fragment as Fragment6, useEffect as useEffect20, useState as useState24 } from "react";
|
|
4882
5053
|
import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
4883
5054
|
var DAY_MS = 864e5;
|
|
4884
5055
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -4897,12 +5068,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
4897
5068
|
function CountdownCard({ card }) {
|
|
4898
5069
|
const { data } = card;
|
|
4899
5070
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
4900
|
-
const [nowMs, setNowMs] =
|
|
4901
|
-
const [reduced] =
|
|
5071
|
+
const [nowMs, setNowMs] = useState24(() => Date.now());
|
|
5072
|
+
const [reduced] = useState24(
|
|
4902
5073
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
4903
5074
|
);
|
|
4904
5075
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
4905
|
-
|
|
5076
|
+
useEffect20(() => {
|
|
4906
5077
|
if (reduced) return;
|
|
4907
5078
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
4908
5079
|
return () => window.clearInterval(id);
|
|
@@ -4921,7 +5092,7 @@ function CountdownCard({ card }) {
|
|
|
4921
5092
|
}
|
|
4922
5093
|
|
|
4923
5094
|
// src/components/dashboard/InjuriesCard.tsx
|
|
4924
|
-
import { useState as
|
|
5095
|
+
import { useState as useState25 } from "react";
|
|
4925
5096
|
import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
4926
5097
|
var SHOWN = 3;
|
|
4927
5098
|
function ColHead({ name, crestUrl }) {
|
|
@@ -4944,7 +5115,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
4944
5115
|
}
|
|
4945
5116
|
function InjuriesCard({ card, ui }) {
|
|
4946
5117
|
const { data } = card;
|
|
4947
|
-
const [expanded, setExpanded] =
|
|
5118
|
+
const [expanded, setExpanded] = useState25(false);
|
|
4948
5119
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
4949
5120
|
const limit = expanded ? void 0 : SHOWN;
|
|
4950
5121
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
@@ -5050,7 +5221,7 @@ function LinksCard({ card }) {
|
|
|
5050
5221
|
}
|
|
5051
5222
|
|
|
5052
5223
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
5053
|
-
import { useState as
|
|
5224
|
+
import { useState as useState26 } from "react";
|
|
5054
5225
|
import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
5055
5226
|
function initials3(name) {
|
|
5056
5227
|
return name.trim().slice(0, 3).toUpperCase();
|
|
@@ -5060,7 +5231,7 @@ function PostMatchCrest({
|
|
|
5060
5231
|
name,
|
|
5061
5232
|
side
|
|
5062
5233
|
}) {
|
|
5063
|
-
const [failed, setFailed] =
|
|
5234
|
+
const [failed, setFailed] = useState26(false);
|
|
5064
5235
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
5065
5236
|
if (url && !failed) {
|
|
5066
5237
|
return /* @__PURE__ */ jsx32("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5259,10 +5430,10 @@ function RestingFormCard({ card }) {
|
|
|
5259
5430
|
}
|
|
5260
5431
|
|
|
5261
5432
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
5262
|
-
import { useRef as
|
|
5433
|
+
import { useRef as useRef19, useState as useState28 } from "react";
|
|
5263
5434
|
|
|
5264
5435
|
// src/useLiveClock.ts
|
|
5265
|
-
import { useEffect as
|
|
5436
|
+
import { useEffect as useEffect21, useState as useState27 } from "react";
|
|
5266
5437
|
var TICK_MS = 6e4;
|
|
5267
5438
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
5268
5439
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -5271,10 +5442,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
5271
5442
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
5272
5443
|
}
|
|
5273
5444
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
5274
|
-
const [displayMinute, setDisplayMinute] =
|
|
5445
|
+
const [displayMinute, setDisplayMinute] = useState27(
|
|
5275
5446
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
5276
5447
|
);
|
|
5277
|
-
|
|
5448
|
+
useEffect21(() => {
|
|
5278
5449
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
5279
5450
|
if (!clockRunning) return;
|
|
5280
5451
|
const id = window.setInterval(() => {
|
|
@@ -5291,7 +5462,7 @@ function initials5(name) {
|
|
|
5291
5462
|
return name.trim().slice(0, 3).toUpperCase();
|
|
5292
5463
|
}
|
|
5293
5464
|
function LiveCrest({ url, name, side }) {
|
|
5294
|
-
const [failed, setFailed] =
|
|
5465
|
+
const [failed, setFailed] = useState28(false);
|
|
5295
5466
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
5296
5467
|
if (url && !failed) {
|
|
5297
5468
|
return /* @__PURE__ */ jsx41("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5310,7 +5481,7 @@ function LiveScoreCard({
|
|
|
5310
5481
|
}) {
|
|
5311
5482
|
const { data } = card;
|
|
5312
5483
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
5313
|
-
const seedRef =
|
|
5484
|
+
const seedRef = useRef19(null);
|
|
5314
5485
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
5315
5486
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
5316
5487
|
}
|
|
@@ -5350,7 +5521,7 @@ function LiveScoreCard({
|
|
|
5350
5521
|
}
|
|
5351
5522
|
|
|
5352
5523
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
5353
|
-
import { useState as
|
|
5524
|
+
import { useState as useState29 } from "react";
|
|
5354
5525
|
import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
5355
5526
|
var SHOWN2 = 3;
|
|
5356
5527
|
function EventIcon({ type }) {
|
|
@@ -5392,7 +5563,7 @@ function EventRow({ e }) {
|
|
|
5392
5563
|
] });
|
|
5393
5564
|
}
|
|
5394
5565
|
function LiveTimelineCard({ card, ui }) {
|
|
5395
|
-
const [expanded, setExpanded] =
|
|
5566
|
+
const [expanded, setExpanded] = useState29(false);
|
|
5396
5567
|
const events = card.data.events;
|
|
5397
5568
|
if (!events || events.length === 0) return null;
|
|
5398
5569
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -5634,11 +5805,11 @@ function turnAnchor(messages) {
|
|
|
5634
5805
|
}
|
|
5635
5806
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
5636
5807
|
const { state, send } = controller;
|
|
5637
|
-
const listRef =
|
|
5638
|
-
const endRef =
|
|
5639
|
-
const pinnedRef =
|
|
5640
|
-
const anchoredTurnRef =
|
|
5641
|
-
|
|
5808
|
+
const listRef = useRef20(null);
|
|
5809
|
+
const endRef = useRef20(null);
|
|
5810
|
+
const pinnedRef = useRef20(true);
|
|
5811
|
+
const anchoredTurnRef = useRef20(null);
|
|
5812
|
+
useEffect22(() => {
|
|
5642
5813
|
const anchor = turnAnchor(state.messages);
|
|
5643
5814
|
const list = listRef.current;
|
|
5644
5815
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -5695,13 +5866,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
5695
5866
|
}
|
|
5696
5867
|
|
|
5697
5868
|
// src/components/ChatInput.tsx
|
|
5698
|
-
import { forwardRef, useEffect as
|
|
5869
|
+
import { forwardRef, useEffect as useEffect23, useImperativeHandle, useRef as useRef21, useState as useState30 } from "react";
|
|
5699
5870
|
import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
5700
5871
|
var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
|
|
5701
|
-
const [value, setValue] =
|
|
5702
|
-
const textareaRef =
|
|
5703
|
-
const stopRef =
|
|
5704
|
-
const textBoxWantsFocusRef =
|
|
5872
|
+
const [value, setValue] = useState30("");
|
|
5873
|
+
const textareaRef = useRef21(null);
|
|
5874
|
+
const stopRef = useRef21(null);
|
|
5875
|
+
const textBoxWantsFocusRef = useRef21(false);
|
|
5705
5876
|
const submit = () => {
|
|
5706
5877
|
if (disabled) return;
|
|
5707
5878
|
const t = value.trim();
|
|
@@ -5727,7 +5898,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
|
|
|
5727
5898
|
stopRef.current?.focus();
|
|
5728
5899
|
}
|
|
5729
5900
|
}), []);
|
|
5730
|
-
|
|
5901
|
+
useEffect23(() => {
|
|
5731
5902
|
if (streaming || disabled || !textBoxWantsFocusRef.current) return;
|
|
5732
5903
|
textBoxWantsFocusRef.current = false;
|
|
5733
5904
|
const box = textareaRef.current;
|
|
@@ -5759,6 +5930,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
|
|
|
5759
5930
|
});
|
|
5760
5931
|
|
|
5761
5932
|
// src/components/TabBar.tsx
|
|
5933
|
+
import { useEffect as useEffect24, useRef as useRef22 } from "react";
|
|
5762
5934
|
import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
5763
5935
|
function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
|
|
5764
5936
|
const tabs = [
|
|
@@ -5774,8 +5946,16 @@ function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, game
|
|
|
5774
5946
|
],
|
|
5775
5947
|
...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
|
|
5776
5948
|
];
|
|
5949
|
+
const listRef = useRef22(null);
|
|
5950
|
+
const activeTab = monitor.activeTab;
|
|
5951
|
+
useEffect24(() => {
|
|
5952
|
+
const el = listRef.current?.querySelector("[data-on]");
|
|
5953
|
+
if (!el || typeof el.scrollIntoView !== "function") return;
|
|
5954
|
+
const reduce = typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
5955
|
+
el.scrollIntoView({ block: "nearest", inline: "nearest", behavior: reduce ? "auto" : "smooth" });
|
|
5956
|
+
}, [activeTab]);
|
|
5777
5957
|
if (tabs.length < 2) return null;
|
|
5778
|
-
return /* @__PURE__ */ jsx50("div", { className: "ss-w-tabs", role: "tablist", children: tabs.map(({ tab, label, count, dot }) => {
|
|
5958
|
+
return /* @__PURE__ */ jsx50("div", { className: "ss-w-tabs", role: "tablist", ref: listRef, children: tabs.map(({ tab, label, count, dot }) => {
|
|
5779
5959
|
const active = monitor.activeTab === tab;
|
|
5780
5960
|
return /* @__PURE__ */ jsxs45(
|
|
5781
5961
|
"button",
|
|
@@ -5852,10 +6032,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
5852
6032
|
}
|
|
5853
6033
|
|
|
5854
6034
|
// src/components/LiveFactBlock.tsx
|
|
5855
|
-
import { useState as
|
|
6035
|
+
import { useState as useState31 } from "react";
|
|
5856
6036
|
import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
5857
6037
|
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
5858
|
-
const [expanded, setExpanded] =
|
|
6038
|
+
const [expanded, setExpanded] = useState31(false);
|
|
5859
6039
|
const [current, ...earlier] = facts;
|
|
5860
6040
|
if (!current) return null;
|
|
5861
6041
|
const m = current.market;
|
|
@@ -6121,7 +6301,7 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
6121
6301
|
}
|
|
6122
6302
|
|
|
6123
6303
|
// src/components/TodayPanel.tsx
|
|
6124
|
-
import { useEffect as
|
|
6304
|
+
import { useEffect as useEffect26, useId as useId2, useMemo as useMemo4, useState as useState34 } from "react";
|
|
6125
6305
|
|
|
6126
6306
|
// src/placement.ts
|
|
6127
6307
|
function placeLeagues(visible, pinnedMatchIds) {
|
|
@@ -6184,11 +6364,11 @@ function matchingFixtures(group, query) {
|
|
|
6184
6364
|
}
|
|
6185
6365
|
|
|
6186
6366
|
// src/useStarTap.ts
|
|
6187
|
-
import { useCallback as
|
|
6367
|
+
import { useCallback as useCallback18, useRef as useRef23, useState as useState32 } from "react";
|
|
6188
6368
|
function useStarTap(starLeague) {
|
|
6189
|
-
const [pendingId, setPendingId] =
|
|
6190
|
-
const pendingRef =
|
|
6191
|
-
const tap =
|
|
6369
|
+
const [pendingId, setPendingId] = useState32(null);
|
|
6370
|
+
const pendingRef = useRef23(null);
|
|
6371
|
+
const tap = useCallback18(async (competitionId, next) => {
|
|
6192
6372
|
if (pendingRef.current !== null) return false;
|
|
6193
6373
|
pendingRef.current = competitionId;
|
|
6194
6374
|
setPendingId(competitionId);
|
|
@@ -6247,7 +6427,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
|
|
|
6247
6427
|
}
|
|
6248
6428
|
|
|
6249
6429
|
// src/components/LeagueDetail.tsx
|
|
6250
|
-
import { useEffect as
|
|
6430
|
+
import { useEffect as useEffect25, useState as useState33 } from "react";
|
|
6251
6431
|
|
|
6252
6432
|
// src/components/FixtureRow.tsx
|
|
6253
6433
|
import { jsx as jsx56, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
@@ -6282,11 +6462,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
|
6282
6462
|
import { jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
6283
6463
|
var STAR_PATH2 = "M12 2.5l2.9 5.9 6.5.95-4.7 4.58 1.1 6.47L12 17.35 6.1 20.4l1.1-6.47L2.5 9.35l6.5-.95z";
|
|
6284
6464
|
function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
|
|
6285
|
-
const [toast, setToast] =
|
|
6286
|
-
|
|
6465
|
+
const [toast, setToast] = useState33(null);
|
|
6466
|
+
useEffect25(() => {
|
|
6287
6467
|
setToast(null);
|
|
6288
6468
|
}, [group.competitionId]);
|
|
6289
|
-
|
|
6469
|
+
useEffect25(() => {
|
|
6290
6470
|
if (toast === null) return;
|
|
6291
6471
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6292
6472
|
return () => clearTimeout(id);
|
|
@@ -6418,7 +6598,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
|
|
|
6418
6598
|
}
|
|
6419
6599
|
|
|
6420
6600
|
// src/components/games/ui/SearchField.tsx
|
|
6421
|
-
import { useCallback as
|
|
6601
|
+
import { useCallback as useCallback19, useRef as useRef24 } from "react";
|
|
6422
6602
|
|
|
6423
6603
|
// src/components/games/ui/icons.tsx
|
|
6424
6604
|
import { jsx as jsx59 } from "react/jsx-runtime";
|
|
@@ -6457,8 +6637,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx59("path", { d:
|
|
|
6457
6637
|
// src/components/games/ui/SearchField.tsx
|
|
6458
6638
|
import { jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
6459
6639
|
function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
|
|
6460
|
-
const localRef =
|
|
6461
|
-
const setInputRef =
|
|
6640
|
+
const localRef = useRef24(null);
|
|
6641
|
+
const setInputRef = useCallback19((node) => {
|
|
6462
6642
|
localRef.current = node;
|
|
6463
6643
|
if (typeof inputRef === "function") inputRef(node);
|
|
6464
6644
|
else if (inputRef) inputRef.current = node;
|
|
@@ -6503,10 +6683,10 @@ import { Fragment as Fragment7, jsx as jsx61, jsxs as jsxs55 } from "react/jsx-r
|
|
|
6503
6683
|
function TodayPanel({ discovery, ui, monitor }) {
|
|
6504
6684
|
const { groups, states, stale, starLeague } = discovery;
|
|
6505
6685
|
const searchId = useId2();
|
|
6506
|
-
const [query, setQuery] =
|
|
6507
|
-
const [selectedCompetitionId, setSelectedCompetitionId] =
|
|
6508
|
-
const [toast, setToast] =
|
|
6509
|
-
|
|
6686
|
+
const [query, setQuery] = useState34("");
|
|
6687
|
+
const [selectedCompetitionId, setSelectedCompetitionId] = useState34(null);
|
|
6688
|
+
const [toast, setToast] = useState34(null);
|
|
6689
|
+
useEffect26(() => {
|
|
6510
6690
|
if (toast === null) return;
|
|
6511
6691
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6512
6692
|
return () => clearTimeout(id);
|
|
@@ -6552,7 +6732,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6552
6732
|
}
|
|
6553
6733
|
const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
|
|
6554
6734
|
const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
|
|
6555
|
-
|
|
6735
|
+
useEffect26(() => {
|
|
6556
6736
|
if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
|
|
6557
6737
|
}, [selectedCompetitionId, openGroup]);
|
|
6558
6738
|
const liveRows = stale ? [] : visibleGroups.flatMap((group) => group.matches.filter((m) => isTreatedLive(states[m.matchId], stale)).map((match) => ({ match, rank: group.rank }))).sort((a, b) => a.rank - b.rank);
|
|
@@ -6699,7 +6879,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6699
6879
|
}
|
|
6700
6880
|
|
|
6701
6881
|
// src/components/GamesPanel.tsx
|
|
6702
|
-
import { useEffect as
|
|
6882
|
+
import { useEffect as useEffect30, useState as useState49 } from "react";
|
|
6703
6883
|
|
|
6704
6884
|
// src/components/GamesLoginWall.tsx
|
|
6705
6885
|
import { jsx as jsx62 } from "react/jsx-runtime";
|
|
@@ -6708,7 +6888,7 @@ function GamesLoginWall({ ui }) {
|
|
|
6708
6888
|
}
|
|
6709
6889
|
|
|
6710
6890
|
// src/components/GamesHub.tsx
|
|
6711
|
-
import { useEffect as
|
|
6891
|
+
import { useEffect as useEffect27, useState as useState35 } from "react";
|
|
6712
6892
|
|
|
6713
6893
|
// src/components/games/ui/gameMeta.ts
|
|
6714
6894
|
function prettifyGameId(gameId) {
|
|
@@ -6859,8 +7039,8 @@ function pickHeroGame(games) {
|
|
|
6859
7039
|
}
|
|
6860
7040
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
6861
7041
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
6862
|
-
const [, setTick] =
|
|
6863
|
-
|
|
7042
|
+
const [, setTick] = useState35(0);
|
|
7043
|
+
useEffect27(() => {
|
|
6864
7044
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
6865
7045
|
return () => clearInterval(id);
|
|
6866
7046
|
}, []);
|
|
@@ -6920,10 +7100,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
6920
7100
|
}
|
|
6921
7101
|
|
|
6922
7102
|
// src/components/GameScreenHost.tsx
|
|
6923
|
-
import { useEffect as
|
|
7103
|
+
import { useEffect as useEffect29, useRef as useRef27, useState as useState47 } from "react";
|
|
6924
7104
|
|
|
6925
7105
|
// src/useGamePlay.ts
|
|
6926
|
-
import { useCallback as
|
|
7106
|
+
import { useCallback as useCallback20, useRef as useRef25, useState as useState36 } from "react";
|
|
6927
7107
|
function toSubmitResult(payload) {
|
|
6928
7108
|
return {
|
|
6929
7109
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -6935,17 +7115,17 @@ function toSubmitResult(payload) {
|
|
|
6935
7115
|
};
|
|
6936
7116
|
}
|
|
6937
7117
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
6938
|
-
const [result, setResult] =
|
|
6939
|
-
const [submitting, setSubmitting] =
|
|
6940
|
-
const [rawStatus, setRawStatus] =
|
|
6941
|
-
const inFlightRef =
|
|
6942
|
-
const convRef =
|
|
7118
|
+
const [result, setResult] = useState36(null);
|
|
7119
|
+
const [submitting, setSubmitting] = useState36(false);
|
|
7120
|
+
const [rawStatus, setRawStatus] = useState36(null);
|
|
7121
|
+
const inFlightRef = useRef25(false);
|
|
7122
|
+
const convRef = useRef25(conversation);
|
|
6943
7123
|
convRef.current = conversation;
|
|
6944
|
-
const optsRef =
|
|
7124
|
+
const optsRef = useRef25({ gameId, gameDay, fixtureId, locale, refresh });
|
|
6945
7125
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
6946
|
-
const resultRef =
|
|
7126
|
+
const resultRef = useRef25(null);
|
|
6947
7127
|
resultRef.current = result;
|
|
6948
|
-
const refetch =
|
|
7128
|
+
const refetch = useCallback20(async () => {
|
|
6949
7129
|
const conv = convRef.current;
|
|
6950
7130
|
if (!conv) return;
|
|
6951
7131
|
const opts = optsRef.current;
|
|
@@ -6961,7 +7141,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6961
7141
|
} catch {
|
|
6962
7142
|
}
|
|
6963
7143
|
}, []);
|
|
6964
|
-
const submit =
|
|
7144
|
+
const submit = useCallback20(async (answerJson) => {
|
|
6965
7145
|
const conv = convRef.current;
|
|
6966
7146
|
if (!conv || inFlightRef.current) return;
|
|
6967
7147
|
inFlightRef.current = true;
|
|
@@ -6988,14 +7168,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6988
7168
|
setSubmitting(false);
|
|
6989
7169
|
}
|
|
6990
7170
|
}, [refetch]);
|
|
6991
|
-
const hydrate =
|
|
7171
|
+
const hydrate = useCallback20(() => {
|
|
6992
7172
|
void refetch();
|
|
6993
7173
|
}, [refetch]);
|
|
6994
7174
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
6995
7175
|
}
|
|
6996
7176
|
|
|
6997
7177
|
// src/components/games/MysteryTigerGame.tsx
|
|
6998
|
-
import { useState as
|
|
7178
|
+
import { useState as useState38, useId as useId3 } from "react";
|
|
6999
7179
|
|
|
7000
7180
|
// src/components/games/nationFlags.ts
|
|
7001
7181
|
var FLAGS = {
|
|
@@ -7206,7 +7386,7 @@ function isNationCode(flag) {
|
|
|
7206
7386
|
}
|
|
7207
7387
|
|
|
7208
7388
|
// src/components/games/PlayerAvatar.tsx
|
|
7209
|
-
import { useState as
|
|
7389
|
+
import { useState as useState37 } from "react";
|
|
7210
7390
|
import { jsx as jsx67 } from "react/jsx-runtime";
|
|
7211
7391
|
function initialsOf(name) {
|
|
7212
7392
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
@@ -7224,7 +7404,7 @@ function PlayerAvatar({
|
|
|
7224
7404
|
imagePath,
|
|
7225
7405
|
className
|
|
7226
7406
|
}) {
|
|
7227
|
-
const [failed, setFailed] =
|
|
7407
|
+
const [failed, setFailed] = useState37(false);
|
|
7228
7408
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
7229
7409
|
return /* @__PURE__ */ jsx67("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx67("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx67("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
7230
7410
|
}
|
|
@@ -7465,7 +7645,7 @@ function MysteryTigerGame({
|
|
|
7465
7645
|
onBack
|
|
7466
7646
|
}) {
|
|
7467
7647
|
const t = ui.games.mysteryTiger;
|
|
7468
|
-
const [query, setQuery] =
|
|
7648
|
+
const [query, setQuery] = useState38("");
|
|
7469
7649
|
const inputId = useId3();
|
|
7470
7650
|
const clientState = parseClientState(result?.clientStateJson);
|
|
7471
7651
|
const guessResults = clientState?.guessResults ?? [];
|
|
@@ -7727,13 +7907,13 @@ function HigherOrLowerGame({
|
|
|
7727
7907
|
}
|
|
7728
7908
|
|
|
7729
7909
|
// src/components/games/CareerPathGame.tsx
|
|
7730
|
-
import { useState as
|
|
7910
|
+
import { useState as useState40, useId as useId4 } from "react";
|
|
7731
7911
|
|
|
7732
7912
|
// src/components/games/ui/CrestShield.tsx
|
|
7733
|
-
import { useState as
|
|
7913
|
+
import { useState as useState39 } from "react";
|
|
7734
7914
|
import { jsx as jsx78 } from "react/jsx-runtime";
|
|
7735
7915
|
function CrestShield({ src, name, size = 28 }) {
|
|
7736
|
-
const [failed, setFailed] =
|
|
7916
|
+
const [failed, setFailed] = useState39(false);
|
|
7737
7917
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
7738
7918
|
return /* @__PURE__ */ jsx78("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
7739
7919
|
}
|
|
@@ -7765,7 +7945,7 @@ function CareerPathGame({
|
|
|
7765
7945
|
}) {
|
|
7766
7946
|
const s = ui.games.careerPath;
|
|
7767
7947
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
7768
|
-
const [query, setQuery] =
|
|
7948
|
+
const [query, setQuery] = useState40("");
|
|
7769
7949
|
const inputId = useId4();
|
|
7770
7950
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
7771
7951
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
@@ -7872,7 +8052,7 @@ function CareerPathGame({
|
|
|
7872
8052
|
}
|
|
7873
8053
|
|
|
7874
8054
|
// src/components/games/BeatTheGridGame.tsx
|
|
7875
|
-
import React, { useEffect as
|
|
8055
|
+
import React, { useEffect as useEffect28, useId as useId5, useRef as useRef26, useState as useState41 } from "react";
|
|
7876
8056
|
|
|
7877
8057
|
// src/components/games/ui/OptionList.tsx
|
|
7878
8058
|
import { jsx as jsx80 } from "react/jsx-runtime";
|
|
@@ -7961,10 +8141,10 @@ function SearchSheet({
|
|
|
7961
8141
|
ui
|
|
7962
8142
|
}) {
|
|
7963
8143
|
const s = ui.games.beatTheGrid;
|
|
7964
|
-
const [query, setQuery] =
|
|
8144
|
+
const [query, setQuery] = useState41("");
|
|
7965
8145
|
const inputId = useId5();
|
|
7966
|
-
const inputRef =
|
|
7967
|
-
|
|
8146
|
+
const inputRef = useRef26(null);
|
|
8147
|
+
useEffect28(() => {
|
|
7968
8148
|
inputRef.current?.focus();
|
|
7969
8149
|
}, [row, col]);
|
|
7970
8150
|
const filtered = playerPool.filter(
|
|
@@ -8029,7 +8209,7 @@ function BeatTheGridGame({
|
|
|
8029
8209
|
}) {
|
|
8030
8210
|
const s = ui.games.beatTheGrid;
|
|
8031
8211
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
8032
|
-
const [activeCell, setActiveCell] =
|
|
8212
|
+
const [activeCell, setActiveCell] = useState41(null);
|
|
8033
8213
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
8034
8214
|
const filledCells = clientState?.cells ?? [];
|
|
8035
8215
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -8184,7 +8364,7 @@ function BeatTheGridGame({
|
|
|
8184
8364
|
}
|
|
8185
8365
|
|
|
8186
8366
|
// src/components/games/GuessTheXiGame.tsx
|
|
8187
|
-
import { useState as
|
|
8367
|
+
import { useState as useState42, useId as useId6 } from "react";
|
|
8188
8368
|
|
|
8189
8369
|
// src/components/games/ui/PitchSvg.tsx
|
|
8190
8370
|
import { Fragment as Fragment16, jsx as jsx82, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
@@ -8273,7 +8453,7 @@ function GuessTheXiGame({
|
|
|
8273
8453
|
onBack
|
|
8274
8454
|
}) {
|
|
8275
8455
|
const t = ui.games.guessTheXi;
|
|
8276
|
-
const [query, setQuery] =
|
|
8456
|
+
const [query, setQuery] = useState42("");
|
|
8277
8457
|
const inputId = useId6();
|
|
8278
8458
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
8279
8459
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
@@ -8416,7 +8596,7 @@ function GuessTheXiGame({
|
|
|
8416
8596
|
}
|
|
8417
8597
|
|
|
8418
8598
|
// src/components/games/DailyQuizGame.tsx
|
|
8419
|
-
import { useState as
|
|
8599
|
+
import { useState as useState43 } from "react";
|
|
8420
8600
|
import { Fragment as Fragment18, jsx as jsx84, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
8421
8601
|
function parseClientState6(json) {
|
|
8422
8602
|
if (!json) return null;
|
|
@@ -8457,8 +8637,8 @@ function DailyQuizGame({
|
|
|
8457
8637
|
}) {
|
|
8458
8638
|
const s = ui.games.dailyQuiz;
|
|
8459
8639
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
8460
|
-
const [selections, setSelections] =
|
|
8461
|
-
const [page, setPage] =
|
|
8640
|
+
const [selections, setSelections] = useState43(/* @__PURE__ */ new Map());
|
|
8641
|
+
const [page, setPage] = useState43(0);
|
|
8462
8642
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
8463
8643
|
const results = clientState?.results ?? [];
|
|
8464
8644
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
@@ -8568,7 +8748,7 @@ function DailyQuizGame({
|
|
|
8568
8748
|
}
|
|
8569
8749
|
|
|
8570
8750
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
8571
|
-
import { useId as useId7, useState as
|
|
8751
|
+
import { useId as useId7, useState as useState44 } from "react";
|
|
8572
8752
|
import { jsx as jsx85, jsxs as jsxs73 } from "react/jsx-runtime";
|
|
8573
8753
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
8574
8754
|
function parseClientState7(json) {
|
|
@@ -8664,11 +8844,11 @@ function MatchdayPredictorGame({
|
|
|
8664
8844
|
onBack
|
|
8665
8845
|
}) {
|
|
8666
8846
|
const t = ui.games.predictor;
|
|
8667
|
-
const [homeScore, setHomeScore] =
|
|
8668
|
-
const [awayScore, setAwayScore] =
|
|
8669
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] =
|
|
8670
|
-
const [lastEdited, setLastEdited] =
|
|
8671
|
-
const [query, setQuery] =
|
|
8847
|
+
const [homeScore, setHomeScore] = useState44(0);
|
|
8848
|
+
const [awayScore, setAwayScore] = useState44(0);
|
|
8849
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = useState44(null);
|
|
8850
|
+
const [lastEdited, setLastEdited] = useState44("home");
|
|
8851
|
+
const [query, setQuery] = useState44("");
|
|
8672
8852
|
const searchId = useId7();
|
|
8673
8853
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
8674
8854
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -8836,7 +9016,7 @@ function MatchdayPredictorGame({
|
|
|
8836
9016
|
}
|
|
8837
9017
|
|
|
8838
9018
|
// src/components/games/StartingXiGame.tsx
|
|
8839
|
-
import { useId as useId8, useState as
|
|
9019
|
+
import { useId as useId8, useState as useState45 } from "react";
|
|
8840
9020
|
import { Fragment as Fragment19, jsx as jsx86, jsxs as jsxs74 } from "react/jsx-runtime";
|
|
8841
9021
|
var POINTS_PER_STARTER = 8;
|
|
8842
9022
|
var XI_SIZE = 11;
|
|
@@ -8880,9 +9060,9 @@ function StartingXiGame({
|
|
|
8880
9060
|
lockAtUtc
|
|
8881
9061
|
}) {
|
|
8882
9062
|
const t = ui.games.startingXi;
|
|
8883
|
-
const [slotPlayers, setSlotPlayers] =
|
|
8884
|
-
const [active, setActive] =
|
|
8885
|
-
const [query, setQuery] =
|
|
9063
|
+
const [slotPlayers, setSlotPlayers] = useState45(() => Array(XI_SIZE).fill(null));
|
|
9064
|
+
const [active, setActive] = useState45(0);
|
|
9065
|
+
const [query, setQuery] = useState45("");
|
|
8886
9066
|
const searchId = useId8();
|
|
8887
9067
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
8888
9068
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -9022,7 +9202,7 @@ function StartingXiGame({
|
|
|
9022
9202
|
}
|
|
9023
9203
|
|
|
9024
9204
|
// src/components/games/StatLadderGame.tsx
|
|
9025
|
-
import { useId as useId9, useState as
|
|
9205
|
+
import { useId as useId9, useState as useState46 } from "react";
|
|
9026
9206
|
import { jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
|
|
9027
9207
|
function ladderClue(ladder) {
|
|
9028
9208
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
@@ -9059,8 +9239,8 @@ function StatLadderGame({
|
|
|
9059
9239
|
onBack
|
|
9060
9240
|
}) {
|
|
9061
9241
|
const t = ui.games.statLadder;
|
|
9062
|
-
const [query, setQuery] =
|
|
9063
|
-
const [selectedId, setSelectedId] =
|
|
9242
|
+
const [query, setQuery] = useState46("");
|
|
9243
|
+
const [selectedId, setSelectedId] = useState46(null);
|
|
9064
9244
|
const searchId = useId9();
|
|
9065
9245
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
9066
9246
|
const revealed = clientState != null;
|
|
@@ -9267,8 +9447,8 @@ function GameScreenHost({
|
|
|
9267
9447
|
ui
|
|
9268
9448
|
}) {
|
|
9269
9449
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
9270
|
-
const [configJson, setConfigJson] =
|
|
9271
|
-
|
|
9450
|
+
const [configJson, setConfigJson] = useState47(null);
|
|
9451
|
+
useEffect29(() => {
|
|
9272
9452
|
setConfigJson(null);
|
|
9273
9453
|
if (!conversation) return;
|
|
9274
9454
|
let cancelled = false;
|
|
@@ -9291,12 +9471,12 @@ function GameScreenHost({
|
|
|
9291
9471
|
fixtureId: fixtureId || void 0,
|
|
9292
9472
|
locale: ui.games.lang
|
|
9293
9473
|
});
|
|
9294
|
-
|
|
9474
|
+
useEffect29(() => {
|
|
9295
9475
|
if (conversation) hydrate();
|
|
9296
9476
|
}, [conversation, gameId]);
|
|
9297
|
-
const hydrateRef =
|
|
9477
|
+
const hydrateRef = useRef27(hydrate);
|
|
9298
9478
|
hydrateRef.current = hydrate;
|
|
9299
|
-
|
|
9479
|
+
useEffect29(() => {
|
|
9300
9480
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
9301
9481
|
if (rawStatus !== "pending") return;
|
|
9302
9482
|
const timerId = setInterval(() => {
|
|
@@ -9409,7 +9589,7 @@ function GameScreenHost({
|
|
|
9409
9589
|
}
|
|
9410
9590
|
|
|
9411
9591
|
// src/components/Leaderboard.tsx
|
|
9412
|
-
import { useState as
|
|
9592
|
+
import { useState as useState48 } from "react";
|
|
9413
9593
|
|
|
9414
9594
|
// src/components/LeaderboardRow.tsx
|
|
9415
9595
|
import { jsx as jsx90, jsxs as jsxs77 } from "react/jsx-runtime";
|
|
@@ -9494,7 +9674,7 @@ function Leaderboard({
|
|
|
9494
9674
|
ui,
|
|
9495
9675
|
onPlay
|
|
9496
9676
|
}) {
|
|
9497
|
-
const [segment, setSegment] =
|
|
9677
|
+
const [segment, setSegment] = useState48("weekly");
|
|
9498
9678
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
9499
9679
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
9500
9680
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
@@ -9597,9 +9777,9 @@ function GamesPanel({
|
|
|
9597
9777
|
leaderboardLoading,
|
|
9598
9778
|
refreshHub
|
|
9599
9779
|
}) {
|
|
9600
|
-
const [selected, setSelected] =
|
|
9601
|
-
const [segment, setSegment] =
|
|
9602
|
-
|
|
9780
|
+
const [selected, setSelected] = useState49(null);
|
|
9781
|
+
const [segment, setSegment] = useState49("play");
|
|
9782
|
+
useEffect30(() => {
|
|
9603
9783
|
ensureGamesFonts();
|
|
9604
9784
|
}, []);
|
|
9605
9785
|
if (!loggedIn) return /* @__PURE__ */ jsx94(GamesLoginWall, { ui });
|
|
@@ -9747,8 +9927,7 @@ function Standings({ standings, loading, ui }) {
|
|
|
9747
9927
|
] }, `${gi}-${group.table ?? "none"}`)) });
|
|
9748
9928
|
}
|
|
9749
9929
|
|
|
9750
|
-
// src/components/
|
|
9751
|
-
import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
|
|
9930
|
+
// src/components/groupByPosition.ts
|
|
9752
9931
|
function groupByPosition(players) {
|
|
9753
9932
|
const groups = [];
|
|
9754
9933
|
for (const p of players) {
|
|
@@ -9758,26 +9937,181 @@ function groupByPosition(players) {
|
|
|
9758
9937
|
}
|
|
9759
9938
|
return groups;
|
|
9760
9939
|
}
|
|
9761
|
-
|
|
9762
|
-
|
|
9763
|
-
|
|
9764
|
-
|
|
9765
|
-
|
|
9766
|
-
|
|
9767
|
-
|
|
9768
|
-
|
|
9769
|
-
|
|
9770
|
-
|
|
9940
|
+
|
|
9941
|
+
// src/components/labels.ts
|
|
9942
|
+
function positionLabel(ui, name) {
|
|
9943
|
+
switch (name) {
|
|
9944
|
+
case "Goalkeeper":
|
|
9945
|
+
return ui.positionGoalkeeper;
|
|
9946
|
+
case "Defender":
|
|
9947
|
+
return ui.positionDefender;
|
|
9948
|
+
case "Midfielder":
|
|
9949
|
+
return ui.positionMidfielder;
|
|
9950
|
+
case "Attacker":
|
|
9951
|
+
return ui.positionAttacker;
|
|
9952
|
+
default:
|
|
9953
|
+
return name;
|
|
9954
|
+
}
|
|
9955
|
+
}
|
|
9956
|
+
function footLabel(ui, foot) {
|
|
9957
|
+
const v = foot?.trim() ?? "";
|
|
9958
|
+
if (v === "" || v.toUpperCase() === "N/A") return null;
|
|
9959
|
+
switch (v.toLowerCase()) {
|
|
9960
|
+
case "right":
|
|
9961
|
+
return ui.footRight;
|
|
9962
|
+
case "left":
|
|
9963
|
+
return ui.footLeft;
|
|
9964
|
+
case "both":
|
|
9965
|
+
return ui.footBoth;
|
|
9966
|
+
default:
|
|
9967
|
+
return v;
|
|
9968
|
+
}
|
|
9969
|
+
}
|
|
9970
|
+
|
|
9971
|
+
// src/components/SquadStats.tsx
|
|
9972
|
+
import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
|
|
9973
|
+
function SquadStats({ stats, loading, ui, onSelectPlayer }) {
|
|
9974
|
+
if (stats === null && loading) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list" });
|
|
9975
|
+
if (stats === null || stats.length === 0) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-empty", children: ui.clubSquadStatsEmpty });
|
|
9976
|
+
return /* @__PURE__ */ jsxs83("div", { className: "ss-w-mon-list", children: [
|
|
9977
|
+
/* @__PURE__ */ jsxs83("div", { className: "ss-w-sq-row ss-w-sq-head", "aria-hidden": "true", children: [
|
|
9978
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num" }),
|
|
9979
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name" }),
|
|
9980
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColApps }),
|
|
9981
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColGoals }),
|
|
9982
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColAssists }),
|
|
9983
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: ui.statColRating })
|
|
9984
|
+
] }),
|
|
9985
|
+
groupByPosition(stats).map((group, gi) => /* @__PURE__ */ jsxs83("div", { children: [
|
|
9986
|
+
group.positionName && /* @__PURE__ */ jsx97("div", { className: "ss-w-club-eyebrow", children: positionLabel(ui, group.positionName) }),
|
|
9987
|
+
group.items.map((p) => /* @__PURE__ */ jsxs83("button", { type: "button", className: "ss-w-sq-row ss-w-sq-tap", onClick: () => onSelectPlayer(p.playerId), children: [
|
|
9988
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
|
|
9989
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name ss-w-sq-name-1", children: p.playerName }),
|
|
9990
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.appearances }),
|
|
9991
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.goals }),
|
|
9992
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.assists }),
|
|
9993
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-col", children: p.averageRating === null ? "\u2014" : p.averageRating.toFixed(1) })
|
|
9994
|
+
] }, p.playerId))
|
|
9995
|
+
] }, `${gi}-${group.positionName ?? "none"}`))
|
|
9996
|
+
] });
|
|
9997
|
+
}
|
|
9998
|
+
|
|
9999
|
+
// src/components/Squad.tsx
|
|
10000
|
+
import { Fragment as Fragment21, jsx as jsx98, jsxs as jsxs84 } from "react/jsx-runtime";
|
|
10001
|
+
function Squad({ squad, loading, ui, view, onToggleView, stats, statsLoading, onSelectPlayer }) {
|
|
10002
|
+
const toggle = /* @__PURE__ */ jsx98("div", { className: "ss-w-sq-seg", role: "group", children: ["roster", "stats"].map((v) => /* @__PURE__ */ jsx98(
|
|
10003
|
+
"button",
|
|
10004
|
+
{
|
|
10005
|
+
type: "button",
|
|
10006
|
+
className: "ss-w-sq-seg-btn",
|
|
10007
|
+
"aria-pressed": view === v,
|
|
10008
|
+
onClick: () => {
|
|
10009
|
+
if (view !== v) onToggleView();
|
|
10010
|
+
},
|
|
10011
|
+
children: v === "roster" ? ui.squadViewRoster : ui.squadViewStats
|
|
10012
|
+
},
|
|
10013
|
+
v
|
|
10014
|
+
)) });
|
|
10015
|
+
if (view === "stats") {
|
|
10016
|
+
return /* @__PURE__ */ jsxs84(Fragment21, { children: [
|
|
10017
|
+
toggle,
|
|
10018
|
+
/* @__PURE__ */ jsx98(SquadStats, { stats, loading: statsLoading, ui, onSelectPlayer })
|
|
10019
|
+
] });
|
|
10020
|
+
}
|
|
10021
|
+
if (squad === null && loading) return /* @__PURE__ */ jsxs84(Fragment21, { children: [
|
|
10022
|
+
toggle,
|
|
10023
|
+
/* @__PURE__ */ jsx98("div", { className: "ss-w-mon-list" })
|
|
10024
|
+
] });
|
|
10025
|
+
if (squad === null || squad.length === 0) return /* @__PURE__ */ jsxs84(Fragment21, { children: [
|
|
10026
|
+
toggle,
|
|
10027
|
+
/* @__PURE__ */ jsx98("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty })
|
|
10028
|
+
] });
|
|
10029
|
+
return /* @__PURE__ */ jsxs84(Fragment21, { children: [
|
|
10030
|
+
toggle,
|
|
10031
|
+
/* @__PURE__ */ jsx98("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ jsxs84("div", { children: [
|
|
10032
|
+
group.positionName && /* @__PURE__ */ jsx98("div", { className: "ss-w-club-eyebrow", children: positionLabel(ui, group.positionName) }),
|
|
10033
|
+
group.items.map((p) => /* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-sq-row ss-w-sq-tap", onClick: () => onSelectPlayer(p.playerId), children: [
|
|
10034
|
+
/* @__PURE__ */ jsx98("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
|
|
10035
|
+
/* @__PURE__ */ jsx98("span", { className: "ss-w-sq-name", children: p.playerName })
|
|
10036
|
+
] }, p.playerId))
|
|
10037
|
+
] }, `${gi}-${group.positionName ?? "none"}`)) })
|
|
10038
|
+
] });
|
|
10039
|
+
}
|
|
10040
|
+
|
|
10041
|
+
// src/components/PlayerDetail.tsx
|
|
10042
|
+
import { Fragment as Fragment22, jsx as jsx99, jsxs as jsxs85 } from "react/jsx-runtime";
|
|
10043
|
+
var DASH = "\u2014";
|
|
10044
|
+
function ageFrom(dobMs) {
|
|
10045
|
+
if (dobMs === null) return DASH;
|
|
10046
|
+
const dob = new Date(dobMs);
|
|
10047
|
+
const now = /* @__PURE__ */ new Date();
|
|
10048
|
+
let age = now.getUTCFullYear() - dob.getUTCFullYear();
|
|
10049
|
+
const beforeBirthday = now.getUTCMonth() < dob.getUTCMonth() || now.getUTCMonth() === dob.getUTCMonth() && now.getUTCDate() < dob.getUTCDate();
|
|
10050
|
+
if (beforeBirthday) age--;
|
|
10051
|
+
return String(age);
|
|
10052
|
+
}
|
|
10053
|
+
function Field({ label, value }) {
|
|
10054
|
+
return /* @__PURE__ */ jsxs85("div", { className: "ss-w-pd-field", children: [
|
|
10055
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-pd-label", children: label }),
|
|
10056
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-pd-value", children: value })
|
|
10057
|
+
] });
|
|
10058
|
+
}
|
|
10059
|
+
function PlayerDetail({ detail, loading, ui, seasonName, onClose }) {
|
|
10060
|
+
const back = /* @__PURE__ */ jsxs85("button", { type: "button", className: "ss-w-pd-back", onClick: onClose, children: [
|
|
10061
|
+
/* @__PURE__ */ jsx99("span", { "aria-hidden": "true", children: "\u2039" }),
|
|
10062
|
+
" ",
|
|
10063
|
+
ui.clubPlayerBack
|
|
10064
|
+
] });
|
|
10065
|
+
if (detail === null) {
|
|
10066
|
+
return loading ? /* @__PURE__ */ jsxs85(Fragment22, { children: [
|
|
10067
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-pd-bar", children: back }),
|
|
10068
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-mon-list" })
|
|
10069
|
+
] }) : /* @__PURE__ */ jsxs85(Fragment22, { children: [
|
|
10070
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-pd-bar", children: back }),
|
|
10071
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-mon-empty", children: ui.clubPlayerDetailEmpty })
|
|
10072
|
+
] });
|
|
10073
|
+
}
|
|
10074
|
+
const s = detail.seasonStats;
|
|
10075
|
+
const opt = (v, digits) => v === null ? DASH : digits === void 0 ? String(v) : v.toFixed(digits);
|
|
10076
|
+
return /* @__PURE__ */ jsxs85(Fragment22, { children: [
|
|
10077
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-pd-bar", children: back }),
|
|
10078
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-mon-list", children: [
|
|
10079
|
+
/* @__PURE__ */ jsxs85("div", { children: [
|
|
10080
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-pd-name", children: detail.playerName }),
|
|
10081
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-pd-sub", children: [detail.jerseyNumber === null ? null : `#${detail.jerseyNumber}`, positionLabel(ui, detail.positionName)].filter(Boolean).join(" \xB7 ") })
|
|
10082
|
+
] }),
|
|
10083
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-pd-grid ss-w-pd-bio", children: [
|
|
10084
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.detailNationality, value: detail.nationality ?? DASH }),
|
|
10085
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.detailAge, value: ageFrom(detail.dateOfBirthUnixMs) }),
|
|
10086
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.detailHeight, value: detail.heightCm === null ? DASH : `${detail.heightCm} cm` }),
|
|
10087
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.detailFoot, value: footLabel(ui, detail.foot) ?? DASH })
|
|
10088
|
+
] }),
|
|
10089
|
+
/* @__PURE__ */ jsxs85("div", { children: [
|
|
10090
|
+
seasonName !== null && /* @__PURE__ */ jsx99("div", { className: "ss-w-club-eyebrow", children: ui.detailSeason.replace("{season}", seasonName) }),
|
|
10091
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-pd-grid", children: [
|
|
10092
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColApps, value: String(s.appearances) }),
|
|
10093
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColMinutes, value: String(s.minutesPlayed) }),
|
|
10094
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColGoals, value: String(s.goals) }),
|
|
10095
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColAssists, value: String(s.assists) }),
|
|
10096
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColYellow, value: String(s.yellowCards) }),
|
|
10097
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColRed, value: String(s.redCards) }),
|
|
10098
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColRating, value: opt(s.averageRating, 1) }),
|
|
10099
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColXg, value: opt(s.expectedGoals, 2) }),
|
|
10100
|
+
/* @__PURE__ */ jsx99(Field, { label: ui.statColShots, value: opt(s.totalShots) })
|
|
10101
|
+
] })
|
|
10102
|
+
] })
|
|
10103
|
+
] })
|
|
10104
|
+
] });
|
|
9771
10105
|
}
|
|
9772
10106
|
|
|
9773
10107
|
// src/components/PresetSpeedDial.tsx
|
|
9774
10108
|
import { useId as useId10 } from "react";
|
|
9775
|
-
import { jsx as
|
|
10109
|
+
import { jsx as jsx100, jsxs as jsxs86 } from "react/jsx-runtime";
|
|
9776
10110
|
function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
|
|
9777
10111
|
const pillsId = useId10();
|
|
9778
10112
|
const tabIndex = expanded ? 0 : -1;
|
|
9779
|
-
return /* @__PURE__ */
|
|
9780
|
-
/* @__PURE__ */
|
|
10113
|
+
return /* @__PURE__ */ jsxs86("div", { ref: rootRef, className: "ss-w-dial", children: [
|
|
10114
|
+
/* @__PURE__ */ jsxs86(
|
|
9781
10115
|
"button",
|
|
9782
10116
|
{
|
|
9783
10117
|
ref: buttonRef,
|
|
@@ -9788,36 +10122,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
|
|
|
9788
10122
|
"aria-label": strings.dialName,
|
|
9789
10123
|
onClick: onToggle,
|
|
9790
10124
|
children: [
|
|
9791
|
-
/* @__PURE__ */
|
|
9792
|
-
/* @__PURE__ */
|
|
9793
|
-
showDot && !expanded ? /* @__PURE__ */
|
|
10125
|
+
/* @__PURE__ */ jsx100("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ jsx100(SlidersIcon, {}) }),
|
|
10126
|
+
/* @__PURE__ */ jsx100("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ jsx100(CloseIcon, {}) }),
|
|
10127
|
+
showDot && !expanded ? /* @__PURE__ */ jsx100("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
|
|
9794
10128
|
]
|
|
9795
10129
|
}
|
|
9796
10130
|
),
|
|
9797
|
-
/* @__PURE__ */
|
|
9798
|
-
/* @__PURE__ */
|
|
9799
|
-
/* @__PURE__ */
|
|
9800
|
-
/* @__PURE__ */
|
|
10131
|
+
/* @__PURE__ */ jsxs86("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
|
|
10132
|
+
/* @__PURE__ */ jsxs86("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
|
|
10133
|
+
/* @__PURE__ */ jsx100(SlidersIcon, {}),
|
|
10134
|
+
/* @__PURE__ */ jsx100("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
|
|
9801
10135
|
] }),
|
|
9802
|
-
/* @__PURE__ */
|
|
9803
|
-
/* @__PURE__ */
|
|
9804
|
-
/* @__PURE__ */
|
|
10136
|
+
/* @__PURE__ */ jsxs86("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
|
|
10137
|
+
/* @__PURE__ */ jsx100(ComboIcon, {}),
|
|
10138
|
+
/* @__PURE__ */ jsx100("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
|
|
9805
10139
|
] })
|
|
9806
10140
|
] })
|
|
9807
10141
|
] });
|
|
9808
10142
|
}
|
|
9809
10143
|
|
|
9810
10144
|
// src/components/PresetTools.tsx
|
|
9811
|
-
import { Fragment as
|
|
9812
|
-
import { Fragment as
|
|
10145
|
+
import { Fragment as Fragment23, useEffect as useEffect31, useId as useId11, useRef as useRef28, useState as useState50 } from "react";
|
|
10146
|
+
import { Fragment as Fragment24, jsx as jsx101, jsxs as jsxs87 } from "react/jsx-runtime";
|
|
9813
10147
|
var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
9814
10148
|
function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
9815
|
-
const dialogRef =
|
|
10149
|
+
const dialogRef = useRef28(null);
|
|
9816
10150
|
const titleId = useId11();
|
|
9817
|
-
|
|
10151
|
+
useEffect31(() => {
|
|
9818
10152
|
dialogRef.current?.focus();
|
|
9819
10153
|
}, []);
|
|
9820
|
-
|
|
10154
|
+
useEffect31(() => {
|
|
9821
10155
|
const onKey = (e) => {
|
|
9822
10156
|
if (e.key !== "Escape") return;
|
|
9823
10157
|
e.stopPropagation();
|
|
@@ -9847,79 +10181,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
|
9847
10181
|
first.focus();
|
|
9848
10182
|
}
|
|
9849
10183
|
};
|
|
9850
|
-
return /* @__PURE__ */
|
|
9851
|
-
/* @__PURE__ */
|
|
9852
|
-
/* @__PURE__ */
|
|
9853
|
-
/* @__PURE__ */
|
|
10184
|
+
return /* @__PURE__ */ jsx101("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ jsxs87("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
|
|
10185
|
+
/* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-head", children: [
|
|
10186
|
+
/* @__PURE__ */ jsx101("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
|
|
10187
|
+
/* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx101(CloseIcon, {}) })
|
|
9854
10188
|
] }),
|
|
9855
|
-
/* @__PURE__ */
|
|
9856
|
-
footer ? /* @__PURE__ */
|
|
10189
|
+
/* @__PURE__ */ jsx101("div", { className: "ss-w-tool-body", children }),
|
|
10190
|
+
footer ? /* @__PURE__ */ jsx101("div", { className: "ss-w-tool-foot", children: footer }) : null
|
|
9857
10191
|
] }) });
|
|
9858
10192
|
}
|
|
9859
10193
|
function fillTemplate(template, slots) {
|
|
9860
10194
|
return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
|
|
9861
10195
|
const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
|
|
9862
|
-
return /* @__PURE__ */
|
|
10196
|
+
return /* @__PURE__ */ jsx101(Fragment23, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
|
|
9863
10197
|
});
|
|
9864
10198
|
}
|
|
9865
10199
|
function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
|
|
9866
10200
|
const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
|
|
9867
|
-
return /* @__PURE__ */
|
|
9868
|
-
/* @__PURE__ */
|
|
9869
|
-
/* @__PURE__ */
|
|
10201
|
+
return /* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-num", children: [
|
|
10202
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
|
|
10203
|
+
/* @__PURE__ */ jsx101("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
|
|
9870
10204
|
const c = choices2[Number(e.target.value)];
|
|
9871
10205
|
if (c) onChoose(c.value);
|
|
9872
|
-
}, children: choices2.map((c, i) => /* @__PURE__ */
|
|
10206
|
+
}, children: choices2.map((c, i) => /* @__PURE__ */ jsx101("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
|
|
9873
10207
|
] });
|
|
9874
10208
|
}
|
|
9875
10209
|
function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
|
|
9876
10210
|
const sizeText = sizeLabels[currentIdx] ?? "";
|
|
9877
|
-
return /* @__PURE__ */
|
|
9878
|
-
/* @__PURE__ */
|
|
9879
|
-
/* @__PURE__ */
|
|
10211
|
+
return /* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-num", children: [
|
|
10212
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
|
|
10213
|
+
/* @__PURE__ */ jsx101("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(currentIdx), onChange: (e) => onChoose(Number(e.target.value)), children: optionLabels.map((opt, i) => /* @__PURE__ */ jsx101("option", { value: String(i), children: opt }, i)) })
|
|
9880
10214
|
] });
|
|
9881
10215
|
}
|
|
9882
10216
|
function SendButton({ label, display, disabled, onClick }) {
|
|
9883
|
-
return /* @__PURE__ */
|
|
10217
|
+
return /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
|
|
9884
10218
|
}
|
|
9885
10219
|
function PickList({ picks, formatKickoff }) {
|
|
9886
|
-
return /* @__PURE__ */
|
|
9887
|
-
/* @__PURE__ */
|
|
10220
|
+
return /* @__PURE__ */ jsx101("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ jsxs87("li", { className: "ss-w-tool-pick", children: [
|
|
10221
|
+
/* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-pick-match", children: [
|
|
9888
10222
|
p.homeTeamName,
|
|
9889
10223
|
" \u2013 ",
|
|
9890
10224
|
p.awayTeamName
|
|
9891
10225
|
] }),
|
|
9892
|
-
/* @__PURE__ */
|
|
10226
|
+
/* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-pick-sel", children: [
|
|
9893
10227
|
p.marketLabel,
|
|
9894
10228
|
": ",
|
|
9895
10229
|
p.selectionLabel,
|
|
9896
10230
|
p.line ? ` ${p.line}` : ""
|
|
9897
10231
|
] }),
|
|
9898
|
-
/* @__PURE__ */
|
|
9899
|
-
/* @__PURE__ */
|
|
10232
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
|
|
10233
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
|
|
9900
10234
|
] }, p.matchOddsId)) });
|
|
9901
10235
|
}
|
|
9902
10236
|
function ComboPreview({ cell, formatKickoff }) {
|
|
9903
|
-
return /* @__PURE__ */
|
|
9904
|
-
/* @__PURE__ */
|
|
9905
|
-
/* @__PURE__ */
|
|
10237
|
+
return /* @__PURE__ */ jsxs87(Fragment24, { children: [
|
|
10238
|
+
/* @__PURE__ */ jsx101(PickList, { picks: cell.combo.legs, formatKickoff }),
|
|
10239
|
+
/* @__PURE__ */ jsx101("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
|
|
9906
10240
|
] });
|
|
9907
10241
|
}
|
|
9908
10242
|
function Unavailable({ text }) {
|
|
9909
|
-
return /* @__PURE__ */
|
|
10243
|
+
return /* @__PURE__ */ jsx101("p", { className: "ss-w-tool-unavailable", children: text });
|
|
9910
10244
|
}
|
|
9911
10245
|
function AskRow({ icon, ask, ready, send }) {
|
|
9912
|
-
return /* @__PURE__ */
|
|
9913
|
-
/* @__PURE__ */
|
|
9914
|
-
/* @__PURE__ */
|
|
9915
|
-
/* @__PURE__ */
|
|
9916
|
-
ready ? /* @__PURE__ */
|
|
10246
|
+
return /* @__PURE__ */ jsxs87("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
|
|
10247
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
|
|
10248
|
+
/* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-main", children: [
|
|
10249
|
+
/* @__PURE__ */ jsx101("p", { className: "ss-w-tool-ask", children: ask }),
|
|
10250
|
+
ready ? /* @__PURE__ */ jsx101("span", { className: "ss-w-tool-ready", children: ready }) : null
|
|
9917
10251
|
] }),
|
|
9918
10252
|
send
|
|
9919
10253
|
] });
|
|
9920
10254
|
}
|
|
9921
10255
|
function RoundSend({ label, display, disabled, onClick }) {
|
|
9922
|
-
return /* @__PURE__ */
|
|
10256
|
+
return /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx101(SendIcon, {}) });
|
|
9923
10257
|
}
|
|
9924
10258
|
var BIG_COMBO = { total: 50, legs: 6 };
|
|
9925
10259
|
function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
@@ -9928,15 +10262,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9928
10262
|
const totals = comboTotals(grid);
|
|
9929
10263
|
const legChoices = comboLegChoices(grid);
|
|
9930
10264
|
const count = FIXED_SINGLES_COUNT;
|
|
9931
|
-
const [maxPrice, setMaxPrice] =
|
|
9932
|
-
const [minPrice, setMinPrice] =
|
|
9933
|
-
const [start] =
|
|
9934
|
-
const [total, setTotal] =
|
|
9935
|
-
const [legs, setLegs] =
|
|
9936
|
-
const [bigStart] =
|
|
9937
|
-
const [bigTotal, setBigTotal] =
|
|
9938
|
-
const [bigLegs, setBigLegs] =
|
|
9939
|
-
const [announcement, setAnnouncement] =
|
|
10265
|
+
const [maxPrice, setMaxPrice] = useState50(() => startSingles(grid.singles, limits, START.maxPrice, count));
|
|
10266
|
+
const [minPrice, setMinPrice] = useState50(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
|
|
10267
|
+
const [start] = useState50(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
|
|
10268
|
+
const [total, setTotal] = useState50(start.total);
|
|
10269
|
+
const [legs, setLegs] = useState50(start.legs);
|
|
10270
|
+
const [bigStart] = useState50(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
|
|
10271
|
+
const [bigTotal, setBigTotal] = useState50(bigStart.total);
|
|
10272
|
+
const [bigLegs, setBigLegs] = useState50(bigStart.legs);
|
|
10273
|
+
const [announcement, setAnnouncement] = useState50("");
|
|
9940
10274
|
const maxCell = findSingles(grid.singles, maxPrice, count);
|
|
9941
10275
|
const minCell = findSingles(grid.singlesFrom, minPrice, count);
|
|
9942
10276
|
const comboCell = findCombo(grid, total, legs);
|
|
@@ -9980,95 +10314,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9980
10314
|
const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
|
|
9981
10315
|
const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
|
|
9982
10316
|
const markets = grid.markets ?? [];
|
|
9983
|
-
const [marketIdx, setMarketIdx] =
|
|
10317
|
+
const [marketIdx, setMarketIdx] = useState50(0);
|
|
9984
10318
|
const marketCell = markets[marketIdx] ?? null;
|
|
9985
10319
|
const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
|
|
9986
10320
|
const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
|
|
9987
10321
|
const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
|
|
9988
|
-
return /* @__PURE__ */
|
|
9989
|
-
/* @__PURE__ */
|
|
10322
|
+
return /* @__PURE__ */ jsxs87(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
|
|
10323
|
+
/* @__PURE__ */ jsx101(
|
|
9990
10324
|
AskRow,
|
|
9991
10325
|
{
|
|
9992
10326
|
icon: "\u{1F3AF}",
|
|
9993
10327
|
ask: fillTemplate(strings.maxPriceRow, {
|
|
9994
10328
|
count: String(count),
|
|
9995
|
-
price: /* @__PURE__ */
|
|
10329
|
+
price: /* @__PURE__ */ jsx101(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
|
|
9996
10330
|
}),
|
|
9997
10331
|
ready: singlesReady(maxCell),
|
|
9998
|
-
send: /* @__PURE__ */
|
|
10332
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
|
|
9999
10333
|
if (maxCell) onSend(maxPriceAsk(maxCell, strings));
|
|
10000
10334
|
} })
|
|
10001
10335
|
}
|
|
10002
10336
|
),
|
|
10003
|
-
/* @__PURE__ */
|
|
10337
|
+
/* @__PURE__ */ jsx101(
|
|
10004
10338
|
AskRow,
|
|
10005
10339
|
{
|
|
10006
10340
|
icon: "\u{1F4C8}",
|
|
10007
10341
|
ask: fillTemplate(strings.minPriceRow, {
|
|
10008
10342
|
count: String(count),
|
|
10009
|
-
price: /* @__PURE__ */
|
|
10343
|
+
price: /* @__PURE__ */ jsx101(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
|
|
10010
10344
|
}),
|
|
10011
10345
|
ready: singlesReady(minCell),
|
|
10012
|
-
send: /* @__PURE__ */
|
|
10346
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
|
|
10013
10347
|
if (minCell) onSend(minPriceAsk(minCell, strings));
|
|
10014
10348
|
} })
|
|
10015
10349
|
}
|
|
10016
10350
|
),
|
|
10017
|
-
/* @__PURE__ */
|
|
10351
|
+
/* @__PURE__ */ jsx101(
|
|
10018
10352
|
AskRow,
|
|
10019
10353
|
{
|
|
10020
10354
|
icon: "\u2728",
|
|
10021
10355
|
ask: fillTemplate(strings.comboRow, {
|
|
10022
|
-
legs: /* @__PURE__ */
|
|
10023
|
-
total: /* @__PURE__ */
|
|
10356
|
+
legs: /* @__PURE__ */ jsx101(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
|
|
10357
|
+
total: /* @__PURE__ */ jsx101(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
|
|
10024
10358
|
}),
|
|
10025
10359
|
ready: comboReady(comboCell),
|
|
10026
|
-
send: /* @__PURE__ */
|
|
10360
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
|
|
10027
10361
|
if (comboCell) onSend(comboAsk(comboCell, strings));
|
|
10028
10362
|
} })
|
|
10029
10363
|
}
|
|
10030
10364
|
),
|
|
10031
|
-
/* @__PURE__ */
|
|
10365
|
+
/* @__PURE__ */ jsx101(
|
|
10032
10366
|
AskRow,
|
|
10033
10367
|
{
|
|
10034
10368
|
icon: "\u{1F3C6}",
|
|
10035
10369
|
ask: fillTemplate(strings.bigComboRow, {
|
|
10036
|
-
legs: /* @__PURE__ */
|
|
10037
|
-
total: /* @__PURE__ */
|
|
10370
|
+
legs: /* @__PURE__ */ jsx101(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
|
|
10371
|
+
total: /* @__PURE__ */ jsx101(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
|
|
10038
10372
|
}),
|
|
10039
10373
|
ready: comboReady(bigCell),
|
|
10040
|
-
send: /* @__PURE__ */
|
|
10374
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
|
|
10041
10375
|
if (bigCell) onSend(comboAsk(bigCell, strings));
|
|
10042
10376
|
} })
|
|
10043
10377
|
}
|
|
10044
10378
|
),
|
|
10045
|
-
markets.length > 0 && /* @__PURE__ */
|
|
10379
|
+
markets.length > 0 && /* @__PURE__ */ jsx101(
|
|
10046
10380
|
AskRow,
|
|
10047
10381
|
{
|
|
10048
10382
|
icon: "\u26BD",
|
|
10049
10383
|
ask: fillTemplate(strings.marketRow, {
|
|
10050
|
-
market: /* @__PURE__ */
|
|
10384
|
+
market: /* @__PURE__ */ jsx101(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
|
|
10051
10385
|
}),
|
|
10052
10386
|
ready: marketCell ? strings.readyCount(marketCell.count) : null,
|
|
10053
|
-
send: /* @__PURE__ */
|
|
10387
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
|
|
10054
10388
|
if (marketCell) onSend(marketAsk(marketCell, strings));
|
|
10055
10389
|
} })
|
|
10056
10390
|
}
|
|
10057
10391
|
),
|
|
10058
|
-
/* @__PURE__ */
|
|
10392
|
+
/* @__PURE__ */ jsx101("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
|
|
10059
10393
|
] });
|
|
10060
10394
|
}
|
|
10061
10395
|
function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
|
|
10062
10396
|
const totals = comboTotals(grid);
|
|
10063
10397
|
const legChoices = comboLegChoices(grid);
|
|
10064
|
-
const [start] =
|
|
10065
|
-
const [total, setTotal] =
|
|
10066
|
-
const [legs, setLegs] =
|
|
10398
|
+
const [start] = useState50(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
|
|
10399
|
+
const [total, setTotal] = useState50(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
|
|
10400
|
+
const [legs, setLegs] = useState50(() => {
|
|
10067
10401
|
if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
|
|
10068
10402
|
const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
|
|
10069
10403
|
return legsForTotal(grid, nearest(totals, initialTotal), from);
|
|
10070
10404
|
});
|
|
10071
|
-
const [announcement, setAnnouncement] =
|
|
10405
|
+
const [announcement, setAnnouncement] = useState50("");
|
|
10072
10406
|
const cell = findCombo(grid, total, legs);
|
|
10073
10407
|
const minLegs = legChoices[0] ?? legs;
|
|
10074
10408
|
const maxLegs = legChoices[legChoices.length - 1] ?? legs;
|
|
@@ -10079,29 +10413,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
|
|
|
10079
10413
|
const d = strings.comboDisplay(nextLegs, nextTotal);
|
|
10080
10414
|
setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
|
|
10081
10415
|
};
|
|
10082
|
-
const footer = /* @__PURE__ */
|
|
10416
|
+
const footer = /* @__PURE__ */ jsx101(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
|
|
10083
10417
|
if (cell) onSend(comboAsk(cell, strings));
|
|
10084
10418
|
} });
|
|
10085
|
-
return /* @__PURE__ */
|
|
10086
|
-
/* @__PURE__ */
|
|
10087
|
-
/* @__PURE__ */
|
|
10088
|
-
/* @__PURE__ */
|
|
10419
|
+
return /* @__PURE__ */ jsxs87(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
|
|
10420
|
+
/* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
|
|
10421
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
|
|
10422
|
+
/* @__PURE__ */ jsx101("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-chip", "aria-pressed": samePrice(t, total), onClick: () => choose(t, samePrice(t, total) ? legs : legsForTotal(grid, t, legs)), children: t.toFixed(1) }, t)) })
|
|
10089
10423
|
] }),
|
|
10090
|
-
/* @__PURE__ */
|
|
10091
|
-
/* @__PURE__ */
|
|
10092
|
-
/* @__PURE__ */
|
|
10093
|
-
/* @__PURE__ */
|
|
10094
|
-
/* @__PURE__ */
|
|
10095
|
-
/* @__PURE__ */
|
|
10424
|
+
/* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
|
|
10425
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
|
|
10426
|
+
/* @__PURE__ */ jsxs87("div", { className: "ss-w-tool-stepper", children: [
|
|
10427
|
+
/* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
|
|
10428
|
+
/* @__PURE__ */ jsx101("span", { className: "ss-w-tool-count", children: legs }),
|
|
10429
|
+
/* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
|
|
10096
10430
|
] })
|
|
10097
10431
|
] }),
|
|
10098
|
-
cell ? /* @__PURE__ */
|
|
10099
|
-
/* @__PURE__ */
|
|
10432
|
+
cell ? /* @__PURE__ */ jsx101(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ jsx101(Unavailable, { text: strings.unavailable }),
|
|
10433
|
+
/* @__PURE__ */ jsx101("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
|
|
10100
10434
|
] });
|
|
10101
10435
|
}
|
|
10102
10436
|
|
|
10103
10437
|
// src/usePresetDial.ts
|
|
10104
|
-
import { useCallback as
|
|
10438
|
+
import { useCallback as useCallback21, useEffect as useEffect32, useRef as useRef29, useState as useState51 } from "react";
|
|
10105
10439
|
function sendInFlight(messages, isStreaming) {
|
|
10106
10440
|
const last = messages[messages.length - 1];
|
|
10107
10441
|
return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
|
|
@@ -10115,25 +10449,25 @@ function lastUserId(messages) {
|
|
|
10115
10449
|
}
|
|
10116
10450
|
var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
|
|
10117
10451
|
function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
|
|
10118
|
-
const [expanded, setExpanded] =
|
|
10119
|
-
const fold =
|
|
10120
|
-
const toggle =
|
|
10452
|
+
const [expanded, setExpanded] = useState51(() => !sendInFlight(messages, isStreaming));
|
|
10453
|
+
const fold = useCallback21(() => setExpanded(false), []);
|
|
10454
|
+
const toggle = useCallback21(() => setExpanded((e) => !e), []);
|
|
10121
10455
|
const currentUserId = lastUserId(messages);
|
|
10122
|
-
const userIdRef =
|
|
10123
|
-
|
|
10456
|
+
const userIdRef = useRef29(currentUserId);
|
|
10457
|
+
useEffect32(() => {
|
|
10124
10458
|
if (currentUserId === userIdRef.current) return;
|
|
10125
10459
|
userIdRef.current = currentUserId;
|
|
10126
10460
|
setExpanded(false);
|
|
10127
10461
|
}, [currentUserId]);
|
|
10128
|
-
const tabRef =
|
|
10129
|
-
|
|
10462
|
+
const tabRef = useRef29(activeTab);
|
|
10463
|
+
useEffect32(() => {
|
|
10130
10464
|
if (activeTab === tabRef.current) return;
|
|
10131
10465
|
tabRef.current = activeTab;
|
|
10132
10466
|
setExpanded(false);
|
|
10133
10467
|
}, [activeTab]);
|
|
10134
|
-
const expandedRef =
|
|
10468
|
+
const expandedRef = useRef29(expanded);
|
|
10135
10469
|
expandedRef.current = expanded;
|
|
10136
|
-
|
|
10470
|
+
useEffect32(() => {
|
|
10137
10471
|
const onEscape = (e) => {
|
|
10138
10472
|
const dial = dialRef.current;
|
|
10139
10473
|
if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
|
|
@@ -10146,7 +10480,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
|
|
|
10146
10480
|
window.addEventListener("keydown", onEscape, true);
|
|
10147
10481
|
return () => window.removeEventListener("keydown", onEscape, true);
|
|
10148
10482
|
}, [dialRef, dialButtonRef]);
|
|
10149
|
-
|
|
10483
|
+
useEffect32(() => {
|
|
10150
10484
|
if (!expanded) return;
|
|
10151
10485
|
const layer = layerRef.current;
|
|
10152
10486
|
const inDial = (e) => {
|
|
@@ -10198,11 +10532,11 @@ function markToolSeen() {
|
|
|
10198
10532
|
}
|
|
10199
10533
|
|
|
10200
10534
|
// src/components/ChatPanel.tsx
|
|
10201
|
-
import { Fragment as
|
|
10535
|
+
import { Fragment as Fragment25, jsx as jsx102, jsxs as jsxs88 } from "react/jsx-runtime";
|
|
10202
10536
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
10203
10537
|
function useIsModal() {
|
|
10204
|
-
const [modal, setModal] =
|
|
10205
|
-
|
|
10538
|
+
const [modal, setModal] = useState52(false);
|
|
10539
|
+
useEffect33(() => {
|
|
10206
10540
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
10207
10541
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
10208
10542
|
const sync = () => setModal(mql.matches);
|
|
@@ -10213,10 +10547,38 @@ function useIsModal() {
|
|
|
10213
10547
|
return modal;
|
|
10214
10548
|
}
|
|
10215
10549
|
var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
|
|
10216
|
-
|
|
10550
|
+
var SQUAD_LAYER_STYLE = { display: "flex", flexDirection: "column", flex: 1, minHeight: 0 };
|
|
10551
|
+
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, clubFixturesResult, clubStandingsResult, clubSquadResult, clubSquadStatsResult, clubPlayerDetailResult, loggedIn, conversation, presetGrid }) {
|
|
10217
10552
|
const { state, close, stop, send, reset } = controller;
|
|
10553
|
+
const [squadView, setSquadView] = useState52("roster");
|
|
10554
|
+
const [selectedPlayerId, setSelectedPlayerId] = useState52(null);
|
|
10555
|
+
const clearPlayerDetail = clubPlayerDetailResult?.clear;
|
|
10556
|
+
const fetchPlayerDetail = clubPlayerDetailResult?.fetch;
|
|
10557
|
+
const squadLayerRef = useRef30(null);
|
|
10558
|
+
const squadScrollRef = useRef30(null);
|
|
10559
|
+
const selectPlayer = (playerId) => {
|
|
10560
|
+
squadScrollRef.current = squadLayerRef.current?.querySelector(".ss-w-mon-list")?.scrollTop ?? null;
|
|
10561
|
+
setSelectedPlayerId(playerId);
|
|
10562
|
+
fetchPlayerDetail?.(playerId);
|
|
10563
|
+
};
|
|
10564
|
+
const closePlayer = () => {
|
|
10565
|
+
setSelectedPlayerId(null);
|
|
10566
|
+
clearPlayerDetail?.();
|
|
10567
|
+
};
|
|
10568
|
+
useLayoutEffect(() => {
|
|
10569
|
+
if (selectedPlayerId !== null || squadScrollRef.current === null) return;
|
|
10570
|
+
const list = squadLayerRef.current?.querySelector(".ss-w-mon-list");
|
|
10571
|
+
if (list) list.scrollTop = squadScrollRef.current;
|
|
10572
|
+
squadScrollRef.current = null;
|
|
10573
|
+
}, [selectedPlayerId]);
|
|
10574
|
+
const activeTab = monitor?.activeTab;
|
|
10575
|
+
useEffect33(() => {
|
|
10576
|
+
if (activeTab === "squad" || selectedPlayerId === null) return;
|
|
10577
|
+
setSelectedPlayerId(null);
|
|
10578
|
+
clearPlayerDetail?.();
|
|
10579
|
+
}, [activeTab, selectedPlayerId, clearPlayerDetail]);
|
|
10218
10580
|
const isModal = useIsModal();
|
|
10219
|
-
|
|
10581
|
+
useEffect33(() => {
|
|
10220
10582
|
const onKey = (e) => {
|
|
10221
10583
|
if (e.key === "Escape") close();
|
|
10222
10584
|
};
|
|
@@ -10232,19 +10594,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10232
10594
|
monitor?.setActiveTab("chat");
|
|
10233
10595
|
send(text, { grounding });
|
|
10234
10596
|
};
|
|
10235
|
-
|
|
10597
|
+
useEffect33(() => {
|
|
10236
10598
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
10237
10599
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
10238
10600
|
const onChatTab = !monitor || monitor.activeTab === "chat";
|
|
10239
|
-
const layerRef =
|
|
10240
|
-
const dialRef =
|
|
10241
|
-
const dialButtonRef =
|
|
10242
|
-
const inputRef =
|
|
10243
|
-
const limitRef =
|
|
10244
|
-
const typedSendRef =
|
|
10245
|
-
const focusAfterCloseRef =
|
|
10246
|
-
const [tool, setTool] =
|
|
10247
|
-
const [toolSeen, setToolSeen] =
|
|
10601
|
+
const layerRef = useRef30(null);
|
|
10602
|
+
const dialRef = useRef30(null);
|
|
10603
|
+
const dialButtonRef = useRef30(null);
|
|
10604
|
+
const inputRef = useRef30(null);
|
|
10605
|
+
const limitRef = useRef30(null);
|
|
10606
|
+
const typedSendRef = useRef30(false);
|
|
10607
|
+
const focusAfterCloseRef = useRef30(null);
|
|
10608
|
+
const [tool, setTool] = useState52(null);
|
|
10609
|
+
const [toolSeen, setToolSeen] = useState52(readToolSeen);
|
|
10248
10610
|
const dial = usePresetDial({
|
|
10249
10611
|
layerRef,
|
|
10250
10612
|
dialRef,
|
|
@@ -10256,53 +10618,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10256
10618
|
const { fold } = dial;
|
|
10257
10619
|
const paused = isPaused(state.limit);
|
|
10258
10620
|
const showDial = !!presetGrid && onChatTab && !tool && !paused;
|
|
10259
|
-
|
|
10621
|
+
useEffect33(() => {
|
|
10260
10622
|
if (paused) setTool(null);
|
|
10261
10623
|
}, [paused]);
|
|
10262
|
-
|
|
10624
|
+
useEffect33(() => {
|
|
10263
10625
|
if (!paused) return;
|
|
10264
10626
|
if (typedSendRef.current) limitRef.current?.focus();
|
|
10265
10627
|
typedSendRef.current = false;
|
|
10266
10628
|
}, [paused]);
|
|
10267
|
-
const openTool =
|
|
10629
|
+
const openTool = useCallback22((next) => {
|
|
10268
10630
|
fold();
|
|
10269
10631
|
markToolSeen();
|
|
10270
10632
|
setToolSeen(true);
|
|
10271
10633
|
setTool(next);
|
|
10272
10634
|
}, [fold]);
|
|
10273
|
-
const onPill =
|
|
10635
|
+
const onPill = useCallback22((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
|
|
10274
10636
|
const toolsValue = useMemo5(
|
|
10275
10637
|
() => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
|
|
10276
10638
|
[presetGrid, paused, openTool, ui.presets.changeCombo]
|
|
10277
10639
|
);
|
|
10278
|
-
const closeTool =
|
|
10640
|
+
const closeTool = useCallback22(() => {
|
|
10279
10641
|
focusAfterCloseRef.current = "dial";
|
|
10280
10642
|
setTool(null);
|
|
10281
10643
|
}, []);
|
|
10282
|
-
const sendAsk =
|
|
10644
|
+
const sendAsk = useCallback22((ask) => {
|
|
10283
10645
|
focusAfterCloseRef.current = "composer";
|
|
10284
10646
|
setTool(null);
|
|
10285
10647
|
monitor?.setActiveTab("chat");
|
|
10286
10648
|
send(ask.message, { displayText: ask.displayText, preset: ask.preset });
|
|
10287
10649
|
}, [monitor, send]);
|
|
10288
|
-
const formatKickoff =
|
|
10650
|
+
const formatKickoff = useCallback22((kickoffUtc) => {
|
|
10289
10651
|
const k = ui.bettingKickoff(kickoffUtc);
|
|
10290
10652
|
return `${k.dayLabel} ${k.time}`;
|
|
10291
10653
|
}, [ui]);
|
|
10292
|
-
|
|
10654
|
+
useEffect33(() => {
|
|
10293
10655
|
if (tool) return;
|
|
10294
10656
|
const target = focusAfterCloseRef.current;
|
|
10295
10657
|
focusAfterCloseRef.current = null;
|
|
10296
10658
|
if (target === "dial") dialButtonRef.current?.focus();
|
|
10297
10659
|
else if (target === "composer") inputRef.current?.focus();
|
|
10298
10660
|
}, [tool]);
|
|
10299
|
-
|
|
10661
|
+
useEffect33(() => {
|
|
10300
10662
|
if (!tool || onChatTab && presetGrid) return;
|
|
10301
10663
|
focusAfterCloseRef.current = "composer";
|
|
10302
10664
|
setTool(null);
|
|
10303
10665
|
}, [tool, onChatTab, presetGrid]);
|
|
10304
|
-
return /* @__PURE__ */
|
|
10305
|
-
/* @__PURE__ */
|
|
10666
|
+
return /* @__PURE__ */ jsxs88("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
10667
|
+
/* @__PURE__ */ jsx102(
|
|
10306
10668
|
ChatHeader,
|
|
10307
10669
|
{
|
|
10308
10670
|
onClose: close,
|
|
@@ -10315,7 +10677,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10315
10677
|
moreOptionsLabel: ui.moreOptions
|
|
10316
10678
|
}
|
|
10317
10679
|
),
|
|
10318
|
-
monitor && /* @__PURE__ */
|
|
10680
|
+
monitor && /* @__PURE__ */ jsx102(
|
|
10319
10681
|
TabBar,
|
|
10320
10682
|
{
|
|
10321
10683
|
monitor,
|
|
@@ -10328,9 +10690,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10328
10690
|
clubEnabled: clubFixturesResult?.enabled ?? false
|
|
10329
10691
|
}
|
|
10330
10692
|
),
|
|
10331
|
-
/* @__PURE__ */
|
|
10332
|
-
/* @__PURE__ */
|
|
10333
|
-
showDial ? /* @__PURE__ */
|
|
10693
|
+
/* @__PURE__ */ jsxs88("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
|
|
10694
|
+
/* @__PURE__ */ jsx102(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ jsx102(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
|
|
10695
|
+
showDial ? /* @__PURE__ */ jsx102(
|
|
10334
10696
|
PresetSpeedDial,
|
|
10335
10697
|
{
|
|
10336
10698
|
expanded: dial.expanded,
|
|
@@ -10342,15 +10704,38 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10342
10704
|
buttonRef: dialButtonRef
|
|
10343
10705
|
}
|
|
10344
10706
|
) : null,
|
|
10345
|
-
tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */
|
|
10707
|
+
tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ jsx102(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx102(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
|
|
10346
10708
|
] }),
|
|
10347
|
-
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */
|
|
10348
|
-
monitor && monitor.activeTab === "following" && /* @__PURE__ */
|
|
10349
|
-
monitor && monitor.activeTab === "odds" && /* @__PURE__ */
|
|
10350
|
-
monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */
|
|
10351
|
-
monitor && monitor.activeTab === "standings" && /* @__PURE__ */
|
|
10352
|
-
monitor && monitor.activeTab === "squad" && /* @__PURE__ */
|
|
10353
|
-
|
|
10709
|
+
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx102(TodayPanel, { discovery, ui, monitor }),
|
|
10710
|
+
monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx102(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
|
|
10711
|
+
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx102(OddsPanel, { monitor, ui, slip }),
|
|
10712
|
+
monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ jsx102(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
|
|
10713
|
+
monitor && monitor.activeTab === "standings" && /* @__PURE__ */ jsx102(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
|
|
10714
|
+
monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsxs88(Fragment25, { children: [
|
|
10715
|
+
/* @__PURE__ */ jsx102(
|
|
10716
|
+
"div",
|
|
10717
|
+
{
|
|
10718
|
+
ref: squadLayerRef,
|
|
10719
|
+
style: selectedPlayerId === null ? SQUAD_LAYER_STYLE : HIDDEN_LAYER_STYLE,
|
|
10720
|
+
"aria-hidden": selectedPlayerId !== null ? true : void 0,
|
|
10721
|
+
children: /* @__PURE__ */ jsx102(
|
|
10722
|
+
Squad,
|
|
10723
|
+
{
|
|
10724
|
+
squad: clubSquadResult?.data ?? null,
|
|
10725
|
+
loading: clubSquadResult?.loading ?? false,
|
|
10726
|
+
ui,
|
|
10727
|
+
view: squadView,
|
|
10728
|
+
onToggleView: () => setSquadView((v) => v === "roster" ? "stats" : "roster"),
|
|
10729
|
+
stats: clubSquadStatsResult?.data ?? null,
|
|
10730
|
+
statsLoading: clubSquadStatsResult?.loading ?? false,
|
|
10731
|
+
onSelectPlayer: selectPlayer
|
|
10732
|
+
}
|
|
10733
|
+
)
|
|
10734
|
+
}
|
|
10735
|
+
),
|
|
10736
|
+
selectedPlayerId !== null && /* @__PURE__ */ jsx102(PlayerDetail, { detail: clubPlayerDetailResult?.data ?? null, loading: clubPlayerDetailResult?.loading ?? false, ui, seasonName: clubSquadStatsResult?.seasonName ?? null, onClose: closePlayer })
|
|
10737
|
+
] }),
|
|
10738
|
+
monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx102(
|
|
10354
10739
|
GamesPanel,
|
|
10355
10740
|
{
|
|
10356
10741
|
loggedIn: !!loggedIn,
|
|
@@ -10365,9 +10750,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10365
10750
|
}
|
|
10366
10751
|
}
|
|
10367
10752
|
),
|
|
10368
|
-
(!monitor || monitor.activeTab !== "games") && /* @__PURE__ */
|
|
10369
|
-
/* @__PURE__ */
|
|
10370
|
-
paused ? null : /* @__PURE__ */
|
|
10753
|
+
(!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs88(Fragment25, { children: [
|
|
10754
|
+
/* @__PURE__ */ jsx102("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
|
|
10755
|
+
paused ? null : /* @__PURE__ */ jsx102(
|
|
10371
10756
|
ChatInput,
|
|
10372
10757
|
{
|
|
10373
10758
|
ref: inputRef,
|
|
@@ -10386,9 +10771,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10386
10771
|
}
|
|
10387
10772
|
|
|
10388
10773
|
// src/components/HostEventsProvider.tsx
|
|
10389
|
-
import { jsx as
|
|
10774
|
+
import { jsx as jsx103 } from "react/jsx-runtime";
|
|
10390
10775
|
function HostEventsProvider({ value, children }) {
|
|
10391
|
-
return /* @__PURE__ */
|
|
10776
|
+
return /* @__PURE__ */ jsx103(SlipStateContext.Provider, { value: value.slipState, children });
|
|
10392
10777
|
}
|
|
10393
10778
|
|
|
10394
10779
|
// src/styles/css.generated.ts
|
|
@@ -11467,7 +11852,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11467
11852
|
/* live monitor tab bar: underline pattern mirrors .ss-w-ecard-scope; the unread dot uses --ss-w-neg */
|
|
11468
11853
|
.ss-w-tabs { display: flex; align-items: stretch; gap: 2px; border-bottom: 1px solid var(--ss-w-line); overflow-x: auto; scrollbar-width: none; }
|
|
11469
11854
|
.ss-w-tabs::-webkit-scrollbar { display: none; }
|
|
11470
|
-
.ss-w-tab { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 620; color: var(--ss-w-faint); background: none; border: none; cursor: pointer; padding: 9px
|
|
11855
|
+
.ss-w-tab { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 620; color: var(--ss-w-faint); background: none; border: none; cursor: pointer; padding: 9px 8px; margin-bottom: -1px; border-bottom: 2px solid transparent; flex: none; white-space: nowrap; }
|
|
11471
11856
|
.ss-w-tab[data-on] { color: var(--ss-w-ink); border-bottom-color: var(--ss-w-accent); }
|
|
11472
11857
|
.ss-w-tab-count { font-size: 10.5px; font-weight: 700; color: var(--ss-w-faint); background: var(--ss-w-bubble); border-radius: 999px; padding: 1px 6px; }
|
|
11473
11858
|
.ss-w-tab[data-on] .ss-w-tab-count { color: var(--ss-w-accent); }
|
|
@@ -11549,6 +11934,28 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11549
11934
|
.ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
|
|
11550
11935
|
.ss-w-sq-num { flex: none; width: 20px; text-align: right; font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-faint); }
|
|
11551
11936
|
.ss-w-sq-name { font-size: 13px; font-weight: 600; color: var(--ss-w-ink); }
|
|
11937
|
+
.ss-w-sq-name { flex: 1; min-width: 0; }
|
|
11938
|
+
.ss-w-sq-name-1 { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
11939
|
+
.ss-w-sq-seg { display: flex; flex: none; gap: 2px; margin: 10px 14px 0; padding: 2px; border-radius: var(--ss-w-radius); background: var(--ss-w-track); }
|
|
11940
|
+
.ss-w-sq-seg-btn { flex: 1; padding: 5px 8px; border: 0; border-radius: calc(var(--ss-w-radius) - 2px); background: transparent; font: inherit; font-size: 12px; font-weight: 600; color: var(--ss-w-faint); cursor: pointer; }
|
|
11941
|
+
.ss-w-sq-seg-btn[aria-pressed="true"] { background: var(--ss-w-panel); color: var(--ss-w-ink); }
|
|
11942
|
+
.ss-w-sq-seg-btn:focus-visible, .ss-w-sq-tap:focus-visible, .ss-w-pd-back:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 1px; }
|
|
11943
|
+
.ss-w-sq-tap { width: 100%; border: 0; border-bottom: 1px solid var(--ss-w-line); background: transparent; font: inherit; text-align: left; cursor: pointer; }
|
|
11944
|
+
.ss-w-sq-col { flex: none; width: 40px; text-align: center; font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--ss-w-ink); }
|
|
11945
|
+
.ss-w-sq-head { border-bottom: 0; padding-bottom: 0; }
|
|
11946
|
+
.ss-w-sq-head .ss-w-sq-col { font-size: 10px; font-weight: 700; color: var(--ss-w-faint); }
|
|
11947
|
+
.ss-w-pd-bar { flex: none; padding: 8px 14px 0; }
|
|
11948
|
+
.ss-w-pd-back { padding: 4px 0; border: 0; background: transparent; font: inherit; font-size: 12px; font-weight: 600; color: var(--ss-w-accent); cursor: pointer; }
|
|
11949
|
+
.ss-w-pd-name { font-size: 16px; font-weight: 700; color: var(--ss-w-ink); }
|
|
11950
|
+
.ss-w-pd-sub { margin-top: 2px; font-size: 12px; color: var(--ss-w-faint); }
|
|
11951
|
+
.ss-w-pd-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
|
|
11952
|
+
.ss-w-pd-bio { grid-template-columns: repeat(2, 1fr); }
|
|
11953
|
+
.ss-w-pd-field { display: flex; flex-direction: column; gap: 2px; padding: 8px 10px; border: 1px solid var(--ss-w-line); border-radius: var(--ss-w-radius); }
|
|
11954
|
+
.ss-w-pd-label { font-size: 10px; font-weight: 700; letter-spacing: .04em; color: var(--ss-w-faint); }
|
|
11955
|
+
.ss-w-pd-value { font-size: 14px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-ink); }
|
|
11956
|
+
.ss-w-rec-list { margin: 0; padding: 0; list-style: none; }
|
|
11957
|
+
.ss-w-rec-value { flex: none; font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-ink); }
|
|
11958
|
+
.ss-w-rec-since { font-size: 12px; color: var(--ss-w-faint); }
|
|
11552
11959
|
/* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
|
|
11553
11960
|
the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
|
|
11554
11961
|
a bare context line with nothing under it. */
|
|
@@ -12152,7 +12559,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
12152
12559
|
`;
|
|
12153
12560
|
|
|
12154
12561
|
// src/StatsWidget.tsx
|
|
12155
|
-
import { jsx as
|
|
12562
|
+
import { jsx as jsx104 } from "react/jsx-runtime";
|
|
12156
12563
|
function buildClient(props) {
|
|
12157
12564
|
try {
|
|
12158
12565
|
if ("client" in props && props.client) {
|
|
@@ -12186,14 +12593,14 @@ function StatsWidget(props) {
|
|
|
12186
12593
|
[built?.client]
|
|
12187
12594
|
);
|
|
12188
12595
|
const ui = useMemo6(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
12189
|
-
const rootRef =
|
|
12190
|
-
const introDoneRef =
|
|
12191
|
-
const markIntroDone =
|
|
12596
|
+
const rootRef = useRef31(null);
|
|
12597
|
+
const introDoneRef = useRef31(false);
|
|
12598
|
+
const markIntroDone = useCallback23(() => {
|
|
12192
12599
|
introDoneRef.current = true;
|
|
12193
12600
|
}, []);
|
|
12194
12601
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
12195
12602
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
12196
|
-
const [hasToday, setHasToday] =
|
|
12603
|
+
const [hasToday, setHasToday] = useState53(false);
|
|
12197
12604
|
const liveCardWatches = useMemo6(() => {
|
|
12198
12605
|
const seen = /* @__PURE__ */ new Set();
|
|
12199
12606
|
const out = [];
|
|
@@ -12220,15 +12627,15 @@ function StatsWidget(props) {
|
|
|
12220
12627
|
});
|
|
12221
12628
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
12222
12629
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
12223
|
-
const getSchedule =
|
|
12630
|
+
const getSchedule = useCallback23(
|
|
12224
12631
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
12225
12632
|
[built, operatorUserId, anonymousUserId]
|
|
12226
12633
|
);
|
|
12227
|
-
const postLeagueStar =
|
|
12634
|
+
const postLeagueStar = useCallback23(
|
|
12228
12635
|
(competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
12229
12636
|
[built, operatorUserId, anonymousUserId]
|
|
12230
12637
|
);
|
|
12231
|
-
const getStates =
|
|
12638
|
+
const getStates = useCallback23(
|
|
12232
12639
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
12233
12640
|
[built]
|
|
12234
12641
|
);
|
|
@@ -12247,11 +12654,11 @@ function StatsWidget(props) {
|
|
|
12247
12654
|
pinnedMatchIds
|
|
12248
12655
|
});
|
|
12249
12656
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
12250
|
-
|
|
12657
|
+
useEffect34(() => {
|
|
12251
12658
|
setHasToday(todayHasContent);
|
|
12252
12659
|
}, [todayHasContent]);
|
|
12253
|
-
const prevLiveSnapshotRef =
|
|
12254
|
-
|
|
12660
|
+
const prevLiveSnapshotRef = useRef31(monitor.snapshot);
|
|
12661
|
+
useEffect34(() => {
|
|
12255
12662
|
const snap = monitor.snapshot;
|
|
12256
12663
|
if (!snap || snap === prevLiveSnapshotRef.current) return;
|
|
12257
12664
|
prevLiveSnapshotRef.current = snap;
|
|
@@ -12289,14 +12696,16 @@ function StatsWidget(props) {
|
|
|
12289
12696
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
12290
12697
|
const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12291
12698
|
const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12292
|
-
const
|
|
12699
|
+
const clubSquadStatsResult = useClubSquadStats(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12700
|
+
const clubPlayerDetailResult = useClubPlayerDetail(built?.conversation ?? null);
|
|
12701
|
+
const getPricePresets = useCallback23(
|
|
12293
12702
|
(locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
|
|
12294
12703
|
[built]
|
|
12295
12704
|
);
|
|
12296
12705
|
const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
|
|
12297
12706
|
const markTodayActivity = monitor.markTodayActivity;
|
|
12298
|
-
const prevLiveCountRef =
|
|
12299
|
-
|
|
12707
|
+
const prevLiveCountRef = useRef31(0);
|
|
12708
|
+
useEffect34(() => {
|
|
12300
12709
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
12301
12710
|
prevLiveCountRef.current = discovery.liveCount;
|
|
12302
12711
|
if (rose) markTodayActivity();
|
|
@@ -12346,11 +12755,11 @@ function StatsWidget(props) {
|
|
|
12346
12755
|
})
|
|
12347
12756
|
}));
|
|
12348
12757
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
12349
|
-
|
|
12758
|
+
useEffect34(() => {
|
|
12350
12759
|
if (!logger) return;
|
|
12351
12760
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
12352
12761
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
12353
|
-
|
|
12762
|
+
useEffect34(() => {
|
|
12354
12763
|
if (!logger) return;
|
|
12355
12764
|
logger.resume();
|
|
12356
12765
|
const onHide = () => {
|
|
@@ -12368,14 +12777,14 @@ function StatsWidget(props) {
|
|
|
12368
12777
|
logger.dispose();
|
|
12369
12778
|
};
|
|
12370
12779
|
}, [logger]);
|
|
12371
|
-
|
|
12780
|
+
useEffect34(() => {
|
|
12372
12781
|
if (!built || !ui.injectStyles) return;
|
|
12373
12782
|
const node = rootRef.current?.getRootNode();
|
|
12374
12783
|
if (node) injectStyles(node);
|
|
12375
12784
|
}, [built, ui.injectStyles]);
|
|
12376
12785
|
if (!built) return null;
|
|
12377
12786
|
const attrs = themeAttrs(ui);
|
|
12378
|
-
return /* @__PURE__ */
|
|
12787
|
+
return /* @__PURE__ */ jsx104(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx104(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ jsx104("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx104(
|
|
12379
12788
|
ChatPanel,
|
|
12380
12789
|
{
|
|
12381
12790
|
controller,
|
|
@@ -12389,11 +12798,13 @@ function StatsWidget(props) {
|
|
|
12389
12798
|
clubFixturesResult,
|
|
12390
12799
|
clubStandingsResult,
|
|
12391
12800
|
clubSquadResult,
|
|
12801
|
+
clubSquadStatsResult,
|
|
12802
|
+
clubPlayerDetailResult,
|
|
12392
12803
|
loggedIn: !!operatorUserId,
|
|
12393
12804
|
conversation: built?.conversation ?? null,
|
|
12394
12805
|
presetGrid
|
|
12395
12806
|
}
|
|
12396
|
-
) : /* @__PURE__ */
|
|
12807
|
+
) : /* @__PURE__ */ jsx104(
|
|
12397
12808
|
ChatFab,
|
|
12398
12809
|
{
|
|
12399
12810
|
label: ui.launcherLabel,
|