@sensiblestats/widget-react 0.83.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 +22 -0
- package/dist/index.cjs +802 -390
- 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 +765 -353
- 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,
|
|
@@ -1177,6 +1273,7 @@ function toMarketOddsVM(card) {
|
|
|
1177
1273
|
mainLine: str(card.mainLine),
|
|
1178
1274
|
pinEnabled: card.pinEnabled === true,
|
|
1179
1275
|
statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
|
|
1276
|
+
statTexts: Array.isArray(card.insights) ? card.insights.map((i) => str(i?.text)).filter((t) => !!t) : void 0,
|
|
1180
1277
|
tag: card.tag === "your_market" ? "your_market" : void 0,
|
|
1181
1278
|
live: card.live ?? null,
|
|
1182
1279
|
marketCount: typeof card.marketCount === "number" && Number.isFinite(card.marketCount) ? card.marketCount : void 0
|
|
@@ -3242,8 +3339,83 @@ function useClubSquad(conversation, { activeTab, enabled }) {
|
|
|
3242
3339
|
return { data, loading: effectiveLoading, refresh };
|
|
3243
3340
|
}
|
|
3244
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
|
+
|
|
3245
3417
|
// src/usePresetGrid.ts
|
|
3246
|
-
import { useEffect as
|
|
3418
|
+
import { useEffect as useEffect12, useRef as useRef13, useState as useState12 } from "react";
|
|
3247
3419
|
|
|
3248
3420
|
// src/presetGrid.ts
|
|
3249
3421
|
var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
|
|
@@ -3386,22 +3558,22 @@ function marketDisplay(cell, s) {
|
|
|
3386
3558
|
// src/usePresetGrid.ts
|
|
3387
3559
|
var GRID_MAX_AGE_MS = 6e5;
|
|
3388
3560
|
function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
|
|
3389
|
-
const [grid, setGrid] =
|
|
3390
|
-
const keptRef =
|
|
3391
|
-
const localeRef =
|
|
3392
|
-
const inFlightRef =
|
|
3393
|
-
const mountedRef =
|
|
3394
|
-
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);
|
|
3395
3567
|
getRef.current = getPricePresets;
|
|
3396
|
-
const nowRef =
|
|
3568
|
+
const nowRef = useRef13(now);
|
|
3397
3569
|
nowRef.current = now;
|
|
3398
|
-
|
|
3570
|
+
useEffect12(() => {
|
|
3399
3571
|
mountedRef.current = true;
|
|
3400
3572
|
return () => {
|
|
3401
3573
|
mountedRef.current = false;
|
|
3402
3574
|
};
|
|
3403
3575
|
}, []);
|
|
3404
|
-
|
|
3576
|
+
useEffect12(() => {
|
|
3405
3577
|
if (localeRef.current !== locale) {
|
|
3406
3578
|
localeRef.current = locale;
|
|
3407
3579
|
keptRef.current = null;
|
|
@@ -3451,11 +3623,11 @@ function useEventLog() {
|
|
|
3451
3623
|
}
|
|
3452
3624
|
|
|
3453
3625
|
// src/popupTelemetry.ts
|
|
3454
|
-
import { useCallback as
|
|
3626
|
+
import { useCallback as useCallback12, useEffect as useEffect13, useRef as useRef14 } from "react";
|
|
3455
3627
|
function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
3456
|
-
const shownRef =
|
|
3457
|
-
const closedTextRef =
|
|
3458
|
-
|
|
3628
|
+
const shownRef = useRef14(/* @__PURE__ */ new Set());
|
|
3629
|
+
const closedTextRef = useRef14(null);
|
|
3630
|
+
useEffect13(() => {
|
|
3459
3631
|
if (isOpen) {
|
|
3460
3632
|
if (closedTextRef.current) log?.log({ name: "popup_opened" });
|
|
3461
3633
|
closedTextRef.current = null;
|
|
@@ -3467,17 +3639,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
|
3467
3639
|
log?.log({ name: "popup_shown" });
|
|
3468
3640
|
}
|
|
3469
3641
|
}, [log, isOpen, popupText]);
|
|
3470
|
-
return
|
|
3642
|
+
return useCallback12(() => {
|
|
3471
3643
|
log?.log({ name: "popup_dismissed" });
|
|
3472
3644
|
dismissPopup();
|
|
3473
3645
|
}, [log, dismissPopup]);
|
|
3474
3646
|
}
|
|
3475
3647
|
|
|
3476
3648
|
// src/openTelemetry.ts
|
|
3477
|
-
import { useEffect as
|
|
3649
|
+
import { useEffect as useEffect14, useRef as useRef15 } from "react";
|
|
3478
3650
|
function useOpenTelemetry(log, isOpen) {
|
|
3479
|
-
const openLoggedRef =
|
|
3480
|
-
|
|
3651
|
+
const openLoggedRef = useRef15(false);
|
|
3652
|
+
useEffect14(() => {
|
|
3481
3653
|
if (!isOpen) {
|
|
3482
3654
|
openLoggedRef.current = false;
|
|
3483
3655
|
return;
|
|
@@ -3489,10 +3661,10 @@ function useOpenTelemetry(log, isOpen) {
|
|
|
3489
3661
|
}
|
|
3490
3662
|
|
|
3491
3663
|
// src/components/ChatFab.tsx
|
|
3492
|
-
import { useEffect as
|
|
3664
|
+
import { useEffect as useEffect15, useRef as useRef16, useState as useState14 } from "react";
|
|
3493
3665
|
|
|
3494
3666
|
// src/components/BrandMark.tsx
|
|
3495
|
-
import { useState as
|
|
3667
|
+
import { useState as useState13 } from "react";
|
|
3496
3668
|
|
|
3497
3669
|
// src/assets/logo.ts
|
|
3498
3670
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
@@ -3555,7 +3727,7 @@ function DashboardIcon({ name }) {
|
|
|
3555
3727
|
// src/components/BrandMark.tsx
|
|
3556
3728
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
3557
3729
|
function BrandMark({ logoUrl, className }) {
|
|
3558
|
-
const [failed, setFailed] =
|
|
3730
|
+
const [failed, setFailed] = useState13(false);
|
|
3559
3731
|
if (!logoUrl || failed) return /* @__PURE__ */ jsx2(SsMark, { className });
|
|
3560
3732
|
return /* @__PURE__ */ jsx2("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3561
3733
|
}
|
|
@@ -3591,9 +3763,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
|
|
|
3591
3763
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
3592
3764
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
|
|
3593
3765
|
const bubble = popupText ?? greeting;
|
|
3594
|
-
const [intro, setIntro] =
|
|
3595
|
-
const armedRef =
|
|
3596
|
-
|
|
3766
|
+
const [intro, setIntro] = useState14(false);
|
|
3767
|
+
const armedRef = useRef16(introAllowed);
|
|
3768
|
+
useEffect15(() => {
|
|
3597
3769
|
if (armedRef.current && bubble) {
|
|
3598
3770
|
armedRef.current = false;
|
|
3599
3771
|
setIntro(true);
|
|
@@ -3607,10 +3779,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
3607
3779
|
}
|
|
3608
3780
|
|
|
3609
3781
|
// src/components/ChatPanel.tsx
|
|
3610
|
-
import { useCallback as
|
|
3782
|
+
import { useCallback as useCallback22, useEffect as useEffect33, useLayoutEffect, useMemo as useMemo5, useRef as useRef30, useState as useState52 } from "react";
|
|
3611
3783
|
|
|
3612
3784
|
// src/components/ChatHeader.tsx
|
|
3613
|
-
import { useEffect as
|
|
3785
|
+
import { useEffect as useEffect16, useRef as useRef17, useState as useState15 } from "react";
|
|
3614
3786
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
3615
3787
|
function ChatHeader({
|
|
3616
3788
|
onClose,
|
|
@@ -3622,15 +3794,15 @@ function ChatHeader({
|
|
|
3622
3794
|
newConversationLabel = "New conversation",
|
|
3623
3795
|
moreOptionsLabel = "More options"
|
|
3624
3796
|
}) {
|
|
3625
|
-
const [menuOpen, setMenuOpen] =
|
|
3626
|
-
const wrapRef =
|
|
3627
|
-
const kebabRef =
|
|
3628
|
-
const firstItemRef =
|
|
3797
|
+
const [menuOpen, setMenuOpen] = useState15(false);
|
|
3798
|
+
const wrapRef = useRef17(null);
|
|
3799
|
+
const kebabRef = useRef17(null);
|
|
3800
|
+
const firstItemRef = useRef17(null);
|
|
3629
3801
|
const hasMenu = !!(canReset && onNewConversation);
|
|
3630
|
-
|
|
3802
|
+
useEffect16(() => {
|
|
3631
3803
|
if (menuOpen) firstItemRef.current?.focus();
|
|
3632
3804
|
}, [menuOpen]);
|
|
3633
|
-
|
|
3805
|
+
useEffect16(() => {
|
|
3634
3806
|
if (!menuOpen) return;
|
|
3635
3807
|
const onPointer = (e) => {
|
|
3636
3808
|
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
@@ -3686,7 +3858,7 @@ function ChatHeader({
|
|
|
3686
3858
|
}
|
|
3687
3859
|
|
|
3688
3860
|
// src/components/MessageList.tsx
|
|
3689
|
-
import { useEffect as
|
|
3861
|
+
import { useEffect as useEffect22, useRef as useRef20 } from "react";
|
|
3690
3862
|
|
|
3691
3863
|
// src/components/Markdown.tsx
|
|
3692
3864
|
import ReactMarkdown from "react-markdown";
|
|
@@ -3704,7 +3876,7 @@ function Markdown({ text }) {
|
|
|
3704
3876
|
}
|
|
3705
3877
|
|
|
3706
3878
|
// src/components/EntityCardList.tsx
|
|
3707
|
-
import { useState as
|
|
3879
|
+
import { useState as useState16 } from "react";
|
|
3708
3880
|
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
3709
3881
|
var MAX_VISIBLE = 3;
|
|
3710
3882
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
@@ -3788,7 +3960,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
3788
3960
|
)) });
|
|
3789
3961
|
}
|
|
3790
3962
|
function EntityCardItem({ c }) {
|
|
3791
|
-
const [active, setActive] =
|
|
3963
|
+
const [active, setActive] = useState16(0);
|
|
3792
3964
|
const hasBody = c.scopes.length > 0;
|
|
3793
3965
|
if (!hasBody) {
|
|
3794
3966
|
return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
|
|
@@ -3802,7 +3974,7 @@ function EntityCardItem({ c }) {
|
|
|
3802
3974
|
] });
|
|
3803
3975
|
}
|
|
3804
3976
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
3805
|
-
const [expanded, setExpanded] =
|
|
3977
|
+
const [expanded, setExpanded] = useState16(false);
|
|
3806
3978
|
if (cards.length === 0) return null;
|
|
3807
3979
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
3808
3980
|
const overflow = cards.length - MAX_VISIBLE;
|
|
@@ -3813,10 +3985,10 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
3813
3985
|
}
|
|
3814
3986
|
|
|
3815
3987
|
// src/components/AddToSlipButton.tsx
|
|
3816
|
-
import { useCallback as
|
|
3988
|
+
import { useCallback as useCallback14, useState as useState17 } from "react";
|
|
3817
3989
|
|
|
3818
3990
|
// src/slipAdd.ts
|
|
3819
|
-
import { useCallback as
|
|
3991
|
+
import { useCallback as useCallback13 } from "react";
|
|
3820
3992
|
import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
|
|
3821
3993
|
|
|
3822
3994
|
// src/slipStateContext.ts
|
|
@@ -3838,7 +4010,7 @@ function useSlipAdd(slip, ui) {
|
|
|
3838
4010
|
const slipState = useSlipState();
|
|
3839
4011
|
const handler = slip.onAddToSlip;
|
|
3840
4012
|
const rawLabels = !!ui?.rawBettingLabels;
|
|
3841
|
-
return
|
|
4013
|
+
return useCallback13(async (selection, { marketDeveloperName, selectionLabel, line }) => {
|
|
3842
4014
|
if (!handler) return { kind: "failed" };
|
|
3843
4015
|
const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
|
|
3844
4016
|
if (marketDeveloperName !== void 0) {
|
|
@@ -3875,11 +4047,11 @@ function useSlipAdd(slip, ui) {
|
|
|
3875
4047
|
}
|
|
3876
4048
|
|
|
3877
4049
|
// src/components/Toast.tsx
|
|
3878
|
-
import { useEffect as
|
|
4050
|
+
import { useEffect as useEffect17 } from "react";
|
|
3879
4051
|
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
3880
4052
|
var DISMISS_MS = 4e3;
|
|
3881
4053
|
function Toast({ toast, onDismiss }) {
|
|
3882
|
-
|
|
4054
|
+
useEffect17(() => {
|
|
3883
4055
|
if (!toast) return;
|
|
3884
4056
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
3885
4057
|
return () => clearTimeout(timer);
|
|
@@ -3891,10 +4063,10 @@ function Toast({ toast, onDismiss }) {
|
|
|
3891
4063
|
// src/components/AddToSlipButton.tsx
|
|
3892
4064
|
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
3893
4065
|
function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
|
|
3894
|
-
const [pending, setPending] =
|
|
3895
|
-
const [settledLocal, setSettledLocal] =
|
|
3896
|
-
const [toast, setToast] =
|
|
3897
|
-
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), []);
|
|
3898
4070
|
const add = useSlipAdd(slip, ui);
|
|
3899
4071
|
const slipState = useSlipState();
|
|
3900
4072
|
const handler = slip.onAddToSlip;
|
|
@@ -3982,14 +4154,14 @@ function OddsMovementBadge({
|
|
|
3982
4154
|
}
|
|
3983
4155
|
|
|
3984
4156
|
// src/components/Crest.tsx
|
|
3985
|
-
import { useState as
|
|
4157
|
+
import { useState as useState18 } from "react";
|
|
3986
4158
|
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
3987
4159
|
function initials2(name) {
|
|
3988
4160
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
3989
4161
|
}
|
|
3990
4162
|
function Crest2({ url, name, kind }) {
|
|
3991
4163
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
3992
|
-
const [failed, setFailed] =
|
|
4164
|
+
const [failed, setFailed] = useState18(false);
|
|
3993
4165
|
if (url && !failed) {
|
|
3994
4166
|
return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3995
4167
|
}
|
|
@@ -3997,7 +4169,7 @@ function Crest2({ url, name, kind }) {
|
|
|
3997
4169
|
}
|
|
3998
4170
|
|
|
3999
4171
|
// src/components/PinToggle.tsx
|
|
4000
|
-
import { useCallback as
|
|
4172
|
+
import { useCallback as useCallback15, useState as useState19 } from "react";
|
|
4001
4173
|
import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
4002
4174
|
var PIN_GLYPHS = {
|
|
4003
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" },
|
|
@@ -4005,8 +4177,8 @@ var PIN_GLYPHS = {
|
|
|
4005
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" }
|
|
4006
4178
|
};
|
|
4007
4179
|
function PinToggle({ pin, monitor, ui, market }) {
|
|
4008
|
-
const [toast, setToast] =
|
|
4009
|
-
const dismiss =
|
|
4180
|
+
const [toast, setToast] = useState19(null);
|
|
4181
|
+
const dismiss = useCallback15(() => setToast(null), []);
|
|
4010
4182
|
const log = useEventLog();
|
|
4011
4183
|
if (!monitor || !monitor.enabled) return null;
|
|
4012
4184
|
const key = pinKey(pin);
|
|
@@ -4063,11 +4235,11 @@ function PinToggle({ pin, monitor, ui, market }) {
|
|
|
4063
4235
|
}
|
|
4064
4236
|
|
|
4065
4237
|
// src/components/PriceHistoryButton.tsx
|
|
4066
|
-
import { useCallback as
|
|
4238
|
+
import { useCallback as useCallback16, useState as useState20 } from "react";
|
|
4067
4239
|
import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
4068
4240
|
function PriceHistoryButton({ selection, monitor, ui }) {
|
|
4069
|
-
const [toast, setToast] =
|
|
4070
|
-
const dismiss =
|
|
4241
|
+
const [toast, setToast] = useState20(null);
|
|
4242
|
+
const dismiss = useCallback16(() => setToast(null), []);
|
|
4071
4243
|
const log = useEventLog();
|
|
4072
4244
|
if (!monitor || !monitor.enabled) return null;
|
|
4073
4245
|
const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
|
|
@@ -4182,15 +4354,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
4182
4354
|
}
|
|
4183
4355
|
|
|
4184
4356
|
// src/components/AddAllToSlipButton.tsx
|
|
4185
|
-
import { useCallback as
|
|
4357
|
+
import { useCallback as useCallback17, useState as useState21 } from "react";
|
|
4186
4358
|
import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
4187
4359
|
function AddAllToSlipButton({ legs, slip, ui }) {
|
|
4188
4360
|
const add = useSlipAdd(slip, ui);
|
|
4189
4361
|
const slipState = useSlipState();
|
|
4190
|
-
const [pending, setPending] =
|
|
4191
|
-
const [settledLocal, setSettledLocal] =
|
|
4192
|
-
const [toast, setToast] =
|
|
4193
|
-
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), []);
|
|
4194
4366
|
if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
|
|
4195
4367
|
const settled = slipState ? slipState.settled : settledLocal;
|
|
4196
4368
|
const open = legs.filter((leg) => !settled[leg.matchOddsId]);
|
|
@@ -4300,7 +4472,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
|
|
|
4300
4472
|
}
|
|
4301
4473
|
|
|
4302
4474
|
// src/components/MarketOddsCardList.tsx
|
|
4303
|
-
import { useEffect as
|
|
4475
|
+
import { useEffect as useEffect18, useState as useState22 } from "react";
|
|
4304
4476
|
|
|
4305
4477
|
// src/components/AllMarketsButton.tsx
|
|
4306
4478
|
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
@@ -4363,7 +4535,7 @@ function fmtHhMm(iso, locale) {
|
|
|
4363
4535
|
return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
|
|
4364
4536
|
}
|
|
4365
4537
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
4366
|
-
const [open, setOpen] =
|
|
4538
|
+
const [open, setOpen] = useState22(false);
|
|
4367
4539
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
4368
4540
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
4369
4541
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
@@ -4373,9 +4545,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
4373
4545
|
const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
|
|
4374
4546
|
const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
|
|
4375
4547
|
const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
|
|
4376
|
-
const [, setStaleTick] =
|
|
4548
|
+
const [, setStaleTick] = useState22(0);
|
|
4377
4549
|
const watchStale = live != null && !isClosed && !isStale;
|
|
4378
|
-
|
|
4550
|
+
useEffect18(() => {
|
|
4379
4551
|
if (!watchStale) return;
|
|
4380
4552
|
const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
|
|
4381
4553
|
return () => window.clearTimeout(id);
|
|
@@ -4429,7 +4601,7 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
4429
4601
|
] }) : null
|
|
4430
4602
|
] }) : null
|
|
4431
4603
|
] }),
|
|
4432
|
-
|
|
4604
|
+
!hideHeader && !pinRef ? (vm.statTexts && vm.statTexts.length > 0 ? vm.statTexts : vm.statText ? [vm.statText] : []).map((text, i) => /* @__PURE__ */ jsx18("div", { className: "ss-w-mo-stat", children: text }, i)) : null,
|
|
4433
4605
|
isClosed ? /* @__PURE__ */ jsx18("div", { className: "ss-w-mo-closed", children: closedReason === "suspended" ? /* @__PURE__ */ jsx18("span", { children: ui?.liveCard.suspended ?? "Market suspended" }) : closedReason === "no_live_price" ? /* @__PURE__ */ jsx18("span", { children: ui?.liveCard.noPrice ?? "No live price available" }) : closedReason === "full_time" ? /* @__PURE__ */ jsx18("span", { children: ui?.liveCard.fullTime ?? "Full time" }) : null }) : /* @__PURE__ */ jsxs14(Fragment2, { children: [
|
|
4434
4606
|
/* @__PURE__ */ jsxs14("div", { className: "ss-w-mo-rows", children: [
|
|
4435
4607
|
vm.mainRows.map((row) => /* @__PURE__ */ jsx18(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)),
|
|
@@ -4454,7 +4626,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
|
|
|
4454
4626
|
}
|
|
4455
4627
|
|
|
4456
4628
|
// src/components/CompactOddsList.tsx
|
|
4457
|
-
import { useEffect as
|
|
4629
|
+
import { useEffect as useEffect19, useRef as useRef18, useState as useState23 } from "react";
|
|
4458
4630
|
|
|
4459
4631
|
// src/compactList.ts
|
|
4460
4632
|
var COMPACT_MIN_CARDS = 3;
|
|
@@ -4568,11 +4740,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
|
|
|
4568
4740
|
] });
|
|
4569
4741
|
}
|
|
4570
4742
|
function CompactOddsList({ list, ui, slip, monitor }) {
|
|
4571
|
-
const [shown, setShown] =
|
|
4743
|
+
const [shown, setShown] = useState23(COMPACT_PAGE);
|
|
4572
4744
|
const hidden = list.rowCount - shown;
|
|
4573
|
-
const [focusIndex, setFocusIndex] =
|
|
4574
|
-
const focusRef =
|
|
4575
|
-
|
|
4745
|
+
const [focusIndex, setFocusIndex] = useState23(null);
|
|
4746
|
+
const focusRef = useRef18(null);
|
|
4747
|
+
useEffect19(() => {
|
|
4576
4748
|
if (focusIndex !== null) focusRef.current?.focus();
|
|
4577
4749
|
}, [focusIndex]);
|
|
4578
4750
|
let left = shown;
|
|
@@ -4877,7 +5049,7 @@ function FixtureCard({ card }) {
|
|
|
4877
5049
|
}
|
|
4878
5050
|
|
|
4879
5051
|
// src/components/dashboard/CountdownCard.tsx
|
|
4880
|
-
import { Fragment as Fragment6, useEffect as
|
|
5052
|
+
import { Fragment as Fragment6, useEffect as useEffect20, useState as useState24 } from "react";
|
|
4881
5053
|
import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
4882
5054
|
var DAY_MS = 864e5;
|
|
4883
5055
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -4896,12 +5068,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
4896
5068
|
function CountdownCard({ card }) {
|
|
4897
5069
|
const { data } = card;
|
|
4898
5070
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
4899
|
-
const [nowMs, setNowMs] =
|
|
4900
|
-
const [reduced] =
|
|
5071
|
+
const [nowMs, setNowMs] = useState24(() => Date.now());
|
|
5072
|
+
const [reduced] = useState24(
|
|
4901
5073
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
4902
5074
|
);
|
|
4903
5075
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
4904
|
-
|
|
5076
|
+
useEffect20(() => {
|
|
4905
5077
|
if (reduced) return;
|
|
4906
5078
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
4907
5079
|
return () => window.clearInterval(id);
|
|
@@ -4920,7 +5092,7 @@ function CountdownCard({ card }) {
|
|
|
4920
5092
|
}
|
|
4921
5093
|
|
|
4922
5094
|
// src/components/dashboard/InjuriesCard.tsx
|
|
4923
|
-
import { useState as
|
|
5095
|
+
import { useState as useState25 } from "react";
|
|
4924
5096
|
import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
4925
5097
|
var SHOWN = 3;
|
|
4926
5098
|
function ColHead({ name, crestUrl }) {
|
|
@@ -4943,7 +5115,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
4943
5115
|
}
|
|
4944
5116
|
function InjuriesCard({ card, ui }) {
|
|
4945
5117
|
const { data } = card;
|
|
4946
|
-
const [expanded, setExpanded] =
|
|
5118
|
+
const [expanded, setExpanded] = useState25(false);
|
|
4947
5119
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
4948
5120
|
const limit = expanded ? void 0 : SHOWN;
|
|
4949
5121
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
@@ -5049,7 +5221,7 @@ function LinksCard({ card }) {
|
|
|
5049
5221
|
}
|
|
5050
5222
|
|
|
5051
5223
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
5052
|
-
import { useState as
|
|
5224
|
+
import { useState as useState26 } from "react";
|
|
5053
5225
|
import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
5054
5226
|
function initials3(name) {
|
|
5055
5227
|
return name.trim().slice(0, 3).toUpperCase();
|
|
@@ -5059,7 +5231,7 @@ function PostMatchCrest({
|
|
|
5059
5231
|
name,
|
|
5060
5232
|
side
|
|
5061
5233
|
}) {
|
|
5062
|
-
const [failed, setFailed] =
|
|
5234
|
+
const [failed, setFailed] = useState26(false);
|
|
5063
5235
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
5064
5236
|
if (url && !failed) {
|
|
5065
5237
|
return /* @__PURE__ */ jsx32("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5258,10 +5430,10 @@ function RestingFormCard({ card }) {
|
|
|
5258
5430
|
}
|
|
5259
5431
|
|
|
5260
5432
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
5261
|
-
import { useRef as
|
|
5433
|
+
import { useRef as useRef19, useState as useState28 } from "react";
|
|
5262
5434
|
|
|
5263
5435
|
// src/useLiveClock.ts
|
|
5264
|
-
import { useEffect as
|
|
5436
|
+
import { useEffect as useEffect21, useState as useState27 } from "react";
|
|
5265
5437
|
var TICK_MS = 6e4;
|
|
5266
5438
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
5267
5439
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -5270,10 +5442,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
5270
5442
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
5271
5443
|
}
|
|
5272
5444
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
5273
|
-
const [displayMinute, setDisplayMinute] =
|
|
5445
|
+
const [displayMinute, setDisplayMinute] = useState27(
|
|
5274
5446
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
5275
5447
|
);
|
|
5276
|
-
|
|
5448
|
+
useEffect21(() => {
|
|
5277
5449
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
5278
5450
|
if (!clockRunning) return;
|
|
5279
5451
|
const id = window.setInterval(() => {
|
|
@@ -5290,7 +5462,7 @@ function initials5(name) {
|
|
|
5290
5462
|
return name.trim().slice(0, 3).toUpperCase();
|
|
5291
5463
|
}
|
|
5292
5464
|
function LiveCrest({ url, name, side }) {
|
|
5293
|
-
const [failed, setFailed] =
|
|
5465
|
+
const [failed, setFailed] = useState28(false);
|
|
5294
5466
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
5295
5467
|
if (url && !failed) {
|
|
5296
5468
|
return /* @__PURE__ */ jsx41("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5309,7 +5481,7 @@ function LiveScoreCard({
|
|
|
5309
5481
|
}) {
|
|
5310
5482
|
const { data } = card;
|
|
5311
5483
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
5312
|
-
const seedRef =
|
|
5484
|
+
const seedRef = useRef19(null);
|
|
5313
5485
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
5314
5486
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
5315
5487
|
}
|
|
@@ -5349,7 +5521,7 @@ function LiveScoreCard({
|
|
|
5349
5521
|
}
|
|
5350
5522
|
|
|
5351
5523
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
5352
|
-
import { useState as
|
|
5524
|
+
import { useState as useState29 } from "react";
|
|
5353
5525
|
import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
5354
5526
|
var SHOWN2 = 3;
|
|
5355
5527
|
function EventIcon({ type }) {
|
|
@@ -5391,7 +5563,7 @@ function EventRow({ e }) {
|
|
|
5391
5563
|
] });
|
|
5392
5564
|
}
|
|
5393
5565
|
function LiveTimelineCard({ card, ui }) {
|
|
5394
|
-
const [expanded, setExpanded] =
|
|
5566
|
+
const [expanded, setExpanded] = useState29(false);
|
|
5395
5567
|
const events = card.data.events;
|
|
5396
5568
|
if (!events || events.length === 0) return null;
|
|
5397
5569
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -5633,11 +5805,11 @@ function turnAnchor(messages) {
|
|
|
5633
5805
|
}
|
|
5634
5806
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
5635
5807
|
const { state, send } = controller;
|
|
5636
|
-
const listRef =
|
|
5637
|
-
const endRef =
|
|
5638
|
-
const pinnedRef =
|
|
5639
|
-
const anchoredTurnRef =
|
|
5640
|
-
|
|
5808
|
+
const listRef = useRef20(null);
|
|
5809
|
+
const endRef = useRef20(null);
|
|
5810
|
+
const pinnedRef = useRef20(true);
|
|
5811
|
+
const anchoredTurnRef = useRef20(null);
|
|
5812
|
+
useEffect22(() => {
|
|
5641
5813
|
const anchor = turnAnchor(state.messages);
|
|
5642
5814
|
const list = listRef.current;
|
|
5643
5815
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -5694,13 +5866,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
5694
5866
|
}
|
|
5695
5867
|
|
|
5696
5868
|
// src/components/ChatInput.tsx
|
|
5697
|
-
import { forwardRef, useEffect as
|
|
5869
|
+
import { forwardRef, useEffect as useEffect23, useImperativeHandle, useRef as useRef21, useState as useState30 } from "react";
|
|
5698
5870
|
import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
5699
5871
|
var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
|
|
5700
|
-
const [value, setValue] =
|
|
5701
|
-
const textareaRef =
|
|
5702
|
-
const stopRef =
|
|
5703
|
-
const textBoxWantsFocusRef =
|
|
5872
|
+
const [value, setValue] = useState30("");
|
|
5873
|
+
const textareaRef = useRef21(null);
|
|
5874
|
+
const stopRef = useRef21(null);
|
|
5875
|
+
const textBoxWantsFocusRef = useRef21(false);
|
|
5704
5876
|
const submit = () => {
|
|
5705
5877
|
if (disabled) return;
|
|
5706
5878
|
const t = value.trim();
|
|
@@ -5726,7 +5898,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
|
|
|
5726
5898
|
stopRef.current?.focus();
|
|
5727
5899
|
}
|
|
5728
5900
|
}), []);
|
|
5729
|
-
|
|
5901
|
+
useEffect23(() => {
|
|
5730
5902
|
if (streaming || disabled || !textBoxWantsFocusRef.current) return;
|
|
5731
5903
|
textBoxWantsFocusRef.current = false;
|
|
5732
5904
|
const box = textareaRef.current;
|
|
@@ -5758,6 +5930,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
|
|
|
5758
5930
|
});
|
|
5759
5931
|
|
|
5760
5932
|
// src/components/TabBar.tsx
|
|
5933
|
+
import { useEffect as useEffect24, useRef as useRef22 } from "react";
|
|
5761
5934
|
import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
5762
5935
|
function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
|
|
5763
5936
|
const tabs = [
|
|
@@ -5773,8 +5946,16 @@ function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, game
|
|
|
5773
5946
|
],
|
|
5774
5947
|
...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
|
|
5775
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]);
|
|
5776
5957
|
if (tabs.length < 2) return null;
|
|
5777
|
-
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 }) => {
|
|
5778
5959
|
const active = monitor.activeTab === tab;
|
|
5779
5960
|
return /* @__PURE__ */ jsxs45(
|
|
5780
5961
|
"button",
|
|
@@ -5851,10 +6032,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
5851
6032
|
}
|
|
5852
6033
|
|
|
5853
6034
|
// src/components/LiveFactBlock.tsx
|
|
5854
|
-
import { useState as
|
|
6035
|
+
import { useState as useState31 } from "react";
|
|
5855
6036
|
import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
5856
6037
|
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
5857
|
-
const [expanded, setExpanded] =
|
|
6038
|
+
const [expanded, setExpanded] = useState31(false);
|
|
5858
6039
|
const [current, ...earlier] = facts;
|
|
5859
6040
|
if (!current) return null;
|
|
5860
6041
|
const m = current.market;
|
|
@@ -6120,7 +6301,7 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
6120
6301
|
}
|
|
6121
6302
|
|
|
6122
6303
|
// src/components/TodayPanel.tsx
|
|
6123
|
-
import { useEffect as
|
|
6304
|
+
import { useEffect as useEffect26, useId as useId2, useMemo as useMemo4, useState as useState34 } from "react";
|
|
6124
6305
|
|
|
6125
6306
|
// src/placement.ts
|
|
6126
6307
|
function placeLeagues(visible, pinnedMatchIds) {
|
|
@@ -6183,11 +6364,11 @@ function matchingFixtures(group, query) {
|
|
|
6183
6364
|
}
|
|
6184
6365
|
|
|
6185
6366
|
// src/useStarTap.ts
|
|
6186
|
-
import { useCallback as
|
|
6367
|
+
import { useCallback as useCallback18, useRef as useRef23, useState as useState32 } from "react";
|
|
6187
6368
|
function useStarTap(starLeague) {
|
|
6188
|
-
const [pendingId, setPendingId] =
|
|
6189
|
-
const pendingRef =
|
|
6190
|
-
const tap =
|
|
6369
|
+
const [pendingId, setPendingId] = useState32(null);
|
|
6370
|
+
const pendingRef = useRef23(null);
|
|
6371
|
+
const tap = useCallback18(async (competitionId, next) => {
|
|
6191
6372
|
if (pendingRef.current !== null) return false;
|
|
6192
6373
|
pendingRef.current = competitionId;
|
|
6193
6374
|
setPendingId(competitionId);
|
|
@@ -6246,7 +6427,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
|
|
|
6246
6427
|
}
|
|
6247
6428
|
|
|
6248
6429
|
// src/components/LeagueDetail.tsx
|
|
6249
|
-
import { useEffect as
|
|
6430
|
+
import { useEffect as useEffect25, useState as useState33 } from "react";
|
|
6250
6431
|
|
|
6251
6432
|
// src/components/FixtureRow.tsx
|
|
6252
6433
|
import { jsx as jsx56, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
@@ -6281,11 +6462,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
|
6281
6462
|
import { jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
6282
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";
|
|
6283
6464
|
function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
|
|
6284
|
-
const [toast, setToast] =
|
|
6285
|
-
|
|
6465
|
+
const [toast, setToast] = useState33(null);
|
|
6466
|
+
useEffect25(() => {
|
|
6286
6467
|
setToast(null);
|
|
6287
6468
|
}, [group.competitionId]);
|
|
6288
|
-
|
|
6469
|
+
useEffect25(() => {
|
|
6289
6470
|
if (toast === null) return;
|
|
6290
6471
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6291
6472
|
return () => clearTimeout(id);
|
|
@@ -6417,7 +6598,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
|
|
|
6417
6598
|
}
|
|
6418
6599
|
|
|
6419
6600
|
// src/components/games/ui/SearchField.tsx
|
|
6420
|
-
import { useCallback as
|
|
6601
|
+
import { useCallback as useCallback19, useRef as useRef24 } from "react";
|
|
6421
6602
|
|
|
6422
6603
|
// src/components/games/ui/icons.tsx
|
|
6423
6604
|
import { jsx as jsx59 } from "react/jsx-runtime";
|
|
@@ -6456,8 +6637,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx59("path", { d:
|
|
|
6456
6637
|
// src/components/games/ui/SearchField.tsx
|
|
6457
6638
|
import { jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
6458
6639
|
function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
|
|
6459
|
-
const localRef =
|
|
6460
|
-
const setInputRef =
|
|
6640
|
+
const localRef = useRef24(null);
|
|
6641
|
+
const setInputRef = useCallback19((node) => {
|
|
6461
6642
|
localRef.current = node;
|
|
6462
6643
|
if (typeof inputRef === "function") inputRef(node);
|
|
6463
6644
|
else if (inputRef) inputRef.current = node;
|
|
@@ -6502,10 +6683,10 @@ import { Fragment as Fragment7, jsx as jsx61, jsxs as jsxs55 } from "react/jsx-r
|
|
|
6502
6683
|
function TodayPanel({ discovery, ui, monitor }) {
|
|
6503
6684
|
const { groups, states, stale, starLeague } = discovery;
|
|
6504
6685
|
const searchId = useId2();
|
|
6505
|
-
const [query, setQuery] =
|
|
6506
|
-
const [selectedCompetitionId, setSelectedCompetitionId] =
|
|
6507
|
-
const [toast, setToast] =
|
|
6508
|
-
|
|
6686
|
+
const [query, setQuery] = useState34("");
|
|
6687
|
+
const [selectedCompetitionId, setSelectedCompetitionId] = useState34(null);
|
|
6688
|
+
const [toast, setToast] = useState34(null);
|
|
6689
|
+
useEffect26(() => {
|
|
6509
6690
|
if (toast === null) return;
|
|
6510
6691
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6511
6692
|
return () => clearTimeout(id);
|
|
@@ -6551,7 +6732,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6551
6732
|
}
|
|
6552
6733
|
const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
|
|
6553
6734
|
const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
|
|
6554
|
-
|
|
6735
|
+
useEffect26(() => {
|
|
6555
6736
|
if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
|
|
6556
6737
|
}, [selectedCompetitionId, openGroup]);
|
|
6557
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);
|
|
@@ -6698,7 +6879,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6698
6879
|
}
|
|
6699
6880
|
|
|
6700
6881
|
// src/components/GamesPanel.tsx
|
|
6701
|
-
import { useEffect as
|
|
6882
|
+
import { useEffect as useEffect30, useState as useState49 } from "react";
|
|
6702
6883
|
|
|
6703
6884
|
// src/components/GamesLoginWall.tsx
|
|
6704
6885
|
import { jsx as jsx62 } from "react/jsx-runtime";
|
|
@@ -6707,7 +6888,7 @@ function GamesLoginWall({ ui }) {
|
|
|
6707
6888
|
}
|
|
6708
6889
|
|
|
6709
6890
|
// src/components/GamesHub.tsx
|
|
6710
|
-
import { useEffect as
|
|
6891
|
+
import { useEffect as useEffect27, useState as useState35 } from "react";
|
|
6711
6892
|
|
|
6712
6893
|
// src/components/games/ui/gameMeta.ts
|
|
6713
6894
|
function prettifyGameId(gameId) {
|
|
@@ -6858,8 +7039,8 @@ function pickHeroGame(games) {
|
|
|
6858
7039
|
}
|
|
6859
7040
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
6860
7041
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
6861
|
-
const [, setTick] =
|
|
6862
|
-
|
|
7042
|
+
const [, setTick] = useState35(0);
|
|
7043
|
+
useEffect27(() => {
|
|
6863
7044
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
6864
7045
|
return () => clearInterval(id);
|
|
6865
7046
|
}, []);
|
|
@@ -6919,10 +7100,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
6919
7100
|
}
|
|
6920
7101
|
|
|
6921
7102
|
// src/components/GameScreenHost.tsx
|
|
6922
|
-
import { useEffect as
|
|
7103
|
+
import { useEffect as useEffect29, useRef as useRef27, useState as useState47 } from "react";
|
|
6923
7104
|
|
|
6924
7105
|
// src/useGamePlay.ts
|
|
6925
|
-
import { useCallback as
|
|
7106
|
+
import { useCallback as useCallback20, useRef as useRef25, useState as useState36 } from "react";
|
|
6926
7107
|
function toSubmitResult(payload) {
|
|
6927
7108
|
return {
|
|
6928
7109
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -6934,17 +7115,17 @@ function toSubmitResult(payload) {
|
|
|
6934
7115
|
};
|
|
6935
7116
|
}
|
|
6936
7117
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
6937
|
-
const [result, setResult] =
|
|
6938
|
-
const [submitting, setSubmitting] =
|
|
6939
|
-
const [rawStatus, setRawStatus] =
|
|
6940
|
-
const inFlightRef =
|
|
6941
|
-
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);
|
|
6942
7123
|
convRef.current = conversation;
|
|
6943
|
-
const optsRef =
|
|
7124
|
+
const optsRef = useRef25({ gameId, gameDay, fixtureId, locale, refresh });
|
|
6944
7125
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
6945
|
-
const resultRef =
|
|
7126
|
+
const resultRef = useRef25(null);
|
|
6946
7127
|
resultRef.current = result;
|
|
6947
|
-
const refetch =
|
|
7128
|
+
const refetch = useCallback20(async () => {
|
|
6948
7129
|
const conv = convRef.current;
|
|
6949
7130
|
if (!conv) return;
|
|
6950
7131
|
const opts = optsRef.current;
|
|
@@ -6960,7 +7141,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6960
7141
|
} catch {
|
|
6961
7142
|
}
|
|
6962
7143
|
}, []);
|
|
6963
|
-
const submit =
|
|
7144
|
+
const submit = useCallback20(async (answerJson) => {
|
|
6964
7145
|
const conv = convRef.current;
|
|
6965
7146
|
if (!conv || inFlightRef.current) return;
|
|
6966
7147
|
inFlightRef.current = true;
|
|
@@ -6987,14 +7168,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6987
7168
|
setSubmitting(false);
|
|
6988
7169
|
}
|
|
6989
7170
|
}, [refetch]);
|
|
6990
|
-
const hydrate =
|
|
7171
|
+
const hydrate = useCallback20(() => {
|
|
6991
7172
|
void refetch();
|
|
6992
7173
|
}, [refetch]);
|
|
6993
7174
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
6994
7175
|
}
|
|
6995
7176
|
|
|
6996
7177
|
// src/components/games/MysteryTigerGame.tsx
|
|
6997
|
-
import { useState as
|
|
7178
|
+
import { useState as useState38, useId as useId3 } from "react";
|
|
6998
7179
|
|
|
6999
7180
|
// src/components/games/nationFlags.ts
|
|
7000
7181
|
var FLAGS = {
|
|
@@ -7205,7 +7386,7 @@ function isNationCode(flag) {
|
|
|
7205
7386
|
}
|
|
7206
7387
|
|
|
7207
7388
|
// src/components/games/PlayerAvatar.tsx
|
|
7208
|
-
import { useState as
|
|
7389
|
+
import { useState as useState37 } from "react";
|
|
7209
7390
|
import { jsx as jsx67 } from "react/jsx-runtime";
|
|
7210
7391
|
function initialsOf(name) {
|
|
7211
7392
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
@@ -7223,7 +7404,7 @@ function PlayerAvatar({
|
|
|
7223
7404
|
imagePath,
|
|
7224
7405
|
className
|
|
7225
7406
|
}) {
|
|
7226
|
-
const [failed, setFailed] =
|
|
7407
|
+
const [failed, setFailed] = useState37(false);
|
|
7227
7408
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
7228
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) }) });
|
|
7229
7410
|
}
|
|
@@ -7464,7 +7645,7 @@ function MysteryTigerGame({
|
|
|
7464
7645
|
onBack
|
|
7465
7646
|
}) {
|
|
7466
7647
|
const t = ui.games.mysteryTiger;
|
|
7467
|
-
const [query, setQuery] =
|
|
7648
|
+
const [query, setQuery] = useState38("");
|
|
7468
7649
|
const inputId = useId3();
|
|
7469
7650
|
const clientState = parseClientState(result?.clientStateJson);
|
|
7470
7651
|
const guessResults = clientState?.guessResults ?? [];
|
|
@@ -7726,13 +7907,13 @@ function HigherOrLowerGame({
|
|
|
7726
7907
|
}
|
|
7727
7908
|
|
|
7728
7909
|
// src/components/games/CareerPathGame.tsx
|
|
7729
|
-
import { useState as
|
|
7910
|
+
import { useState as useState40, useId as useId4 } from "react";
|
|
7730
7911
|
|
|
7731
7912
|
// src/components/games/ui/CrestShield.tsx
|
|
7732
|
-
import { useState as
|
|
7913
|
+
import { useState as useState39 } from "react";
|
|
7733
7914
|
import { jsx as jsx78 } from "react/jsx-runtime";
|
|
7734
7915
|
function CrestShield({ src, name, size = 28 }) {
|
|
7735
|
-
const [failed, setFailed] =
|
|
7916
|
+
const [failed, setFailed] = useState39(false);
|
|
7736
7917
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
7737
7918
|
return /* @__PURE__ */ jsx78("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
7738
7919
|
}
|
|
@@ -7764,7 +7945,7 @@ function CareerPathGame({
|
|
|
7764
7945
|
}) {
|
|
7765
7946
|
const s = ui.games.careerPath;
|
|
7766
7947
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
7767
|
-
const [query, setQuery] =
|
|
7948
|
+
const [query, setQuery] = useState40("");
|
|
7768
7949
|
const inputId = useId4();
|
|
7769
7950
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
7770
7951
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
@@ -7871,7 +8052,7 @@ function CareerPathGame({
|
|
|
7871
8052
|
}
|
|
7872
8053
|
|
|
7873
8054
|
// src/components/games/BeatTheGridGame.tsx
|
|
7874
|
-
import React, { useEffect as
|
|
8055
|
+
import React, { useEffect as useEffect28, useId as useId5, useRef as useRef26, useState as useState41 } from "react";
|
|
7875
8056
|
|
|
7876
8057
|
// src/components/games/ui/OptionList.tsx
|
|
7877
8058
|
import { jsx as jsx80 } from "react/jsx-runtime";
|
|
@@ -7960,10 +8141,10 @@ function SearchSheet({
|
|
|
7960
8141
|
ui
|
|
7961
8142
|
}) {
|
|
7962
8143
|
const s = ui.games.beatTheGrid;
|
|
7963
|
-
const [query, setQuery] =
|
|
8144
|
+
const [query, setQuery] = useState41("");
|
|
7964
8145
|
const inputId = useId5();
|
|
7965
|
-
const inputRef =
|
|
7966
|
-
|
|
8146
|
+
const inputRef = useRef26(null);
|
|
8147
|
+
useEffect28(() => {
|
|
7967
8148
|
inputRef.current?.focus();
|
|
7968
8149
|
}, [row, col]);
|
|
7969
8150
|
const filtered = playerPool.filter(
|
|
@@ -8028,7 +8209,7 @@ function BeatTheGridGame({
|
|
|
8028
8209
|
}) {
|
|
8029
8210
|
const s = ui.games.beatTheGrid;
|
|
8030
8211
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
8031
|
-
const [activeCell, setActiveCell] =
|
|
8212
|
+
const [activeCell, setActiveCell] = useState41(null);
|
|
8032
8213
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
8033
8214
|
const filledCells = clientState?.cells ?? [];
|
|
8034
8215
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -8183,7 +8364,7 @@ function BeatTheGridGame({
|
|
|
8183
8364
|
}
|
|
8184
8365
|
|
|
8185
8366
|
// src/components/games/GuessTheXiGame.tsx
|
|
8186
|
-
import { useState as
|
|
8367
|
+
import { useState as useState42, useId as useId6 } from "react";
|
|
8187
8368
|
|
|
8188
8369
|
// src/components/games/ui/PitchSvg.tsx
|
|
8189
8370
|
import { Fragment as Fragment16, jsx as jsx82, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
@@ -8272,7 +8453,7 @@ function GuessTheXiGame({
|
|
|
8272
8453
|
onBack
|
|
8273
8454
|
}) {
|
|
8274
8455
|
const t = ui.games.guessTheXi;
|
|
8275
|
-
const [query, setQuery] =
|
|
8456
|
+
const [query, setQuery] = useState42("");
|
|
8276
8457
|
const inputId = useId6();
|
|
8277
8458
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
8278
8459
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
@@ -8415,7 +8596,7 @@ function GuessTheXiGame({
|
|
|
8415
8596
|
}
|
|
8416
8597
|
|
|
8417
8598
|
// src/components/games/DailyQuizGame.tsx
|
|
8418
|
-
import { useState as
|
|
8599
|
+
import { useState as useState43 } from "react";
|
|
8419
8600
|
import { Fragment as Fragment18, jsx as jsx84, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
8420
8601
|
function parseClientState6(json) {
|
|
8421
8602
|
if (!json) return null;
|
|
@@ -8456,8 +8637,8 @@ function DailyQuizGame({
|
|
|
8456
8637
|
}) {
|
|
8457
8638
|
const s = ui.games.dailyQuiz;
|
|
8458
8639
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
8459
|
-
const [selections, setSelections] =
|
|
8460
|
-
const [page, setPage] =
|
|
8640
|
+
const [selections, setSelections] = useState43(/* @__PURE__ */ new Map());
|
|
8641
|
+
const [page, setPage] = useState43(0);
|
|
8461
8642
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
8462
8643
|
const results = clientState?.results ?? [];
|
|
8463
8644
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
@@ -8567,7 +8748,7 @@ function DailyQuizGame({
|
|
|
8567
8748
|
}
|
|
8568
8749
|
|
|
8569
8750
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
8570
|
-
import { useId as useId7, useState as
|
|
8751
|
+
import { useId as useId7, useState as useState44 } from "react";
|
|
8571
8752
|
import { jsx as jsx85, jsxs as jsxs73 } from "react/jsx-runtime";
|
|
8572
8753
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
8573
8754
|
function parseClientState7(json) {
|
|
@@ -8663,11 +8844,11 @@ function MatchdayPredictorGame({
|
|
|
8663
8844
|
onBack
|
|
8664
8845
|
}) {
|
|
8665
8846
|
const t = ui.games.predictor;
|
|
8666
|
-
const [homeScore, setHomeScore] =
|
|
8667
|
-
const [awayScore, setAwayScore] =
|
|
8668
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] =
|
|
8669
|
-
const [lastEdited, setLastEdited] =
|
|
8670
|
-
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("");
|
|
8671
8852
|
const searchId = useId7();
|
|
8672
8853
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
8673
8854
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -8835,7 +9016,7 @@ function MatchdayPredictorGame({
|
|
|
8835
9016
|
}
|
|
8836
9017
|
|
|
8837
9018
|
// src/components/games/StartingXiGame.tsx
|
|
8838
|
-
import { useId as useId8, useState as
|
|
9019
|
+
import { useId as useId8, useState as useState45 } from "react";
|
|
8839
9020
|
import { Fragment as Fragment19, jsx as jsx86, jsxs as jsxs74 } from "react/jsx-runtime";
|
|
8840
9021
|
var POINTS_PER_STARTER = 8;
|
|
8841
9022
|
var XI_SIZE = 11;
|
|
@@ -8879,9 +9060,9 @@ function StartingXiGame({
|
|
|
8879
9060
|
lockAtUtc
|
|
8880
9061
|
}) {
|
|
8881
9062
|
const t = ui.games.startingXi;
|
|
8882
|
-
const [slotPlayers, setSlotPlayers] =
|
|
8883
|
-
const [active, setActive] =
|
|
8884
|
-
const [query, setQuery] =
|
|
9063
|
+
const [slotPlayers, setSlotPlayers] = useState45(() => Array(XI_SIZE).fill(null));
|
|
9064
|
+
const [active, setActive] = useState45(0);
|
|
9065
|
+
const [query, setQuery] = useState45("");
|
|
8885
9066
|
const searchId = useId8();
|
|
8886
9067
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
8887
9068
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -9021,7 +9202,7 @@ function StartingXiGame({
|
|
|
9021
9202
|
}
|
|
9022
9203
|
|
|
9023
9204
|
// src/components/games/StatLadderGame.tsx
|
|
9024
|
-
import { useId as useId9, useState as
|
|
9205
|
+
import { useId as useId9, useState as useState46 } from "react";
|
|
9025
9206
|
import { jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
|
|
9026
9207
|
function ladderClue(ladder) {
|
|
9027
9208
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
@@ -9058,8 +9239,8 @@ function StatLadderGame({
|
|
|
9058
9239
|
onBack
|
|
9059
9240
|
}) {
|
|
9060
9241
|
const t = ui.games.statLadder;
|
|
9061
|
-
const [query, setQuery] =
|
|
9062
|
-
const [selectedId, setSelectedId] =
|
|
9242
|
+
const [query, setQuery] = useState46("");
|
|
9243
|
+
const [selectedId, setSelectedId] = useState46(null);
|
|
9063
9244
|
const searchId = useId9();
|
|
9064
9245
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
9065
9246
|
const revealed = clientState != null;
|
|
@@ -9266,8 +9447,8 @@ function GameScreenHost({
|
|
|
9266
9447
|
ui
|
|
9267
9448
|
}) {
|
|
9268
9449
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
9269
|
-
const [configJson, setConfigJson] =
|
|
9270
|
-
|
|
9450
|
+
const [configJson, setConfigJson] = useState47(null);
|
|
9451
|
+
useEffect29(() => {
|
|
9271
9452
|
setConfigJson(null);
|
|
9272
9453
|
if (!conversation) return;
|
|
9273
9454
|
let cancelled = false;
|
|
@@ -9290,12 +9471,12 @@ function GameScreenHost({
|
|
|
9290
9471
|
fixtureId: fixtureId || void 0,
|
|
9291
9472
|
locale: ui.games.lang
|
|
9292
9473
|
});
|
|
9293
|
-
|
|
9474
|
+
useEffect29(() => {
|
|
9294
9475
|
if (conversation) hydrate();
|
|
9295
9476
|
}, [conversation, gameId]);
|
|
9296
|
-
const hydrateRef =
|
|
9477
|
+
const hydrateRef = useRef27(hydrate);
|
|
9297
9478
|
hydrateRef.current = hydrate;
|
|
9298
|
-
|
|
9479
|
+
useEffect29(() => {
|
|
9299
9480
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
9300
9481
|
if (rawStatus !== "pending") return;
|
|
9301
9482
|
const timerId = setInterval(() => {
|
|
@@ -9408,7 +9589,7 @@ function GameScreenHost({
|
|
|
9408
9589
|
}
|
|
9409
9590
|
|
|
9410
9591
|
// src/components/Leaderboard.tsx
|
|
9411
|
-
import { useState as
|
|
9592
|
+
import { useState as useState48 } from "react";
|
|
9412
9593
|
|
|
9413
9594
|
// src/components/LeaderboardRow.tsx
|
|
9414
9595
|
import { jsx as jsx90, jsxs as jsxs77 } from "react/jsx-runtime";
|
|
@@ -9493,7 +9674,7 @@ function Leaderboard({
|
|
|
9493
9674
|
ui,
|
|
9494
9675
|
onPlay
|
|
9495
9676
|
}) {
|
|
9496
|
-
const [segment, setSegment] =
|
|
9677
|
+
const [segment, setSegment] = useState48("weekly");
|
|
9497
9678
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
9498
9679
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
9499
9680
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
@@ -9596,9 +9777,9 @@ function GamesPanel({
|
|
|
9596
9777
|
leaderboardLoading,
|
|
9597
9778
|
refreshHub
|
|
9598
9779
|
}) {
|
|
9599
|
-
const [selected, setSelected] =
|
|
9600
|
-
const [segment, setSegment] =
|
|
9601
|
-
|
|
9780
|
+
const [selected, setSelected] = useState49(null);
|
|
9781
|
+
const [segment, setSegment] = useState49("play");
|
|
9782
|
+
useEffect30(() => {
|
|
9602
9783
|
ensureGamesFonts();
|
|
9603
9784
|
}, []);
|
|
9604
9785
|
if (!loggedIn) return /* @__PURE__ */ jsx94(GamesLoginWall, { ui });
|
|
@@ -9746,8 +9927,7 @@ function Standings({ standings, loading, ui }) {
|
|
|
9746
9927
|
] }, `${gi}-${group.table ?? "none"}`)) });
|
|
9747
9928
|
}
|
|
9748
9929
|
|
|
9749
|
-
// src/components/
|
|
9750
|
-
import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
|
|
9930
|
+
// src/components/groupByPosition.ts
|
|
9751
9931
|
function groupByPosition(players) {
|
|
9752
9932
|
const groups = [];
|
|
9753
9933
|
for (const p of players) {
|
|
@@ -9757,26 +9937,181 @@ function groupByPosition(players) {
|
|
|
9757
9937
|
}
|
|
9758
9938
|
return groups;
|
|
9759
9939
|
}
|
|
9760
|
-
|
|
9761
|
-
|
|
9762
|
-
|
|
9763
|
-
|
|
9764
|
-
|
|
9765
|
-
|
|
9766
|
-
|
|
9767
|
-
|
|
9768
|
-
|
|
9769
|
-
|
|
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
|
+
] });
|
|
9770
10105
|
}
|
|
9771
10106
|
|
|
9772
10107
|
// src/components/PresetSpeedDial.tsx
|
|
9773
10108
|
import { useId as useId10 } from "react";
|
|
9774
|
-
import { jsx as
|
|
10109
|
+
import { jsx as jsx100, jsxs as jsxs86 } from "react/jsx-runtime";
|
|
9775
10110
|
function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
|
|
9776
10111
|
const pillsId = useId10();
|
|
9777
10112
|
const tabIndex = expanded ? 0 : -1;
|
|
9778
|
-
return /* @__PURE__ */
|
|
9779
|
-
/* @__PURE__ */
|
|
10113
|
+
return /* @__PURE__ */ jsxs86("div", { ref: rootRef, className: "ss-w-dial", children: [
|
|
10114
|
+
/* @__PURE__ */ jsxs86(
|
|
9780
10115
|
"button",
|
|
9781
10116
|
{
|
|
9782
10117
|
ref: buttonRef,
|
|
@@ -9787,36 +10122,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
|
|
|
9787
10122
|
"aria-label": strings.dialName,
|
|
9788
10123
|
onClick: onToggle,
|
|
9789
10124
|
children: [
|
|
9790
|
-
/* @__PURE__ */
|
|
9791
|
-
/* @__PURE__ */
|
|
9792
|
-
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
|
|
9793
10128
|
]
|
|
9794
10129
|
}
|
|
9795
10130
|
),
|
|
9796
|
-
/* @__PURE__ */
|
|
9797
|
-
/* @__PURE__ */
|
|
9798
|
-
/* @__PURE__ */
|
|
9799
|
-
/* @__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 })
|
|
9800
10135
|
] }),
|
|
9801
|
-
/* @__PURE__ */
|
|
9802
|
-
/* @__PURE__ */
|
|
9803
|
-
/* @__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 })
|
|
9804
10139
|
] })
|
|
9805
10140
|
] })
|
|
9806
10141
|
] });
|
|
9807
10142
|
}
|
|
9808
10143
|
|
|
9809
10144
|
// src/components/PresetTools.tsx
|
|
9810
|
-
import { Fragment as
|
|
9811
|
-
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";
|
|
9812
10147
|
var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
9813
10148
|
function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
9814
|
-
const dialogRef =
|
|
10149
|
+
const dialogRef = useRef28(null);
|
|
9815
10150
|
const titleId = useId11();
|
|
9816
|
-
|
|
10151
|
+
useEffect31(() => {
|
|
9817
10152
|
dialogRef.current?.focus();
|
|
9818
10153
|
}, []);
|
|
9819
|
-
|
|
10154
|
+
useEffect31(() => {
|
|
9820
10155
|
const onKey = (e) => {
|
|
9821
10156
|
if (e.key !== "Escape") return;
|
|
9822
10157
|
e.stopPropagation();
|
|
@@ -9846,79 +10181,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
|
9846
10181
|
first.focus();
|
|
9847
10182
|
}
|
|
9848
10183
|
};
|
|
9849
|
-
return /* @__PURE__ */
|
|
9850
|
-
/* @__PURE__ */
|
|
9851
|
-
/* @__PURE__ */
|
|
9852
|
-
/* @__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, {}) })
|
|
9853
10188
|
] }),
|
|
9854
|
-
/* @__PURE__ */
|
|
9855
|
-
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
|
|
9856
10191
|
] }) });
|
|
9857
10192
|
}
|
|
9858
10193
|
function fillTemplate(template, slots) {
|
|
9859
10194
|
return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
|
|
9860
10195
|
const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
|
|
9861
|
-
return /* @__PURE__ */
|
|
10196
|
+
return /* @__PURE__ */ jsx101(Fragment23, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
|
|
9862
10197
|
});
|
|
9863
10198
|
}
|
|
9864
10199
|
function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
|
|
9865
10200
|
const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
|
|
9866
|
-
return /* @__PURE__ */
|
|
9867
|
-
/* @__PURE__ */
|
|
9868
|
-
/* @__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) => {
|
|
9869
10204
|
const c = choices2[Number(e.target.value)];
|
|
9870
10205
|
if (c) onChoose(c.value);
|
|
9871
|
-
}, 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)) })
|
|
9872
10207
|
] });
|
|
9873
10208
|
}
|
|
9874
10209
|
function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
|
|
9875
10210
|
const sizeText = sizeLabels[currentIdx] ?? "";
|
|
9876
|
-
return /* @__PURE__ */
|
|
9877
|
-
/* @__PURE__ */
|
|
9878
|
-
/* @__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)) })
|
|
9879
10214
|
] });
|
|
9880
10215
|
}
|
|
9881
10216
|
function SendButton({ label, display, disabled, onClick }) {
|
|
9882
|
-
return /* @__PURE__ */
|
|
10217
|
+
return /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
|
|
9883
10218
|
}
|
|
9884
10219
|
function PickList({ picks, formatKickoff }) {
|
|
9885
|
-
return /* @__PURE__ */
|
|
9886
|
-
/* @__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: [
|
|
9887
10222
|
p.homeTeamName,
|
|
9888
10223
|
" \u2013 ",
|
|
9889
10224
|
p.awayTeamName
|
|
9890
10225
|
] }),
|
|
9891
|
-
/* @__PURE__ */
|
|
10226
|
+
/* @__PURE__ */ jsxs87("span", { className: "ss-w-tool-pick-sel", children: [
|
|
9892
10227
|
p.marketLabel,
|
|
9893
10228
|
": ",
|
|
9894
10229
|
p.selectionLabel,
|
|
9895
10230
|
p.line ? ` ${p.line}` : ""
|
|
9896
10231
|
] }),
|
|
9897
|
-
/* @__PURE__ */
|
|
9898
|
-
/* @__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) })
|
|
9899
10234
|
] }, p.matchOddsId)) });
|
|
9900
10235
|
}
|
|
9901
10236
|
function ComboPreview({ cell, formatKickoff }) {
|
|
9902
|
-
return /* @__PURE__ */
|
|
9903
|
-
/* @__PURE__ */
|
|
9904
|
-
/* @__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 })
|
|
9905
10240
|
] });
|
|
9906
10241
|
}
|
|
9907
10242
|
function Unavailable({ text }) {
|
|
9908
|
-
return /* @__PURE__ */
|
|
10243
|
+
return /* @__PURE__ */ jsx101("p", { className: "ss-w-tool-unavailable", children: text });
|
|
9909
10244
|
}
|
|
9910
10245
|
function AskRow({ icon, ask, ready, send }) {
|
|
9911
|
-
return /* @__PURE__ */
|
|
9912
|
-
/* @__PURE__ */
|
|
9913
|
-
/* @__PURE__ */
|
|
9914
|
-
/* @__PURE__ */
|
|
9915
|
-
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
|
|
9916
10251
|
] }),
|
|
9917
10252
|
send
|
|
9918
10253
|
] });
|
|
9919
10254
|
}
|
|
9920
10255
|
function RoundSend({ label, display, disabled, onClick }) {
|
|
9921
|
-
return /* @__PURE__ */
|
|
10256
|
+
return /* @__PURE__ */ jsx101("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx101(SendIcon, {}) });
|
|
9922
10257
|
}
|
|
9923
10258
|
var BIG_COMBO = { total: 50, legs: 6 };
|
|
9924
10259
|
function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
@@ -9927,15 +10262,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9927
10262
|
const totals = comboTotals(grid);
|
|
9928
10263
|
const legChoices = comboLegChoices(grid);
|
|
9929
10264
|
const count = FIXED_SINGLES_COUNT;
|
|
9930
|
-
const [maxPrice, setMaxPrice] =
|
|
9931
|
-
const [minPrice, setMinPrice] =
|
|
9932
|
-
const [start] =
|
|
9933
|
-
const [total, setTotal] =
|
|
9934
|
-
const [legs, setLegs] =
|
|
9935
|
-
const [bigStart] =
|
|
9936
|
-
const [bigTotal, setBigTotal] =
|
|
9937
|
-
const [bigLegs, setBigLegs] =
|
|
9938
|
-
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("");
|
|
9939
10274
|
const maxCell = findSingles(grid.singles, maxPrice, count);
|
|
9940
10275
|
const minCell = findSingles(grid.singlesFrom, minPrice, count);
|
|
9941
10276
|
const comboCell = findCombo(grid, total, legs);
|
|
@@ -9979,95 +10314,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9979
10314
|
const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
|
|
9980
10315
|
const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
|
|
9981
10316
|
const markets = grid.markets ?? [];
|
|
9982
|
-
const [marketIdx, setMarketIdx] =
|
|
10317
|
+
const [marketIdx, setMarketIdx] = useState50(0);
|
|
9983
10318
|
const marketCell = markets[marketIdx] ?? null;
|
|
9984
10319
|
const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
|
|
9985
10320
|
const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
|
|
9986
10321
|
const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
|
|
9987
|
-
return /* @__PURE__ */
|
|
9988
|
-
/* @__PURE__ */
|
|
10322
|
+
return /* @__PURE__ */ jsxs87(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
|
|
10323
|
+
/* @__PURE__ */ jsx101(
|
|
9989
10324
|
AskRow,
|
|
9990
10325
|
{
|
|
9991
10326
|
icon: "\u{1F3AF}",
|
|
9992
10327
|
ask: fillTemplate(strings.maxPriceRow, {
|
|
9993
10328
|
count: String(count),
|
|
9994
|
-
price: /* @__PURE__ */
|
|
10329
|
+
price: /* @__PURE__ */ jsx101(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
|
|
9995
10330
|
}),
|
|
9996
10331
|
ready: singlesReady(maxCell),
|
|
9997
|
-
send: /* @__PURE__ */
|
|
10332
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
|
|
9998
10333
|
if (maxCell) onSend(maxPriceAsk(maxCell, strings));
|
|
9999
10334
|
} })
|
|
10000
10335
|
}
|
|
10001
10336
|
),
|
|
10002
|
-
/* @__PURE__ */
|
|
10337
|
+
/* @__PURE__ */ jsx101(
|
|
10003
10338
|
AskRow,
|
|
10004
10339
|
{
|
|
10005
10340
|
icon: "\u{1F4C8}",
|
|
10006
10341
|
ask: fillTemplate(strings.minPriceRow, {
|
|
10007
10342
|
count: String(count),
|
|
10008
|
-
price: /* @__PURE__ */
|
|
10343
|
+
price: /* @__PURE__ */ jsx101(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
|
|
10009
10344
|
}),
|
|
10010
10345
|
ready: singlesReady(minCell),
|
|
10011
|
-
send: /* @__PURE__ */
|
|
10346
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
|
|
10012
10347
|
if (minCell) onSend(minPriceAsk(minCell, strings));
|
|
10013
10348
|
} })
|
|
10014
10349
|
}
|
|
10015
10350
|
),
|
|
10016
|
-
/* @__PURE__ */
|
|
10351
|
+
/* @__PURE__ */ jsx101(
|
|
10017
10352
|
AskRow,
|
|
10018
10353
|
{
|
|
10019
10354
|
icon: "\u2728",
|
|
10020
10355
|
ask: fillTemplate(strings.comboRow, {
|
|
10021
|
-
legs: /* @__PURE__ */
|
|
10022
|
-
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 })
|
|
10023
10358
|
}),
|
|
10024
10359
|
ready: comboReady(comboCell),
|
|
10025
|
-
send: /* @__PURE__ */
|
|
10360
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
|
|
10026
10361
|
if (comboCell) onSend(comboAsk(comboCell, strings));
|
|
10027
10362
|
} })
|
|
10028
10363
|
}
|
|
10029
10364
|
),
|
|
10030
|
-
/* @__PURE__ */
|
|
10365
|
+
/* @__PURE__ */ jsx101(
|
|
10031
10366
|
AskRow,
|
|
10032
10367
|
{
|
|
10033
10368
|
icon: "\u{1F3C6}",
|
|
10034
10369
|
ask: fillTemplate(strings.bigComboRow, {
|
|
10035
|
-
legs: /* @__PURE__ */
|
|
10036
|
-
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 })
|
|
10037
10372
|
}),
|
|
10038
10373
|
ready: comboReady(bigCell),
|
|
10039
|
-
send: /* @__PURE__ */
|
|
10374
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
|
|
10040
10375
|
if (bigCell) onSend(comboAsk(bigCell, strings));
|
|
10041
10376
|
} })
|
|
10042
10377
|
}
|
|
10043
10378
|
),
|
|
10044
|
-
markets.length > 0 && /* @__PURE__ */
|
|
10379
|
+
markets.length > 0 && /* @__PURE__ */ jsx101(
|
|
10045
10380
|
AskRow,
|
|
10046
10381
|
{
|
|
10047
10382
|
icon: "\u26BD",
|
|
10048
10383
|
ask: fillTemplate(strings.marketRow, {
|
|
10049
|
-
market: /* @__PURE__ */
|
|
10384
|
+
market: /* @__PURE__ */ jsx101(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
|
|
10050
10385
|
}),
|
|
10051
10386
|
ready: marketCell ? strings.readyCount(marketCell.count) : null,
|
|
10052
|
-
send: /* @__PURE__ */
|
|
10387
|
+
send: /* @__PURE__ */ jsx101(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
|
|
10053
10388
|
if (marketCell) onSend(marketAsk(marketCell, strings));
|
|
10054
10389
|
} })
|
|
10055
10390
|
}
|
|
10056
10391
|
),
|
|
10057
|
-
/* @__PURE__ */
|
|
10392
|
+
/* @__PURE__ */ jsx101("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
|
|
10058
10393
|
] });
|
|
10059
10394
|
}
|
|
10060
10395
|
function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
|
|
10061
10396
|
const totals = comboTotals(grid);
|
|
10062
10397
|
const legChoices = comboLegChoices(grid);
|
|
10063
|
-
const [start] =
|
|
10064
|
-
const [total, setTotal] =
|
|
10065
|
-
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(() => {
|
|
10066
10401
|
if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
|
|
10067
10402
|
const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
|
|
10068
10403
|
return legsForTotal(grid, nearest(totals, initialTotal), from);
|
|
10069
10404
|
});
|
|
10070
|
-
const [announcement, setAnnouncement] =
|
|
10405
|
+
const [announcement, setAnnouncement] = useState50("");
|
|
10071
10406
|
const cell = findCombo(grid, total, legs);
|
|
10072
10407
|
const minLegs = legChoices[0] ?? legs;
|
|
10073
10408
|
const maxLegs = legChoices[legChoices.length - 1] ?? legs;
|
|
@@ -10078,29 +10413,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
|
|
|
10078
10413
|
const d = strings.comboDisplay(nextLegs, nextTotal);
|
|
10079
10414
|
setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
|
|
10080
10415
|
};
|
|
10081
|
-
const footer = /* @__PURE__ */
|
|
10416
|
+
const footer = /* @__PURE__ */ jsx101(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
|
|
10082
10417
|
if (cell) onSend(comboAsk(cell, strings));
|
|
10083
10418
|
} });
|
|
10084
|
-
return /* @__PURE__ */
|
|
10085
|
-
/* @__PURE__ */
|
|
10086
|
-
/* @__PURE__ */
|
|
10087
|
-
/* @__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)) })
|
|
10088
10423
|
] }),
|
|
10089
|
-
/* @__PURE__ */
|
|
10090
|
-
/* @__PURE__ */
|
|
10091
|
-
/* @__PURE__ */
|
|
10092
|
-
/* @__PURE__ */
|
|
10093
|
-
/* @__PURE__ */
|
|
10094
|
-
/* @__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: "+" })
|
|
10095
10430
|
] })
|
|
10096
10431
|
] }),
|
|
10097
|
-
cell ? /* @__PURE__ */
|
|
10098
|
-
/* @__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 })
|
|
10099
10434
|
] });
|
|
10100
10435
|
}
|
|
10101
10436
|
|
|
10102
10437
|
// src/usePresetDial.ts
|
|
10103
|
-
import { useCallback as
|
|
10438
|
+
import { useCallback as useCallback21, useEffect as useEffect32, useRef as useRef29, useState as useState51 } from "react";
|
|
10104
10439
|
function sendInFlight(messages, isStreaming) {
|
|
10105
10440
|
const last = messages[messages.length - 1];
|
|
10106
10441
|
return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
|
|
@@ -10114,25 +10449,25 @@ function lastUserId(messages) {
|
|
|
10114
10449
|
}
|
|
10115
10450
|
var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
|
|
10116
10451
|
function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
|
|
10117
|
-
const [expanded, setExpanded] =
|
|
10118
|
-
const fold =
|
|
10119
|
-
const toggle =
|
|
10452
|
+
const [expanded, setExpanded] = useState51(() => !sendInFlight(messages, isStreaming));
|
|
10453
|
+
const fold = useCallback21(() => setExpanded(false), []);
|
|
10454
|
+
const toggle = useCallback21(() => setExpanded((e) => !e), []);
|
|
10120
10455
|
const currentUserId = lastUserId(messages);
|
|
10121
|
-
const userIdRef =
|
|
10122
|
-
|
|
10456
|
+
const userIdRef = useRef29(currentUserId);
|
|
10457
|
+
useEffect32(() => {
|
|
10123
10458
|
if (currentUserId === userIdRef.current) return;
|
|
10124
10459
|
userIdRef.current = currentUserId;
|
|
10125
10460
|
setExpanded(false);
|
|
10126
10461
|
}, [currentUserId]);
|
|
10127
|
-
const tabRef =
|
|
10128
|
-
|
|
10462
|
+
const tabRef = useRef29(activeTab);
|
|
10463
|
+
useEffect32(() => {
|
|
10129
10464
|
if (activeTab === tabRef.current) return;
|
|
10130
10465
|
tabRef.current = activeTab;
|
|
10131
10466
|
setExpanded(false);
|
|
10132
10467
|
}, [activeTab]);
|
|
10133
|
-
const expandedRef =
|
|
10468
|
+
const expandedRef = useRef29(expanded);
|
|
10134
10469
|
expandedRef.current = expanded;
|
|
10135
|
-
|
|
10470
|
+
useEffect32(() => {
|
|
10136
10471
|
const onEscape = (e) => {
|
|
10137
10472
|
const dial = dialRef.current;
|
|
10138
10473
|
if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
|
|
@@ -10145,7 +10480,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
|
|
|
10145
10480
|
window.addEventListener("keydown", onEscape, true);
|
|
10146
10481
|
return () => window.removeEventListener("keydown", onEscape, true);
|
|
10147
10482
|
}, [dialRef, dialButtonRef]);
|
|
10148
|
-
|
|
10483
|
+
useEffect32(() => {
|
|
10149
10484
|
if (!expanded) return;
|
|
10150
10485
|
const layer = layerRef.current;
|
|
10151
10486
|
const inDial = (e) => {
|
|
@@ -10197,11 +10532,11 @@ function markToolSeen() {
|
|
|
10197
10532
|
}
|
|
10198
10533
|
|
|
10199
10534
|
// src/components/ChatPanel.tsx
|
|
10200
|
-
import { Fragment as
|
|
10535
|
+
import { Fragment as Fragment25, jsx as jsx102, jsxs as jsxs88 } from "react/jsx-runtime";
|
|
10201
10536
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
10202
10537
|
function useIsModal() {
|
|
10203
|
-
const [modal, setModal] =
|
|
10204
|
-
|
|
10538
|
+
const [modal, setModal] = useState52(false);
|
|
10539
|
+
useEffect33(() => {
|
|
10205
10540
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
10206
10541
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
10207
10542
|
const sync = () => setModal(mql.matches);
|
|
@@ -10212,10 +10547,38 @@ function useIsModal() {
|
|
|
10212
10547
|
return modal;
|
|
10213
10548
|
}
|
|
10214
10549
|
var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
|
|
10215
|
-
|
|
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 }) {
|
|
10216
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]);
|
|
10217
10580
|
const isModal = useIsModal();
|
|
10218
|
-
|
|
10581
|
+
useEffect33(() => {
|
|
10219
10582
|
const onKey = (e) => {
|
|
10220
10583
|
if (e.key === "Escape") close();
|
|
10221
10584
|
};
|
|
@@ -10231,19 +10594,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10231
10594
|
monitor?.setActiveTab("chat");
|
|
10232
10595
|
send(text, { grounding });
|
|
10233
10596
|
};
|
|
10234
|
-
|
|
10597
|
+
useEffect33(() => {
|
|
10235
10598
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
10236
10599
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
10237
10600
|
const onChatTab = !monitor || monitor.activeTab === "chat";
|
|
10238
|
-
const layerRef =
|
|
10239
|
-
const dialRef =
|
|
10240
|
-
const dialButtonRef =
|
|
10241
|
-
const inputRef =
|
|
10242
|
-
const limitRef =
|
|
10243
|
-
const typedSendRef =
|
|
10244
|
-
const focusAfterCloseRef =
|
|
10245
|
-
const [tool, setTool] =
|
|
10246
|
-
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);
|
|
10247
10610
|
const dial = usePresetDial({
|
|
10248
10611
|
layerRef,
|
|
10249
10612
|
dialRef,
|
|
@@ -10255,53 +10618,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10255
10618
|
const { fold } = dial;
|
|
10256
10619
|
const paused = isPaused(state.limit);
|
|
10257
10620
|
const showDial = !!presetGrid && onChatTab && !tool && !paused;
|
|
10258
|
-
|
|
10621
|
+
useEffect33(() => {
|
|
10259
10622
|
if (paused) setTool(null);
|
|
10260
10623
|
}, [paused]);
|
|
10261
|
-
|
|
10624
|
+
useEffect33(() => {
|
|
10262
10625
|
if (!paused) return;
|
|
10263
10626
|
if (typedSendRef.current) limitRef.current?.focus();
|
|
10264
10627
|
typedSendRef.current = false;
|
|
10265
10628
|
}, [paused]);
|
|
10266
|
-
const openTool =
|
|
10629
|
+
const openTool = useCallback22((next) => {
|
|
10267
10630
|
fold();
|
|
10268
10631
|
markToolSeen();
|
|
10269
10632
|
setToolSeen(true);
|
|
10270
10633
|
setTool(next);
|
|
10271
10634
|
}, [fold]);
|
|
10272
|
-
const onPill =
|
|
10635
|
+
const onPill = useCallback22((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
|
|
10273
10636
|
const toolsValue = useMemo5(
|
|
10274
10637
|
() => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
|
|
10275
10638
|
[presetGrid, paused, openTool, ui.presets.changeCombo]
|
|
10276
10639
|
);
|
|
10277
|
-
const closeTool =
|
|
10640
|
+
const closeTool = useCallback22(() => {
|
|
10278
10641
|
focusAfterCloseRef.current = "dial";
|
|
10279
10642
|
setTool(null);
|
|
10280
10643
|
}, []);
|
|
10281
|
-
const sendAsk =
|
|
10644
|
+
const sendAsk = useCallback22((ask) => {
|
|
10282
10645
|
focusAfterCloseRef.current = "composer";
|
|
10283
10646
|
setTool(null);
|
|
10284
10647
|
monitor?.setActiveTab("chat");
|
|
10285
10648
|
send(ask.message, { displayText: ask.displayText, preset: ask.preset });
|
|
10286
10649
|
}, [monitor, send]);
|
|
10287
|
-
const formatKickoff =
|
|
10650
|
+
const formatKickoff = useCallback22((kickoffUtc) => {
|
|
10288
10651
|
const k = ui.bettingKickoff(kickoffUtc);
|
|
10289
10652
|
return `${k.dayLabel} ${k.time}`;
|
|
10290
10653
|
}, [ui]);
|
|
10291
|
-
|
|
10654
|
+
useEffect33(() => {
|
|
10292
10655
|
if (tool) return;
|
|
10293
10656
|
const target = focusAfterCloseRef.current;
|
|
10294
10657
|
focusAfterCloseRef.current = null;
|
|
10295
10658
|
if (target === "dial") dialButtonRef.current?.focus();
|
|
10296
10659
|
else if (target === "composer") inputRef.current?.focus();
|
|
10297
10660
|
}, [tool]);
|
|
10298
|
-
|
|
10661
|
+
useEffect33(() => {
|
|
10299
10662
|
if (!tool || onChatTab && presetGrid) return;
|
|
10300
10663
|
focusAfterCloseRef.current = "composer";
|
|
10301
10664
|
setTool(null);
|
|
10302
10665
|
}, [tool, onChatTab, presetGrid]);
|
|
10303
|
-
return /* @__PURE__ */
|
|
10304
|
-
/* @__PURE__ */
|
|
10666
|
+
return /* @__PURE__ */ jsxs88("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
10667
|
+
/* @__PURE__ */ jsx102(
|
|
10305
10668
|
ChatHeader,
|
|
10306
10669
|
{
|
|
10307
10670
|
onClose: close,
|
|
@@ -10314,7 +10677,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10314
10677
|
moreOptionsLabel: ui.moreOptions
|
|
10315
10678
|
}
|
|
10316
10679
|
),
|
|
10317
|
-
monitor && /* @__PURE__ */
|
|
10680
|
+
monitor && /* @__PURE__ */ jsx102(
|
|
10318
10681
|
TabBar,
|
|
10319
10682
|
{
|
|
10320
10683
|
monitor,
|
|
@@ -10327,9 +10690,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10327
10690
|
clubEnabled: clubFixturesResult?.enabled ?? false
|
|
10328
10691
|
}
|
|
10329
10692
|
),
|
|
10330
|
-
/* @__PURE__ */
|
|
10331
|
-
/* @__PURE__ */
|
|
10332
|
-
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(
|
|
10333
10696
|
PresetSpeedDial,
|
|
10334
10697
|
{
|
|
10335
10698
|
expanded: dial.expanded,
|
|
@@ -10341,15 +10704,38 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10341
10704
|
buttonRef: dialButtonRef
|
|
10342
10705
|
}
|
|
10343
10706
|
) : null,
|
|
10344
|
-
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
|
|
10345
10708
|
] }),
|
|
10346
|
-
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */
|
|
10347
|
-
monitor && monitor.activeTab === "following" && /* @__PURE__ */
|
|
10348
|
-
monitor && monitor.activeTab === "odds" && /* @__PURE__ */
|
|
10349
|
-
monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */
|
|
10350
|
-
monitor && monitor.activeTab === "standings" && /* @__PURE__ */
|
|
10351
|
-
monitor && monitor.activeTab === "squad" && /* @__PURE__ */
|
|
10352
|
-
|
|
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(
|
|
10353
10739
|
GamesPanel,
|
|
10354
10740
|
{
|
|
10355
10741
|
loggedIn: !!loggedIn,
|
|
@@ -10364,9 +10750,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10364
10750
|
}
|
|
10365
10751
|
}
|
|
10366
10752
|
),
|
|
10367
|
-
(!monitor || monitor.activeTab !== "games") && /* @__PURE__ */
|
|
10368
|
-
/* @__PURE__ */
|
|
10369
|
-
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(
|
|
10370
10756
|
ChatInput,
|
|
10371
10757
|
{
|
|
10372
10758
|
ref: inputRef,
|
|
@@ -10385,9 +10771,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10385
10771
|
}
|
|
10386
10772
|
|
|
10387
10773
|
// src/components/HostEventsProvider.tsx
|
|
10388
|
-
import { jsx as
|
|
10774
|
+
import { jsx as jsx103 } from "react/jsx-runtime";
|
|
10389
10775
|
function HostEventsProvider({ value, children }) {
|
|
10390
|
-
return /* @__PURE__ */
|
|
10776
|
+
return /* @__PURE__ */ jsx103(SlipStateContext.Provider, { value: value.slipState, children });
|
|
10391
10777
|
}
|
|
10392
10778
|
|
|
10393
10779
|
// src/styles/css.generated.ts
|
|
@@ -11466,7 +11852,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11466
11852
|
/* live monitor tab bar: underline pattern mirrors .ss-w-ecard-scope; the unread dot uses --ss-w-neg */
|
|
11467
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; }
|
|
11468
11854
|
.ss-w-tabs::-webkit-scrollbar { display: none; }
|
|
11469
|
-
.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; }
|
|
11470
11856
|
.ss-w-tab[data-on] { color: var(--ss-w-ink); border-bottom-color: var(--ss-w-accent); }
|
|
11471
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; }
|
|
11472
11858
|
.ss-w-tab[data-on] .ss-w-tab-count { color: var(--ss-w-accent); }
|
|
@@ -11548,6 +11934,28 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11548
11934
|
.ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
|
|
11549
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); }
|
|
11550
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); }
|
|
11551
11959
|
/* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
|
|
11552
11960
|
the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
|
|
11553
11961
|
a bare context line with nothing under it. */
|
|
@@ -12151,7 +12559,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
12151
12559
|
`;
|
|
12152
12560
|
|
|
12153
12561
|
// src/StatsWidget.tsx
|
|
12154
|
-
import { jsx as
|
|
12562
|
+
import { jsx as jsx104 } from "react/jsx-runtime";
|
|
12155
12563
|
function buildClient(props) {
|
|
12156
12564
|
try {
|
|
12157
12565
|
if ("client" in props && props.client) {
|
|
@@ -12185,14 +12593,14 @@ function StatsWidget(props) {
|
|
|
12185
12593
|
[built?.client]
|
|
12186
12594
|
);
|
|
12187
12595
|
const ui = useMemo6(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
12188
|
-
const rootRef =
|
|
12189
|
-
const introDoneRef =
|
|
12190
|
-
const markIntroDone =
|
|
12596
|
+
const rootRef = useRef31(null);
|
|
12597
|
+
const introDoneRef = useRef31(false);
|
|
12598
|
+
const markIntroDone = useCallback23(() => {
|
|
12191
12599
|
introDoneRef.current = true;
|
|
12192
12600
|
}, []);
|
|
12193
12601
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
12194
12602
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
12195
|
-
const [hasToday, setHasToday] =
|
|
12603
|
+
const [hasToday, setHasToday] = useState53(false);
|
|
12196
12604
|
const liveCardWatches = useMemo6(() => {
|
|
12197
12605
|
const seen = /* @__PURE__ */ new Set();
|
|
12198
12606
|
const out = [];
|
|
@@ -12219,15 +12627,15 @@ function StatsWidget(props) {
|
|
|
12219
12627
|
});
|
|
12220
12628
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
12221
12629
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
12222
|
-
const getSchedule =
|
|
12630
|
+
const getSchedule = useCallback23(
|
|
12223
12631
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
12224
12632
|
[built, operatorUserId, anonymousUserId]
|
|
12225
12633
|
);
|
|
12226
|
-
const postLeagueStar =
|
|
12634
|
+
const postLeagueStar = useCallback23(
|
|
12227
12635
|
(competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
12228
12636
|
[built, operatorUserId, anonymousUserId]
|
|
12229
12637
|
);
|
|
12230
|
-
const getStates =
|
|
12638
|
+
const getStates = useCallback23(
|
|
12231
12639
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
12232
12640
|
[built]
|
|
12233
12641
|
);
|
|
@@ -12246,11 +12654,11 @@ function StatsWidget(props) {
|
|
|
12246
12654
|
pinnedMatchIds
|
|
12247
12655
|
});
|
|
12248
12656
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
12249
|
-
|
|
12657
|
+
useEffect34(() => {
|
|
12250
12658
|
setHasToday(todayHasContent);
|
|
12251
12659
|
}, [todayHasContent]);
|
|
12252
|
-
const prevLiveSnapshotRef =
|
|
12253
|
-
|
|
12660
|
+
const prevLiveSnapshotRef = useRef31(monitor.snapshot);
|
|
12661
|
+
useEffect34(() => {
|
|
12254
12662
|
const snap = monitor.snapshot;
|
|
12255
12663
|
if (!snap || snap === prevLiveSnapshotRef.current) return;
|
|
12256
12664
|
prevLiveSnapshotRef.current = snap;
|
|
@@ -12288,14 +12696,16 @@ function StatsWidget(props) {
|
|
|
12288
12696
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
12289
12697
|
const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12290
12698
|
const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12291
|
-
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(
|
|
12292
12702
|
(locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
|
|
12293
12703
|
[built]
|
|
12294
12704
|
);
|
|
12295
12705
|
const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
|
|
12296
12706
|
const markTodayActivity = monitor.markTodayActivity;
|
|
12297
|
-
const prevLiveCountRef =
|
|
12298
|
-
|
|
12707
|
+
const prevLiveCountRef = useRef31(0);
|
|
12708
|
+
useEffect34(() => {
|
|
12299
12709
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
12300
12710
|
prevLiveCountRef.current = discovery.liveCount;
|
|
12301
12711
|
if (rose) markTodayActivity();
|
|
@@ -12345,11 +12755,11 @@ function StatsWidget(props) {
|
|
|
12345
12755
|
})
|
|
12346
12756
|
}));
|
|
12347
12757
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
12348
|
-
|
|
12758
|
+
useEffect34(() => {
|
|
12349
12759
|
if (!logger) return;
|
|
12350
12760
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
12351
12761
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
12352
|
-
|
|
12762
|
+
useEffect34(() => {
|
|
12353
12763
|
if (!logger) return;
|
|
12354
12764
|
logger.resume();
|
|
12355
12765
|
const onHide = () => {
|
|
@@ -12367,14 +12777,14 @@ function StatsWidget(props) {
|
|
|
12367
12777
|
logger.dispose();
|
|
12368
12778
|
};
|
|
12369
12779
|
}, [logger]);
|
|
12370
|
-
|
|
12780
|
+
useEffect34(() => {
|
|
12371
12781
|
if (!built || !ui.injectStyles) return;
|
|
12372
12782
|
const node = rootRef.current?.getRootNode();
|
|
12373
12783
|
if (node) injectStyles(node);
|
|
12374
12784
|
}, [built, ui.injectStyles]);
|
|
12375
12785
|
if (!built) return null;
|
|
12376
12786
|
const attrs = themeAttrs(ui);
|
|
12377
|
-
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(
|
|
12378
12788
|
ChatPanel,
|
|
12379
12789
|
{
|
|
12380
12790
|
controller,
|
|
@@ -12388,11 +12798,13 @@ function StatsWidget(props) {
|
|
|
12388
12798
|
clubFixturesResult,
|
|
12389
12799
|
clubStandingsResult,
|
|
12390
12800
|
clubSquadResult,
|
|
12801
|
+
clubSquadStatsResult,
|
|
12802
|
+
clubPlayerDetailResult,
|
|
12391
12803
|
loggedIn: !!operatorUserId,
|
|
12392
12804
|
conversation: built?.conversation ?? null,
|
|
12393
12805
|
presetGrid
|
|
12394
12806
|
}
|
|
12395
|
-
) : /* @__PURE__ */
|
|
12807
|
+
) : /* @__PURE__ */ jsx104(
|
|
12396
12808
|
ChatFab,
|
|
12397
12809
|
{
|
|
12398
12810
|
label: ui.launcherLabel,
|