@sensiblestats/widget-react 0.82.0 → 0.84.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 +835 -491
- 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 +785 -441
- package/dist/index.js.map +1 -1
- package/dist/styles.css +5 -0
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -37,7 +37,7 @@ __export(index_exports, {
|
|
|
37
37
|
module.exports = __toCommonJS(index_exports);
|
|
38
38
|
|
|
39
39
|
// src/StatsWidget.tsx
|
|
40
|
-
var
|
|
40
|
+
var import_react64 = require("react");
|
|
41
41
|
var import_widget_sdk6 = require("@sensiblestats/widget-sdk");
|
|
42
42
|
|
|
43
43
|
// src/kickoff.ts
|
|
@@ -151,6 +151,20 @@ var STRINGS = {
|
|
|
151
151
|
accordionRetry: "Couldn't load odds \u2014 tap to retry",
|
|
152
152
|
accordionSuspended: "Suspended",
|
|
153
153
|
tabToday: "Today",
|
|
154
|
+
tabFixtures: "Fixtures",
|
|
155
|
+
tabStandings: "Standings",
|
|
156
|
+
tabSquad: "Squad",
|
|
157
|
+
clubFixturesEmpty: "No fixtures yet.",
|
|
158
|
+
clubStandingsEmpty: "Standings are not available yet.",
|
|
159
|
+
clubSquadEmpty: "Squad is not available yet.",
|
|
160
|
+
standingsColClub: "Club",
|
|
161
|
+
standingsColPlayed: "P",
|
|
162
|
+
standingsColWon: "W",
|
|
163
|
+
standingsColDrawn: "D",
|
|
164
|
+
standingsColLost: "L",
|
|
165
|
+
standingsColGoalDiff: "GD",
|
|
166
|
+
standingsColPoints: "Pts",
|
|
167
|
+
gamesPlaySegment: "Play",
|
|
154
168
|
sectionLive: "Live",
|
|
155
169
|
yourLeagues: "Your leagues",
|
|
156
170
|
topLeagues: "Top leagues",
|
|
@@ -518,6 +532,20 @@ var STRINGS = {
|
|
|
518
532
|
accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
|
|
519
533
|
accordionSuspended: "Ask\u0131da",
|
|
520
534
|
tabToday: "Bug\xFCn",
|
|
535
|
+
tabFixtures: "Fikst\xFCr",
|
|
536
|
+
tabStandings: "Puan Durumu",
|
|
537
|
+
tabSquad: "Kadro",
|
|
538
|
+
clubFixturesEmpty: "Hen\xFCz fikst\xFCr yok.",
|
|
539
|
+
clubStandingsEmpty: "Puan durumu hen\xFCz mevcut de\u011Fil.",
|
|
540
|
+
clubSquadEmpty: "Kadro hen\xFCz mevcut de\u011Fil.",
|
|
541
|
+
standingsColClub: "Tak\u0131m",
|
|
542
|
+
standingsColPlayed: "O",
|
|
543
|
+
standingsColWon: "G",
|
|
544
|
+
standingsColDrawn: "B",
|
|
545
|
+
standingsColLost: "M",
|
|
546
|
+
standingsColGoalDiff: "AV",
|
|
547
|
+
standingsColPoints: "P",
|
|
548
|
+
gamesPlaySegment: "Oyna",
|
|
521
549
|
sectionLive: "Canl\u0131",
|
|
522
550
|
yourLeagues: "Liglerin",
|
|
523
551
|
topLeagues: "\xD6ne \xE7\u0131kan ligler",
|
|
@@ -882,6 +910,20 @@ function normalizeUi(cfg) {
|
|
|
882
910
|
tabFollowing: strings.tabFollowing,
|
|
883
911
|
tabOdds: strings.tabOdds,
|
|
884
912
|
tabToday: strings.tabToday,
|
|
913
|
+
tabFixtures: strings.tabFixtures,
|
|
914
|
+
tabStandings: strings.tabStandings,
|
|
915
|
+
tabSquad: strings.tabSquad,
|
|
916
|
+
clubFixturesEmpty: strings.clubFixturesEmpty,
|
|
917
|
+
clubStandingsEmpty: strings.clubStandingsEmpty,
|
|
918
|
+
clubSquadEmpty: strings.clubSquadEmpty,
|
|
919
|
+
standingsColClub: strings.standingsColClub,
|
|
920
|
+
standingsColPlayed: strings.standingsColPlayed,
|
|
921
|
+
standingsColWon: strings.standingsColWon,
|
|
922
|
+
standingsColDrawn: strings.standingsColDrawn,
|
|
923
|
+
standingsColLost: strings.standingsColLost,
|
|
924
|
+
standingsColGoalDiff: strings.standingsColGoalDiff,
|
|
925
|
+
standingsColPoints: strings.standingsColPoints,
|
|
926
|
+
gamesPlaySegment: strings.gamesPlaySegment,
|
|
885
927
|
sectionLive: strings.sectionLive,
|
|
886
928
|
yourLeagues: strings.yourLeagues,
|
|
887
929
|
topLeagues: strings.topLeagues,
|
|
@@ -1173,6 +1215,7 @@ function toMarketOddsVM(card) {
|
|
|
1173
1215
|
mainLine: str(card.mainLine),
|
|
1174
1216
|
pinEnabled: card.pinEnabled === true,
|
|
1175
1217
|
statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
|
|
1218
|
+
statTexts: Array.isArray(card.insights) ? card.insights.map((i) => str(i?.text)).filter((t) => !!t) : void 0,
|
|
1176
1219
|
tag: card.tag === "your_market" ? "your_market" : void 0,
|
|
1177
1220
|
live: card.live ?? null,
|
|
1178
1221
|
marketCount: typeof card.marketCount === "number" && Number.isFinite(card.marketCount) ? card.marketCount : void 0
|
|
@@ -2516,6 +2559,7 @@ function useLiveMonitor(opts) {
|
|
|
2516
2559
|
const marketOddsRef = (0, import_react5.useRef)(marketOdds);
|
|
2517
2560
|
marketOddsRef.current = marketOdds;
|
|
2518
2561
|
const hasToday = opts.hasToday ?? false;
|
|
2562
|
+
const clubEnabled = opts.clubEnabled ?? false;
|
|
2519
2563
|
const marketKey = (matchId, dev) => `${matchId}:${dev}`;
|
|
2520
2564
|
const getMarketOddsRef = (0, import_react5.useRef)(opts.getMarketOdds);
|
|
2521
2565
|
getMarketOddsRef.current = opts.getMarketOdds;
|
|
@@ -2692,12 +2736,16 @@ function useLiveMonitor(opts) {
|
|
|
2692
2736
|
if (wasEmpty && watchesLength > 0) void tick();
|
|
2693
2737
|
}, [watchesLength, tick]);
|
|
2694
2738
|
(0, import_react5.useEffect)(() => {
|
|
2739
|
+
if (clubEnabled && (activeTab === "today" || activeTab === "following" || activeTab === "odds")) {
|
|
2740
|
+
setActiveTabState("chat");
|
|
2741
|
+
return;
|
|
2742
|
+
}
|
|
2695
2743
|
const matchPins = pins.filter((p) => p.kind === "match").length;
|
|
2696
2744
|
const marketPins = pins.length - matchPins;
|
|
2697
2745
|
if (activeTab === "following" && matchPins === 0) setActiveTabState(hasToday ? "today" : "chat");
|
|
2698
2746
|
if (activeTab === "odds" && marketPins === 0) setActiveTabState(hasToday ? "today" : "chat");
|
|
2699
2747
|
if (activeTab === "today" && !hasToday) setActiveTabState("chat");
|
|
2700
|
-
}, [pins, activeTab, hasToday]);
|
|
2748
|
+
}, [pins, activeTab, hasToday, clubEnabled]);
|
|
2701
2749
|
const prevIsOpenRef = (0, import_react5.useRef)(false);
|
|
2702
2750
|
(0, import_react5.useEffect)(() => {
|
|
2703
2751
|
const wasClosed = !prevIsOpenRef.current;
|
|
@@ -3062,7 +3110,7 @@ function useLeaderboard(conversation, { activeTab }) {
|
|
|
3062
3110
|
const conversationRef = (0, import_react8.useRef)(conversation);
|
|
3063
3111
|
conversationRef.current = conversation;
|
|
3064
3112
|
(0, import_react8.useEffect)(() => {
|
|
3065
|
-
if (activeTab !== "
|
|
3113
|
+
if (activeTab !== "games") return;
|
|
3066
3114
|
let active = true;
|
|
3067
3115
|
const doFetch = async () => {
|
|
3068
3116
|
const conv = conversationRef.current;
|
|
@@ -3090,8 +3138,151 @@ function useLeaderboard(conversation, { activeTab }) {
|
|
|
3090
3138
|
return { data, loading, refresh };
|
|
3091
3139
|
}
|
|
3092
3140
|
|
|
3093
|
-
// src/
|
|
3141
|
+
// src/useClubFixtures.ts
|
|
3094
3142
|
var import_react9 = require("react");
|
|
3143
|
+
var CLUB_PROBE_RETRY_MS = 15e3;
|
|
3144
|
+
var CLUB_PROBE_MAX_ATTEMPTS = 3;
|
|
3145
|
+
function useClubFixtures(conversation) {
|
|
3146
|
+
const [enabled, setEnabled] = (0, import_react9.useState)(false);
|
|
3147
|
+
const [settled, setSettled] = (0, import_react9.useState)(false);
|
|
3148
|
+
const [fixtures, setFixtures] = (0, import_react9.useState)([]);
|
|
3149
|
+
const [loading, setLoading] = (0, import_react9.useState)(false);
|
|
3150
|
+
const [refreshCount, setRefreshCount] = (0, import_react9.useState)(0);
|
|
3151
|
+
const inFlightRef = (0, import_react9.useRef)(false);
|
|
3152
|
+
const hardOffRef = (0, import_react9.useRef)(false);
|
|
3153
|
+
const conversationRef = (0, import_react9.useRef)(conversation);
|
|
3154
|
+
conversationRef.current = conversation;
|
|
3155
|
+
const ready = conversation != null;
|
|
3156
|
+
(0, import_react9.useEffect)(() => {
|
|
3157
|
+
if (hardOffRef.current) return;
|
|
3158
|
+
let active = true;
|
|
3159
|
+
let retryTimeoutId;
|
|
3160
|
+
let attempts = 0;
|
|
3161
|
+
const doFetch = async () => {
|
|
3162
|
+
const conv = conversationRef.current;
|
|
3163
|
+
if (!conv || inFlightRef.current || !active) return;
|
|
3164
|
+
inFlightRef.current = true;
|
|
3165
|
+
setLoading(true);
|
|
3166
|
+
try {
|
|
3167
|
+
attempts += 1;
|
|
3168
|
+
const result = await conv.getClubFixtures();
|
|
3169
|
+
if (!active) return;
|
|
3170
|
+
if (result === null) {
|
|
3171
|
+
hardOffRef.current = true;
|
|
3172
|
+
setEnabled(false);
|
|
3173
|
+
setFixtures([]);
|
|
3174
|
+
} else {
|
|
3175
|
+
setFixtures(result.fixtures);
|
|
3176
|
+
setEnabled(true);
|
|
3177
|
+
}
|
|
3178
|
+
setSettled(true);
|
|
3179
|
+
} catch {
|
|
3180
|
+
if (!active) return;
|
|
3181
|
+
if (attempts < CLUB_PROBE_MAX_ATTEMPTS) {
|
|
3182
|
+
retryTimeoutId = window.setTimeout(() => {
|
|
3183
|
+
if (!hardOffRef.current) void doFetch();
|
|
3184
|
+
}, CLUB_PROBE_RETRY_MS);
|
|
3185
|
+
} else {
|
|
3186
|
+
setEnabled(false);
|
|
3187
|
+
setFixtures([]);
|
|
3188
|
+
setSettled(true);
|
|
3189
|
+
}
|
|
3190
|
+
} finally {
|
|
3191
|
+
inFlightRef.current = false;
|
|
3192
|
+
if (active) setLoading(false);
|
|
3193
|
+
}
|
|
3194
|
+
};
|
|
3195
|
+
void doFetch();
|
|
3196
|
+
return () => {
|
|
3197
|
+
active = false;
|
|
3198
|
+
inFlightRef.current = false;
|
|
3199
|
+
if (retryTimeoutId !== void 0) window.clearTimeout(retryTimeoutId);
|
|
3200
|
+
};
|
|
3201
|
+
}, [refreshCount, ready]);
|
|
3202
|
+
const refresh = (0, import_react9.useCallback)(() => setRefreshCount((c) => c + 1), []);
|
|
3203
|
+
return { enabled, settled, fixtures, loading, refresh };
|
|
3204
|
+
}
|
|
3205
|
+
|
|
3206
|
+
// src/useClubStandings.ts
|
|
3207
|
+
var import_react10 = require("react");
|
|
3208
|
+
function useClubStandings(conversation, { activeTab, enabled }) {
|
|
3209
|
+
const [data, setData] = (0, import_react10.useState)(null);
|
|
3210
|
+
const [loading, setLoading] = (0, import_react10.useState)(false);
|
|
3211
|
+
const [refreshCount, setRefreshCount] = (0, import_react10.useState)(0);
|
|
3212
|
+
const inFlightRef = (0, import_react10.useRef)(false);
|
|
3213
|
+
const conversationRef = (0, import_react10.useRef)(conversation);
|
|
3214
|
+
conversationRef.current = conversation;
|
|
3215
|
+
(0, import_react10.useEffect)(() => {
|
|
3216
|
+
if (activeTab !== "standings" || !enabled) return;
|
|
3217
|
+
let active = true;
|
|
3218
|
+
const doFetch = async () => {
|
|
3219
|
+
const conv = conversationRef.current;
|
|
3220
|
+
if (!conv || inFlightRef.current) return;
|
|
3221
|
+
inFlightRef.current = true;
|
|
3222
|
+
setLoading(true);
|
|
3223
|
+
try {
|
|
3224
|
+
const result = await conv.getClubStandings();
|
|
3225
|
+
if (active) setData(result?.rows ?? null);
|
|
3226
|
+
} catch {
|
|
3227
|
+
} finally {
|
|
3228
|
+
inFlightRef.current = false;
|
|
3229
|
+
if (active) setLoading(false);
|
|
3230
|
+
}
|
|
3231
|
+
};
|
|
3232
|
+
void doFetch();
|
|
3233
|
+
return () => {
|
|
3234
|
+
active = false;
|
|
3235
|
+
inFlightRef.current = false;
|
|
3236
|
+
};
|
|
3237
|
+
}, [activeTab, enabled, refreshCount]);
|
|
3238
|
+
const refresh = (0, import_react10.useCallback)(() => {
|
|
3239
|
+
setRefreshCount((c) => c + 1);
|
|
3240
|
+
}, []);
|
|
3241
|
+
const effectiveLoading = loading || activeTab === "standings" && enabled && data === null;
|
|
3242
|
+
return { data, loading: effectiveLoading, refresh };
|
|
3243
|
+
}
|
|
3244
|
+
|
|
3245
|
+
// src/useClubSquad.ts
|
|
3246
|
+
var import_react11 = require("react");
|
|
3247
|
+
function useClubSquad(conversation, { activeTab, enabled }) {
|
|
3248
|
+
const [data, setData] = (0, import_react11.useState)(null);
|
|
3249
|
+
const [loading, setLoading] = (0, import_react11.useState)(false);
|
|
3250
|
+
const [refreshCount, setRefreshCount] = (0, import_react11.useState)(0);
|
|
3251
|
+
const inFlightRef = (0, import_react11.useRef)(false);
|
|
3252
|
+
const conversationRef = (0, import_react11.useRef)(conversation);
|
|
3253
|
+
conversationRef.current = conversation;
|
|
3254
|
+
(0, import_react11.useEffect)(() => {
|
|
3255
|
+
if (activeTab !== "squad" || !enabled) return;
|
|
3256
|
+
let active = true;
|
|
3257
|
+
const doFetch = async () => {
|
|
3258
|
+
const conv = conversationRef.current;
|
|
3259
|
+
if (!conv || inFlightRef.current) return;
|
|
3260
|
+
inFlightRef.current = true;
|
|
3261
|
+
setLoading(true);
|
|
3262
|
+
try {
|
|
3263
|
+
const result = await conv.getClubSquad();
|
|
3264
|
+
if (active) setData(result?.players ?? null);
|
|
3265
|
+
} catch {
|
|
3266
|
+
} finally {
|
|
3267
|
+
inFlightRef.current = false;
|
|
3268
|
+
if (active) setLoading(false);
|
|
3269
|
+
}
|
|
3270
|
+
};
|
|
3271
|
+
void doFetch();
|
|
3272
|
+
return () => {
|
|
3273
|
+
active = false;
|
|
3274
|
+
inFlightRef.current = false;
|
|
3275
|
+
};
|
|
3276
|
+
}, [activeTab, enabled, refreshCount]);
|
|
3277
|
+
const refresh = (0, import_react11.useCallback)(() => {
|
|
3278
|
+
setRefreshCount((c) => c + 1);
|
|
3279
|
+
}, []);
|
|
3280
|
+
const effectiveLoading = loading || activeTab === "squad" && enabled && data === null;
|
|
3281
|
+
return { data, loading: effectiveLoading, refresh };
|
|
3282
|
+
}
|
|
3283
|
+
|
|
3284
|
+
// src/usePresetGrid.ts
|
|
3285
|
+
var import_react12 = require("react");
|
|
3095
3286
|
|
|
3096
3287
|
// src/presetGrid.ts
|
|
3097
3288
|
var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
|
|
@@ -3234,22 +3425,22 @@ function marketDisplay(cell, s) {
|
|
|
3234
3425
|
// src/usePresetGrid.ts
|
|
3235
3426
|
var GRID_MAX_AGE_MS = 6e5;
|
|
3236
3427
|
function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
|
|
3237
|
-
const [grid, setGrid] = (0,
|
|
3238
|
-
const keptRef = (0,
|
|
3239
|
-
const localeRef = (0,
|
|
3240
|
-
const inFlightRef = (0,
|
|
3241
|
-
const mountedRef = (0,
|
|
3242
|
-
const getRef = (0,
|
|
3428
|
+
const [grid, setGrid] = (0, import_react12.useState)(null);
|
|
3429
|
+
const keptRef = (0, import_react12.useRef)(null);
|
|
3430
|
+
const localeRef = (0, import_react12.useRef)(locale);
|
|
3431
|
+
const inFlightRef = (0, import_react12.useRef)(false);
|
|
3432
|
+
const mountedRef = (0, import_react12.useRef)(true);
|
|
3433
|
+
const getRef = (0, import_react12.useRef)(getPricePresets);
|
|
3243
3434
|
getRef.current = getPricePresets;
|
|
3244
|
-
const nowRef = (0,
|
|
3435
|
+
const nowRef = (0, import_react12.useRef)(now);
|
|
3245
3436
|
nowRef.current = now;
|
|
3246
|
-
(0,
|
|
3437
|
+
(0, import_react12.useEffect)(() => {
|
|
3247
3438
|
mountedRef.current = true;
|
|
3248
3439
|
return () => {
|
|
3249
3440
|
mountedRef.current = false;
|
|
3250
3441
|
};
|
|
3251
3442
|
}, []);
|
|
3252
|
-
(0,
|
|
3443
|
+
(0, import_react12.useEffect)(() => {
|
|
3253
3444
|
if (localeRef.current !== locale) {
|
|
3254
3445
|
localeRef.current = locale;
|
|
3255
3446
|
keptRef.current = null;
|
|
@@ -3292,18 +3483,18 @@ function visibleGroupsOf(groups, states) {
|
|
|
3292
3483
|
}
|
|
3293
3484
|
|
|
3294
3485
|
// src/eventLogContext.ts
|
|
3295
|
-
var
|
|
3296
|
-
var EventLogContext = (0,
|
|
3486
|
+
var import_react13 = require("react");
|
|
3487
|
+
var EventLogContext = (0, import_react13.createContext)(null);
|
|
3297
3488
|
function useEventLog() {
|
|
3298
|
-
return (0,
|
|
3489
|
+
return (0, import_react13.useContext)(EventLogContext);
|
|
3299
3490
|
}
|
|
3300
3491
|
|
|
3301
3492
|
// src/popupTelemetry.ts
|
|
3302
|
-
var
|
|
3493
|
+
var import_react14 = require("react");
|
|
3303
3494
|
function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
3304
|
-
const shownRef = (0,
|
|
3305
|
-
const closedTextRef = (0,
|
|
3306
|
-
(0,
|
|
3495
|
+
const shownRef = (0, import_react14.useRef)(/* @__PURE__ */ new Set());
|
|
3496
|
+
const closedTextRef = (0, import_react14.useRef)(null);
|
|
3497
|
+
(0, import_react14.useEffect)(() => {
|
|
3307
3498
|
if (isOpen) {
|
|
3308
3499
|
if (closedTextRef.current) log?.log({ name: "popup_opened" });
|
|
3309
3500
|
closedTextRef.current = null;
|
|
@@ -3315,17 +3506,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
|
3315
3506
|
log?.log({ name: "popup_shown" });
|
|
3316
3507
|
}
|
|
3317
3508
|
}, [log, isOpen, popupText]);
|
|
3318
|
-
return (0,
|
|
3509
|
+
return (0, import_react14.useCallback)(() => {
|
|
3319
3510
|
log?.log({ name: "popup_dismissed" });
|
|
3320
3511
|
dismissPopup();
|
|
3321
3512
|
}, [log, dismissPopup]);
|
|
3322
3513
|
}
|
|
3323
3514
|
|
|
3324
3515
|
// src/openTelemetry.ts
|
|
3325
|
-
var
|
|
3516
|
+
var import_react15 = require("react");
|
|
3326
3517
|
function useOpenTelemetry(log, isOpen) {
|
|
3327
|
-
const openLoggedRef = (0,
|
|
3328
|
-
(0,
|
|
3518
|
+
const openLoggedRef = (0, import_react15.useRef)(false);
|
|
3519
|
+
(0, import_react15.useEffect)(() => {
|
|
3329
3520
|
if (!isOpen) {
|
|
3330
3521
|
openLoggedRef.current = false;
|
|
3331
3522
|
return;
|
|
@@ -3337,10 +3528,10 @@ function useOpenTelemetry(log, isOpen) {
|
|
|
3337
3528
|
}
|
|
3338
3529
|
|
|
3339
3530
|
// src/components/ChatFab.tsx
|
|
3340
|
-
var
|
|
3531
|
+
var import_react17 = require("react");
|
|
3341
3532
|
|
|
3342
3533
|
// src/components/BrandMark.tsx
|
|
3343
|
-
var
|
|
3534
|
+
var import_react16 = require("react");
|
|
3344
3535
|
|
|
3345
3536
|
// src/assets/logo.ts
|
|
3346
3537
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
@@ -3403,7 +3594,7 @@ function DashboardIcon({ name }) {
|
|
|
3403
3594
|
// src/components/BrandMark.tsx
|
|
3404
3595
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
3405
3596
|
function BrandMark({ logoUrl, className }) {
|
|
3406
|
-
const [failed, setFailed] = (0,
|
|
3597
|
+
const [failed, setFailed] = (0, import_react16.useState)(false);
|
|
3407
3598
|
if (!logoUrl || failed) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SsMark, { className });
|
|
3408
3599
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3409
3600
|
}
|
|
@@ -3439,9 +3630,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
|
|
|
3439
3630
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
3440
3631
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
|
|
3441
3632
|
const bubble = popupText ?? greeting;
|
|
3442
|
-
const [intro, setIntro] = (0,
|
|
3443
|
-
const armedRef = (0,
|
|
3444
|
-
(0,
|
|
3633
|
+
const [intro, setIntro] = (0, import_react17.useState)(false);
|
|
3634
|
+
const armedRef = (0, import_react17.useRef)(introAllowed);
|
|
3635
|
+
(0, import_react17.useEffect)(() => {
|
|
3445
3636
|
if (armedRef.current && bubble) {
|
|
3446
3637
|
armedRef.current = false;
|
|
3447
3638
|
setIntro(true);
|
|
@@ -3455,10 +3646,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
3455
3646
|
}
|
|
3456
3647
|
|
|
3457
3648
|
// src/components/ChatPanel.tsx
|
|
3458
|
-
var
|
|
3649
|
+
var import_react63 = require("react");
|
|
3459
3650
|
|
|
3460
3651
|
// src/components/ChatHeader.tsx
|
|
3461
|
-
var
|
|
3652
|
+
var import_react18 = require("react");
|
|
3462
3653
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
3463
3654
|
function ChatHeader({
|
|
3464
3655
|
onClose,
|
|
@@ -3470,15 +3661,15 @@ function ChatHeader({
|
|
|
3470
3661
|
newConversationLabel = "New conversation",
|
|
3471
3662
|
moreOptionsLabel = "More options"
|
|
3472
3663
|
}) {
|
|
3473
|
-
const [menuOpen, setMenuOpen] = (0,
|
|
3474
|
-
const wrapRef = (0,
|
|
3475
|
-
const kebabRef = (0,
|
|
3476
|
-
const firstItemRef = (0,
|
|
3664
|
+
const [menuOpen, setMenuOpen] = (0, import_react18.useState)(false);
|
|
3665
|
+
const wrapRef = (0, import_react18.useRef)(null);
|
|
3666
|
+
const kebabRef = (0, import_react18.useRef)(null);
|
|
3667
|
+
const firstItemRef = (0, import_react18.useRef)(null);
|
|
3477
3668
|
const hasMenu = !!(canReset && onNewConversation);
|
|
3478
|
-
(0,
|
|
3669
|
+
(0, import_react18.useEffect)(() => {
|
|
3479
3670
|
if (menuOpen) firstItemRef.current?.focus();
|
|
3480
3671
|
}, [menuOpen]);
|
|
3481
|
-
(0,
|
|
3672
|
+
(0, import_react18.useEffect)(() => {
|
|
3482
3673
|
if (!menuOpen) return;
|
|
3483
3674
|
const onPointer = (e) => {
|
|
3484
3675
|
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
@@ -3534,7 +3725,7 @@ function ChatHeader({
|
|
|
3534
3725
|
}
|
|
3535
3726
|
|
|
3536
3727
|
// src/components/MessageList.tsx
|
|
3537
|
-
var
|
|
3728
|
+
var import_react38 = require("react");
|
|
3538
3729
|
|
|
3539
3730
|
// src/components/Markdown.tsx
|
|
3540
3731
|
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
@@ -3552,7 +3743,7 @@ function Markdown({ text }) {
|
|
|
3552
3743
|
}
|
|
3553
3744
|
|
|
3554
3745
|
// src/components/EntityCardList.tsx
|
|
3555
|
-
var
|
|
3746
|
+
var import_react19 = require("react");
|
|
3556
3747
|
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
3557
3748
|
var MAX_VISIBLE = 3;
|
|
3558
3749
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
@@ -3636,7 +3827,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
3636
3827
|
)) });
|
|
3637
3828
|
}
|
|
3638
3829
|
function EntityCardItem({ c }) {
|
|
3639
|
-
const [active, setActive] = (0,
|
|
3830
|
+
const [active, setActive] = (0, import_react19.useState)(0);
|
|
3640
3831
|
const hasBody = c.scopes.length > 0;
|
|
3641
3832
|
if (!hasBody) {
|
|
3642
3833
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { c, showScopeCrest: false }) });
|
|
@@ -3650,7 +3841,7 @@ function EntityCardItem({ c }) {
|
|
|
3650
3841
|
] });
|
|
3651
3842
|
}
|
|
3652
3843
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
3653
|
-
const [expanded, setExpanded] = (0,
|
|
3844
|
+
const [expanded, setExpanded] = (0, import_react19.useState)(false);
|
|
3654
3845
|
if (cards.length === 0) return null;
|
|
3655
3846
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
3656
3847
|
const overflow = cards.length - MAX_VISIBLE;
|
|
@@ -3661,17 +3852,17 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
3661
3852
|
}
|
|
3662
3853
|
|
|
3663
3854
|
// src/components/AddToSlipButton.tsx
|
|
3664
|
-
var
|
|
3855
|
+
var import_react23 = require("react");
|
|
3665
3856
|
|
|
3666
3857
|
// src/slipAdd.ts
|
|
3667
|
-
var
|
|
3858
|
+
var import_react21 = require("react");
|
|
3668
3859
|
var import_widget_sdk5 = require("@sensiblestats/widget-sdk");
|
|
3669
3860
|
|
|
3670
3861
|
// src/slipStateContext.ts
|
|
3671
|
-
var
|
|
3672
|
-
var SlipStateContext = (0,
|
|
3862
|
+
var import_react20 = require("react");
|
|
3863
|
+
var SlipStateContext = (0, import_react20.createContext)(null);
|
|
3673
3864
|
function useSlipState() {
|
|
3674
|
-
return (0,
|
|
3865
|
+
return (0, import_react20.useContext)(SlipStateContext);
|
|
3675
3866
|
}
|
|
3676
3867
|
|
|
3677
3868
|
// src/slipAdd.ts
|
|
@@ -3686,7 +3877,7 @@ function useSlipAdd(slip, ui) {
|
|
|
3686
3877
|
const slipState = useSlipState();
|
|
3687
3878
|
const handler = slip.onAddToSlip;
|
|
3688
3879
|
const rawLabels = !!ui?.rawBettingLabels;
|
|
3689
|
-
return (0,
|
|
3880
|
+
return (0, import_react21.useCallback)(async (selection, { marketDeveloperName, selectionLabel, line }) => {
|
|
3690
3881
|
if (!handler) return { kind: "failed" };
|
|
3691
3882
|
const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
|
|
3692
3883
|
if (marketDeveloperName !== void 0) {
|
|
@@ -3723,11 +3914,11 @@ function useSlipAdd(slip, ui) {
|
|
|
3723
3914
|
}
|
|
3724
3915
|
|
|
3725
3916
|
// src/components/Toast.tsx
|
|
3726
|
-
var
|
|
3917
|
+
var import_react22 = require("react");
|
|
3727
3918
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
3728
3919
|
var DISMISS_MS = 4e3;
|
|
3729
3920
|
function Toast({ toast, onDismiss }) {
|
|
3730
|
-
(0,
|
|
3921
|
+
(0, import_react22.useEffect)(() => {
|
|
3731
3922
|
if (!toast) return;
|
|
3732
3923
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
3733
3924
|
return () => clearTimeout(timer);
|
|
@@ -3739,10 +3930,10 @@ function Toast({ toast, onDismiss }) {
|
|
|
3739
3930
|
// src/components/AddToSlipButton.tsx
|
|
3740
3931
|
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
3741
3932
|
function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
|
|
3742
|
-
const [pending, setPending] = (0,
|
|
3743
|
-
const [settledLocal, setSettledLocal] = (0,
|
|
3744
|
-
const [toast, setToast] = (0,
|
|
3745
|
-
const dismiss = (0,
|
|
3933
|
+
const [pending, setPending] = (0, import_react23.useState)(false);
|
|
3934
|
+
const [settledLocal, setSettledLocal] = (0, import_react23.useState)(false);
|
|
3935
|
+
const [toast, setToast] = (0, import_react23.useState)(null);
|
|
3936
|
+
const dismiss = (0, import_react23.useCallback)(() => setToast(null), []);
|
|
3746
3937
|
const add = useSlipAdd(slip, ui);
|
|
3747
3938
|
const slipState = useSlipState();
|
|
3748
3939
|
const handler = slip.onAddToSlip;
|
|
@@ -3830,14 +4021,14 @@ function OddsMovementBadge({
|
|
|
3830
4021
|
}
|
|
3831
4022
|
|
|
3832
4023
|
// src/components/Crest.tsx
|
|
3833
|
-
var
|
|
4024
|
+
var import_react24 = require("react");
|
|
3834
4025
|
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
3835
4026
|
function initials2(name) {
|
|
3836
4027
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
3837
4028
|
}
|
|
3838
4029
|
function Crest2({ url, name, kind }) {
|
|
3839
4030
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
3840
|
-
const [failed, setFailed] = (0,
|
|
4031
|
+
const [failed, setFailed] = (0, import_react24.useState)(false);
|
|
3841
4032
|
if (url && !failed) {
|
|
3842
4033
|
return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3843
4034
|
}
|
|
@@ -3845,7 +4036,7 @@ function Crest2({ url, name, kind }) {
|
|
|
3845
4036
|
}
|
|
3846
4037
|
|
|
3847
4038
|
// src/components/PinToggle.tsx
|
|
3848
|
-
var
|
|
4039
|
+
var import_react25 = require("react");
|
|
3849
4040
|
var import_jsx_runtime12 = require("react/jsx-runtime");
|
|
3850
4041
|
var PIN_GLYPHS = {
|
|
3851
4042
|
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" },
|
|
@@ -3853,8 +4044,8 @@ var PIN_GLYPHS = {
|
|
|
3853
4044
|
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" }
|
|
3854
4045
|
};
|
|
3855
4046
|
function PinToggle({ pin, monitor, ui, market }) {
|
|
3856
|
-
const [toast, setToast] = (0,
|
|
3857
|
-
const dismiss = (0,
|
|
4047
|
+
const [toast, setToast] = (0, import_react25.useState)(null);
|
|
4048
|
+
const dismiss = (0, import_react25.useCallback)(() => setToast(null), []);
|
|
3858
4049
|
const log = useEventLog();
|
|
3859
4050
|
if (!monitor || !monitor.enabled) return null;
|
|
3860
4051
|
const key = pinKey(pin);
|
|
@@ -3911,11 +4102,11 @@ function PinToggle({ pin, monitor, ui, market }) {
|
|
|
3911
4102
|
}
|
|
3912
4103
|
|
|
3913
4104
|
// src/components/PriceHistoryButton.tsx
|
|
3914
|
-
var
|
|
4105
|
+
var import_react26 = require("react");
|
|
3915
4106
|
var import_jsx_runtime13 = require("react/jsx-runtime");
|
|
3916
4107
|
function PriceHistoryButton({ selection, monitor, ui }) {
|
|
3917
|
-
const [toast, setToast] = (0,
|
|
3918
|
-
const dismiss = (0,
|
|
4108
|
+
const [toast, setToast] = (0, import_react26.useState)(null);
|
|
4109
|
+
const dismiss = (0, import_react26.useCallback)(() => setToast(null), []);
|
|
3919
4110
|
const log = useEventLog();
|
|
3920
4111
|
if (!monitor || !monitor.enabled) return null;
|
|
3921
4112
|
const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
|
|
@@ -4030,15 +4221,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
4030
4221
|
}
|
|
4031
4222
|
|
|
4032
4223
|
// src/components/AddAllToSlipButton.tsx
|
|
4033
|
-
var
|
|
4224
|
+
var import_react27 = require("react");
|
|
4034
4225
|
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
4035
4226
|
function AddAllToSlipButton({ legs, slip, ui }) {
|
|
4036
4227
|
const add = useSlipAdd(slip, ui);
|
|
4037
4228
|
const slipState = useSlipState();
|
|
4038
|
-
const [pending, setPending] = (0,
|
|
4039
|
-
const [settledLocal, setSettledLocal] = (0,
|
|
4040
|
-
const [toast, setToast] = (0,
|
|
4041
|
-
const dismiss = (0,
|
|
4229
|
+
const [pending, setPending] = (0, import_react27.useState)(false);
|
|
4230
|
+
const [settledLocal, setSettledLocal] = (0, import_react27.useState)({});
|
|
4231
|
+
const [toast, setToast] = (0, import_react27.useState)(null);
|
|
4232
|
+
const dismiss = (0, import_react27.useCallback)(() => setToast(null), []);
|
|
4042
4233
|
if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
|
|
4043
4234
|
const settled = slipState ? slipState.settled : settledLocal;
|
|
4044
4235
|
const open = legs.filter((leg) => !settled[leg.matchOddsId]);
|
|
@@ -4080,10 +4271,10 @@ function AddAllToSlipButton({ legs, slip, ui }) {
|
|
|
4080
4271
|
}
|
|
4081
4272
|
|
|
4082
4273
|
// src/presetToolsContext.ts
|
|
4083
|
-
var
|
|
4084
|
-
var PresetToolsContext = (0,
|
|
4274
|
+
var import_react28 = require("react");
|
|
4275
|
+
var PresetToolsContext = (0, import_react28.createContext)(null);
|
|
4085
4276
|
function usePresetTools() {
|
|
4086
|
-
return (0,
|
|
4277
|
+
return (0, import_react28.useContext)(PresetToolsContext);
|
|
4087
4278
|
}
|
|
4088
4279
|
|
|
4089
4280
|
// src/components/ComboCardList.tsx
|
|
@@ -4148,7 +4339,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
|
|
|
4148
4339
|
}
|
|
4149
4340
|
|
|
4150
4341
|
// src/components/MarketOddsCardList.tsx
|
|
4151
|
-
var
|
|
4342
|
+
var import_react29 = require("react");
|
|
4152
4343
|
|
|
4153
4344
|
// src/components/AllMarketsButton.tsx
|
|
4154
4345
|
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
@@ -4211,7 +4402,7 @@ function fmtHhMm(iso, locale) {
|
|
|
4211
4402
|
return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
|
|
4212
4403
|
}
|
|
4213
4404
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
4214
|
-
const [open, setOpen] = (0,
|
|
4405
|
+
const [open, setOpen] = (0, import_react29.useState)(false);
|
|
4215
4406
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
4216
4407
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
4217
4408
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
@@ -4221,9 +4412,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
4221
4412
|
const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
|
|
4222
4413
|
const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
|
|
4223
4414
|
const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
|
|
4224
|
-
const [, setStaleTick] = (0,
|
|
4415
|
+
const [, setStaleTick] = (0, import_react29.useState)(0);
|
|
4225
4416
|
const watchStale = live != null && !isClosed && !isStale;
|
|
4226
|
-
(0,
|
|
4417
|
+
(0, import_react29.useEffect)(() => {
|
|
4227
4418
|
if (!watchStale) return;
|
|
4228
4419
|
const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
|
|
4229
4420
|
return () => window.clearTimeout(id);
|
|
@@ -4277,7 +4468,7 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
4277
4468
|
] }) : null
|
|
4278
4469
|
] }) : null
|
|
4279
4470
|
] }),
|
|
4280
|
-
|
|
4471
|
+
!hideHeader && !pinRef ? (vm.statTexts && vm.statTexts.length > 0 ? vm.statTexts : vm.statText ? [vm.statText] : []).map((text, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-mo-stat", children: text }, i)) : null,
|
|
4281
4472
|
isClosed ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "ss-w-mo-closed", children: closedReason === "suspended" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: ui?.liveCard.suspended ?? "Market suspended" }) : closedReason === "no_live_price" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: ui?.liveCard.noPrice ?? "No live price available" }) : closedReason === "full_time" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: ui?.liveCard.fullTime ?? "Full time" }) : null }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
|
|
4282
4473
|
/* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "ss-w-mo-rows", children: [
|
|
4283
4474
|
vm.mainRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)),
|
|
@@ -4302,7 +4493,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
|
|
|
4302
4493
|
}
|
|
4303
4494
|
|
|
4304
4495
|
// src/components/CompactOddsList.tsx
|
|
4305
|
-
var
|
|
4496
|
+
var import_react30 = require("react");
|
|
4306
4497
|
|
|
4307
4498
|
// src/compactList.ts
|
|
4308
4499
|
var COMPACT_MIN_CARDS = 3;
|
|
@@ -4416,11 +4607,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
|
|
|
4416
4607
|
] });
|
|
4417
4608
|
}
|
|
4418
4609
|
function CompactOddsList({ list, ui, slip, monitor }) {
|
|
4419
|
-
const [shown, setShown] = (0,
|
|
4610
|
+
const [shown, setShown] = (0, import_react30.useState)(COMPACT_PAGE);
|
|
4420
4611
|
const hidden = list.rowCount - shown;
|
|
4421
|
-
const [focusIndex, setFocusIndex] = (0,
|
|
4422
|
-
const focusRef = (0,
|
|
4423
|
-
(0,
|
|
4612
|
+
const [focusIndex, setFocusIndex] = (0, import_react30.useState)(null);
|
|
4613
|
+
const focusRef = (0, import_react30.useRef)(null);
|
|
4614
|
+
(0, import_react30.useEffect)(() => {
|
|
4424
4615
|
if (focusIndex !== null) focusRef.current?.focus();
|
|
4425
4616
|
}, [focusIndex]);
|
|
4426
4617
|
let left = shown;
|
|
@@ -4725,7 +4916,7 @@ function FixtureCard({ card }) {
|
|
|
4725
4916
|
}
|
|
4726
4917
|
|
|
4727
4918
|
// src/components/dashboard/CountdownCard.tsx
|
|
4728
|
-
var
|
|
4919
|
+
var import_react31 = require("react");
|
|
4729
4920
|
var import_jsx_runtime25 = require("react/jsx-runtime");
|
|
4730
4921
|
var DAY_MS = 864e5;
|
|
4731
4922
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -4744,12 +4935,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
4744
4935
|
function CountdownCard({ card }) {
|
|
4745
4936
|
const { data } = card;
|
|
4746
4937
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
4747
|
-
const [nowMs, setNowMs] = (0,
|
|
4748
|
-
const [reduced] = (0,
|
|
4938
|
+
const [nowMs, setNowMs] = (0, import_react31.useState)(() => Date.now());
|
|
4939
|
+
const [reduced] = (0, import_react31.useState)(
|
|
4749
4940
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
4750
4941
|
);
|
|
4751
4942
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
4752
|
-
(0,
|
|
4943
|
+
(0, import_react31.useEffect)(() => {
|
|
4753
4944
|
if (reduced) return;
|
|
4754
4945
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
4755
4946
|
return () => window.clearInterval(id);
|
|
@@ -4757,7 +4948,7 @@ function CountdownCard({ card }) {
|
|
|
4757
4948
|
const segments = remainingSegments(data.kickoffUnix, nowMs, withinDay && !reduced);
|
|
4758
4949
|
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "ss-w-fandash-card ss-w-fandash-countdown", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "ss-w-fandash-countdown-top", children: [
|
|
4759
4950
|
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-eyebrow", children: card.title ?? "Kick-off in" }),
|
|
4760
|
-
segments ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
|
|
4951
|
+
segments ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-clock", children: segments.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react31.Fragment, { children: [
|
|
4761
4952
|
i > 0 ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-colon", children: ":" }) : null,
|
|
4762
4953
|
/* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: "ss-w-fandash-countdown-seg", children: [
|
|
4763
4954
|
/* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "ss-w-fandash-countdown-value", children: s.value }),
|
|
@@ -4768,7 +4959,7 @@ function CountdownCard({ card }) {
|
|
|
4768
4959
|
}
|
|
4769
4960
|
|
|
4770
4961
|
// src/components/dashboard/InjuriesCard.tsx
|
|
4771
|
-
var
|
|
4962
|
+
var import_react32 = require("react");
|
|
4772
4963
|
var import_jsx_runtime26 = require("react/jsx-runtime");
|
|
4773
4964
|
var SHOWN = 3;
|
|
4774
4965
|
function ColHead({ name, crestUrl }) {
|
|
@@ -4791,7 +4982,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
4791
4982
|
}
|
|
4792
4983
|
function InjuriesCard({ card, ui }) {
|
|
4793
4984
|
const { data } = card;
|
|
4794
|
-
const [expanded, setExpanded] = (0,
|
|
4985
|
+
const [expanded, setExpanded] = (0, import_react32.useState)(false);
|
|
4795
4986
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
4796
4987
|
const limit = expanded ? void 0 : SHOWN;
|
|
4797
4988
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
@@ -4897,7 +5088,7 @@ function LinksCard({ card }) {
|
|
|
4897
5088
|
}
|
|
4898
5089
|
|
|
4899
5090
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
4900
|
-
var
|
|
5091
|
+
var import_react33 = require("react");
|
|
4901
5092
|
var import_jsx_runtime32 = require("react/jsx-runtime");
|
|
4902
5093
|
function initials3(name) {
|
|
4903
5094
|
return name.trim().slice(0, 3).toUpperCase();
|
|
@@ -4907,7 +5098,7 @@ function PostMatchCrest({
|
|
|
4907
5098
|
name,
|
|
4908
5099
|
side
|
|
4909
5100
|
}) {
|
|
4910
|
-
const [failed, setFailed] = (0,
|
|
5101
|
+
const [failed, setFailed] = (0, import_react33.useState)(false);
|
|
4911
5102
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
4912
5103
|
if (url && !failed) {
|
|
4913
5104
|
return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5106,10 +5297,10 @@ function RestingFormCard({ card }) {
|
|
|
5106
5297
|
}
|
|
5107
5298
|
|
|
5108
5299
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
5109
|
-
var
|
|
5300
|
+
var import_react35 = require("react");
|
|
5110
5301
|
|
|
5111
5302
|
// src/useLiveClock.ts
|
|
5112
|
-
var
|
|
5303
|
+
var import_react34 = require("react");
|
|
5113
5304
|
var TICK_MS = 6e4;
|
|
5114
5305
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
5115
5306
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -5118,10 +5309,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
5118
5309
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
5119
5310
|
}
|
|
5120
5311
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
5121
|
-
const [displayMinute, setDisplayMinute] = (0,
|
|
5312
|
+
const [displayMinute, setDisplayMinute] = (0, import_react34.useState)(
|
|
5122
5313
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
5123
5314
|
);
|
|
5124
|
-
(0,
|
|
5315
|
+
(0, import_react34.useEffect)(() => {
|
|
5125
5316
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
5126
5317
|
if (!clockRunning) return;
|
|
5127
5318
|
const id = window.setInterval(() => {
|
|
@@ -5138,7 +5329,7 @@ function initials5(name) {
|
|
|
5138
5329
|
return name.trim().slice(0, 3).toUpperCase();
|
|
5139
5330
|
}
|
|
5140
5331
|
function LiveCrest({ url, name, side }) {
|
|
5141
|
-
const [failed, setFailed] = (0,
|
|
5332
|
+
const [failed, setFailed] = (0, import_react35.useState)(false);
|
|
5142
5333
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
5143
5334
|
if (url && !failed) {
|
|
5144
5335
|
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5157,7 +5348,7 @@ function LiveScoreCard({
|
|
|
5157
5348
|
}) {
|
|
5158
5349
|
const { data } = card;
|
|
5159
5350
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
5160
|
-
const seedRef = (0,
|
|
5351
|
+
const seedRef = (0, import_react35.useRef)(null);
|
|
5161
5352
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
5162
5353
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
5163
5354
|
}
|
|
@@ -5197,7 +5388,7 @@ function LiveScoreCard({
|
|
|
5197
5388
|
}
|
|
5198
5389
|
|
|
5199
5390
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
5200
|
-
var
|
|
5391
|
+
var import_react36 = require("react");
|
|
5201
5392
|
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
5202
5393
|
var SHOWN2 = 3;
|
|
5203
5394
|
function EventIcon({ type }) {
|
|
@@ -5239,7 +5430,7 @@ function EventRow({ e }) {
|
|
|
5239
5430
|
] });
|
|
5240
5431
|
}
|
|
5241
5432
|
function LiveTimelineCard({ card, ui }) {
|
|
5242
|
-
const [expanded, setExpanded] = (0,
|
|
5433
|
+
const [expanded, setExpanded] = (0, import_react36.useState)(false);
|
|
5243
5434
|
const events = card.data.events;
|
|
5244
5435
|
if (!events || events.length === 0) return null;
|
|
5245
5436
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -5264,7 +5455,7 @@ function LiveTimelineCard({ card, ui }) {
|
|
|
5264
5455
|
}
|
|
5265
5456
|
|
|
5266
5457
|
// src/components/dashboard/MomentumWave.tsx
|
|
5267
|
-
var
|
|
5458
|
+
var import_react37 = require("react");
|
|
5268
5459
|
var import_jsx_runtime43 = require("react/jsx-runtime");
|
|
5269
5460
|
var WIDTH = 270;
|
|
5270
5461
|
var HEIGHT = 56;
|
|
@@ -5288,7 +5479,7 @@ function MomentumWave({
|
|
|
5288
5479
|
}) {
|
|
5289
5480
|
if (points.length === 0) return null;
|
|
5290
5481
|
const { area, line, lastLeftPct, lastTopPx } = buildPaths(points);
|
|
5291
|
-
const clipId = (0,
|
|
5482
|
+
const clipId = (0, import_react37.useId)();
|
|
5292
5483
|
const topClipId = `${clipId}-top`;
|
|
5293
5484
|
const bottomClipId = `${clipId}-bottom`;
|
|
5294
5485
|
const topClass = clubIsHome ? "ss-w-fandash-live-mom-home" : "ss-w-fandash-live-mom-away";
|
|
@@ -5481,11 +5672,11 @@ function turnAnchor(messages) {
|
|
|
5481
5672
|
}
|
|
5482
5673
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
5483
5674
|
const { state, send } = controller;
|
|
5484
|
-
const listRef = (0,
|
|
5485
|
-
const endRef = (0,
|
|
5486
|
-
const pinnedRef = (0,
|
|
5487
|
-
const anchoredTurnRef = (0,
|
|
5488
|
-
(0,
|
|
5675
|
+
const listRef = (0, import_react38.useRef)(null);
|
|
5676
|
+
const endRef = (0, import_react38.useRef)(null);
|
|
5677
|
+
const pinnedRef = (0, import_react38.useRef)(true);
|
|
5678
|
+
const anchoredTurnRef = (0, import_react38.useRef)(null);
|
|
5679
|
+
(0, import_react38.useEffect)(() => {
|
|
5489
5680
|
const anchor = turnAnchor(state.messages);
|
|
5490
5681
|
const list = listRef.current;
|
|
5491
5682
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -5542,13 +5733,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
5542
5733
|
}
|
|
5543
5734
|
|
|
5544
5735
|
// src/components/ChatInput.tsx
|
|
5545
|
-
var
|
|
5736
|
+
var import_react39 = require("react");
|
|
5546
5737
|
var import_jsx_runtime49 = require("react/jsx-runtime");
|
|
5547
|
-
var ChatInput = (0,
|
|
5548
|
-
const [value, setValue] = (0,
|
|
5549
|
-
const textareaRef = (0,
|
|
5550
|
-
const stopRef = (0,
|
|
5551
|
-
const textBoxWantsFocusRef = (0,
|
|
5738
|
+
var ChatInput = (0, import_react39.forwardRef)(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
|
|
5739
|
+
const [value, setValue] = (0, import_react39.useState)("");
|
|
5740
|
+
const textareaRef = (0, import_react39.useRef)(null);
|
|
5741
|
+
const stopRef = (0, import_react39.useRef)(null);
|
|
5742
|
+
const textBoxWantsFocusRef = (0, import_react39.useRef)(false);
|
|
5552
5743
|
const submit = () => {
|
|
5553
5744
|
if (disabled) return;
|
|
5554
5745
|
const t = value.trim();
|
|
@@ -5562,7 +5753,7 @@ var ChatInput = (0, import_react36.forwardRef)(function ChatInput2({ placeholder
|
|
|
5562
5753
|
submit();
|
|
5563
5754
|
}
|
|
5564
5755
|
};
|
|
5565
|
-
(0,
|
|
5756
|
+
(0, import_react39.useImperativeHandle)(ref, () => ({
|
|
5566
5757
|
focus() {
|
|
5567
5758
|
const box = textareaRef.current;
|
|
5568
5759
|
if (box && !box.disabled) {
|
|
@@ -5574,7 +5765,7 @@ var ChatInput = (0, import_react36.forwardRef)(function ChatInput2({ placeholder
|
|
|
5574
5765
|
stopRef.current?.focus();
|
|
5575
5766
|
}
|
|
5576
5767
|
}), []);
|
|
5577
|
-
(0,
|
|
5768
|
+
(0, import_react39.useEffect)(() => {
|
|
5578
5769
|
if (streaming || disabled || !textBoxWantsFocusRef.current) return;
|
|
5579
5770
|
textBoxWantsFocusRef.current = false;
|
|
5580
5771
|
const box = textareaRef.current;
|
|
@@ -5607,16 +5798,19 @@ var ChatInput = (0, import_react36.forwardRef)(function ChatInput2({ placeholder
|
|
|
5607
5798
|
|
|
5608
5799
|
// src/components/TabBar.tsx
|
|
5609
5800
|
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
5610
|
-
function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled }) {
|
|
5801
|
+
function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
|
|
5611
5802
|
const tabs = [
|
|
5612
5803
|
{ tab: "chat", label: ui.tabChat, count: 0, dot: monitor.chatDot },
|
|
5613
|
-
...
|
|
5614
|
-
|
|
5615
|
-
|
|
5616
|
-
|
|
5617
|
-
|
|
5618
|
-
{ tab: "
|
|
5619
|
-
|
|
5804
|
+
...clubEnabled ? [
|
|
5805
|
+
{ tab: "fixtures", label: ui.tabFixtures, count: 0, dot: false },
|
|
5806
|
+
{ tab: "standings", label: ui.tabStandings, count: 0, dot: false },
|
|
5807
|
+
{ tab: "squad", label: ui.tabSquad, count: 0, dot: false }
|
|
5808
|
+
] : [
|
|
5809
|
+
...hasToday ? [{ tab: "today", label: ui.tabToday, count: todayCount, dot: monitor.todayDot }] : [],
|
|
5810
|
+
...matchCount > 0 ? [{ tab: "following", label: ui.tabFollowing, count: matchCount, dot: monitor.matchesDot }] : [],
|
|
5811
|
+
...oddsCount > 0 ? [{ tab: "odds", label: ui.tabOdds, count: oddsCount, dot: monitor.oddsDot }] : []
|
|
5812
|
+
],
|
|
5813
|
+
...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
|
|
5620
5814
|
];
|
|
5621
5815
|
if (tabs.length < 2) return null;
|
|
5622
5816
|
return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "ss-w-tabs", role: "tablist", children: tabs.map(({ tab, label, count, dot }) => {
|
|
@@ -5696,10 +5890,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
5696
5890
|
}
|
|
5697
5891
|
|
|
5698
5892
|
// src/components/LiveFactBlock.tsx
|
|
5699
|
-
var
|
|
5893
|
+
var import_react40 = require("react");
|
|
5700
5894
|
var import_jsx_runtime52 = require("react/jsx-runtime");
|
|
5701
5895
|
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
5702
|
-
const [expanded, setExpanded] = (0,
|
|
5896
|
+
const [expanded, setExpanded] = (0, import_react40.useState)(false);
|
|
5703
5897
|
const [current, ...earlier] = facts;
|
|
5704
5898
|
if (!current) return null;
|
|
5705
5899
|
const m = current.market;
|
|
@@ -5965,7 +6159,7 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
5965
6159
|
}
|
|
5966
6160
|
|
|
5967
6161
|
// src/components/TodayPanel.tsx
|
|
5968
|
-
var
|
|
6162
|
+
var import_react44 = require("react");
|
|
5969
6163
|
|
|
5970
6164
|
// src/placement.ts
|
|
5971
6165
|
function placeLeagues(visible, pinnedMatchIds) {
|
|
@@ -6028,11 +6222,11 @@ function matchingFixtures(group, query) {
|
|
|
6028
6222
|
}
|
|
6029
6223
|
|
|
6030
6224
|
// src/useStarTap.ts
|
|
6031
|
-
var
|
|
6225
|
+
var import_react41 = require("react");
|
|
6032
6226
|
function useStarTap(starLeague) {
|
|
6033
|
-
const [pendingId, setPendingId] = (0,
|
|
6034
|
-
const pendingRef = (0,
|
|
6035
|
-
const tap = (0,
|
|
6227
|
+
const [pendingId, setPendingId] = (0, import_react41.useState)(null);
|
|
6228
|
+
const pendingRef = (0, import_react41.useRef)(null);
|
|
6229
|
+
const tap = (0, import_react41.useCallback)(async (competitionId, next) => {
|
|
6036
6230
|
if (pendingRef.current !== null) return false;
|
|
6037
6231
|
pendingRef.current = competitionId;
|
|
6038
6232
|
setPendingId(competitionId);
|
|
@@ -6091,7 +6285,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
|
|
|
6091
6285
|
}
|
|
6092
6286
|
|
|
6093
6287
|
// src/components/LeagueDetail.tsx
|
|
6094
|
-
var
|
|
6288
|
+
var import_react42 = require("react");
|
|
6095
6289
|
|
|
6096
6290
|
// src/components/FixtureRow.tsx
|
|
6097
6291
|
var import_jsx_runtime56 = require("react/jsx-runtime");
|
|
@@ -6126,11 +6320,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
|
6126
6320
|
var import_jsx_runtime57 = require("react/jsx-runtime");
|
|
6127
6321
|
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";
|
|
6128
6322
|
function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
|
|
6129
|
-
const [toast, setToast] = (0,
|
|
6130
|
-
(0,
|
|
6323
|
+
const [toast, setToast] = (0, import_react42.useState)(null);
|
|
6324
|
+
(0, import_react42.useEffect)(() => {
|
|
6131
6325
|
setToast(null);
|
|
6132
6326
|
}, [group.competitionId]);
|
|
6133
|
-
(0,
|
|
6327
|
+
(0, import_react42.useEffect)(() => {
|
|
6134
6328
|
if (toast === null) return;
|
|
6135
6329
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6136
6330
|
return () => clearTimeout(id);
|
|
@@ -6262,7 +6456,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
|
|
|
6262
6456
|
}
|
|
6263
6457
|
|
|
6264
6458
|
// src/components/games/ui/SearchField.tsx
|
|
6265
|
-
var
|
|
6459
|
+
var import_react43 = require("react");
|
|
6266
6460
|
|
|
6267
6461
|
// src/components/games/ui/icons.tsx
|
|
6268
6462
|
var import_jsx_runtime59 = require("react/jsx-runtime");
|
|
@@ -6301,8 +6495,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ (0, import_jsx_runt
|
|
|
6301
6495
|
// src/components/games/ui/SearchField.tsx
|
|
6302
6496
|
var import_jsx_runtime60 = require("react/jsx-runtime");
|
|
6303
6497
|
function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
|
|
6304
|
-
const localRef = (0,
|
|
6305
|
-
const setInputRef = (0,
|
|
6498
|
+
const localRef = (0, import_react43.useRef)(null);
|
|
6499
|
+
const setInputRef = (0, import_react43.useCallback)((node) => {
|
|
6306
6500
|
localRef.current = node;
|
|
6307
6501
|
if (typeof inputRef === "function") inputRef(node);
|
|
6308
6502
|
else if (inputRef) inputRef.current = node;
|
|
@@ -6346,23 +6540,23 @@ function SearchField({ id, label, labelHidden = false, placeholder, value, onCha
|
|
|
6346
6540
|
var import_jsx_runtime61 = require("react/jsx-runtime");
|
|
6347
6541
|
function TodayPanel({ discovery, ui, monitor }) {
|
|
6348
6542
|
const { groups, states, stale, starLeague } = discovery;
|
|
6349
|
-
const searchId = (0,
|
|
6350
|
-
const [query, setQuery] = (0,
|
|
6351
|
-
const [selectedCompetitionId, setSelectedCompetitionId] = (0,
|
|
6352
|
-
const [toast, setToast] = (0,
|
|
6353
|
-
(0,
|
|
6543
|
+
const searchId = (0, import_react44.useId)();
|
|
6544
|
+
const [query, setQuery] = (0, import_react44.useState)("");
|
|
6545
|
+
const [selectedCompetitionId, setSelectedCompetitionId] = (0, import_react44.useState)(null);
|
|
6546
|
+
const [toast, setToast] = (0, import_react44.useState)(null);
|
|
6547
|
+
(0, import_react44.useEffect)(() => {
|
|
6354
6548
|
if (toast === null) return;
|
|
6355
6549
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6356
6550
|
return () => clearTimeout(id);
|
|
6357
6551
|
}, [toast]);
|
|
6358
6552
|
const visibleGroups = visibleGroupsOf(groups, states);
|
|
6359
|
-
const pinnedMatchIds = (0,
|
|
6553
|
+
const pinnedMatchIds = (0, import_react44.useMemo)(
|
|
6360
6554
|
() => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
|
|
6361
6555
|
[monitor.pins]
|
|
6362
6556
|
);
|
|
6363
|
-
const placement = (0,
|
|
6557
|
+
const placement = (0, import_react44.useMemo)(() => placeLeagues(visibleGroups, pinnedMatchIds), [visibleGroups, pinnedMatchIds]);
|
|
6364
6558
|
const starTap = useStarTap(starLeague);
|
|
6365
|
-
const gridStarTap = (0,
|
|
6559
|
+
const gridStarTap = (0, import_react44.useMemo)(() => ({
|
|
6366
6560
|
pendingId: starTap.pendingId,
|
|
6367
6561
|
tap: async (competitionId, next) => {
|
|
6368
6562
|
const ok = await starTap.tap(competitionId, next);
|
|
@@ -6396,7 +6590,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6396
6590
|
}
|
|
6397
6591
|
const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
|
|
6398
6592
|
const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
|
|
6399
|
-
(0,
|
|
6593
|
+
(0, import_react44.useEffect)(() => {
|
|
6400
6594
|
if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
|
|
6401
6595
|
}, [selectedCompetitionId, openGroup]);
|
|
6402
6596
|
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);
|
|
@@ -6543,7 +6737,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6543
6737
|
}
|
|
6544
6738
|
|
|
6545
6739
|
// src/components/GamesPanel.tsx
|
|
6546
|
-
var
|
|
6740
|
+
var import_react59 = require("react");
|
|
6547
6741
|
|
|
6548
6742
|
// src/components/GamesLoginWall.tsx
|
|
6549
6743
|
var import_jsx_runtime62 = require("react/jsx-runtime");
|
|
@@ -6552,7 +6746,7 @@ function GamesLoginWall({ ui }) {
|
|
|
6552
6746
|
}
|
|
6553
6747
|
|
|
6554
6748
|
// src/components/GamesHub.tsx
|
|
6555
|
-
var
|
|
6749
|
+
var import_react45 = require("react");
|
|
6556
6750
|
|
|
6557
6751
|
// src/components/games/ui/gameMeta.ts
|
|
6558
6752
|
function prettifyGameId(gameId) {
|
|
@@ -6703,8 +6897,8 @@ function pickHeroGame(games) {
|
|
|
6703
6897
|
}
|
|
6704
6898
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
6705
6899
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
6706
|
-
const [, setTick] = (0,
|
|
6707
|
-
(0,
|
|
6900
|
+
const [, setTick] = (0, import_react45.useState)(0);
|
|
6901
|
+
(0, import_react45.useEffect)(() => {
|
|
6708
6902
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
6709
6903
|
return () => clearInterval(id);
|
|
6710
6904
|
}, []);
|
|
@@ -6764,10 +6958,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
6764
6958
|
}
|
|
6765
6959
|
|
|
6766
6960
|
// src/components/GameScreenHost.tsx
|
|
6767
|
-
var
|
|
6961
|
+
var import_react57 = require("react");
|
|
6768
6962
|
|
|
6769
6963
|
// src/useGamePlay.ts
|
|
6770
|
-
var
|
|
6964
|
+
var import_react46 = require("react");
|
|
6771
6965
|
function toSubmitResult(payload) {
|
|
6772
6966
|
return {
|
|
6773
6967
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -6779,17 +6973,17 @@ function toSubmitResult(payload) {
|
|
|
6779
6973
|
};
|
|
6780
6974
|
}
|
|
6781
6975
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
6782
|
-
const [result, setResult] = (0,
|
|
6783
|
-
const [submitting, setSubmitting] = (0,
|
|
6784
|
-
const [rawStatus, setRawStatus] = (0,
|
|
6785
|
-
const inFlightRef = (0,
|
|
6786
|
-
const convRef = (0,
|
|
6976
|
+
const [result, setResult] = (0, import_react46.useState)(null);
|
|
6977
|
+
const [submitting, setSubmitting] = (0, import_react46.useState)(false);
|
|
6978
|
+
const [rawStatus, setRawStatus] = (0, import_react46.useState)(null);
|
|
6979
|
+
const inFlightRef = (0, import_react46.useRef)(false);
|
|
6980
|
+
const convRef = (0, import_react46.useRef)(conversation);
|
|
6787
6981
|
convRef.current = conversation;
|
|
6788
|
-
const optsRef = (0,
|
|
6982
|
+
const optsRef = (0, import_react46.useRef)({ gameId, gameDay, fixtureId, locale, refresh });
|
|
6789
6983
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
6790
|
-
const resultRef = (0,
|
|
6984
|
+
const resultRef = (0, import_react46.useRef)(null);
|
|
6791
6985
|
resultRef.current = result;
|
|
6792
|
-
const refetch = (0,
|
|
6986
|
+
const refetch = (0, import_react46.useCallback)(async () => {
|
|
6793
6987
|
const conv = convRef.current;
|
|
6794
6988
|
if (!conv) return;
|
|
6795
6989
|
const opts = optsRef.current;
|
|
@@ -6805,7 +6999,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6805
6999
|
} catch {
|
|
6806
7000
|
}
|
|
6807
7001
|
}, []);
|
|
6808
|
-
const submit = (0,
|
|
7002
|
+
const submit = (0, import_react46.useCallback)(async (answerJson) => {
|
|
6809
7003
|
const conv = convRef.current;
|
|
6810
7004
|
if (!conv || inFlightRef.current) return;
|
|
6811
7005
|
inFlightRef.current = true;
|
|
@@ -6832,14 +7026,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6832
7026
|
setSubmitting(false);
|
|
6833
7027
|
}
|
|
6834
7028
|
}, [refetch]);
|
|
6835
|
-
const hydrate = (0,
|
|
7029
|
+
const hydrate = (0, import_react46.useCallback)(() => {
|
|
6836
7030
|
void refetch();
|
|
6837
7031
|
}, [refetch]);
|
|
6838
7032
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
6839
7033
|
}
|
|
6840
7034
|
|
|
6841
7035
|
// src/components/games/MysteryTigerGame.tsx
|
|
6842
|
-
var
|
|
7036
|
+
var import_react48 = require("react");
|
|
6843
7037
|
|
|
6844
7038
|
// src/components/games/nationFlags.ts
|
|
6845
7039
|
var FLAGS = {
|
|
@@ -7050,7 +7244,7 @@ function isNationCode(flag) {
|
|
|
7050
7244
|
}
|
|
7051
7245
|
|
|
7052
7246
|
// src/components/games/PlayerAvatar.tsx
|
|
7053
|
-
var
|
|
7247
|
+
var import_react47 = require("react");
|
|
7054
7248
|
var import_jsx_runtime67 = require("react/jsx-runtime");
|
|
7055
7249
|
function initialsOf(name) {
|
|
7056
7250
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
@@ -7068,7 +7262,7 @@ function PlayerAvatar({
|
|
|
7068
7262
|
imagePath,
|
|
7069
7263
|
className
|
|
7070
7264
|
}) {
|
|
7071
|
-
const [failed, setFailed] = (0,
|
|
7265
|
+
const [failed, setFailed] = (0, import_react47.useState)(false);
|
|
7072
7266
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
7073
7267
|
return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ (0, import_jsx_runtime67.jsx)("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
7074
7268
|
}
|
|
@@ -7309,8 +7503,8 @@ function MysteryTigerGame({
|
|
|
7309
7503
|
onBack
|
|
7310
7504
|
}) {
|
|
7311
7505
|
const t = ui.games.mysteryTiger;
|
|
7312
|
-
const [query, setQuery] = (0,
|
|
7313
|
-
const inputId = (0,
|
|
7506
|
+
const [query, setQuery] = (0, import_react48.useState)("");
|
|
7507
|
+
const inputId = (0, import_react48.useId)();
|
|
7314
7508
|
const clientState = parseClientState(result?.clientStateJson);
|
|
7315
7509
|
const guessResults = clientState?.guessResults ?? [];
|
|
7316
7510
|
const alreadyGuessedIds = new Set(guessResults.map((g) => g.playerId));
|
|
@@ -7571,13 +7765,13 @@ function HigherOrLowerGame({
|
|
|
7571
7765
|
}
|
|
7572
7766
|
|
|
7573
7767
|
// src/components/games/CareerPathGame.tsx
|
|
7574
|
-
var
|
|
7768
|
+
var import_react50 = require("react");
|
|
7575
7769
|
|
|
7576
7770
|
// src/components/games/ui/CrestShield.tsx
|
|
7577
|
-
var
|
|
7771
|
+
var import_react49 = require("react");
|
|
7578
7772
|
var import_jsx_runtime78 = require("react/jsx-runtime");
|
|
7579
7773
|
function CrestShield({ src, name, size = 28 }) {
|
|
7580
|
-
const [failed, setFailed] = (0,
|
|
7774
|
+
const [failed, setFailed] = (0, import_react49.useState)(false);
|
|
7581
7775
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
7582
7776
|
return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
7583
7777
|
}
|
|
@@ -7609,8 +7803,8 @@ function CareerPathGame({
|
|
|
7609
7803
|
}) {
|
|
7610
7804
|
const s = ui.games.careerPath;
|
|
7611
7805
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
7612
|
-
const [query, setQuery] = (0,
|
|
7613
|
-
const inputId = (0,
|
|
7806
|
+
const [query, setQuery] = (0, import_react50.useState)("");
|
|
7807
|
+
const inputId = (0, import_react50.useId)();
|
|
7614
7808
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
7615
7809
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
7616
7810
|
const isOver = result?.alreadyPlayed === true || clientState?.solved === true || clientState?.failed === true;
|
|
@@ -7716,7 +7910,7 @@ function CareerPathGame({
|
|
|
7716
7910
|
}
|
|
7717
7911
|
|
|
7718
7912
|
// src/components/games/BeatTheGridGame.tsx
|
|
7719
|
-
var
|
|
7913
|
+
var import_react51 = __toESM(require("react"), 1);
|
|
7720
7914
|
|
|
7721
7915
|
// src/components/games/ui/OptionList.tsx
|
|
7722
7916
|
var import_jsx_runtime80 = require("react/jsx-runtime");
|
|
@@ -7805,10 +7999,10 @@ function SearchSheet({
|
|
|
7805
7999
|
ui
|
|
7806
8000
|
}) {
|
|
7807
8001
|
const s = ui.games.beatTheGrid;
|
|
7808
|
-
const [query, setQuery] = (0,
|
|
7809
|
-
const inputId = (0,
|
|
7810
|
-
const inputRef = (0,
|
|
7811
|
-
(0,
|
|
8002
|
+
const [query, setQuery] = (0, import_react51.useState)("");
|
|
8003
|
+
const inputId = (0, import_react51.useId)();
|
|
8004
|
+
const inputRef = (0, import_react51.useRef)(null);
|
|
8005
|
+
(0, import_react51.useEffect)(() => {
|
|
7812
8006
|
inputRef.current?.focus();
|
|
7813
8007
|
}, [row, col]);
|
|
7814
8008
|
const filtered = playerPool.filter(
|
|
@@ -7873,7 +8067,7 @@ function BeatTheGridGame({
|
|
|
7873
8067
|
}) {
|
|
7874
8068
|
const s = ui.games.beatTheGrid;
|
|
7875
8069
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
7876
|
-
const [activeCell, setActiveCell] = (0,
|
|
8070
|
+
const [activeCell, setActiveCell] = (0, import_react51.useState)(null);
|
|
7877
8071
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
7878
8072
|
const filledCells = clientState?.cells ?? [];
|
|
7879
8073
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -7947,7 +8141,7 @@ function BeatTheGridGame({
|
|
|
7947
8141
|
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)("span", { "aria-hidden": "true", children: abbr }),
|
|
7948
8142
|
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)("span", { className: "ss-g-sr", children: rowLabel })
|
|
7949
8143
|
] });
|
|
7950
|
-
return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(
|
|
8144
|
+
return /* @__PURE__ */ (0, import_jsx_runtime81.jsxs)(import_react51.default.Fragment, { children: [
|
|
7951
8145
|
/* @__PURE__ */ (0, import_jsx_runtime81.jsx)("div", { className: "ss-g-btg-rowhdr", "data-meta": rowMeta ? "true" : void 0, children: rowHeaderContent }),
|
|
7952
8146
|
cols.map((colLabel, colIdx) => {
|
|
7953
8147
|
const filled = findCellResult(filledCells, rowIdx, colIdx);
|
|
@@ -8028,7 +8222,7 @@ function BeatTheGridGame({
|
|
|
8028
8222
|
}
|
|
8029
8223
|
|
|
8030
8224
|
// src/components/games/GuessTheXiGame.tsx
|
|
8031
|
-
var
|
|
8225
|
+
var import_react52 = require("react");
|
|
8032
8226
|
|
|
8033
8227
|
// src/components/games/ui/PitchSvg.tsx
|
|
8034
8228
|
var import_jsx_runtime82 = require("react/jsx-runtime");
|
|
@@ -8117,8 +8311,8 @@ function GuessTheXiGame({
|
|
|
8117
8311
|
onBack
|
|
8118
8312
|
}) {
|
|
8119
8313
|
const t = ui.games.guessTheXi;
|
|
8120
|
-
const [query, setQuery] = (0,
|
|
8121
|
-
const inputId = (0,
|
|
8314
|
+
const [query, setQuery] = (0, import_react52.useState)("");
|
|
8315
|
+
const inputId = (0, import_react52.useId)();
|
|
8122
8316
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
8123
8317
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
8124
8318
|
const solved = clientState?.status === "solved";
|
|
@@ -8260,7 +8454,7 @@ function GuessTheXiGame({
|
|
|
8260
8454
|
}
|
|
8261
8455
|
|
|
8262
8456
|
// src/components/games/DailyQuizGame.tsx
|
|
8263
|
-
var
|
|
8457
|
+
var import_react53 = require("react");
|
|
8264
8458
|
var import_jsx_runtime84 = require("react/jsx-runtime");
|
|
8265
8459
|
function parseClientState6(json) {
|
|
8266
8460
|
if (!json) return null;
|
|
@@ -8301,8 +8495,8 @@ function DailyQuizGame({
|
|
|
8301
8495
|
}) {
|
|
8302
8496
|
const s = ui.games.dailyQuiz;
|
|
8303
8497
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
8304
|
-
const [selections, setSelections] = (0,
|
|
8305
|
-
const [page, setPage] = (0,
|
|
8498
|
+
const [selections, setSelections] = (0, import_react53.useState)(/* @__PURE__ */ new Map());
|
|
8499
|
+
const [page, setPage] = (0, import_react53.useState)(0);
|
|
8306
8500
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
8307
8501
|
const results = clientState?.results ?? [];
|
|
8308
8502
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
@@ -8412,7 +8606,7 @@ function DailyQuizGame({
|
|
|
8412
8606
|
}
|
|
8413
8607
|
|
|
8414
8608
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
8415
|
-
var
|
|
8609
|
+
var import_react54 = require("react");
|
|
8416
8610
|
var import_jsx_runtime85 = require("react/jsx-runtime");
|
|
8417
8611
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
8418
8612
|
function parseClientState7(json) {
|
|
@@ -8508,12 +8702,12 @@ function MatchdayPredictorGame({
|
|
|
8508
8702
|
onBack
|
|
8509
8703
|
}) {
|
|
8510
8704
|
const t = ui.games.predictor;
|
|
8511
|
-
const [homeScore, setHomeScore] = (0,
|
|
8512
|
-
const [awayScore, setAwayScore] = (0,
|
|
8513
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0,
|
|
8514
|
-
const [lastEdited, setLastEdited] = (0,
|
|
8515
|
-
const [query, setQuery] = (0,
|
|
8516
|
-
const searchId = (0,
|
|
8705
|
+
const [homeScore, setHomeScore] = (0, import_react54.useState)(0);
|
|
8706
|
+
const [awayScore, setAwayScore] = (0, import_react54.useState)(0);
|
|
8707
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = (0, import_react54.useState)(null);
|
|
8708
|
+
const [lastEdited, setLastEdited] = (0, import_react54.useState)("home");
|
|
8709
|
+
const [query, setQuery] = (0, import_react54.useState)("");
|
|
8710
|
+
const searchId = (0, import_react54.useId)();
|
|
8517
8711
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
8518
8712
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
8519
8713
|
const header = /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(
|
|
@@ -8680,7 +8874,7 @@ function MatchdayPredictorGame({
|
|
|
8680
8874
|
}
|
|
8681
8875
|
|
|
8682
8876
|
// src/components/games/StartingXiGame.tsx
|
|
8683
|
-
var
|
|
8877
|
+
var import_react55 = require("react");
|
|
8684
8878
|
var import_jsx_runtime86 = require("react/jsx-runtime");
|
|
8685
8879
|
var POINTS_PER_STARTER = 8;
|
|
8686
8880
|
var XI_SIZE = 11;
|
|
@@ -8724,10 +8918,10 @@ function StartingXiGame({
|
|
|
8724
8918
|
lockAtUtc
|
|
8725
8919
|
}) {
|
|
8726
8920
|
const t = ui.games.startingXi;
|
|
8727
|
-
const [slotPlayers, setSlotPlayers] = (0,
|
|
8728
|
-
const [active, setActive] = (0,
|
|
8729
|
-
const [query, setQuery] = (0,
|
|
8730
|
-
const searchId = (0,
|
|
8921
|
+
const [slotPlayers, setSlotPlayers] = (0, import_react55.useState)(() => Array(XI_SIZE).fill(null));
|
|
8922
|
+
const [active, setActive] = (0, import_react55.useState)(0);
|
|
8923
|
+
const [query, setQuery] = (0, import_react55.useState)("");
|
|
8924
|
+
const searchId = (0, import_react55.useId)();
|
|
8731
8925
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
8732
8926
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
8733
8927
|
const header = /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(
|
|
@@ -8866,7 +9060,7 @@ function StartingXiGame({
|
|
|
8866
9060
|
}
|
|
8867
9061
|
|
|
8868
9062
|
// src/components/games/StatLadderGame.tsx
|
|
8869
|
-
var
|
|
9063
|
+
var import_react56 = require("react");
|
|
8870
9064
|
var import_jsx_runtime87 = require("react/jsx-runtime");
|
|
8871
9065
|
function ladderClue(ladder) {
|
|
8872
9066
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
@@ -8903,9 +9097,9 @@ function StatLadderGame({
|
|
|
8903
9097
|
onBack
|
|
8904
9098
|
}) {
|
|
8905
9099
|
const t = ui.games.statLadder;
|
|
8906
|
-
const [query, setQuery] = (0,
|
|
8907
|
-
const [selectedId, setSelectedId] = (0,
|
|
8908
|
-
const searchId = (0,
|
|
9100
|
+
const [query, setQuery] = (0, import_react56.useState)("");
|
|
9101
|
+
const [selectedId, setSelectedId] = (0, import_react56.useState)(null);
|
|
9102
|
+
const searchId = (0, import_react56.useId)();
|
|
8909
9103
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
8910
9104
|
const revealed = clientState != null;
|
|
8911
9105
|
const header = /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(GameHeader, { title: gameTitle({ gameId: "stat-ladder" }, ui.games.titles), eyebrow: t.eyebrow, onBack, backLabel: ui.back });
|
|
@@ -9111,8 +9305,8 @@ function GameScreenHost({
|
|
|
9111
9305
|
ui
|
|
9112
9306
|
}) {
|
|
9113
9307
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
9114
|
-
const [configJson, setConfigJson] = (0,
|
|
9115
|
-
(0,
|
|
9308
|
+
const [configJson, setConfigJson] = (0, import_react57.useState)(null);
|
|
9309
|
+
(0, import_react57.useEffect)(() => {
|
|
9116
9310
|
setConfigJson(null);
|
|
9117
9311
|
if (!conversation) return;
|
|
9118
9312
|
let cancelled = false;
|
|
@@ -9135,12 +9329,12 @@ function GameScreenHost({
|
|
|
9135
9329
|
fixtureId: fixtureId || void 0,
|
|
9136
9330
|
locale: ui.games.lang
|
|
9137
9331
|
});
|
|
9138
|
-
(0,
|
|
9332
|
+
(0, import_react57.useEffect)(() => {
|
|
9139
9333
|
if (conversation) hydrate();
|
|
9140
9334
|
}, [conversation, gameId]);
|
|
9141
|
-
const hydrateRef = (0,
|
|
9335
|
+
const hydrateRef = (0, import_react57.useRef)(hydrate);
|
|
9142
9336
|
hydrateRef.current = hydrate;
|
|
9143
|
-
(0,
|
|
9337
|
+
(0, import_react57.useEffect)(() => {
|
|
9144
9338
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
9145
9339
|
if (rawStatus !== "pending") return;
|
|
9146
9340
|
const timerId = setInterval(() => {
|
|
@@ -9252,65 +9446,11 @@ function GameScreenHost({
|
|
|
9252
9446
|
return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
|
|
9253
9447
|
}
|
|
9254
9448
|
|
|
9255
|
-
// src/components/games/ui/fonts.ts
|
|
9256
|
-
var FONTS_LINK_ID = "ss-w-games-fonts";
|
|
9257
|
-
var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
|
|
9258
|
-
function ensureGamesFonts(doc = document) {
|
|
9259
|
-
if (!doc.head) return;
|
|
9260
|
-
if (doc.getElementById(FONTS_LINK_ID)) return;
|
|
9261
|
-
const link = doc.createElement("link");
|
|
9262
|
-
link.id = FONTS_LINK_ID;
|
|
9263
|
-
link.rel = "stylesheet";
|
|
9264
|
-
link.href = FONTS_HREF;
|
|
9265
|
-
doc.head.appendChild(link);
|
|
9266
|
-
}
|
|
9267
|
-
|
|
9268
|
-
// src/components/GamesPanel.tsx
|
|
9269
|
-
var import_jsx_runtime90 = require("react/jsx-runtime");
|
|
9270
|
-
function GamesPanel({
|
|
9271
|
-
loggedIn,
|
|
9272
|
-
games,
|
|
9273
|
-
ui,
|
|
9274
|
-
conversation,
|
|
9275
|
-
leaderboard,
|
|
9276
|
-
refreshHub
|
|
9277
|
-
}) {
|
|
9278
|
-
const [selected, setSelected] = (0, import_react55.useState)(null);
|
|
9279
|
-
(0, import_react55.useEffect)(() => {
|
|
9280
|
-
ensureGamesFonts();
|
|
9281
|
-
}, []);
|
|
9282
|
-
if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(GamesLoginWall, { ui });
|
|
9283
|
-
if (selected !== null) {
|
|
9284
|
-
return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
|
|
9285
|
-
GameScreenHost,
|
|
9286
|
-
{
|
|
9287
|
-
selected,
|
|
9288
|
-
onBack: () => {
|
|
9289
|
-
setSelected(null);
|
|
9290
|
-
refreshHub?.();
|
|
9291
|
-
},
|
|
9292
|
-
onPlayed: refreshHub,
|
|
9293
|
-
conversation: conversation ?? null,
|
|
9294
|
-
ui
|
|
9295
|
-
}
|
|
9296
|
-
) });
|
|
9297
|
-
}
|
|
9298
|
-
return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
|
|
9299
|
-
GamesHub,
|
|
9300
|
-
{
|
|
9301
|
-
games,
|
|
9302
|
-
onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
|
|
9303
|
-
myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
|
|
9304
|
-
ui
|
|
9305
|
-
}
|
|
9306
|
-
) });
|
|
9307
|
-
}
|
|
9308
|
-
|
|
9309
9449
|
// src/components/Leaderboard.tsx
|
|
9310
|
-
var
|
|
9450
|
+
var import_react58 = require("react");
|
|
9311
9451
|
|
|
9312
9452
|
// src/components/LeaderboardRow.tsx
|
|
9313
|
-
var
|
|
9453
|
+
var import_jsx_runtime90 = require("react/jsx-runtime");
|
|
9314
9454
|
function formatPoints(n) {
|
|
9315
9455
|
return n.toLocaleString("en");
|
|
9316
9456
|
}
|
|
@@ -9319,14 +9459,14 @@ function LeaderboardWeeklyRow({
|
|
|
9319
9459
|
isMe
|
|
9320
9460
|
}) {
|
|
9321
9461
|
const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
|
|
9322
|
-
return /* @__PURE__ */ (0,
|
|
9323
|
-
/* @__PURE__ */ (0,
|
|
9462
|
+
return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
|
|
9463
|
+
/* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("span", { className: rankClass, children: [
|
|
9324
9464
|
"#",
|
|
9325
9465
|
row.rank
|
|
9326
9466
|
] }),
|
|
9327
|
-
/* @__PURE__ */ (0,
|
|
9328
|
-
/* @__PURE__ */ (0,
|
|
9329
|
-
row.currentStreak > 0 && /* @__PURE__ */ (0,
|
|
9467
|
+
/* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
9468
|
+
/* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
|
|
9469
|
+
row.currentStreak > 0 && /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("span", { className: "ss-w-lb2-streak", children: [
|
|
9330
9470
|
"\u{1F525} ",
|
|
9331
9471
|
row.currentStreak
|
|
9332
9472
|
] })
|
|
@@ -9337,18 +9477,18 @@ function LeaderboardAllTimeRow({
|
|
|
9337
9477
|
isMe
|
|
9338
9478
|
}) {
|
|
9339
9479
|
const rankClass = `ss-w-lb2-rank${row.rank <= 3 ? " ss-w-lb2-rank--top3" : ""}`;
|
|
9340
|
-
return /* @__PURE__ */ (0,
|
|
9341
|
-
/* @__PURE__ */ (0,
|
|
9480
|
+
return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("div", { className: `ss-w-lb2-row${isMe ? " ss-w-lb2-row--you" : ""}`, children: [
|
|
9481
|
+
/* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("span", { className: rankClass, children: [
|
|
9342
9482
|
"#",
|
|
9343
9483
|
row.rank
|
|
9344
9484
|
] }),
|
|
9345
|
-
/* @__PURE__ */ (0,
|
|
9346
|
-
/* @__PURE__ */ (0,
|
|
9485
|
+
/* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
9486
|
+
/* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
|
|
9347
9487
|
] });
|
|
9348
9488
|
}
|
|
9349
9489
|
|
|
9350
9490
|
// src/components/LeaderboardEmpty.tsx
|
|
9351
|
-
var
|
|
9491
|
+
var import_jsx_runtime91 = require("react/jsx-runtime");
|
|
9352
9492
|
function LeaderboardEmpty({
|
|
9353
9493
|
segment,
|
|
9354
9494
|
lastWeek,
|
|
@@ -9357,48 +9497,48 @@ function LeaderboardEmpty({
|
|
|
9357
9497
|
ui
|
|
9358
9498
|
}) {
|
|
9359
9499
|
if (segment === "alltime") {
|
|
9360
|
-
return /* @__PURE__ */ (0,
|
|
9361
|
-
/* @__PURE__ */ (0,
|
|
9362
|
-
/* @__PURE__ */ (0,
|
|
9500
|
+
return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
|
|
9501
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
|
|
9502
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
|
|
9363
9503
|
] });
|
|
9364
9504
|
}
|
|
9365
9505
|
const fresh = lastWeek != null;
|
|
9366
9506
|
const title = fresh ? ui.leaderboardEmptyFreshTitle : ui.leaderboardEmptyColdTitle;
|
|
9367
9507
|
const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
|
|
9368
|
-
return /* @__PURE__ */ (0,
|
|
9369
|
-
weeklyPrize && /* @__PURE__ */ (0,
|
|
9370
|
-
/* @__PURE__ */ (0,
|
|
9371
|
-
/* @__PURE__ */ (0,
|
|
9508
|
+
return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-empty", children: [
|
|
9509
|
+
weeklyPrize && /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-prize", children: [
|
|
9510
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
|
|
9511
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
|
|
9372
9512
|
] }),
|
|
9373
|
-
/* @__PURE__ */ (0,
|
|
9374
|
-
/* @__PURE__ */ (0,
|
|
9375
|
-
/* @__PURE__ */ (0,
|
|
9376
|
-
/* @__PURE__ */ (0,
|
|
9377
|
-
onPlay && /* @__PURE__ */ (0,
|
|
9513
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-empty-hero", children: [
|
|
9514
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
|
|
9515
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("h4", { className: "ss-w-lb-empty-title", children: title }),
|
|
9516
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("p", { className: "ss-w-lb-empty-body", children: body }),
|
|
9517
|
+
onPlay && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
|
|
9378
9518
|
] }),
|
|
9379
|
-
fresh && lastWeek && /* @__PURE__ */ (0,
|
|
9380
|
-
/* @__PURE__ */ (0,
|
|
9381
|
-
/* @__PURE__ */ (0,
|
|
9382
|
-
/* @__PURE__ */ (0,
|
|
9383
|
-
/* @__PURE__ */ (0,
|
|
9519
|
+
fresh && lastWeek && /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)("div", { className: "ss-w-lb-last", children: [
|
|
9520
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
|
|
9521
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
|
|
9522
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
|
|
9523
|
+
/* @__PURE__ */ (0, import_jsx_runtime91.jsx)("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
|
|
9384
9524
|
] })
|
|
9385
9525
|
] });
|
|
9386
9526
|
}
|
|
9387
9527
|
|
|
9388
9528
|
// src/components/Leaderboard.tsx
|
|
9389
|
-
var
|
|
9529
|
+
var import_jsx_runtime92 = require("react/jsx-runtime");
|
|
9390
9530
|
function Leaderboard({
|
|
9391
9531
|
data,
|
|
9392
9532
|
ui,
|
|
9393
9533
|
onPlay
|
|
9394
9534
|
}) {
|
|
9395
|
-
const [segment, setSegment] = (0,
|
|
9535
|
+
const [segment, setSegment] = (0, import_react58.useState)("weekly");
|
|
9396
9536
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
9397
9537
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
9398
9538
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
9399
|
-
return /* @__PURE__ */ (0,
|
|
9400
|
-
/* @__PURE__ */ (0,
|
|
9401
|
-
/* @__PURE__ */ (0,
|
|
9539
|
+
return /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb2", children: [
|
|
9540
|
+
/* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-seg", children: [
|
|
9541
|
+
/* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
|
|
9402
9542
|
"button",
|
|
9403
9543
|
{
|
|
9404
9544
|
type: "button",
|
|
@@ -9408,7 +9548,7 @@ function Leaderboard({
|
|
|
9408
9548
|
children: ui.leaderboardThisWeek
|
|
9409
9549
|
}
|
|
9410
9550
|
),
|
|
9411
|
-
/* @__PURE__ */ (0,
|
|
9551
|
+
/* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
|
|
9412
9552
|
"button",
|
|
9413
9553
|
{
|
|
9414
9554
|
type: "button",
|
|
@@ -9419,7 +9559,7 @@ function Leaderboard({
|
|
|
9419
9559
|
}
|
|
9420
9560
|
)
|
|
9421
9561
|
] }),
|
|
9422
|
-
isEmpty ? /* @__PURE__ */ (0,
|
|
9562
|
+
isEmpty ? /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
|
|
9423
9563
|
LeaderboardEmpty,
|
|
9424
9564
|
{
|
|
9425
9565
|
segment,
|
|
@@ -9428,15 +9568,15 @@ function Leaderboard({
|
|
|
9428
9568
|
onPlay,
|
|
9429
9569
|
ui
|
|
9430
9570
|
}
|
|
9431
|
-
) : /* @__PURE__ */ (0,
|
|
9432
|
-
/* @__PURE__ */ (0,
|
|
9571
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)(import_jsx_runtime92.Fragment, { children: [
|
|
9572
|
+
/* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
|
|
9433
9573
|
LeaderboardWeeklyRow,
|
|
9434
9574
|
{
|
|
9435
9575
|
row,
|
|
9436
9576
|
isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
|
|
9437
9577
|
},
|
|
9438
9578
|
row.operatorUserId
|
|
9439
|
-
)) : data.allTimeTop.map((row) => /* @__PURE__ */ (0,
|
|
9579
|
+
)) : data.allTimeTop.map((row) => /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(
|
|
9440
9580
|
LeaderboardAllTimeRow,
|
|
9441
9581
|
{
|
|
9442
9582
|
row,
|
|
@@ -9444,18 +9584,18 @@ function Leaderboard({
|
|
|
9444
9584
|
},
|
|
9445
9585
|
row.operatorUserId
|
|
9446
9586
|
)) }),
|
|
9447
|
-
/* @__PURE__ */ (0,
|
|
9448
|
-
myRow != null && (offBoard ? /* @__PURE__ */ (0,
|
|
9449
|
-
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ (0,
|
|
9450
|
-
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ (0,
|
|
9587
|
+
/* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
|
|
9588
|
+
myRow != null && (offBoard ? /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ (0, import_jsx_runtime92.jsxs)("div", { className: "ss-w-lb2-rows", children: [
|
|
9589
|
+
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
|
|
9590
|
+
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
|
|
9451
9591
|
] })),
|
|
9452
|
-
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ (0,
|
|
9592
|
+
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ (0, import_jsx_runtime92.jsx)("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
|
|
9453
9593
|
] })
|
|
9454
9594
|
] });
|
|
9455
9595
|
}
|
|
9456
9596
|
|
|
9457
9597
|
// src/components/LeaderboardPanel.tsx
|
|
9458
|
-
var
|
|
9598
|
+
var import_jsx_runtime93 = require("react/jsx-runtime");
|
|
9459
9599
|
var EMPTY_PAYLOAD = {
|
|
9460
9600
|
week: "",
|
|
9461
9601
|
weeklyTop: [],
|
|
@@ -9466,19 +9606,216 @@ var EMPTY_PAYLOAD = {
|
|
|
9466
9606
|
lastWeek: null
|
|
9467
9607
|
};
|
|
9468
9608
|
function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
|
|
9609
|
+
if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(GamesLoginWall, { ui });
|
|
9610
|
+
if (data === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-mon-list" });
|
|
9611
|
+
return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
|
|
9612
|
+
}
|
|
9613
|
+
|
|
9614
|
+
// src/components/games/ui/fonts.ts
|
|
9615
|
+
var FONTS_LINK_ID = "ss-w-games-fonts";
|
|
9616
|
+
var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
|
|
9617
|
+
function ensureGamesFonts(doc = document) {
|
|
9618
|
+
if (!doc.head) return;
|
|
9619
|
+
if (doc.getElementById(FONTS_LINK_ID)) return;
|
|
9620
|
+
const link = doc.createElement("link");
|
|
9621
|
+
link.id = FONTS_LINK_ID;
|
|
9622
|
+
link.rel = "stylesheet";
|
|
9623
|
+
link.href = FONTS_HREF;
|
|
9624
|
+
doc.head.appendChild(link);
|
|
9625
|
+
}
|
|
9626
|
+
|
|
9627
|
+
// src/components/GamesPanel.tsx
|
|
9628
|
+
var import_jsx_runtime94 = require("react/jsx-runtime");
|
|
9629
|
+
function GamesPanel({
|
|
9630
|
+
loggedIn,
|
|
9631
|
+
games,
|
|
9632
|
+
ui,
|
|
9633
|
+
conversation,
|
|
9634
|
+
leaderboard,
|
|
9635
|
+
leaderboardLoading,
|
|
9636
|
+
refreshHub
|
|
9637
|
+
}) {
|
|
9638
|
+
const [selected, setSelected] = (0, import_react59.useState)(null);
|
|
9639
|
+
const [segment, setSegment] = (0, import_react59.useState)("play");
|
|
9640
|
+
(0, import_react59.useEffect)(() => {
|
|
9641
|
+
ensureGamesFonts();
|
|
9642
|
+
}, []);
|
|
9469
9643
|
if (!loggedIn) return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(GamesLoginWall, { ui });
|
|
9470
|
-
if (
|
|
9471
|
-
|
|
9644
|
+
if (selected !== null) {
|
|
9645
|
+
return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
|
|
9646
|
+
GameScreenHost,
|
|
9647
|
+
{
|
|
9648
|
+
selected,
|
|
9649
|
+
onBack: () => {
|
|
9650
|
+
setSelected(null);
|
|
9651
|
+
refreshHub?.();
|
|
9652
|
+
},
|
|
9653
|
+
onPlayed: refreshHub,
|
|
9654
|
+
conversation: conversation ?? null,
|
|
9655
|
+
ui
|
|
9656
|
+
}
|
|
9657
|
+
) });
|
|
9658
|
+
}
|
|
9659
|
+
return /* @__PURE__ */ (0, import_jsx_runtime94.jsxs)("div", { className: "ss-g-hub-wrap", lang: ui.games.lang, children: [
|
|
9660
|
+
/* @__PURE__ */ (0, import_jsx_runtime94.jsxs)("div", { className: "ss-w-seg", children: [
|
|
9661
|
+
/* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
|
|
9662
|
+
"button",
|
|
9663
|
+
{
|
|
9664
|
+
type: "button",
|
|
9665
|
+
className: "ss-w-seg-btn",
|
|
9666
|
+
...segment === "play" ? { "data-on": "" } : {},
|
|
9667
|
+
onClick: () => setSegment("play"),
|
|
9668
|
+
children: ui.gamesPlaySegment
|
|
9669
|
+
}
|
|
9670
|
+
),
|
|
9671
|
+
/* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
|
|
9672
|
+
"button",
|
|
9673
|
+
{
|
|
9674
|
+
type: "button",
|
|
9675
|
+
className: "ss-w-seg-btn",
|
|
9676
|
+
...segment === "leaderboard" ? { "data-on": "" } : {},
|
|
9677
|
+
onClick: () => setSegment("leaderboard"),
|
|
9678
|
+
children: ui.tabLeaderboard
|
|
9679
|
+
}
|
|
9680
|
+
)
|
|
9681
|
+
] }),
|
|
9682
|
+
segment === "play" ? /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("div", { "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
|
|
9683
|
+
GamesHub,
|
|
9684
|
+
{
|
|
9685
|
+
games,
|
|
9686
|
+
onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
|
|
9687
|
+
myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
|
|
9688
|
+
ui
|
|
9689
|
+
}
|
|
9690
|
+
) }) : /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(
|
|
9691
|
+
LeaderboardPanel,
|
|
9692
|
+
{
|
|
9693
|
+
loggedIn,
|
|
9694
|
+
data: leaderboard ?? null,
|
|
9695
|
+
loading: leaderboardLoading ?? false,
|
|
9696
|
+
onPlay: () => setSegment("play"),
|
|
9697
|
+
ui
|
|
9698
|
+
}
|
|
9699
|
+
)
|
|
9700
|
+
] });
|
|
9472
9701
|
}
|
|
9473
9702
|
|
|
9474
|
-
// src/components/
|
|
9475
|
-
var import_react57 = require("react");
|
|
9703
|
+
// src/components/Fixtures.tsx
|
|
9476
9704
|
var import_jsx_runtime95 = require("react/jsx-runtime");
|
|
9705
|
+
function groupByRound(fixtures) {
|
|
9706
|
+
const groups = [];
|
|
9707
|
+
for (const fx of fixtures) {
|
|
9708
|
+
const last = groups[groups.length - 1];
|
|
9709
|
+
if (last && last.round === fx.round) last.items.push(fx);
|
|
9710
|
+
else groups.push({ round: fx.round, items: [fx] });
|
|
9711
|
+
}
|
|
9712
|
+
return groups;
|
|
9713
|
+
}
|
|
9714
|
+
function Fixtures({ fixtures, loading, ui }) {
|
|
9715
|
+
if (fixtures.length === 0) {
|
|
9716
|
+
if (loading) return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-mon-list" });
|
|
9717
|
+
return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-mon-empty", children: ui.clubFixturesEmpty });
|
|
9718
|
+
}
|
|
9719
|
+
return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-mon-list", children: groupByRound(fixtures).map((group, gi) => /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { children: [
|
|
9720
|
+
group.round && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "ss-w-club-eyebrow", children: group.round }),
|
|
9721
|
+
group.items.map((fx) => {
|
|
9722
|
+
const played = fx.homeScore !== null && fx.awayScore !== null;
|
|
9723
|
+
const kickoff = fx.matchDateTime ? ui.bettingKickoff(fx.matchDateTime) : null;
|
|
9724
|
+
return /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { className: "ss-w-mon", children: [
|
|
9725
|
+
/* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { className: "ss-w-mon-top", children: [
|
|
9726
|
+
fx.competitionName && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-comp", children: fx.competitionName }),
|
|
9727
|
+
!played && kickoff && /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("span", { className: "ss-w-mon-pill", children: [
|
|
9728
|
+
kickoff.dayLabel,
|
|
9729
|
+
" \xB7 ",
|
|
9730
|
+
kickoff.time
|
|
9731
|
+
] })
|
|
9732
|
+
] }),
|
|
9733
|
+
/* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("div", { className: "ss-w-mon-main", children: [
|
|
9734
|
+
/* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-side", children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-name", children: fx.homeTeamName }) }),
|
|
9735
|
+
played ? /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)("span", { className: "ss-w-mon-score", children: [
|
|
9736
|
+
fx.homeScore,
|
|
9737
|
+
/* @__PURE__ */ (0, import_jsx_runtime95.jsx)("i", { children: "-" }),
|
|
9738
|
+
fx.awayScore
|
|
9739
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-vs", children: "vs" }),
|
|
9740
|
+
/* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("span", { className: "ss-w-mon-name", children: fx.awayTeamName }) })
|
|
9741
|
+
] })
|
|
9742
|
+
] }, fx.id);
|
|
9743
|
+
})
|
|
9744
|
+
] }, `${gi}-${group.round ?? "none"}`)) });
|
|
9745
|
+
}
|
|
9746
|
+
|
|
9747
|
+
// src/components/Standings.tsx
|
|
9748
|
+
var import_jsx_runtime96 = require("react/jsx-runtime");
|
|
9749
|
+
function groupByTable(rows) {
|
|
9750
|
+
const groups = [];
|
|
9751
|
+
for (const row of rows) {
|
|
9752
|
+
const last = groups[groups.length - 1];
|
|
9753
|
+
if (last && last.table === row.table) last.items.push(row);
|
|
9754
|
+
else groups.push({ table: row.table, items: [row] });
|
|
9755
|
+
}
|
|
9756
|
+
return groups;
|
|
9757
|
+
}
|
|
9758
|
+
function Standings({ standings, loading, ui }) {
|
|
9759
|
+
if (standings === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-mon-list" });
|
|
9760
|
+
if (standings === null || standings.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-mon-empty", children: ui.clubStandingsEmpty });
|
|
9761
|
+
return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-mon-list", children: groupByTable(standings).map((group, gi) => /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("div", { className: "ss-w-table-wrap", children: [
|
|
9762
|
+
group.table && /* @__PURE__ */ (0, import_jsx_runtime96.jsx)("div", { className: "ss-w-club-eyebrow", children: group.table }),
|
|
9763
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("table", { className: "ss-w-md-table", children: [
|
|
9764
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("tr", { children: [
|
|
9765
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: "#" }),
|
|
9766
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColClub }),
|
|
9767
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColPlayed }),
|
|
9768
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColWon }),
|
|
9769
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColDrawn }),
|
|
9770
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColLost }),
|
|
9771
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColGoalDiff }),
|
|
9772
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("th", { children: ui.standingsColPoints })
|
|
9773
|
+
] }) }),
|
|
9774
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("tbody", { children: group.items.map((row) => /* @__PURE__ */ (0, import_jsx_runtime96.jsxs)("tr", { children: [
|
|
9775
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.position }),
|
|
9776
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.teamName }),
|
|
9777
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.playedGames }),
|
|
9778
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.wins }),
|
|
9779
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.draws }),
|
|
9780
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.losses }),
|
|
9781
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.goalDifference }),
|
|
9782
|
+
/* @__PURE__ */ (0, import_jsx_runtime96.jsx)("td", { children: row.points })
|
|
9783
|
+
] }, row.teamId)) })
|
|
9784
|
+
] })
|
|
9785
|
+
] }, `${gi}-${group.table ?? "none"}`)) });
|
|
9786
|
+
}
|
|
9787
|
+
|
|
9788
|
+
// src/components/Squad.tsx
|
|
9789
|
+
var import_jsx_runtime97 = require("react/jsx-runtime");
|
|
9790
|
+
function groupByPosition(players) {
|
|
9791
|
+
const groups = [];
|
|
9792
|
+
for (const p of players) {
|
|
9793
|
+
const last = groups[groups.length - 1];
|
|
9794
|
+
if (last && last.positionName === p.positionName) last.items.push(p);
|
|
9795
|
+
else groups.push({ positionName: p.positionName, items: [p] });
|
|
9796
|
+
}
|
|
9797
|
+
return groups;
|
|
9798
|
+
}
|
|
9799
|
+
function Squad({ squad, loading, ui }) {
|
|
9800
|
+
if (squad === null && loading) return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-mon-list" });
|
|
9801
|
+
if (squad === null || squad.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty });
|
|
9802
|
+
return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)("div", { children: [
|
|
9803
|
+
group.positionName && /* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { className: "ss-w-club-eyebrow", children: group.positionName }),
|
|
9804
|
+
group.items.map((p) => /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)("div", { className: "ss-w-sq-row", children: [
|
|
9805
|
+
/* @__PURE__ */ (0, import_jsx_runtime97.jsx)("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
|
|
9806
|
+
/* @__PURE__ */ (0, import_jsx_runtime97.jsx)("span", { className: "ss-w-sq-name", children: p.playerName })
|
|
9807
|
+
] }, p.playerId))
|
|
9808
|
+
] }, `${gi}-${group.positionName ?? "none"}`)) });
|
|
9809
|
+
}
|
|
9810
|
+
|
|
9811
|
+
// src/components/PresetSpeedDial.tsx
|
|
9812
|
+
var import_react60 = require("react");
|
|
9813
|
+
var import_jsx_runtime98 = require("react/jsx-runtime");
|
|
9477
9814
|
function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
|
|
9478
|
-
const pillsId = (0,
|
|
9815
|
+
const pillsId = (0, import_react60.useId)();
|
|
9479
9816
|
const tabIndex = expanded ? 0 : -1;
|
|
9480
|
-
return /* @__PURE__ */ (0,
|
|
9481
|
-
/* @__PURE__ */ (0,
|
|
9817
|
+
return /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("div", { ref: rootRef, className: "ss-w-dial", children: [
|
|
9818
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
|
|
9482
9819
|
"button",
|
|
9483
9820
|
{
|
|
9484
9821
|
ref: buttonRef,
|
|
@@ -9489,36 +9826,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
|
|
|
9489
9826
|
"aria-label": strings.dialName,
|
|
9490
9827
|
onClick: onToggle,
|
|
9491
9828
|
children: [
|
|
9492
|
-
/* @__PURE__ */ (0,
|
|
9493
|
-
/* @__PURE__ */ (0,
|
|
9494
|
-
showDot && !expanded ? /* @__PURE__ */ (0,
|
|
9829
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(SlidersIcon, {}) }),
|
|
9830
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ (0, import_jsx_runtime98.jsx)(CloseIcon, {}) }),
|
|
9831
|
+
showDot && !expanded ? /* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
|
|
9495
9832
|
]
|
|
9496
9833
|
}
|
|
9497
9834
|
),
|
|
9498
|
-
/* @__PURE__ */ (0,
|
|
9499
|
-
/* @__PURE__ */ (0,
|
|
9500
|
-
/* @__PURE__ */ (0,
|
|
9501
|
-
/* @__PURE__ */ (0,
|
|
9835
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
|
|
9836
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
|
|
9837
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsx)(SlidersIcon, {}),
|
|
9838
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
|
|
9502
9839
|
] }),
|
|
9503
|
-
/* @__PURE__ */ (0,
|
|
9504
|
-
/* @__PURE__ */ (0,
|
|
9505
|
-
/* @__PURE__ */ (0,
|
|
9840
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsxs)("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
|
|
9841
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsx)(ComboIcon, {}),
|
|
9842
|
+
/* @__PURE__ */ (0, import_jsx_runtime98.jsx)("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
|
|
9506
9843
|
] })
|
|
9507
9844
|
] })
|
|
9508
9845
|
] });
|
|
9509
9846
|
}
|
|
9510
9847
|
|
|
9511
9848
|
// src/components/PresetTools.tsx
|
|
9512
|
-
var
|
|
9513
|
-
var
|
|
9849
|
+
var import_react61 = require("react");
|
|
9850
|
+
var import_jsx_runtime99 = require("react/jsx-runtime");
|
|
9514
9851
|
var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
9515
9852
|
function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
9516
|
-
const dialogRef = (0,
|
|
9517
|
-
const titleId = (0,
|
|
9518
|
-
(0,
|
|
9853
|
+
const dialogRef = (0, import_react61.useRef)(null);
|
|
9854
|
+
const titleId = (0, import_react61.useId)();
|
|
9855
|
+
(0, import_react61.useEffect)(() => {
|
|
9519
9856
|
dialogRef.current?.focus();
|
|
9520
9857
|
}, []);
|
|
9521
|
-
(0,
|
|
9858
|
+
(0, import_react61.useEffect)(() => {
|
|
9522
9859
|
const onKey = (e) => {
|
|
9523
9860
|
if (e.key !== "Escape") return;
|
|
9524
9861
|
e.stopPropagation();
|
|
@@ -9548,79 +9885,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
|
9548
9885
|
first.focus();
|
|
9549
9886
|
}
|
|
9550
9887
|
};
|
|
9551
|
-
return /* @__PURE__ */ (0,
|
|
9552
|
-
/* @__PURE__ */ (0,
|
|
9553
|
-
/* @__PURE__ */ (0,
|
|
9554
|
-
/* @__PURE__ */ (0,
|
|
9888
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
|
|
9889
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-head", children: [
|
|
9890
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
|
|
9891
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(CloseIcon, {}) })
|
|
9555
9892
|
] }),
|
|
9556
|
-
/* @__PURE__ */ (0,
|
|
9557
|
-
footer ? /* @__PURE__ */ (0,
|
|
9893
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-body", children }),
|
|
9894
|
+
footer ? /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-foot", children: footer }) : null
|
|
9558
9895
|
] }) });
|
|
9559
9896
|
}
|
|
9560
9897
|
function fillTemplate(template, slots) {
|
|
9561
9898
|
return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
|
|
9562
9899
|
const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
|
|
9563
|
-
return /* @__PURE__ */ (0,
|
|
9900
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(import_react61.Fragment, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
|
|
9564
9901
|
});
|
|
9565
9902
|
}
|
|
9566
9903
|
function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
|
|
9567
9904
|
const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
|
|
9568
|
-
return /* @__PURE__ */ (0,
|
|
9569
|
-
/* @__PURE__ */ (0,
|
|
9570
|
-
/* @__PURE__ */ (0,
|
|
9905
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-num", children: [
|
|
9906
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
|
|
9907
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
|
|
9571
9908
|
const c = choices2[Number(e.target.value)];
|
|
9572
9909
|
if (c) onChoose(c.value);
|
|
9573
|
-
}, children: choices2.map((c, i) => /* @__PURE__ */ (0,
|
|
9910
|
+
}, children: choices2.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
|
|
9574
9911
|
] });
|
|
9575
9912
|
}
|
|
9576
9913
|
function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
|
|
9577
9914
|
const sizeText = sizeLabels[currentIdx] ?? "";
|
|
9578
|
-
return /* @__PURE__ */ (0,
|
|
9579
|
-
/* @__PURE__ */ (0,
|
|
9580
|
-
/* @__PURE__ */ (0,
|
|
9915
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-num", children: [
|
|
9916
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
|
|
9917
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("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__ */ (0, import_jsx_runtime99.jsx)("option", { value: String(i), children: opt }, i)) })
|
|
9581
9918
|
] });
|
|
9582
9919
|
}
|
|
9583
9920
|
function SendButton({ label, display, disabled, onClick }) {
|
|
9584
|
-
return /* @__PURE__ */ (0,
|
|
9921
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
|
|
9585
9922
|
}
|
|
9586
9923
|
function PickList({ picks, formatKickoff }) {
|
|
9587
|
-
return /* @__PURE__ */ (0,
|
|
9588
|
-
/* @__PURE__ */ (0,
|
|
9924
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("li", { className: "ss-w-tool-pick", children: [
|
|
9925
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-pick-match", children: [
|
|
9589
9926
|
p.homeTeamName,
|
|
9590
9927
|
" \u2013 ",
|
|
9591
9928
|
p.awayTeamName
|
|
9592
9929
|
] }),
|
|
9593
|
-
/* @__PURE__ */ (0,
|
|
9930
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("span", { className: "ss-w-tool-pick-sel", children: [
|
|
9594
9931
|
p.marketLabel,
|
|
9595
9932
|
": ",
|
|
9596
9933
|
p.selectionLabel,
|
|
9597
9934
|
p.line ? ` ${p.line}` : ""
|
|
9598
9935
|
] }),
|
|
9599
|
-
/* @__PURE__ */ (0,
|
|
9600
|
-
/* @__PURE__ */ (0,
|
|
9936
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
|
|
9937
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
|
|
9601
9938
|
] }, p.matchOddsId)) });
|
|
9602
9939
|
}
|
|
9603
9940
|
function ComboPreview({ cell, formatKickoff }) {
|
|
9604
|
-
return /* @__PURE__ */ (0,
|
|
9605
|
-
/* @__PURE__ */ (0,
|
|
9606
|
-
/* @__PURE__ */ (0,
|
|
9941
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(import_jsx_runtime99.Fragment, { children: [
|
|
9942
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)(PickList, { picks: cell.combo.legs, formatKickoff }),
|
|
9943
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
|
|
9607
9944
|
] });
|
|
9608
9945
|
}
|
|
9609
9946
|
function Unavailable({ text }) {
|
|
9610
|
-
return /* @__PURE__ */ (0,
|
|
9947
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-tool-unavailable", children: text });
|
|
9611
9948
|
}
|
|
9612
9949
|
function AskRow({ icon, ask, ready, send }) {
|
|
9613
|
-
return /* @__PURE__ */ (0,
|
|
9614
|
-
/* @__PURE__ */ (0,
|
|
9615
|
-
/* @__PURE__ */ (0,
|
|
9616
|
-
/* @__PURE__ */ (0,
|
|
9617
|
-
ready ? /* @__PURE__ */ (0,
|
|
9950
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
|
|
9951
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
|
|
9952
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-main", children: [
|
|
9953
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-tool-ask", children: ask }),
|
|
9954
|
+
ready ? /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-ready", children: ready }) : null
|
|
9618
9955
|
] }),
|
|
9619
9956
|
send
|
|
9620
9957
|
] });
|
|
9621
9958
|
}
|
|
9622
9959
|
function RoundSend({ label, display, disabled, onClick }) {
|
|
9623
|
-
return /* @__PURE__ */ (0,
|
|
9960
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(SendIcon, {}) });
|
|
9624
9961
|
}
|
|
9625
9962
|
var BIG_COMBO = { total: 50, legs: 6 };
|
|
9626
9963
|
function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
@@ -9629,15 +9966,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9629
9966
|
const totals = comboTotals(grid);
|
|
9630
9967
|
const legChoices = comboLegChoices(grid);
|
|
9631
9968
|
const count = FIXED_SINGLES_COUNT;
|
|
9632
|
-
const [maxPrice, setMaxPrice] = (0,
|
|
9633
|
-
const [minPrice, setMinPrice] = (0,
|
|
9634
|
-
const [start] = (0,
|
|
9635
|
-
const [total, setTotal] = (0,
|
|
9636
|
-
const [legs, setLegs] = (0,
|
|
9637
|
-
const [bigStart] = (0,
|
|
9638
|
-
const [bigTotal, setBigTotal] = (0,
|
|
9639
|
-
const [bigLegs, setBigLegs] = (0,
|
|
9640
|
-
const [announcement, setAnnouncement] = (0,
|
|
9969
|
+
const [maxPrice, setMaxPrice] = (0, import_react61.useState)(() => startSingles(grid.singles, limits, START.maxPrice, count));
|
|
9970
|
+
const [minPrice, setMinPrice] = (0, import_react61.useState)(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
|
|
9971
|
+
const [start] = (0, import_react61.useState)(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
|
|
9972
|
+
const [total, setTotal] = (0, import_react61.useState)(start.total);
|
|
9973
|
+
const [legs, setLegs] = (0, import_react61.useState)(start.legs);
|
|
9974
|
+
const [bigStart] = (0, import_react61.useState)(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
|
|
9975
|
+
const [bigTotal, setBigTotal] = (0, import_react61.useState)(bigStart.total);
|
|
9976
|
+
const [bigLegs, setBigLegs] = (0, import_react61.useState)(bigStart.legs);
|
|
9977
|
+
const [announcement, setAnnouncement] = (0, import_react61.useState)("");
|
|
9641
9978
|
const maxCell = findSingles(grid.singles, maxPrice, count);
|
|
9642
9979
|
const minCell = findSingles(grid.singlesFrom, minPrice, count);
|
|
9643
9980
|
const comboCell = findCombo(grid, total, legs);
|
|
@@ -9681,95 +10018,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9681
10018
|
const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
|
|
9682
10019
|
const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
|
|
9683
10020
|
const markets = grid.markets ?? [];
|
|
9684
|
-
const [marketIdx, setMarketIdx] = (0,
|
|
10021
|
+
const [marketIdx, setMarketIdx] = (0, import_react61.useState)(0);
|
|
9685
10022
|
const marketCell = markets[marketIdx] ?? null;
|
|
9686
10023
|
const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
|
|
9687
10024
|
const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
|
|
9688
10025
|
const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
|
|
9689
|
-
return /* @__PURE__ */ (0,
|
|
9690
|
-
/* @__PURE__ */ (0,
|
|
10026
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
|
|
10027
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
|
|
9691
10028
|
AskRow,
|
|
9692
10029
|
{
|
|
9693
10030
|
icon: "\u{1F3AF}",
|
|
9694
10031
|
ask: fillTemplate(strings.maxPriceRow, {
|
|
9695
10032
|
count: String(count),
|
|
9696
|
-
price: /* @__PURE__ */ (0,
|
|
10033
|
+
price: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
|
|
9697
10034
|
}),
|
|
9698
10035
|
ready: singlesReady(maxCell),
|
|
9699
|
-
send: /* @__PURE__ */ (0,
|
|
10036
|
+
send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
|
|
9700
10037
|
if (maxCell) onSend(maxPriceAsk(maxCell, strings));
|
|
9701
10038
|
} })
|
|
9702
10039
|
}
|
|
9703
10040
|
),
|
|
9704
|
-
/* @__PURE__ */ (0,
|
|
10041
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
|
|
9705
10042
|
AskRow,
|
|
9706
10043
|
{
|
|
9707
10044
|
icon: "\u{1F4C8}",
|
|
9708
10045
|
ask: fillTemplate(strings.minPriceRow, {
|
|
9709
10046
|
count: String(count),
|
|
9710
|
-
price: /* @__PURE__ */ (0,
|
|
10047
|
+
price: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
|
|
9711
10048
|
}),
|
|
9712
10049
|
ready: singlesReady(minCell),
|
|
9713
|
-
send: /* @__PURE__ */ (0,
|
|
10050
|
+
send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
|
|
9714
10051
|
if (minCell) onSend(minPriceAsk(minCell, strings));
|
|
9715
10052
|
} })
|
|
9716
10053
|
}
|
|
9717
10054
|
),
|
|
9718
|
-
/* @__PURE__ */ (0,
|
|
10055
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
|
|
9719
10056
|
AskRow,
|
|
9720
10057
|
{
|
|
9721
10058
|
icon: "\u2728",
|
|
9722
10059
|
ask: fillTemplate(strings.comboRow, {
|
|
9723
|
-
legs: /* @__PURE__ */ (0,
|
|
9724
|
-
total: /* @__PURE__ */ (0,
|
|
10060
|
+
legs: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
|
|
10061
|
+
total: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
|
|
9725
10062
|
}),
|
|
9726
10063
|
ready: comboReady(comboCell),
|
|
9727
|
-
send: /* @__PURE__ */ (0,
|
|
10064
|
+
send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
|
|
9728
10065
|
if (comboCell) onSend(comboAsk(comboCell, strings));
|
|
9729
10066
|
} })
|
|
9730
10067
|
}
|
|
9731
10068
|
),
|
|
9732
|
-
/* @__PURE__ */ (0,
|
|
10069
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
|
|
9733
10070
|
AskRow,
|
|
9734
10071
|
{
|
|
9735
10072
|
icon: "\u{1F3C6}",
|
|
9736
10073
|
ask: fillTemplate(strings.bigComboRow, {
|
|
9737
|
-
legs: /* @__PURE__ */ (0,
|
|
9738
|
-
total: /* @__PURE__ */ (0,
|
|
10074
|
+
legs: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
|
|
10075
|
+
total: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
|
|
9739
10076
|
}),
|
|
9740
10077
|
ready: comboReady(bigCell),
|
|
9741
|
-
send: /* @__PURE__ */ (0,
|
|
10078
|
+
send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
|
|
9742
10079
|
if (bigCell) onSend(comboAsk(bigCell, strings));
|
|
9743
10080
|
} })
|
|
9744
10081
|
}
|
|
9745
10082
|
),
|
|
9746
|
-
markets.length > 0 && /* @__PURE__ */ (0,
|
|
10083
|
+
markets.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(
|
|
9747
10084
|
AskRow,
|
|
9748
10085
|
{
|
|
9749
10086
|
icon: "\u26BD",
|
|
9750
10087
|
ask: fillTemplate(strings.marketRow, {
|
|
9751
|
-
market: /* @__PURE__ */ (0,
|
|
10088
|
+
market: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
|
|
9752
10089
|
}),
|
|
9753
10090
|
ready: marketCell ? strings.readyCount(marketCell.count) : null,
|
|
9754
|
-
send: /* @__PURE__ */ (0,
|
|
10091
|
+
send: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
|
|
9755
10092
|
if (marketCell) onSend(marketAsk(marketCell, strings));
|
|
9756
10093
|
} })
|
|
9757
10094
|
}
|
|
9758
10095
|
),
|
|
9759
|
-
/* @__PURE__ */ (0,
|
|
10096
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
|
|
9760
10097
|
] });
|
|
9761
10098
|
}
|
|
9762
10099
|
function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
|
|
9763
10100
|
const totals = comboTotals(grid);
|
|
9764
10101
|
const legChoices = comboLegChoices(grid);
|
|
9765
|
-
const [start] = (0,
|
|
9766
|
-
const [total, setTotal] = (0,
|
|
9767
|
-
const [legs, setLegs] = (0,
|
|
10102
|
+
const [start] = (0, import_react61.useState)(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
|
|
10103
|
+
const [total, setTotal] = (0, import_react61.useState)(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
|
|
10104
|
+
const [legs, setLegs] = (0, import_react61.useState)(() => {
|
|
9768
10105
|
if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
|
|
9769
10106
|
const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
|
|
9770
10107
|
return legsForTotal(grid, nearest(totals, initialTotal), from);
|
|
9771
10108
|
});
|
|
9772
|
-
const [announcement, setAnnouncement] = (0,
|
|
10109
|
+
const [announcement, setAnnouncement] = (0, import_react61.useState)("");
|
|
9773
10110
|
const cell = findCombo(grid, total, legs);
|
|
9774
10111
|
const minLegs = legChoices[0] ?? legs;
|
|
9775
10112
|
const maxLegs = legChoices[legChoices.length - 1] ?? legs;
|
|
@@ -9780,29 +10117,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
|
|
|
9780
10117
|
const d = strings.comboDisplay(nextLegs, nextTotal);
|
|
9781
10118
|
setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
|
|
9782
10119
|
};
|
|
9783
|
-
const footer = /* @__PURE__ */ (0,
|
|
10120
|
+
const footer = /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
|
|
9784
10121
|
if (cell) onSend(comboAsk(cell, strings));
|
|
9785
10122
|
} });
|
|
9786
|
-
return /* @__PURE__ */ (0,
|
|
9787
|
-
/* @__PURE__ */ (0,
|
|
9788
|
-
/* @__PURE__ */ (0,
|
|
9789
|
-
/* @__PURE__ */ (0,
|
|
10123
|
+
return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
|
|
10124
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
|
|
10125
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
|
|
10126
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ (0, import_jsx_runtime99.jsx)("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)) })
|
|
9790
10127
|
] }),
|
|
9791
|
-
/* @__PURE__ */ (0,
|
|
9792
|
-
/* @__PURE__ */ (0,
|
|
9793
|
-
/* @__PURE__ */ (0,
|
|
9794
|
-
/* @__PURE__ */ (0,
|
|
9795
|
-
/* @__PURE__ */ (0,
|
|
9796
|
-
/* @__PURE__ */ (0,
|
|
10128
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
|
|
10129
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
|
|
10130
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsxs)("div", { className: "ss-w-tool-stepper", children: [
|
|
10131
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
|
|
10132
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("span", { className: "ss-w-tool-count", children: legs }),
|
|
10133
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
|
|
9797
10134
|
] })
|
|
9798
10135
|
] }),
|
|
9799
|
-
cell ? /* @__PURE__ */ (0,
|
|
9800
|
-
/* @__PURE__ */ (0,
|
|
10136
|
+
cell ? /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(Unavailable, { text: strings.unavailable }),
|
|
10137
|
+
/* @__PURE__ */ (0, import_jsx_runtime99.jsx)("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
|
|
9801
10138
|
] });
|
|
9802
10139
|
}
|
|
9803
10140
|
|
|
9804
10141
|
// src/usePresetDial.ts
|
|
9805
|
-
var
|
|
10142
|
+
var import_react62 = require("react");
|
|
9806
10143
|
function sendInFlight(messages, isStreaming) {
|
|
9807
10144
|
const last = messages[messages.length - 1];
|
|
9808
10145
|
return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
|
|
@@ -9816,25 +10153,25 @@ function lastUserId(messages) {
|
|
|
9816
10153
|
}
|
|
9817
10154
|
var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
|
|
9818
10155
|
function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
|
|
9819
|
-
const [expanded, setExpanded] = (0,
|
|
9820
|
-
const fold = (0,
|
|
9821
|
-
const toggle = (0,
|
|
10156
|
+
const [expanded, setExpanded] = (0, import_react62.useState)(() => !sendInFlight(messages, isStreaming));
|
|
10157
|
+
const fold = (0, import_react62.useCallback)(() => setExpanded(false), []);
|
|
10158
|
+
const toggle = (0, import_react62.useCallback)(() => setExpanded((e) => !e), []);
|
|
9822
10159
|
const currentUserId = lastUserId(messages);
|
|
9823
|
-
const userIdRef = (0,
|
|
9824
|
-
(0,
|
|
10160
|
+
const userIdRef = (0, import_react62.useRef)(currentUserId);
|
|
10161
|
+
(0, import_react62.useEffect)(() => {
|
|
9825
10162
|
if (currentUserId === userIdRef.current) return;
|
|
9826
10163
|
userIdRef.current = currentUserId;
|
|
9827
10164
|
setExpanded(false);
|
|
9828
10165
|
}, [currentUserId]);
|
|
9829
|
-
const tabRef = (0,
|
|
9830
|
-
(0,
|
|
10166
|
+
const tabRef = (0, import_react62.useRef)(activeTab);
|
|
10167
|
+
(0, import_react62.useEffect)(() => {
|
|
9831
10168
|
if (activeTab === tabRef.current) return;
|
|
9832
10169
|
tabRef.current = activeTab;
|
|
9833
10170
|
setExpanded(false);
|
|
9834
10171
|
}, [activeTab]);
|
|
9835
|
-
const expandedRef = (0,
|
|
10172
|
+
const expandedRef = (0, import_react62.useRef)(expanded);
|
|
9836
10173
|
expandedRef.current = expanded;
|
|
9837
|
-
(0,
|
|
10174
|
+
(0, import_react62.useEffect)(() => {
|
|
9838
10175
|
const onEscape = (e) => {
|
|
9839
10176
|
const dial = dialRef.current;
|
|
9840
10177
|
if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
|
|
@@ -9847,7 +10184,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
|
|
|
9847
10184
|
window.addEventListener("keydown", onEscape, true);
|
|
9848
10185
|
return () => window.removeEventListener("keydown", onEscape, true);
|
|
9849
10186
|
}, [dialRef, dialButtonRef]);
|
|
9850
|
-
(0,
|
|
10187
|
+
(0, import_react62.useEffect)(() => {
|
|
9851
10188
|
if (!expanded) return;
|
|
9852
10189
|
const layer = layerRef.current;
|
|
9853
10190
|
const inDial = (e) => {
|
|
@@ -9899,11 +10236,11 @@ function markToolSeen() {
|
|
|
9899
10236
|
}
|
|
9900
10237
|
|
|
9901
10238
|
// src/components/ChatPanel.tsx
|
|
9902
|
-
var
|
|
10239
|
+
var import_jsx_runtime100 = require("react/jsx-runtime");
|
|
9903
10240
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
9904
10241
|
function useIsModal() {
|
|
9905
|
-
const [modal, setModal] = (0,
|
|
9906
|
-
(0,
|
|
10242
|
+
const [modal, setModal] = (0, import_react63.useState)(false);
|
|
10243
|
+
(0, import_react63.useEffect)(() => {
|
|
9907
10244
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
9908
10245
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
9909
10246
|
const sync = () => setModal(mql.matches);
|
|
@@ -9914,10 +10251,10 @@ function useIsModal() {
|
|
|
9914
10251
|
return modal;
|
|
9915
10252
|
}
|
|
9916
10253
|
var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
|
|
9917
|
-
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation, presetGrid }) {
|
|
10254
|
+
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, clubFixturesResult, clubStandingsResult, clubSquadResult, loggedIn, conversation, presetGrid }) {
|
|
9918
10255
|
const { state, close, stop, send, reset } = controller;
|
|
9919
10256
|
const isModal = useIsModal();
|
|
9920
|
-
(0,
|
|
10257
|
+
(0, import_react63.useEffect)(() => {
|
|
9921
10258
|
const onKey = (e) => {
|
|
9922
10259
|
if (e.key === "Escape") close();
|
|
9923
10260
|
};
|
|
@@ -9933,19 +10270,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9933
10270
|
monitor?.setActiveTab("chat");
|
|
9934
10271
|
send(text, { grounding });
|
|
9935
10272
|
};
|
|
9936
|
-
(0,
|
|
10273
|
+
(0, import_react63.useEffect)(() => {
|
|
9937
10274
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
9938
10275
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
9939
10276
|
const onChatTab = !monitor || monitor.activeTab === "chat";
|
|
9940
|
-
const layerRef = (0,
|
|
9941
|
-
const dialRef = (0,
|
|
9942
|
-
const dialButtonRef = (0,
|
|
9943
|
-
const inputRef = (0,
|
|
9944
|
-
const limitRef = (0,
|
|
9945
|
-
const typedSendRef = (0,
|
|
9946
|
-
const focusAfterCloseRef = (0,
|
|
9947
|
-
const [tool, setTool] = (0,
|
|
9948
|
-
const [toolSeen, setToolSeen] = (0,
|
|
10277
|
+
const layerRef = (0, import_react63.useRef)(null);
|
|
10278
|
+
const dialRef = (0, import_react63.useRef)(null);
|
|
10279
|
+
const dialButtonRef = (0, import_react63.useRef)(null);
|
|
10280
|
+
const inputRef = (0, import_react63.useRef)(null);
|
|
10281
|
+
const limitRef = (0, import_react63.useRef)(null);
|
|
10282
|
+
const typedSendRef = (0, import_react63.useRef)(false);
|
|
10283
|
+
const focusAfterCloseRef = (0, import_react63.useRef)(null);
|
|
10284
|
+
const [tool, setTool] = (0, import_react63.useState)(null);
|
|
10285
|
+
const [toolSeen, setToolSeen] = (0, import_react63.useState)(readToolSeen);
|
|
9949
10286
|
const dial = usePresetDial({
|
|
9950
10287
|
layerRef,
|
|
9951
10288
|
dialRef,
|
|
@@ -9957,53 +10294,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9957
10294
|
const { fold } = dial;
|
|
9958
10295
|
const paused = isPaused(state.limit);
|
|
9959
10296
|
const showDial = !!presetGrid && onChatTab && !tool && !paused;
|
|
9960
|
-
(0,
|
|
10297
|
+
(0, import_react63.useEffect)(() => {
|
|
9961
10298
|
if (paused) setTool(null);
|
|
9962
10299
|
}, [paused]);
|
|
9963
|
-
(0,
|
|
10300
|
+
(0, import_react63.useEffect)(() => {
|
|
9964
10301
|
if (!paused) return;
|
|
9965
10302
|
if (typedSendRef.current) limitRef.current?.focus();
|
|
9966
10303
|
typedSendRef.current = false;
|
|
9967
10304
|
}, [paused]);
|
|
9968
|
-
const openTool = (0,
|
|
10305
|
+
const openTool = (0, import_react63.useCallback)((next) => {
|
|
9969
10306
|
fold();
|
|
9970
10307
|
markToolSeen();
|
|
9971
10308
|
setToolSeen(true);
|
|
9972
10309
|
setTool(next);
|
|
9973
10310
|
}, [fold]);
|
|
9974
|
-
const onPill = (0,
|
|
9975
|
-
const toolsValue = (0,
|
|
10311
|
+
const onPill = (0, import_react63.useCallback)((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
|
|
10312
|
+
const toolsValue = (0, import_react63.useMemo)(
|
|
9976
10313
|
() => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
|
|
9977
10314
|
[presetGrid, paused, openTool, ui.presets.changeCombo]
|
|
9978
10315
|
);
|
|
9979
|
-
const closeTool = (0,
|
|
10316
|
+
const closeTool = (0, import_react63.useCallback)(() => {
|
|
9980
10317
|
focusAfterCloseRef.current = "dial";
|
|
9981
10318
|
setTool(null);
|
|
9982
10319
|
}, []);
|
|
9983
|
-
const sendAsk = (0,
|
|
10320
|
+
const sendAsk = (0, import_react63.useCallback)((ask) => {
|
|
9984
10321
|
focusAfterCloseRef.current = "composer";
|
|
9985
10322
|
setTool(null);
|
|
9986
10323
|
monitor?.setActiveTab("chat");
|
|
9987
10324
|
send(ask.message, { displayText: ask.displayText, preset: ask.preset });
|
|
9988
10325
|
}, [monitor, send]);
|
|
9989
|
-
const formatKickoff = (0,
|
|
10326
|
+
const formatKickoff = (0, import_react63.useCallback)((kickoffUtc) => {
|
|
9990
10327
|
const k = ui.bettingKickoff(kickoffUtc);
|
|
9991
10328
|
return `${k.dayLabel} ${k.time}`;
|
|
9992
10329
|
}, [ui]);
|
|
9993
|
-
(0,
|
|
10330
|
+
(0, import_react63.useEffect)(() => {
|
|
9994
10331
|
if (tool) return;
|
|
9995
10332
|
const target = focusAfterCloseRef.current;
|
|
9996
10333
|
focusAfterCloseRef.current = null;
|
|
9997
10334
|
if (target === "dial") dialButtonRef.current?.focus();
|
|
9998
10335
|
else if (target === "composer") inputRef.current?.focus();
|
|
9999
10336
|
}, [tool]);
|
|
10000
|
-
(0,
|
|
10337
|
+
(0, import_react63.useEffect)(() => {
|
|
10001
10338
|
if (!tool || onChatTab && presetGrid) return;
|
|
10002
10339
|
focusAfterCloseRef.current = "composer";
|
|
10003
10340
|
setTool(null);
|
|
10004
10341
|
}, [tool, onChatTab, presetGrid]);
|
|
10005
|
-
return /* @__PURE__ */ (0,
|
|
10006
|
-
/* @__PURE__ */ (0,
|
|
10342
|
+
return /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
10343
|
+
/* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
|
|
10007
10344
|
ChatHeader,
|
|
10008
10345
|
{
|
|
10009
10346
|
onClose: close,
|
|
@@ -10016,7 +10353,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10016
10353
|
moreOptionsLabel: ui.moreOptions
|
|
10017
10354
|
}
|
|
10018
10355
|
),
|
|
10019
|
-
monitor && /* @__PURE__ */ (0,
|
|
10356
|
+
monitor && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
|
|
10020
10357
|
TabBar,
|
|
10021
10358
|
{
|
|
10022
10359
|
monitor,
|
|
@@ -10025,12 +10362,13 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10025
10362
|
oddsCount: monitor.pins.filter((p) => p.kind !== "match").length,
|
|
10026
10363
|
todayCount: discovery?.liveCount ?? 0,
|
|
10027
10364
|
hasToday: discovery ? visibleGroupsOf(discovery.groups, discovery.states).length > 0 : false,
|
|
10028
|
-
gamesEnabled: gamesResult?.enabled ?? false
|
|
10365
|
+
gamesEnabled: gamesResult?.enabled ?? false,
|
|
10366
|
+
clubEnabled: clubFixturesResult?.enabled ?? false
|
|
10029
10367
|
}
|
|
10030
10368
|
),
|
|
10031
|
-
/* @__PURE__ */ (0,
|
|
10032
|
-
/* @__PURE__ */ (0,
|
|
10033
|
-
showDial ? /* @__PURE__ */ (0,
|
|
10369
|
+
/* @__PURE__ */ (0, import_jsx_runtime100.jsxs)("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
|
|
10370
|
+
/* @__PURE__ */ (0, import_jsx_runtime100.jsx)(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
|
|
10371
|
+
showDial ? /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
|
|
10034
10372
|
PresetSpeedDial,
|
|
10035
10373
|
{
|
|
10036
10374
|
expanded: dial.expanded,
|
|
@@ -10042,12 +10380,15 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10042
10380
|
buttonRef: dialButtonRef
|
|
10043
10381
|
}
|
|
10044
10382
|
) : null,
|
|
10045
|
-
tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ (0,
|
|
10383
|
+
tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
|
|
10046
10384
|
] }),
|
|
10047
|
-
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ (0,
|
|
10048
|
-
monitor && monitor.activeTab === "following" && /* @__PURE__ */ (0,
|
|
10049
|
-
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0,
|
|
10050
|
-
monitor && monitor.activeTab === "
|
|
10385
|
+
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(TodayPanel, { discovery, ui, monitor }),
|
|
10386
|
+
monitor && monitor.activeTab === "following" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
|
|
10387
|
+
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(OddsPanel, { monitor, ui, slip }),
|
|
10388
|
+
monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
|
|
10389
|
+
monitor && monitor.activeTab === "standings" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
|
|
10390
|
+
monitor && monitor.activeTab === "squad" && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(Squad, { squad: clubSquadResult?.data ?? null, loading: clubSquadResult?.loading ?? false, ui }),
|
|
10391
|
+
monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
|
|
10051
10392
|
GamesPanel,
|
|
10052
10393
|
{
|
|
10053
10394
|
loggedIn: !!loggedIn,
|
|
@@ -10055,25 +10396,16 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10055
10396
|
ui,
|
|
10056
10397
|
conversation,
|
|
10057
10398
|
leaderboard: leaderboardResult?.data ?? null,
|
|
10399
|
+
leaderboardLoading: leaderboardResult?.loading ?? false,
|
|
10058
10400
|
refreshHub: () => {
|
|
10059
10401
|
gamesResult.refresh();
|
|
10060
10402
|
leaderboardResult?.refresh();
|
|
10061
10403
|
}
|
|
10062
10404
|
}
|
|
10063
10405
|
),
|
|
10064
|
-
monitor
|
|
10065
|
-
|
|
10066
|
-
|
|
10067
|
-
loggedIn: !!loggedIn,
|
|
10068
|
-
data: leaderboardResult.data,
|
|
10069
|
-
loading: leaderboardResult.loading,
|
|
10070
|
-
onPlay: () => monitor.setActiveTab("games"),
|
|
10071
|
-
ui
|
|
10072
|
-
}
|
|
10073
|
-
),
|
|
10074
|
-
(!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ (0, import_jsx_runtime97.jsxs)(import_jsx_runtime97.Fragment, { children: [
|
|
10075
|
-
/* @__PURE__ */ (0, import_jsx_runtime97.jsx)("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
|
|
10076
|
-
paused ? null : /* @__PURE__ */ (0, import_jsx_runtime97.jsx)(
|
|
10406
|
+
(!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)(import_jsx_runtime100.Fragment, { children: [
|
|
10407
|
+
/* @__PURE__ */ (0, import_jsx_runtime100.jsx)("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
|
|
10408
|
+
paused ? null : /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(
|
|
10077
10409
|
ChatInput,
|
|
10078
10410
|
{
|
|
10079
10411
|
ref: inputRef,
|
|
@@ -10092,9 +10424,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10092
10424
|
}
|
|
10093
10425
|
|
|
10094
10426
|
// src/components/HostEventsProvider.tsx
|
|
10095
|
-
var
|
|
10427
|
+
var import_jsx_runtime101 = require("react/jsx-runtime");
|
|
10096
10428
|
function HostEventsProvider({ value, children }) {
|
|
10097
|
-
return /* @__PURE__ */ (0,
|
|
10429
|
+
return /* @__PURE__ */ (0, import_jsx_runtime101.jsx)(SlipStateContext.Provider, { value: value.slipState, children });
|
|
10098
10430
|
}
|
|
10099
10431
|
|
|
10100
10432
|
// src/styles/css.generated.ts
|
|
@@ -11250,6 +11582,11 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11250
11582
|
.ss-w-mk-ctx-right { display: flex; align-items: center; gap: 6px; margin-left: auto; flex: none; }
|
|
11251
11583
|
/* flex:1 keeps the composer pinned to the panel bottom when a tab is empty */
|
|
11252
11584
|
.ss-w-mon-empty { flex: 1; padding: 24px 16px; text-align: center; font-size: 12.5px; color: var(--ss-w-faint); }
|
|
11585
|
+
/* shared group-header label for Club Fixtures (round) and Squad (position) list groups */
|
|
11586
|
+
.ss-w-club-eyebrow { font-size: 10px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--ss-w-faint); padding: 10px 2px 4px; }
|
|
11587
|
+
.ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
|
|
11588
|
+
.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); }
|
|
11589
|
+
.ss-w-sq-name { font-size: 13px; font-weight: 600; color: var(--ss-w-ink); }
|
|
11253
11590
|
/* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
|
|
11254
11591
|
the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
|
|
11255
11592
|
a bare context line with nothing under it. */
|
|
@@ -11853,7 +12190,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11853
12190
|
`;
|
|
11854
12191
|
|
|
11855
12192
|
// src/StatsWidget.tsx
|
|
11856
|
-
var
|
|
12193
|
+
var import_jsx_runtime102 = require("react/jsx-runtime");
|
|
11857
12194
|
function buildClient(props) {
|
|
11858
12195
|
try {
|
|
11859
12196
|
if ("client" in props && props.client) {
|
|
@@ -11878,24 +12215,24 @@ function injectStyles(root) {
|
|
|
11878
12215
|
function StatsWidget(props) {
|
|
11879
12216
|
const injectedClient = "client" in props ? props.client : void 0;
|
|
11880
12217
|
const cfg = props.config;
|
|
11881
|
-
const built = (0,
|
|
11882
|
-
const logger = (0,
|
|
12218
|
+
const built = (0, import_react64.useMemo)(() => buildClient(props), [injectedClient, cfg?.operatorId, cfg?.publicKey, cfg?.baseUrl]);
|
|
12219
|
+
const logger = (0, import_react64.useMemo)(
|
|
11883
12220
|
() => built ? built.client.createEventLogger({
|
|
11884
12221
|
operatorUserId: cfg?.userContext?.operatorUserId,
|
|
11885
12222
|
anonymousUserId: cfg?.userContext?.anonymousUserId
|
|
11886
12223
|
}) : null,
|
|
11887
12224
|
[built?.client]
|
|
11888
12225
|
);
|
|
11889
|
-
const ui = (0,
|
|
11890
|
-
const rootRef = (0,
|
|
11891
|
-
const introDoneRef = (0,
|
|
11892
|
-
const markIntroDone = (0,
|
|
12226
|
+
const ui = (0, import_react64.useMemo)(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
12227
|
+
const rootRef = (0, import_react64.useRef)(null);
|
|
12228
|
+
const introDoneRef = (0, import_react64.useRef)(false);
|
|
12229
|
+
const markIntroDone = (0, import_react64.useCallback)(() => {
|
|
11893
12230
|
introDoneRef.current = true;
|
|
11894
12231
|
}, []);
|
|
11895
12232
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
11896
12233
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
11897
|
-
const [hasToday, setHasToday] = (0,
|
|
11898
|
-
const liveCardWatches = (0,
|
|
12234
|
+
const [hasToday, setHasToday] = (0, import_react64.useState)(false);
|
|
12235
|
+
const liveCardWatches = (0, import_react64.useMemo)(() => {
|
|
11899
12236
|
const seen = /* @__PURE__ */ new Set();
|
|
11900
12237
|
const out = [];
|
|
11901
12238
|
for (const msg of controller.state.messages) {
|
|
@@ -11909,29 +12246,31 @@ function StatsWidget(props) {
|
|
|
11909
12246
|
return out;
|
|
11910
12247
|
}, [controller.state.messages]);
|
|
11911
12248
|
const locale = cfg?.locale;
|
|
12249
|
+
const clubFixturesResult = useClubFixtures(built?.conversation ?? null);
|
|
11912
12250
|
const monitor = useLiveMonitor({
|
|
11913
12251
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins, locale) : Promise.resolve(null),
|
|
11914
12252
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|
|
11915
12253
|
storageKey: `ss-w-pins:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`,
|
|
11916
12254
|
isOpen: controller.state.isOpen,
|
|
11917
12255
|
hasToday,
|
|
11918
|
-
watches: liveCardWatches
|
|
12256
|
+
watches: liveCardWatches,
|
|
12257
|
+
clubEnabled: clubFixturesResult.enabled
|
|
11919
12258
|
});
|
|
11920
12259
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
11921
12260
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
11922
|
-
const getSchedule = (0,
|
|
12261
|
+
const getSchedule = (0, import_react64.useCallback)(
|
|
11923
12262
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
11924
12263
|
[built, operatorUserId, anonymousUserId]
|
|
11925
12264
|
);
|
|
11926
|
-
const postLeagueStar = (0,
|
|
12265
|
+
const postLeagueStar = (0, import_react64.useCallback)(
|
|
11927
12266
|
(competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
11928
12267
|
[built, operatorUserId, anonymousUserId]
|
|
11929
12268
|
);
|
|
11930
|
-
const getStates = (0,
|
|
12269
|
+
const getStates = (0, import_react64.useCallback)(
|
|
11931
12270
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
11932
12271
|
[built]
|
|
11933
12272
|
);
|
|
11934
|
-
const pinnedMatchIds = (0,
|
|
12273
|
+
const pinnedMatchIds = (0, import_react64.useMemo)(
|
|
11935
12274
|
() => monitor.pins.filter((p) => p.kind === "match").map((p) => p.matchId),
|
|
11936
12275
|
[monitor.pins]
|
|
11937
12276
|
);
|
|
@@ -11946,11 +12285,11 @@ function StatsWidget(props) {
|
|
|
11946
12285
|
pinnedMatchIds
|
|
11947
12286
|
});
|
|
11948
12287
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
11949
|
-
(0,
|
|
12288
|
+
(0, import_react64.useEffect)(() => {
|
|
11950
12289
|
setHasToday(todayHasContent);
|
|
11951
12290
|
}, [todayHasContent]);
|
|
11952
|
-
const prevLiveSnapshotRef = (0,
|
|
11953
|
-
(0,
|
|
12291
|
+
const prevLiveSnapshotRef = (0, import_react64.useRef)(monitor.snapshot);
|
|
12292
|
+
(0, import_react64.useEffect)(() => {
|
|
11954
12293
|
const snap = monitor.snapshot;
|
|
11955
12294
|
if (!snap || snap === prevLiveSnapshotRef.current) return;
|
|
11956
12295
|
prevLiveSnapshotRef.current = snap;
|
|
@@ -11986,14 +12325,16 @@ function StatsWidget(props) {
|
|
|
11986
12325
|
}, [monitor.snapshot]);
|
|
11987
12326
|
const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
11988
12327
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
11989
|
-
const
|
|
12328
|
+
const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12329
|
+
const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12330
|
+
const getPricePresets = (0, import_react64.useCallback)(
|
|
11990
12331
|
(locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
|
|
11991
12332
|
[built]
|
|
11992
12333
|
);
|
|
11993
12334
|
const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
|
|
11994
12335
|
const markTodayActivity = monitor.markTodayActivity;
|
|
11995
|
-
const prevLiveCountRef = (0,
|
|
11996
|
-
(0,
|
|
12336
|
+
const prevLiveCountRef = (0, import_react64.useRef)(0);
|
|
12337
|
+
(0, import_react64.useEffect)(() => {
|
|
11997
12338
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
11998
12339
|
prevLiveCountRef.current = discovery.liveCount;
|
|
11999
12340
|
if (rose) markTodayActivity();
|
|
@@ -12007,7 +12348,7 @@ function StatsWidget(props) {
|
|
|
12007
12348
|
closePanel: controller.close
|
|
12008
12349
|
});
|
|
12009
12350
|
const markAdded = hostEvents.markAdded;
|
|
12010
|
-
const slip = (0,
|
|
12351
|
+
const slip = (0, import_react64.useMemo)(
|
|
12011
12352
|
() => {
|
|
12012
12353
|
const handler = props.config?.onAddToSlip;
|
|
12013
12354
|
return {
|
|
@@ -12026,7 +12367,7 @@ function StatsWidget(props) {
|
|
|
12026
12367
|
},
|
|
12027
12368
|
[props.config?.onAddToSlip, controller.state.conversationId, markAdded]
|
|
12028
12369
|
);
|
|
12029
|
-
const onDashboardTap = (0,
|
|
12370
|
+
const onDashboardTap = (0, import_react64.useMemo)(
|
|
12030
12371
|
() => built ? createDashboardTapSignal((input) => built.conversation.sendSignal(input), logger) : void 0,
|
|
12031
12372
|
[built, logger]
|
|
12032
12373
|
);
|
|
@@ -12043,11 +12384,11 @@ function StatsWidget(props) {
|
|
|
12043
12384
|
})
|
|
12044
12385
|
}));
|
|
12045
12386
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
12046
|
-
(0,
|
|
12387
|
+
(0, import_react64.useEffect)(() => {
|
|
12047
12388
|
if (!logger) return;
|
|
12048
12389
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
12049
12390
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
12050
|
-
(0,
|
|
12391
|
+
(0, import_react64.useEffect)(() => {
|
|
12051
12392
|
if (!logger) return;
|
|
12052
12393
|
logger.resume();
|
|
12053
12394
|
const onHide = () => {
|
|
@@ -12065,14 +12406,14 @@ function StatsWidget(props) {
|
|
|
12065
12406
|
logger.dispose();
|
|
12066
12407
|
};
|
|
12067
12408
|
}, [logger]);
|
|
12068
|
-
(0,
|
|
12409
|
+
(0, import_react64.useEffect)(() => {
|
|
12069
12410
|
if (!built || !ui.injectStyles) return;
|
|
12070
12411
|
const node = rootRef.current?.getRootNode();
|
|
12071
12412
|
if (node) injectStyles(node);
|
|
12072
12413
|
}, [built, ui.injectStyles]);
|
|
12073
12414
|
if (!built) return null;
|
|
12074
12415
|
const attrs = themeAttrs(ui);
|
|
12075
|
-
return /* @__PURE__ */ (0,
|
|
12416
|
+
return /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ (0, import_jsx_runtime102.jsx)("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__ */ (0, import_jsx_runtime102.jsx)(
|
|
12076
12417
|
ChatPanel,
|
|
12077
12418
|
{
|
|
12078
12419
|
controller,
|
|
@@ -12083,11 +12424,14 @@ function StatsWidget(props) {
|
|
|
12083
12424
|
discovery,
|
|
12084
12425
|
gamesResult,
|
|
12085
12426
|
leaderboardResult,
|
|
12427
|
+
clubFixturesResult,
|
|
12428
|
+
clubStandingsResult,
|
|
12429
|
+
clubSquadResult,
|
|
12086
12430
|
loggedIn: !!operatorUserId,
|
|
12087
12431
|
conversation: built?.conversation ?? null,
|
|
12088
12432
|
presetGrid
|
|
12089
12433
|
}
|
|
12090
|
-
) : /* @__PURE__ */ (0,
|
|
12434
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime102.jsx)(
|
|
12091
12435
|
ChatFab,
|
|
12092
12436
|
{
|
|
12093
12437
|
label: ui.launcherLabel,
|