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