@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.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/StatsWidget.tsx
|
|
2
|
-
import { useCallback as
|
|
2
|
+
import { useCallback as useCallback21, useEffect as useEffect32, useMemo as useMemo6, useRef as useRef28, useState as useState51 } from "react";
|
|
3
3
|
import { StatsWidgetClient } from "@sensiblestats/widget-sdk";
|
|
4
4
|
|
|
5
5
|
// src/kickoff.ts
|
|
@@ -113,6 +113,20 @@ var STRINGS = {
|
|
|
113
113
|
accordionRetry: "Couldn't load odds \u2014 tap to retry",
|
|
114
114
|
accordionSuspended: "Suspended",
|
|
115
115
|
tabToday: "Today",
|
|
116
|
+
tabFixtures: "Fixtures",
|
|
117
|
+
tabStandings: "Standings",
|
|
118
|
+
tabSquad: "Squad",
|
|
119
|
+
clubFixturesEmpty: "No fixtures yet.",
|
|
120
|
+
clubStandingsEmpty: "Standings are not available yet.",
|
|
121
|
+
clubSquadEmpty: "Squad is not available yet.",
|
|
122
|
+
standingsColClub: "Club",
|
|
123
|
+
standingsColPlayed: "P",
|
|
124
|
+
standingsColWon: "W",
|
|
125
|
+
standingsColDrawn: "D",
|
|
126
|
+
standingsColLost: "L",
|
|
127
|
+
standingsColGoalDiff: "GD",
|
|
128
|
+
standingsColPoints: "Pts",
|
|
129
|
+
gamesPlaySegment: "Play",
|
|
116
130
|
sectionLive: "Live",
|
|
117
131
|
yourLeagues: "Your leagues",
|
|
118
132
|
topLeagues: "Top leagues",
|
|
@@ -480,6 +494,20 @@ var STRINGS = {
|
|
|
480
494
|
accordionRetry: "Oranlar y\xFCklenemedi \u2014 yeniden dene",
|
|
481
495
|
accordionSuspended: "Ask\u0131da",
|
|
482
496
|
tabToday: "Bug\xFCn",
|
|
497
|
+
tabFixtures: "Fikst\xFCr",
|
|
498
|
+
tabStandings: "Puan Durumu",
|
|
499
|
+
tabSquad: "Kadro",
|
|
500
|
+
clubFixturesEmpty: "Hen\xFCz fikst\xFCr yok.",
|
|
501
|
+
clubStandingsEmpty: "Puan durumu hen\xFCz mevcut de\u011Fil.",
|
|
502
|
+
clubSquadEmpty: "Kadro hen\xFCz mevcut de\u011Fil.",
|
|
503
|
+
standingsColClub: "Tak\u0131m",
|
|
504
|
+
standingsColPlayed: "O",
|
|
505
|
+
standingsColWon: "G",
|
|
506
|
+
standingsColDrawn: "B",
|
|
507
|
+
standingsColLost: "M",
|
|
508
|
+
standingsColGoalDiff: "AV",
|
|
509
|
+
standingsColPoints: "P",
|
|
510
|
+
gamesPlaySegment: "Oyna",
|
|
483
511
|
sectionLive: "Canl\u0131",
|
|
484
512
|
yourLeagues: "Liglerin",
|
|
485
513
|
topLeagues: "\xD6ne \xE7\u0131kan ligler",
|
|
@@ -844,6 +872,20 @@ function normalizeUi(cfg) {
|
|
|
844
872
|
tabFollowing: strings.tabFollowing,
|
|
845
873
|
tabOdds: strings.tabOdds,
|
|
846
874
|
tabToday: strings.tabToday,
|
|
875
|
+
tabFixtures: strings.tabFixtures,
|
|
876
|
+
tabStandings: strings.tabStandings,
|
|
877
|
+
tabSquad: strings.tabSquad,
|
|
878
|
+
clubFixturesEmpty: strings.clubFixturesEmpty,
|
|
879
|
+
clubStandingsEmpty: strings.clubStandingsEmpty,
|
|
880
|
+
clubSquadEmpty: strings.clubSquadEmpty,
|
|
881
|
+
standingsColClub: strings.standingsColClub,
|
|
882
|
+
standingsColPlayed: strings.standingsColPlayed,
|
|
883
|
+
standingsColWon: strings.standingsColWon,
|
|
884
|
+
standingsColDrawn: strings.standingsColDrawn,
|
|
885
|
+
standingsColLost: strings.standingsColLost,
|
|
886
|
+
standingsColGoalDiff: strings.standingsColGoalDiff,
|
|
887
|
+
standingsColPoints: strings.standingsColPoints,
|
|
888
|
+
gamesPlaySegment: strings.gamesPlaySegment,
|
|
847
889
|
sectionLive: strings.sectionLive,
|
|
848
890
|
yourLeagues: strings.yourLeagues,
|
|
849
891
|
topLeagues: strings.topLeagues,
|
|
@@ -2478,6 +2520,7 @@ function useLiveMonitor(opts) {
|
|
|
2478
2520
|
const marketOddsRef = useRef4(marketOdds);
|
|
2479
2521
|
marketOddsRef.current = marketOdds;
|
|
2480
2522
|
const hasToday = opts.hasToday ?? false;
|
|
2523
|
+
const clubEnabled = opts.clubEnabled ?? false;
|
|
2481
2524
|
const marketKey = (matchId, dev) => `${matchId}:${dev}`;
|
|
2482
2525
|
const getMarketOddsRef = useRef4(opts.getMarketOdds);
|
|
2483
2526
|
getMarketOddsRef.current = opts.getMarketOdds;
|
|
@@ -2654,12 +2697,16 @@ function useLiveMonitor(opts) {
|
|
|
2654
2697
|
if (wasEmpty && watchesLength > 0) void tick();
|
|
2655
2698
|
}, [watchesLength, tick]);
|
|
2656
2699
|
useEffect4(() => {
|
|
2700
|
+
if (clubEnabled && (activeTab === "today" || activeTab === "following" || activeTab === "odds")) {
|
|
2701
|
+
setActiveTabState("chat");
|
|
2702
|
+
return;
|
|
2703
|
+
}
|
|
2657
2704
|
const matchPins = pins.filter((p) => p.kind === "match").length;
|
|
2658
2705
|
const marketPins = pins.length - matchPins;
|
|
2659
2706
|
if (activeTab === "following" && matchPins === 0) setActiveTabState(hasToday ? "today" : "chat");
|
|
2660
2707
|
if (activeTab === "odds" && marketPins === 0) setActiveTabState(hasToday ? "today" : "chat");
|
|
2661
2708
|
if (activeTab === "today" && !hasToday) setActiveTabState("chat");
|
|
2662
|
-
}, [pins, activeTab, hasToday]);
|
|
2709
|
+
}, [pins, activeTab, hasToday, clubEnabled]);
|
|
2663
2710
|
const prevIsOpenRef = useRef4(false);
|
|
2664
2711
|
useEffect4(() => {
|
|
2665
2712
|
const wasClosed = !prevIsOpenRef.current;
|
|
@@ -3024,7 +3071,7 @@ function useLeaderboard(conversation, { activeTab }) {
|
|
|
3024
3071
|
const conversationRef = useRef7(conversation);
|
|
3025
3072
|
conversationRef.current = conversation;
|
|
3026
3073
|
useEffect7(() => {
|
|
3027
|
-
if (activeTab !== "
|
|
3074
|
+
if (activeTab !== "games") return;
|
|
3028
3075
|
let active = true;
|
|
3029
3076
|
const doFetch = async () => {
|
|
3030
3077
|
const conv = conversationRef.current;
|
|
@@ -3052,8 +3099,151 @@ function useLeaderboard(conversation, { activeTab }) {
|
|
|
3052
3099
|
return { data, loading, refresh };
|
|
3053
3100
|
}
|
|
3054
3101
|
|
|
3102
|
+
// src/useClubFixtures.ts
|
|
3103
|
+
import { useCallback as useCallback7, useEffect as useEffect8, useRef as useRef8, useState as useState7 } from "react";
|
|
3104
|
+
var CLUB_PROBE_RETRY_MS = 15e3;
|
|
3105
|
+
var CLUB_PROBE_MAX_ATTEMPTS = 3;
|
|
3106
|
+
function useClubFixtures(conversation) {
|
|
3107
|
+
const [enabled, setEnabled] = useState7(false);
|
|
3108
|
+
const [settled, setSettled] = useState7(false);
|
|
3109
|
+
const [fixtures, setFixtures] = useState7([]);
|
|
3110
|
+
const [loading, setLoading] = useState7(false);
|
|
3111
|
+
const [refreshCount, setRefreshCount] = useState7(0);
|
|
3112
|
+
const inFlightRef = useRef8(false);
|
|
3113
|
+
const hardOffRef = useRef8(false);
|
|
3114
|
+
const conversationRef = useRef8(conversation);
|
|
3115
|
+
conversationRef.current = conversation;
|
|
3116
|
+
const ready = conversation != null;
|
|
3117
|
+
useEffect8(() => {
|
|
3118
|
+
if (hardOffRef.current) return;
|
|
3119
|
+
let active = true;
|
|
3120
|
+
let retryTimeoutId;
|
|
3121
|
+
let attempts = 0;
|
|
3122
|
+
const doFetch = async () => {
|
|
3123
|
+
const conv = conversationRef.current;
|
|
3124
|
+
if (!conv || inFlightRef.current || !active) return;
|
|
3125
|
+
inFlightRef.current = true;
|
|
3126
|
+
setLoading(true);
|
|
3127
|
+
try {
|
|
3128
|
+
attempts += 1;
|
|
3129
|
+
const result = await conv.getClubFixtures();
|
|
3130
|
+
if (!active) return;
|
|
3131
|
+
if (result === null) {
|
|
3132
|
+
hardOffRef.current = true;
|
|
3133
|
+
setEnabled(false);
|
|
3134
|
+
setFixtures([]);
|
|
3135
|
+
} else {
|
|
3136
|
+
setFixtures(result.fixtures);
|
|
3137
|
+
setEnabled(true);
|
|
3138
|
+
}
|
|
3139
|
+
setSettled(true);
|
|
3140
|
+
} catch {
|
|
3141
|
+
if (!active) return;
|
|
3142
|
+
if (attempts < CLUB_PROBE_MAX_ATTEMPTS) {
|
|
3143
|
+
retryTimeoutId = window.setTimeout(() => {
|
|
3144
|
+
if (!hardOffRef.current) void doFetch();
|
|
3145
|
+
}, CLUB_PROBE_RETRY_MS);
|
|
3146
|
+
} else {
|
|
3147
|
+
setEnabled(false);
|
|
3148
|
+
setFixtures([]);
|
|
3149
|
+
setSettled(true);
|
|
3150
|
+
}
|
|
3151
|
+
} finally {
|
|
3152
|
+
inFlightRef.current = false;
|
|
3153
|
+
if (active) setLoading(false);
|
|
3154
|
+
}
|
|
3155
|
+
};
|
|
3156
|
+
void doFetch();
|
|
3157
|
+
return () => {
|
|
3158
|
+
active = false;
|
|
3159
|
+
inFlightRef.current = false;
|
|
3160
|
+
if (retryTimeoutId !== void 0) window.clearTimeout(retryTimeoutId);
|
|
3161
|
+
};
|
|
3162
|
+
}, [refreshCount, ready]);
|
|
3163
|
+
const refresh = useCallback7(() => setRefreshCount((c) => c + 1), []);
|
|
3164
|
+
return { enabled, settled, fixtures, loading, refresh };
|
|
3165
|
+
}
|
|
3166
|
+
|
|
3167
|
+
// src/useClubStandings.ts
|
|
3168
|
+
import { useCallback as useCallback8, useEffect as useEffect9, useRef as useRef9, useState as useState8 } from "react";
|
|
3169
|
+
function useClubStandings(conversation, { activeTab, enabled }) {
|
|
3170
|
+
const [data, setData] = useState8(null);
|
|
3171
|
+
const [loading, setLoading] = useState8(false);
|
|
3172
|
+
const [refreshCount, setRefreshCount] = useState8(0);
|
|
3173
|
+
const inFlightRef = useRef9(false);
|
|
3174
|
+
const conversationRef = useRef9(conversation);
|
|
3175
|
+
conversationRef.current = conversation;
|
|
3176
|
+
useEffect9(() => {
|
|
3177
|
+
if (activeTab !== "standings" || !enabled) return;
|
|
3178
|
+
let active = true;
|
|
3179
|
+
const doFetch = async () => {
|
|
3180
|
+
const conv = conversationRef.current;
|
|
3181
|
+
if (!conv || inFlightRef.current) return;
|
|
3182
|
+
inFlightRef.current = true;
|
|
3183
|
+
setLoading(true);
|
|
3184
|
+
try {
|
|
3185
|
+
const result = await conv.getClubStandings();
|
|
3186
|
+
if (active) setData(result?.rows ?? null);
|
|
3187
|
+
} catch {
|
|
3188
|
+
} finally {
|
|
3189
|
+
inFlightRef.current = false;
|
|
3190
|
+
if (active) setLoading(false);
|
|
3191
|
+
}
|
|
3192
|
+
};
|
|
3193
|
+
void doFetch();
|
|
3194
|
+
return () => {
|
|
3195
|
+
active = false;
|
|
3196
|
+
inFlightRef.current = false;
|
|
3197
|
+
};
|
|
3198
|
+
}, [activeTab, enabled, refreshCount]);
|
|
3199
|
+
const refresh = useCallback8(() => {
|
|
3200
|
+
setRefreshCount((c) => c + 1);
|
|
3201
|
+
}, []);
|
|
3202
|
+
const effectiveLoading = loading || activeTab === "standings" && enabled && data === null;
|
|
3203
|
+
return { data, loading: effectiveLoading, refresh };
|
|
3204
|
+
}
|
|
3205
|
+
|
|
3206
|
+
// src/useClubSquad.ts
|
|
3207
|
+
import { useCallback as useCallback9, useEffect as useEffect10, useRef as useRef10, useState as useState9 } from "react";
|
|
3208
|
+
function useClubSquad(conversation, { activeTab, enabled }) {
|
|
3209
|
+
const [data, setData] = useState9(null);
|
|
3210
|
+
const [loading, setLoading] = useState9(false);
|
|
3211
|
+
const [refreshCount, setRefreshCount] = useState9(0);
|
|
3212
|
+
const inFlightRef = useRef10(false);
|
|
3213
|
+
const conversationRef = useRef10(conversation);
|
|
3214
|
+
conversationRef.current = conversation;
|
|
3215
|
+
useEffect10(() => {
|
|
3216
|
+
if (activeTab !== "squad" || !enabled) return;
|
|
3217
|
+
let active = true;
|
|
3218
|
+
const doFetch = async () => {
|
|
3219
|
+
const conv = conversationRef.current;
|
|
3220
|
+
if (!conv || inFlightRef.current) return;
|
|
3221
|
+
inFlightRef.current = true;
|
|
3222
|
+
setLoading(true);
|
|
3223
|
+
try {
|
|
3224
|
+
const result = await conv.getClubSquad();
|
|
3225
|
+
if (active) setData(result?.players ?? null);
|
|
3226
|
+
} catch {
|
|
3227
|
+
} finally {
|
|
3228
|
+
inFlightRef.current = false;
|
|
3229
|
+
if (active) setLoading(false);
|
|
3230
|
+
}
|
|
3231
|
+
};
|
|
3232
|
+
void doFetch();
|
|
3233
|
+
return () => {
|
|
3234
|
+
active = false;
|
|
3235
|
+
inFlightRef.current = false;
|
|
3236
|
+
};
|
|
3237
|
+
}, [activeTab, enabled, refreshCount]);
|
|
3238
|
+
const refresh = useCallback9(() => {
|
|
3239
|
+
setRefreshCount((c) => c + 1);
|
|
3240
|
+
}, []);
|
|
3241
|
+
const effectiveLoading = loading || activeTab === "squad" && enabled && data === null;
|
|
3242
|
+
return { data, loading: effectiveLoading, refresh };
|
|
3243
|
+
}
|
|
3244
|
+
|
|
3055
3245
|
// src/usePresetGrid.ts
|
|
3056
|
-
import { useEffect as
|
|
3246
|
+
import { useEffect as useEffect11, useRef as useRef11, useState as useState10 } from "react";
|
|
3057
3247
|
|
|
3058
3248
|
// src/presetGrid.ts
|
|
3059
3249
|
var DEFAULT_SINGLES_LIMITS = [1.3, 1.5, 1.7, 2];
|
|
@@ -3196,22 +3386,22 @@ function marketDisplay(cell, s) {
|
|
|
3196
3386
|
// src/usePresetGrid.ts
|
|
3197
3387
|
var GRID_MAX_AGE_MS = 6e5;
|
|
3198
3388
|
function usePresetGrid({ getPricePresets, isOpen, locale, now = Date.now }) {
|
|
3199
|
-
const [grid, setGrid] =
|
|
3200
|
-
const keptRef =
|
|
3201
|
-
const localeRef =
|
|
3202
|
-
const inFlightRef =
|
|
3203
|
-
const mountedRef =
|
|
3204
|
-
const getRef =
|
|
3389
|
+
const [grid, setGrid] = useState10(null);
|
|
3390
|
+
const keptRef = useRef11(null);
|
|
3391
|
+
const localeRef = useRef11(locale);
|
|
3392
|
+
const inFlightRef = useRef11(false);
|
|
3393
|
+
const mountedRef = useRef11(true);
|
|
3394
|
+
const getRef = useRef11(getPricePresets);
|
|
3205
3395
|
getRef.current = getPricePresets;
|
|
3206
|
-
const nowRef =
|
|
3396
|
+
const nowRef = useRef11(now);
|
|
3207
3397
|
nowRef.current = now;
|
|
3208
|
-
|
|
3398
|
+
useEffect11(() => {
|
|
3209
3399
|
mountedRef.current = true;
|
|
3210
3400
|
return () => {
|
|
3211
3401
|
mountedRef.current = false;
|
|
3212
3402
|
};
|
|
3213
3403
|
}, []);
|
|
3214
|
-
|
|
3404
|
+
useEffect11(() => {
|
|
3215
3405
|
if (localeRef.current !== locale) {
|
|
3216
3406
|
localeRef.current = locale;
|
|
3217
3407
|
keptRef.current = null;
|
|
@@ -3261,11 +3451,11 @@ function useEventLog() {
|
|
|
3261
3451
|
}
|
|
3262
3452
|
|
|
3263
3453
|
// src/popupTelemetry.ts
|
|
3264
|
-
import { useCallback as
|
|
3454
|
+
import { useCallback as useCallback10, useEffect as useEffect12, useRef as useRef12 } from "react";
|
|
3265
3455
|
function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
3266
|
-
const shownRef =
|
|
3267
|
-
const closedTextRef =
|
|
3268
|
-
|
|
3456
|
+
const shownRef = useRef12(/* @__PURE__ */ new Set());
|
|
3457
|
+
const closedTextRef = useRef12(null);
|
|
3458
|
+
useEffect12(() => {
|
|
3269
3459
|
if (isOpen) {
|
|
3270
3460
|
if (closedTextRef.current) log?.log({ name: "popup_opened" });
|
|
3271
3461
|
closedTextRef.current = null;
|
|
@@ -3277,17 +3467,17 @@ function usePopupTelemetry(log, isOpen, popupText, dismissPopup) {
|
|
|
3277
3467
|
log?.log({ name: "popup_shown" });
|
|
3278
3468
|
}
|
|
3279
3469
|
}, [log, isOpen, popupText]);
|
|
3280
|
-
return
|
|
3470
|
+
return useCallback10(() => {
|
|
3281
3471
|
log?.log({ name: "popup_dismissed" });
|
|
3282
3472
|
dismissPopup();
|
|
3283
3473
|
}, [log, dismissPopup]);
|
|
3284
3474
|
}
|
|
3285
3475
|
|
|
3286
3476
|
// src/openTelemetry.ts
|
|
3287
|
-
import { useEffect as
|
|
3477
|
+
import { useEffect as useEffect13, useRef as useRef13 } from "react";
|
|
3288
3478
|
function useOpenTelemetry(log, isOpen) {
|
|
3289
|
-
const openLoggedRef =
|
|
3290
|
-
|
|
3479
|
+
const openLoggedRef = useRef13(false);
|
|
3480
|
+
useEffect13(() => {
|
|
3291
3481
|
if (!isOpen) {
|
|
3292
3482
|
openLoggedRef.current = false;
|
|
3293
3483
|
return;
|
|
@@ -3299,10 +3489,10 @@ function useOpenTelemetry(log, isOpen) {
|
|
|
3299
3489
|
}
|
|
3300
3490
|
|
|
3301
3491
|
// src/components/ChatFab.tsx
|
|
3302
|
-
import { useEffect as
|
|
3492
|
+
import { useEffect as useEffect14, useRef as useRef14, useState as useState12 } from "react";
|
|
3303
3493
|
|
|
3304
3494
|
// src/components/BrandMark.tsx
|
|
3305
|
-
import { useState as
|
|
3495
|
+
import { useState as useState11 } from "react";
|
|
3306
3496
|
|
|
3307
3497
|
// src/assets/logo.ts
|
|
3308
3498
|
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
@@ -3365,7 +3555,7 @@ function DashboardIcon({ name }) {
|
|
|
3365
3555
|
// src/components/BrandMark.tsx
|
|
3366
3556
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
3367
3557
|
function BrandMark({ logoUrl, className }) {
|
|
3368
|
-
const [failed, setFailed] =
|
|
3558
|
+
const [failed, setFailed] = useState11(false);
|
|
3369
3559
|
if (!logoUrl || failed) return /* @__PURE__ */ jsx2(SsMark, { className });
|
|
3370
3560
|
return /* @__PURE__ */ jsx2("img", { className, src: logoUrl, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3371
3561
|
}
|
|
@@ -3401,9 +3591,9 @@ function GreetingBubble({ text, onOpen, onDismiss, dismissLabel = "Dismiss", ask
|
|
|
3401
3591
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
3402
3592
|
function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup, dismissLabel = "Dismiss", introAllowed = false, onIntroStart, asks }) {
|
|
3403
3593
|
const bubble = popupText ?? greeting;
|
|
3404
|
-
const [intro, setIntro] =
|
|
3405
|
-
const armedRef =
|
|
3406
|
-
|
|
3594
|
+
const [intro, setIntro] = useState12(false);
|
|
3595
|
+
const armedRef = useRef14(introAllowed);
|
|
3596
|
+
useEffect14(() => {
|
|
3407
3597
|
if (armedRef.current && bubble) {
|
|
3408
3598
|
armedRef.current = false;
|
|
3409
3599
|
setIntro(true);
|
|
@@ -3417,10 +3607,10 @@ function ChatFab({ label, greeting, popupText, logoUrl, onOpen, onDismissPopup,
|
|
|
3417
3607
|
}
|
|
3418
3608
|
|
|
3419
3609
|
// src/components/ChatPanel.tsx
|
|
3420
|
-
import { useCallback as
|
|
3610
|
+
import { useCallback as useCallback20, useEffect as useEffect31, useMemo as useMemo5, useRef as useRef27, useState as useState50 } from "react";
|
|
3421
3611
|
|
|
3422
3612
|
// src/components/ChatHeader.tsx
|
|
3423
|
-
import { useEffect as
|
|
3613
|
+
import { useEffect as useEffect15, useRef as useRef15, useState as useState13 } from "react";
|
|
3424
3614
|
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
3425
3615
|
function ChatHeader({
|
|
3426
3616
|
onClose,
|
|
@@ -3432,15 +3622,15 @@ function ChatHeader({
|
|
|
3432
3622
|
newConversationLabel = "New conversation",
|
|
3433
3623
|
moreOptionsLabel = "More options"
|
|
3434
3624
|
}) {
|
|
3435
|
-
const [menuOpen, setMenuOpen] =
|
|
3436
|
-
const wrapRef =
|
|
3437
|
-
const kebabRef =
|
|
3438
|
-
const firstItemRef =
|
|
3625
|
+
const [menuOpen, setMenuOpen] = useState13(false);
|
|
3626
|
+
const wrapRef = useRef15(null);
|
|
3627
|
+
const kebabRef = useRef15(null);
|
|
3628
|
+
const firstItemRef = useRef15(null);
|
|
3439
3629
|
const hasMenu = !!(canReset && onNewConversation);
|
|
3440
|
-
|
|
3630
|
+
useEffect15(() => {
|
|
3441
3631
|
if (menuOpen) firstItemRef.current?.focus();
|
|
3442
3632
|
}, [menuOpen]);
|
|
3443
|
-
|
|
3633
|
+
useEffect15(() => {
|
|
3444
3634
|
if (!menuOpen) return;
|
|
3445
3635
|
const onPointer = (e) => {
|
|
3446
3636
|
if (!wrapRef.current?.contains(e.target)) setMenuOpen(false);
|
|
@@ -3496,7 +3686,7 @@ function ChatHeader({
|
|
|
3496
3686
|
}
|
|
3497
3687
|
|
|
3498
3688
|
// src/components/MessageList.tsx
|
|
3499
|
-
import { useEffect as
|
|
3689
|
+
import { useEffect as useEffect21, useRef as useRef18 } from "react";
|
|
3500
3690
|
|
|
3501
3691
|
// src/components/Markdown.tsx
|
|
3502
3692
|
import ReactMarkdown from "react-markdown";
|
|
@@ -3514,7 +3704,7 @@ function Markdown({ text }) {
|
|
|
3514
3704
|
}
|
|
3515
3705
|
|
|
3516
3706
|
// src/components/EntityCardList.tsx
|
|
3517
|
-
import { useState as
|
|
3707
|
+
import { useState as useState14 } from "react";
|
|
3518
3708
|
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
3519
3709
|
var MAX_VISIBLE = 3;
|
|
3520
3710
|
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
@@ -3598,7 +3788,7 @@ function ScopeTabs({ scopes, active, onSelect }) {
|
|
|
3598
3788
|
)) });
|
|
3599
3789
|
}
|
|
3600
3790
|
function EntityCardItem({ c }) {
|
|
3601
|
-
const [active, setActive] =
|
|
3791
|
+
const [active, setActive] = useState14(0);
|
|
3602
3792
|
const hasBody = c.scopes.length > 0;
|
|
3603
3793
|
if (!hasBody) {
|
|
3604
3794
|
return /* @__PURE__ */ jsx7("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ jsx7(CardHeader, { c, showScopeCrest: false }) });
|
|
@@ -3612,7 +3802,7 @@ function EntityCardItem({ c }) {
|
|
|
3612
3802
|
] });
|
|
3613
3803
|
}
|
|
3614
3804
|
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
3615
|
-
const [expanded, setExpanded] =
|
|
3805
|
+
const [expanded, setExpanded] = useState14(false);
|
|
3616
3806
|
if (cards.length === 0) return null;
|
|
3617
3807
|
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
3618
3808
|
const overflow = cards.length - MAX_VISIBLE;
|
|
@@ -3623,10 +3813,10 @@ function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMore
|
|
|
3623
3813
|
}
|
|
3624
3814
|
|
|
3625
3815
|
// src/components/AddToSlipButton.tsx
|
|
3626
|
-
import { useCallback as
|
|
3816
|
+
import { useCallback as useCallback12, useState as useState15 } from "react";
|
|
3627
3817
|
|
|
3628
3818
|
// src/slipAdd.ts
|
|
3629
|
-
import { useCallback as
|
|
3819
|
+
import { useCallback as useCallback11 } from "react";
|
|
3630
3820
|
import { isAddToSlipResult } from "@sensiblestats/widget-sdk";
|
|
3631
3821
|
|
|
3632
3822
|
// src/slipStateContext.ts
|
|
@@ -3648,7 +3838,7 @@ function useSlipAdd(slip, ui) {
|
|
|
3648
3838
|
const slipState = useSlipState();
|
|
3649
3839
|
const handler = slip.onAddToSlip;
|
|
3650
3840
|
const rawLabels = !!ui?.rawBettingLabels;
|
|
3651
|
-
return
|
|
3841
|
+
return useCallback11(async (selection, { marketDeveloperName, selectionLabel, line }) => {
|
|
3652
3842
|
if (!handler) return { kind: "failed" };
|
|
3653
3843
|
const pick = slipPickFields(selection, rawLabels ? selectionLabel : void 0, line);
|
|
3654
3844
|
if (marketDeveloperName !== void 0) {
|
|
@@ -3685,11 +3875,11 @@ function useSlipAdd(slip, ui) {
|
|
|
3685
3875
|
}
|
|
3686
3876
|
|
|
3687
3877
|
// src/components/Toast.tsx
|
|
3688
|
-
import { useEffect as
|
|
3878
|
+
import { useEffect as useEffect16 } from "react";
|
|
3689
3879
|
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
3690
3880
|
var DISMISS_MS = 4e3;
|
|
3691
3881
|
function Toast({ toast, onDismiss }) {
|
|
3692
|
-
|
|
3882
|
+
useEffect16(() => {
|
|
3693
3883
|
if (!toast) return;
|
|
3694
3884
|
const timer = setTimeout(onDismiss, DISMISS_MS);
|
|
3695
3885
|
return () => clearTimeout(timer);
|
|
@@ -3701,10 +3891,10 @@ function Toast({ toast, onDismiss }) {
|
|
|
3701
3891
|
// src/components/AddToSlipButton.tsx
|
|
3702
3892
|
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
3703
3893
|
function SlipButton({ selection, shownOdds, marketDeveloperName, selectionLabel, line, slip, ui, price, ariaLabel }) {
|
|
3704
|
-
const [pending, setPending] =
|
|
3705
|
-
const [settledLocal, setSettledLocal] =
|
|
3706
|
-
const [toast, setToast] =
|
|
3707
|
-
const dismiss =
|
|
3894
|
+
const [pending, setPending] = useState15(false);
|
|
3895
|
+
const [settledLocal, setSettledLocal] = useState15(false);
|
|
3896
|
+
const [toast, setToast] = useState15(null);
|
|
3897
|
+
const dismiss = useCallback12(() => setToast(null), []);
|
|
3708
3898
|
const add = useSlipAdd(slip, ui);
|
|
3709
3899
|
const slipState = useSlipState();
|
|
3710
3900
|
const handler = slip.onAddToSlip;
|
|
@@ -3792,14 +3982,14 @@ function OddsMovementBadge({
|
|
|
3792
3982
|
}
|
|
3793
3983
|
|
|
3794
3984
|
// src/components/Crest.tsx
|
|
3795
|
-
import { useState as
|
|
3985
|
+
import { useState as useState16 } from "react";
|
|
3796
3986
|
import { jsx as jsx11 } from "react/jsx-runtime";
|
|
3797
3987
|
function initials2(name) {
|
|
3798
3988
|
return (name ?? "").trim().slice(0, 1).toUpperCase() || "?";
|
|
3799
3989
|
}
|
|
3800
3990
|
function Crest2({ url, name, kind }) {
|
|
3801
3991
|
const cls = kind === "comp" ? "ss-w-bi-comp-logo" : "ss-w-bi-crest";
|
|
3802
|
-
const [failed, setFailed] =
|
|
3992
|
+
const [failed, setFailed] = useState16(false);
|
|
3803
3993
|
if (url && !failed) {
|
|
3804
3994
|
return /* @__PURE__ */ jsx11("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
3805
3995
|
}
|
|
@@ -3807,7 +3997,7 @@ function Crest2({ url, name, kind }) {
|
|
|
3807
3997
|
}
|
|
3808
3998
|
|
|
3809
3999
|
// src/components/PinToggle.tsx
|
|
3810
|
-
import { useCallback as
|
|
4000
|
+
import { useCallback as useCallback13, useState as useState17 } from "react";
|
|
3811
4001
|
import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
3812
4002
|
var PIN_GLYPHS = {
|
|
3813
4003
|
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" },
|
|
@@ -3815,8 +4005,8 @@ var PIN_GLYPHS = {
|
|
|
3815
4005
|
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" }
|
|
3816
4006
|
};
|
|
3817
4007
|
function PinToggle({ pin, monitor, ui, market }) {
|
|
3818
|
-
const [toast, setToast] =
|
|
3819
|
-
const dismiss =
|
|
4008
|
+
const [toast, setToast] = useState17(null);
|
|
4009
|
+
const dismiss = useCallback13(() => setToast(null), []);
|
|
3820
4010
|
const log = useEventLog();
|
|
3821
4011
|
if (!monitor || !monitor.enabled) return null;
|
|
3822
4012
|
const key = pinKey(pin);
|
|
@@ -3873,11 +4063,11 @@ function PinToggle({ pin, monitor, ui, market }) {
|
|
|
3873
4063
|
}
|
|
3874
4064
|
|
|
3875
4065
|
// src/components/PriceHistoryButton.tsx
|
|
3876
|
-
import { useCallback as
|
|
4066
|
+
import { useCallback as useCallback14, useState as useState18 } from "react";
|
|
3877
4067
|
import { jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
3878
4068
|
function PriceHistoryButton({ selection, monitor, ui }) {
|
|
3879
|
-
const [toast, setToast] =
|
|
3880
|
-
const dismiss =
|
|
4069
|
+
const [toast, setToast] = useState18(null);
|
|
4070
|
+
const dismiss = useCallback14(() => setToast(null), []);
|
|
3881
4071
|
const log = useEventLog();
|
|
3882
4072
|
if (!monitor || !monitor.enabled) return null;
|
|
3883
4073
|
const name = joinSelection(selection.selectionLabel ?? void 0, selection.line ?? void 0);
|
|
@@ -3992,15 +4182,15 @@ function BettingInsightList({ insights, ui, slip, monitor }) {
|
|
|
3992
4182
|
}
|
|
3993
4183
|
|
|
3994
4184
|
// src/components/AddAllToSlipButton.tsx
|
|
3995
|
-
import { useCallback as
|
|
4185
|
+
import { useCallback as useCallback15, useState as useState19 } from "react";
|
|
3996
4186
|
import { jsx as jsx15, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3997
4187
|
function AddAllToSlipButton({ legs, slip, ui }) {
|
|
3998
4188
|
const add = useSlipAdd(slip, ui);
|
|
3999
4189
|
const slipState = useSlipState();
|
|
4000
|
-
const [pending, setPending] =
|
|
4001
|
-
const [settledLocal, setSettledLocal] =
|
|
4002
|
-
const [toast, setToast] =
|
|
4003
|
-
const dismiss =
|
|
4190
|
+
const [pending, setPending] = useState19(false);
|
|
4191
|
+
const [settledLocal, setSettledLocal] = useState19({});
|
|
4192
|
+
const [toast, setToast] = useState19(null);
|
|
4193
|
+
const dismiss = useCallback15(() => setToast(null), []);
|
|
4004
4194
|
if (!ui || !slip.onAddToSlip || legs.length < 2) return null;
|
|
4005
4195
|
const settled = slipState ? slipState.settled : settledLocal;
|
|
4006
4196
|
const open = legs.filter((leg) => !settled[leg.matchOddsId]);
|
|
@@ -4110,7 +4300,7 @@ function ComboCardList({ cards, ui, slip, monitor }) {
|
|
|
4110
4300
|
}
|
|
4111
4301
|
|
|
4112
4302
|
// src/components/MarketOddsCardList.tsx
|
|
4113
|
-
import { useEffect as
|
|
4303
|
+
import { useEffect as useEffect17, useState as useState20 } from "react";
|
|
4114
4304
|
|
|
4115
4305
|
// src/components/AllMarketsButton.tsx
|
|
4116
4306
|
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
@@ -4173,7 +4363,7 @@ function fmtHhMm(iso, locale) {
|
|
|
4173
4363
|
return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
|
|
4174
4364
|
}
|
|
4175
4365
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
4176
|
-
const [open, setOpen] =
|
|
4366
|
+
const [open, setOpen] = useState20(false);
|
|
4177
4367
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
4178
4368
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
4179
4369
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
@@ -4183,9 +4373,9 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
4183
4373
|
const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
|
|
4184
4374
|
const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
|
|
4185
4375
|
const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
|
|
4186
|
-
const [, setStaleTick] =
|
|
4376
|
+
const [, setStaleTick] = useState20(0);
|
|
4187
4377
|
const watchStale = live != null && !isClosed && !isStale;
|
|
4188
|
-
|
|
4378
|
+
useEffect17(() => {
|
|
4189
4379
|
if (!watchStale) return;
|
|
4190
4380
|
const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
|
|
4191
4381
|
return () => window.clearTimeout(id);
|
|
@@ -4264,7 +4454,7 @@ function MarketOddsCardList({ cards, ui, slip, monitor, inSlipIds, hideHeader, p
|
|
|
4264
4454
|
}
|
|
4265
4455
|
|
|
4266
4456
|
// src/components/CompactOddsList.tsx
|
|
4267
|
-
import { useEffect as
|
|
4457
|
+
import { useEffect as useEffect18, useRef as useRef16, useState as useState21 } from "react";
|
|
4268
4458
|
|
|
4269
4459
|
// src/compactList.ts
|
|
4270
4460
|
var COMPACT_MIN_CARDS = 3;
|
|
@@ -4378,11 +4568,11 @@ function Row({ row, columns, ui, slip, monitor, rowRef }) {
|
|
|
4378
4568
|
] });
|
|
4379
4569
|
}
|
|
4380
4570
|
function CompactOddsList({ list, ui, slip, monitor }) {
|
|
4381
|
-
const [shown, setShown] =
|
|
4571
|
+
const [shown, setShown] = useState21(COMPACT_PAGE);
|
|
4382
4572
|
const hidden = list.rowCount - shown;
|
|
4383
|
-
const [focusIndex, setFocusIndex] =
|
|
4384
|
-
const focusRef =
|
|
4385
|
-
|
|
4573
|
+
const [focusIndex, setFocusIndex] = useState21(null);
|
|
4574
|
+
const focusRef = useRef16(null);
|
|
4575
|
+
useEffect18(() => {
|
|
4386
4576
|
if (focusIndex !== null) focusRef.current?.focus();
|
|
4387
4577
|
}, [focusIndex]);
|
|
4388
4578
|
let left = shown;
|
|
@@ -4687,7 +4877,7 @@ function FixtureCard({ card }) {
|
|
|
4687
4877
|
}
|
|
4688
4878
|
|
|
4689
4879
|
// src/components/dashboard/CountdownCard.tsx
|
|
4690
|
-
import { Fragment as Fragment6, useEffect as
|
|
4880
|
+
import { Fragment as Fragment6, useEffect as useEffect19, useState as useState22 } from "react";
|
|
4691
4881
|
import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
4692
4882
|
var DAY_MS = 864e5;
|
|
4693
4883
|
function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
@@ -4706,12 +4896,12 @@ function remainingSegments(kickoffUnix, nowMs, withSeconds) {
|
|
|
4706
4896
|
function CountdownCard({ card }) {
|
|
4707
4897
|
const { data } = card;
|
|
4708
4898
|
const unitLabel = { d: data.daysUnit, h: data.hoursUnit, m: data.minutesUnit, s: data.secondsUnit };
|
|
4709
|
-
const [nowMs, setNowMs] =
|
|
4710
|
-
const [reduced] =
|
|
4899
|
+
const [nowMs, setNowMs] = useState22(() => Date.now());
|
|
4900
|
+
const [reduced] = useState22(
|
|
4711
4901
|
() => typeof window !== "undefined" && window.matchMedia("(prefers-reduced-motion: reduce)").matches
|
|
4712
4902
|
);
|
|
4713
4903
|
const withinDay = data.kickoffUnix * 1e3 - nowMs < DAY_MS;
|
|
4714
|
-
|
|
4904
|
+
useEffect19(() => {
|
|
4715
4905
|
if (reduced) return;
|
|
4716
4906
|
const id = window.setInterval(() => setNowMs(Date.now()), withinDay ? 1e3 : 6e4);
|
|
4717
4907
|
return () => window.clearInterval(id);
|
|
@@ -4730,7 +4920,7 @@ function CountdownCard({ card }) {
|
|
|
4730
4920
|
}
|
|
4731
4921
|
|
|
4732
4922
|
// src/components/dashboard/InjuriesCard.tsx
|
|
4733
|
-
import { useState as
|
|
4923
|
+
import { useState as useState23 } from "react";
|
|
4734
4924
|
import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
4735
4925
|
var SHOWN = 3;
|
|
4736
4926
|
function ColHead({ name, crestUrl }) {
|
|
@@ -4753,7 +4943,7 @@ function InjuryList({ rows, emptyLabel, limit }) {
|
|
|
4753
4943
|
}
|
|
4754
4944
|
function InjuriesCard({ card, ui }) {
|
|
4755
4945
|
const { data } = card;
|
|
4756
|
-
const [expanded, setExpanded] =
|
|
4946
|
+
const [expanded, setExpanded] = useState23(false);
|
|
4757
4947
|
const hidden = Math.max(0, data.ours.length - SHOWN) + Math.max(0, data.theirs.length - SHOWN);
|
|
4758
4948
|
const limit = expanded ? void 0 : SHOWN;
|
|
4759
4949
|
const showMore = ui?.showMore ?? ((n) => `Show ${n} more`);
|
|
@@ -4859,7 +5049,7 @@ function LinksCard({ card }) {
|
|
|
4859
5049
|
}
|
|
4860
5050
|
|
|
4861
5051
|
// src/components/dashboard/PostMatchResultCard.tsx
|
|
4862
|
-
import { useState as
|
|
5052
|
+
import { useState as useState24 } from "react";
|
|
4863
5053
|
import { jsx as jsx32, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
4864
5054
|
function initials3(name) {
|
|
4865
5055
|
return name.trim().slice(0, 3).toUpperCase();
|
|
@@ -4869,7 +5059,7 @@ function PostMatchCrest({
|
|
|
4869
5059
|
name,
|
|
4870
5060
|
side
|
|
4871
5061
|
}) {
|
|
4872
|
-
const [failed, setFailed] =
|
|
5062
|
+
const [failed, setFailed] = useState24(false);
|
|
4873
5063
|
const cls = `ss-w-fandash-postmatch-crest ss-w-fandash-postmatch-crest--${side}`;
|
|
4874
5064
|
if (url && !failed) {
|
|
4875
5065
|
return /* @__PURE__ */ jsx32("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5068,10 +5258,10 @@ function RestingFormCard({ card }) {
|
|
|
5068
5258
|
}
|
|
5069
5259
|
|
|
5070
5260
|
// src/components/dashboard/LiveScoreCard.tsx
|
|
5071
|
-
import { useRef as
|
|
5261
|
+
import { useRef as useRef17, useState as useState26 } from "react";
|
|
5072
5262
|
|
|
5073
5263
|
// src/useLiveClock.ts
|
|
5074
|
-
import { useEffect as
|
|
5264
|
+
import { useEffect as useEffect20, useState as useState25 } from "react";
|
|
5075
5265
|
var TICK_MS = 6e4;
|
|
5076
5266
|
var MAX_LIVE_TICK_MINUTES = 15;
|
|
5077
5267
|
function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
@@ -5080,10 +5270,10 @@ function computeDisplayMinute(minute, clockRunning, receivedAtMs) {
|
|
|
5080
5270
|
return minute + Math.min(Math.max(0, elapsedMinutes), MAX_LIVE_TICK_MINUTES);
|
|
5081
5271
|
}
|
|
5082
5272
|
function useLiveClock(minute, clockRunning, receivedAtMs) {
|
|
5083
|
-
const [displayMinute, setDisplayMinute] =
|
|
5273
|
+
const [displayMinute, setDisplayMinute] = useState25(
|
|
5084
5274
|
() => computeDisplayMinute(minute, clockRunning, receivedAtMs)
|
|
5085
5275
|
);
|
|
5086
|
-
|
|
5276
|
+
useEffect20(() => {
|
|
5087
5277
|
setDisplayMinute(computeDisplayMinute(minute, clockRunning, receivedAtMs));
|
|
5088
5278
|
if (!clockRunning) return;
|
|
5089
5279
|
const id = window.setInterval(() => {
|
|
@@ -5100,7 +5290,7 @@ function initials5(name) {
|
|
|
5100
5290
|
return name.trim().slice(0, 3).toUpperCase();
|
|
5101
5291
|
}
|
|
5102
5292
|
function LiveCrest({ url, name, side }) {
|
|
5103
|
-
const [failed, setFailed] =
|
|
5293
|
+
const [failed, setFailed] = useState26(false);
|
|
5104
5294
|
const cls = `ss-w-fandash-live-crest ss-w-fandash-live-crest--${side}`;
|
|
5105
5295
|
if (url && !failed) {
|
|
5106
5296
|
return /* @__PURE__ */ jsx41("img", { className: cls, src: url, alt: "", "aria-hidden": "true", onError: () => setFailed(true) });
|
|
@@ -5119,7 +5309,7 @@ function LiveScoreCard({
|
|
|
5119
5309
|
}) {
|
|
5120
5310
|
const { data } = card;
|
|
5121
5311
|
const seedKey = `${data.minute}:${data.homeScore}:${data.awayScore}`;
|
|
5122
|
-
const seedRef =
|
|
5312
|
+
const seedRef = useRef17(null);
|
|
5123
5313
|
if (!seedRef.current || seedRef.current.key !== seedKey) {
|
|
5124
5314
|
seedRef.current = { key: seedKey, receivedAtMs: Date.now() };
|
|
5125
5315
|
}
|
|
@@ -5159,7 +5349,7 @@ function LiveScoreCard({
|
|
|
5159
5349
|
}
|
|
5160
5350
|
|
|
5161
5351
|
// src/components/dashboard/LiveTimelineCard.tsx
|
|
5162
|
-
import { useState as
|
|
5352
|
+
import { useState as useState27 } from "react";
|
|
5163
5353
|
import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
5164
5354
|
var SHOWN2 = 3;
|
|
5165
5355
|
function EventIcon({ type }) {
|
|
@@ -5201,7 +5391,7 @@ function EventRow({ e }) {
|
|
|
5201
5391
|
] });
|
|
5202
5392
|
}
|
|
5203
5393
|
function LiveTimelineCard({ card, ui }) {
|
|
5204
|
-
const [expanded, setExpanded] =
|
|
5394
|
+
const [expanded, setExpanded] = useState27(false);
|
|
5205
5395
|
const events = card.data.events;
|
|
5206
5396
|
if (!events || events.length === 0) return null;
|
|
5207
5397
|
const sorted = [...events].sort((a, b) => b.minute - a.minute);
|
|
@@ -5443,11 +5633,11 @@ function turnAnchor(messages) {
|
|
|
5443
5633
|
}
|
|
5444
5634
|
function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
5445
5635
|
const { state, send } = controller;
|
|
5446
|
-
const listRef =
|
|
5447
|
-
const endRef =
|
|
5448
|
-
const pinnedRef =
|
|
5449
|
-
const anchoredTurnRef =
|
|
5450
|
-
|
|
5636
|
+
const listRef = useRef18(null);
|
|
5637
|
+
const endRef = useRef18(null);
|
|
5638
|
+
const pinnedRef = useRef18(true);
|
|
5639
|
+
const anchoredTurnRef = useRef18(null);
|
|
5640
|
+
useEffect21(() => {
|
|
5451
5641
|
const anchor = turnAnchor(state.messages);
|
|
5452
5642
|
const list = listRef.current;
|
|
5453
5643
|
if (anchor && anchor.turnId !== anchoredTurnRef.current) {
|
|
@@ -5504,13 +5694,13 @@ function MessageList({ controller, ui, slip, onDashboardTap, monitor }) {
|
|
|
5504
5694
|
}
|
|
5505
5695
|
|
|
5506
5696
|
// src/components/ChatInput.tsx
|
|
5507
|
-
import { forwardRef, useEffect as
|
|
5697
|
+
import { forwardRef, useEffect as useEffect22, useImperativeHandle, useRef as useRef19, useState as useState28 } from "react";
|
|
5508
5698
|
import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
5509
5699
|
var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend, onStop, stopLabel = "Stop response", sendLabel = "Send message", disabled = false, onType }, ref) {
|
|
5510
|
-
const [value, setValue] =
|
|
5511
|
-
const textareaRef =
|
|
5512
|
-
const stopRef =
|
|
5513
|
-
const textBoxWantsFocusRef =
|
|
5700
|
+
const [value, setValue] = useState28("");
|
|
5701
|
+
const textareaRef = useRef19(null);
|
|
5702
|
+
const stopRef = useRef19(null);
|
|
5703
|
+
const textBoxWantsFocusRef = useRef19(false);
|
|
5514
5704
|
const submit = () => {
|
|
5515
5705
|
if (disabled) return;
|
|
5516
5706
|
const t = value.trim();
|
|
@@ -5536,7 +5726,7 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
|
|
|
5536
5726
|
stopRef.current?.focus();
|
|
5537
5727
|
}
|
|
5538
5728
|
}), []);
|
|
5539
|
-
|
|
5729
|
+
useEffect22(() => {
|
|
5540
5730
|
if (streaming || disabled || !textBoxWantsFocusRef.current) return;
|
|
5541
5731
|
textBoxWantsFocusRef.current = false;
|
|
5542
5732
|
const box = textareaRef.current;
|
|
@@ -5569,16 +5759,19 @@ var ChatInput = forwardRef(function ChatInput2({ placeholder, streaming, onSend,
|
|
|
5569
5759
|
|
|
5570
5760
|
// src/components/TabBar.tsx
|
|
5571
5761
|
import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
5572
|
-
function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled }) {
|
|
5762
|
+
function TabBar({ monitor, ui, matchCount, oddsCount, todayCount, hasToday, gamesEnabled, clubEnabled }) {
|
|
5573
5763
|
const tabs = [
|
|
5574
5764
|
{ tab: "chat", label: ui.tabChat, count: 0, dot: monitor.chatDot },
|
|
5575
|
-
...
|
|
5576
|
-
|
|
5577
|
-
|
|
5578
|
-
|
|
5579
|
-
|
|
5580
|
-
{ tab: "
|
|
5581
|
-
|
|
5765
|
+
...clubEnabled ? [
|
|
5766
|
+
{ tab: "fixtures", label: ui.tabFixtures, count: 0, dot: false },
|
|
5767
|
+
{ tab: "standings", label: ui.tabStandings, count: 0, dot: false },
|
|
5768
|
+
{ tab: "squad", label: ui.tabSquad, count: 0, dot: false }
|
|
5769
|
+
] : [
|
|
5770
|
+
...hasToday ? [{ tab: "today", label: ui.tabToday, count: todayCount, dot: monitor.todayDot }] : [],
|
|
5771
|
+
...matchCount > 0 ? [{ tab: "following", label: ui.tabFollowing, count: matchCount, dot: monitor.matchesDot }] : [],
|
|
5772
|
+
...oddsCount > 0 ? [{ tab: "odds", label: ui.tabOdds, count: oddsCount, dot: monitor.oddsDot }] : []
|
|
5773
|
+
],
|
|
5774
|
+
...gamesEnabled ? [{ tab: "games", label: ui.tabGames, count: 0, dot: false }] : []
|
|
5582
5775
|
];
|
|
5583
5776
|
if (tabs.length < 2) return null;
|
|
5584
5777
|
return /* @__PURE__ */ jsx50("div", { className: "ss-w-tabs", role: "tablist", children: tabs.map(({ tab, label, count, dot }) => {
|
|
@@ -5658,10 +5851,10 @@ function MarketAccordion({ match, monitor, ui, slip }) {
|
|
|
5658
5851
|
}
|
|
5659
5852
|
|
|
5660
5853
|
// src/components/LiveFactBlock.tsx
|
|
5661
|
-
import { useState as
|
|
5854
|
+
import { useState as useState29 } from "react";
|
|
5662
5855
|
import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
5663
5856
|
function LiveFactBlock({ facts, matchId, ui, slip, onAsk }) {
|
|
5664
|
-
const [expanded, setExpanded] =
|
|
5857
|
+
const [expanded, setExpanded] = useState29(false);
|
|
5665
5858
|
const [current, ...earlier] = facts;
|
|
5666
5859
|
if (!current) return null;
|
|
5667
5860
|
const m = current.market;
|
|
@@ -5927,7 +6120,7 @@ function OddsPanel({ monitor, ui, slip }) {
|
|
|
5927
6120
|
}
|
|
5928
6121
|
|
|
5929
6122
|
// src/components/TodayPanel.tsx
|
|
5930
|
-
import { useEffect as
|
|
6123
|
+
import { useEffect as useEffect24, useId as useId2, useMemo as useMemo4, useState as useState32 } from "react";
|
|
5931
6124
|
|
|
5932
6125
|
// src/placement.ts
|
|
5933
6126
|
function placeLeagues(visible, pinnedMatchIds) {
|
|
@@ -5990,11 +6183,11 @@ function matchingFixtures(group, query) {
|
|
|
5990
6183
|
}
|
|
5991
6184
|
|
|
5992
6185
|
// src/useStarTap.ts
|
|
5993
|
-
import { useCallback as
|
|
6186
|
+
import { useCallback as useCallback16, useRef as useRef20, useState as useState30 } from "react";
|
|
5994
6187
|
function useStarTap(starLeague) {
|
|
5995
|
-
const [pendingId, setPendingId] =
|
|
5996
|
-
const pendingRef =
|
|
5997
|
-
const tap =
|
|
6188
|
+
const [pendingId, setPendingId] = useState30(null);
|
|
6189
|
+
const pendingRef = useRef20(null);
|
|
6190
|
+
const tap = useCallback16(async (competitionId, next) => {
|
|
5998
6191
|
if (pendingRef.current !== null) return false;
|
|
5999
6192
|
pendingRef.current = competitionId;
|
|
6000
6193
|
setPendingId(competitionId);
|
|
@@ -6053,7 +6246,7 @@ function LeagueTile({ group, starClickable: starClickable2, disambiguate, onOpen
|
|
|
6053
6246
|
}
|
|
6054
6247
|
|
|
6055
6248
|
// src/components/LeagueDetail.tsx
|
|
6056
|
-
import { useEffect as
|
|
6249
|
+
import { useEffect as useEffect23, useState as useState31 } from "react";
|
|
6057
6250
|
|
|
6058
6251
|
// src/components/FixtureRow.tsx
|
|
6059
6252
|
import { jsx as jsx56, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
@@ -6088,11 +6281,11 @@ function FixtureRow({ match, state, stale, ui, monitor }) {
|
|
|
6088
6281
|
import { jsx as jsx57, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
6089
6282
|
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";
|
|
6090
6283
|
function LeagueDetail({ group, position, states, stale, ui, monitor, starTap, onBack, onPrev, onNext }) {
|
|
6091
|
-
const [toast, setToast] =
|
|
6092
|
-
|
|
6284
|
+
const [toast, setToast] = useState31(null);
|
|
6285
|
+
useEffect23(() => {
|
|
6093
6286
|
setToast(null);
|
|
6094
6287
|
}, [group.competitionId]);
|
|
6095
|
-
|
|
6288
|
+
useEffect23(() => {
|
|
6096
6289
|
if (toast === null) return;
|
|
6097
6290
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6098
6291
|
return () => clearTimeout(id);
|
|
@@ -6224,7 +6417,7 @@ function LeagueRowGroup({ group, states, stale, cap, starClickable: starClickabl
|
|
|
6224
6417
|
}
|
|
6225
6418
|
|
|
6226
6419
|
// src/components/games/ui/SearchField.tsx
|
|
6227
|
-
import { useCallback as
|
|
6420
|
+
import { useCallback as useCallback17, useRef as useRef21 } from "react";
|
|
6228
6421
|
|
|
6229
6422
|
// src/components/games/ui/icons.tsx
|
|
6230
6423
|
import { jsx as jsx59 } from "react/jsx-runtime";
|
|
@@ -6263,8 +6456,8 @@ var IconFlame = ({ size = 16 }) => svg(size, /* @__PURE__ */ jsx59("path", { d:
|
|
|
6263
6456
|
// src/components/games/ui/SearchField.tsx
|
|
6264
6457
|
import { jsx as jsx60, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
6265
6458
|
function SearchField({ id, label, labelHidden = false, placeholder, value, onChange, disabled, inputRef, onKeyDown, clearLabel }) {
|
|
6266
|
-
const localRef =
|
|
6267
|
-
const setInputRef =
|
|
6459
|
+
const localRef = useRef21(null);
|
|
6460
|
+
const setInputRef = useCallback17((node) => {
|
|
6268
6461
|
localRef.current = node;
|
|
6269
6462
|
if (typeof inputRef === "function") inputRef(node);
|
|
6270
6463
|
else if (inputRef) inputRef.current = node;
|
|
@@ -6309,10 +6502,10 @@ import { Fragment as Fragment7, jsx as jsx61, jsxs as jsxs55 } from "react/jsx-r
|
|
|
6309
6502
|
function TodayPanel({ discovery, ui, monitor }) {
|
|
6310
6503
|
const { groups, states, stale, starLeague } = discovery;
|
|
6311
6504
|
const searchId = useId2();
|
|
6312
|
-
const [query, setQuery] =
|
|
6313
|
-
const [selectedCompetitionId, setSelectedCompetitionId] =
|
|
6314
|
-
const [toast, setToast] =
|
|
6315
|
-
|
|
6505
|
+
const [query, setQuery] = useState32("");
|
|
6506
|
+
const [selectedCompetitionId, setSelectedCompetitionId] = useState32(null);
|
|
6507
|
+
const [toast, setToast] = useState32(null);
|
|
6508
|
+
useEffect24(() => {
|
|
6316
6509
|
if (toast === null) return;
|
|
6317
6510
|
const id = setTimeout(() => setToast(null), 4e3);
|
|
6318
6511
|
return () => clearTimeout(id);
|
|
@@ -6358,7 +6551,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6358
6551
|
}
|
|
6359
6552
|
const openIndex = selectedCompetitionId === null ? -1 : placement.order.findIndex((g) => g.competitionId === selectedCompetitionId);
|
|
6360
6553
|
const openGroup = openIndex === -1 ? void 0 : placement.order[openIndex];
|
|
6361
|
-
|
|
6554
|
+
useEffect24(() => {
|
|
6362
6555
|
if (selectedCompetitionId !== null && openGroup === void 0) setSelectedCompetitionId(null);
|
|
6363
6556
|
}, [selectedCompetitionId, openGroup]);
|
|
6364
6557
|
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);
|
|
@@ -6505,7 +6698,7 @@ function TodayPanel({ discovery, ui, monitor }) {
|
|
|
6505
6698
|
}
|
|
6506
6699
|
|
|
6507
6700
|
// src/components/GamesPanel.tsx
|
|
6508
|
-
import { useEffect as
|
|
6701
|
+
import { useEffect as useEffect28, useState as useState47 } from "react";
|
|
6509
6702
|
|
|
6510
6703
|
// src/components/GamesLoginWall.tsx
|
|
6511
6704
|
import { jsx as jsx62 } from "react/jsx-runtime";
|
|
@@ -6514,7 +6707,7 @@ function GamesLoginWall({ ui }) {
|
|
|
6514
6707
|
}
|
|
6515
6708
|
|
|
6516
6709
|
// src/components/GamesHub.tsx
|
|
6517
|
-
import { useEffect as
|
|
6710
|
+
import { useEffect as useEffect25, useState as useState33 } from "react";
|
|
6518
6711
|
|
|
6519
6712
|
// src/components/games/ui/gameMeta.ts
|
|
6520
6713
|
function prettifyGameId(gameId) {
|
|
@@ -6665,8 +6858,8 @@ function pickHeroGame(games) {
|
|
|
6665
6858
|
}
|
|
6666
6859
|
var tileKey = (g) => `${g.gameId}-${g.gameDay}-${g.fixtureId}`;
|
|
6667
6860
|
function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
6668
|
-
const [, setTick] =
|
|
6669
|
-
|
|
6861
|
+
const [, setTick] = useState33(0);
|
|
6862
|
+
useEffect25(() => {
|
|
6670
6863
|
const id = setInterval(() => setTick((t) => t + 1), 6e4);
|
|
6671
6864
|
return () => clearInterval(id);
|
|
6672
6865
|
}, []);
|
|
@@ -6726,10 +6919,10 @@ function GamesHub({ games, myWeeklyRow, weeklyPrize, onOpen, ui }) {
|
|
|
6726
6919
|
}
|
|
6727
6920
|
|
|
6728
6921
|
// src/components/GameScreenHost.tsx
|
|
6729
|
-
import { useEffect as
|
|
6922
|
+
import { useEffect as useEffect27, useRef as useRef24, useState as useState45 } from "react";
|
|
6730
6923
|
|
|
6731
6924
|
// src/useGamePlay.ts
|
|
6732
|
-
import { useCallback as
|
|
6925
|
+
import { useCallback as useCallback18, useRef as useRef22, useState as useState34 } from "react";
|
|
6733
6926
|
function toSubmitResult(payload) {
|
|
6734
6927
|
return {
|
|
6735
6928
|
// 'pending' means the play is recorded but awaiting resolution (fixture games)
|
|
@@ -6741,17 +6934,17 @@ function toSubmitResult(payload) {
|
|
|
6741
6934
|
};
|
|
6742
6935
|
}
|
|
6743
6936
|
function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh }) {
|
|
6744
|
-
const [result, setResult] =
|
|
6745
|
-
const [submitting, setSubmitting] =
|
|
6746
|
-
const [rawStatus, setRawStatus] =
|
|
6747
|
-
const inFlightRef =
|
|
6748
|
-
const convRef =
|
|
6937
|
+
const [result, setResult] = useState34(null);
|
|
6938
|
+
const [submitting, setSubmitting] = useState34(false);
|
|
6939
|
+
const [rawStatus, setRawStatus] = useState34(null);
|
|
6940
|
+
const inFlightRef = useRef22(false);
|
|
6941
|
+
const convRef = useRef22(conversation);
|
|
6749
6942
|
convRef.current = conversation;
|
|
6750
|
-
const optsRef =
|
|
6943
|
+
const optsRef = useRef22({ gameId, gameDay, fixtureId, locale, refresh });
|
|
6751
6944
|
optsRef.current = { gameId, gameDay, fixtureId, locale, refresh };
|
|
6752
|
-
const resultRef =
|
|
6945
|
+
const resultRef = useRef22(null);
|
|
6753
6946
|
resultRef.current = result;
|
|
6754
|
-
const refetch =
|
|
6947
|
+
const refetch = useCallback18(async () => {
|
|
6755
6948
|
const conv = convRef.current;
|
|
6756
6949
|
if (!conv) return;
|
|
6757
6950
|
const opts = optsRef.current;
|
|
@@ -6767,7 +6960,7 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6767
6960
|
} catch {
|
|
6768
6961
|
}
|
|
6769
6962
|
}, []);
|
|
6770
|
-
const submit =
|
|
6963
|
+
const submit = useCallback18(async (answerJson) => {
|
|
6771
6964
|
const conv = convRef.current;
|
|
6772
6965
|
if (!conv || inFlightRef.current) return;
|
|
6773
6966
|
inFlightRef.current = true;
|
|
@@ -6794,14 +6987,14 @@ function useGamePlay(conversation, { gameId, gameDay, fixtureId, locale, refresh
|
|
|
6794
6987
|
setSubmitting(false);
|
|
6795
6988
|
}
|
|
6796
6989
|
}, [refetch]);
|
|
6797
|
-
const hydrate =
|
|
6990
|
+
const hydrate = useCallback18(() => {
|
|
6798
6991
|
void refetch();
|
|
6799
6992
|
}, [refetch]);
|
|
6800
6993
|
return { result, submitting, submit, hydrate, rawStatus };
|
|
6801
6994
|
}
|
|
6802
6995
|
|
|
6803
6996
|
// src/components/games/MysteryTigerGame.tsx
|
|
6804
|
-
import { useState as
|
|
6997
|
+
import { useState as useState36, useId as useId3 } from "react";
|
|
6805
6998
|
|
|
6806
6999
|
// src/components/games/nationFlags.ts
|
|
6807
7000
|
var FLAGS = {
|
|
@@ -7012,7 +7205,7 @@ function isNationCode(flag) {
|
|
|
7012
7205
|
}
|
|
7013
7206
|
|
|
7014
7207
|
// src/components/games/PlayerAvatar.tsx
|
|
7015
|
-
import { useState as
|
|
7208
|
+
import { useState as useState35 } from "react";
|
|
7016
7209
|
import { jsx as jsx67 } from "react/jsx-runtime";
|
|
7017
7210
|
function initialsOf(name) {
|
|
7018
7211
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
@@ -7030,7 +7223,7 @@ function PlayerAvatar({
|
|
|
7030
7223
|
imagePath,
|
|
7031
7224
|
className
|
|
7032
7225
|
}) {
|
|
7033
|
-
const [failed, setFailed] =
|
|
7226
|
+
const [failed, setFailed] = useState35(false);
|
|
7034
7227
|
const showImage = Boolean(imagePath) && !isPlaceholderImage(imagePath) && !failed;
|
|
7035
7228
|
return /* @__PURE__ */ jsx67("div", { className, "aria-hidden": "true", children: showImage ? /* @__PURE__ */ jsx67("img", { src: imagePath, alt: "", loading: "lazy", onError: () => setFailed(true) }) : /* @__PURE__ */ jsx67("span", { className: "ss-w-av-initials", children: initialsOf(name) }) });
|
|
7036
7229
|
}
|
|
@@ -7271,7 +7464,7 @@ function MysteryTigerGame({
|
|
|
7271
7464
|
onBack
|
|
7272
7465
|
}) {
|
|
7273
7466
|
const t = ui.games.mysteryTiger;
|
|
7274
|
-
const [query, setQuery] =
|
|
7467
|
+
const [query, setQuery] = useState36("");
|
|
7275
7468
|
const inputId = useId3();
|
|
7276
7469
|
const clientState = parseClientState(result?.clientStateJson);
|
|
7277
7470
|
const guessResults = clientState?.guessResults ?? [];
|
|
@@ -7533,13 +7726,13 @@ function HigherOrLowerGame({
|
|
|
7533
7726
|
}
|
|
7534
7727
|
|
|
7535
7728
|
// src/components/games/CareerPathGame.tsx
|
|
7536
|
-
import { useState as
|
|
7729
|
+
import { useState as useState38, useId as useId4 } from "react";
|
|
7537
7730
|
|
|
7538
7731
|
// src/components/games/ui/CrestShield.tsx
|
|
7539
|
-
import { useState as
|
|
7732
|
+
import { useState as useState37 } from "react";
|
|
7540
7733
|
import { jsx as jsx78 } from "react/jsx-runtime";
|
|
7541
7734
|
function CrestShield({ src, name, size = 28 }) {
|
|
7542
|
-
const [failed, setFailed] =
|
|
7735
|
+
const [failed, setFailed] = useState37(false);
|
|
7543
7736
|
if (src && !isPlaceholderImage(src) && !failed) {
|
|
7544
7737
|
return /* @__PURE__ */ jsx78("img", { className: "ss-g-crest", src, alt: name, width: size, height: size, loading: "lazy", onError: () => setFailed(true) });
|
|
7545
7738
|
}
|
|
@@ -7571,7 +7764,7 @@ function CareerPathGame({
|
|
|
7571
7764
|
}) {
|
|
7572
7765
|
const s = ui.games.careerPath;
|
|
7573
7766
|
const title = gameTitle({ gameId: "career-path" }, ui.games.titles);
|
|
7574
|
-
const [query, setQuery] =
|
|
7767
|
+
const [query, setQuery] = useState38("");
|
|
7575
7768
|
const inputId = useId4();
|
|
7576
7769
|
const clientState = parseClientState3(result?.clientStateJson);
|
|
7577
7770
|
const alreadyGuessedIds = new Set(clientState?.guessResults.map((g) => g.playerId) ?? []);
|
|
@@ -7678,7 +7871,7 @@ function CareerPathGame({
|
|
|
7678
7871
|
}
|
|
7679
7872
|
|
|
7680
7873
|
// src/components/games/BeatTheGridGame.tsx
|
|
7681
|
-
import React, { useEffect as
|
|
7874
|
+
import React, { useEffect as useEffect26, useId as useId5, useRef as useRef23, useState as useState39 } from "react";
|
|
7682
7875
|
|
|
7683
7876
|
// src/components/games/ui/OptionList.tsx
|
|
7684
7877
|
import { jsx as jsx80 } from "react/jsx-runtime";
|
|
@@ -7767,10 +7960,10 @@ function SearchSheet({
|
|
|
7767
7960
|
ui
|
|
7768
7961
|
}) {
|
|
7769
7962
|
const s = ui.games.beatTheGrid;
|
|
7770
|
-
const [query, setQuery] =
|
|
7963
|
+
const [query, setQuery] = useState39("");
|
|
7771
7964
|
const inputId = useId5();
|
|
7772
|
-
const inputRef =
|
|
7773
|
-
|
|
7965
|
+
const inputRef = useRef23(null);
|
|
7966
|
+
useEffect26(() => {
|
|
7774
7967
|
inputRef.current?.focus();
|
|
7775
7968
|
}, [row, col]);
|
|
7776
7969
|
const filtered = playerPool.filter(
|
|
@@ -7835,7 +8028,7 @@ function BeatTheGridGame({
|
|
|
7835
8028
|
}) {
|
|
7836
8029
|
const s = ui.games.beatTheGrid;
|
|
7837
8030
|
const title = gameTitle({ gameId: "beat-the-grid" }, ui.games.titles);
|
|
7838
|
-
const [activeCell, setActiveCell] =
|
|
8031
|
+
const [activeCell, setActiveCell] = useState39(null);
|
|
7839
8032
|
const clientState = parseClientState4(result?.clientStateJson);
|
|
7840
8033
|
const filledCells = clientState?.cells ?? [];
|
|
7841
8034
|
const isLocked2 = result?.alreadyPlayed === true || clientState?.isComplete === true;
|
|
@@ -7990,7 +8183,7 @@ function BeatTheGridGame({
|
|
|
7990
8183
|
}
|
|
7991
8184
|
|
|
7992
8185
|
// src/components/games/GuessTheXiGame.tsx
|
|
7993
|
-
import { useState as
|
|
8186
|
+
import { useState as useState40, useId as useId6 } from "react";
|
|
7994
8187
|
|
|
7995
8188
|
// src/components/games/ui/PitchSvg.tsx
|
|
7996
8189
|
import { Fragment as Fragment16, jsx as jsx82, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
@@ -8079,7 +8272,7 @@ function GuessTheXiGame({
|
|
|
8079
8272
|
onBack
|
|
8080
8273
|
}) {
|
|
8081
8274
|
const t = ui.games.guessTheXi;
|
|
8082
|
-
const [query, setQuery] =
|
|
8275
|
+
const [query, setQuery] = useState40("");
|
|
8083
8276
|
const inputId = useId6();
|
|
8084
8277
|
const clientState = parseClientState5(result?.clientStateJson);
|
|
8085
8278
|
const isOver = result?.alreadyPlayed === true || clientState?.status === "solved" || clientState?.status === "failed";
|
|
@@ -8222,7 +8415,7 @@ function GuessTheXiGame({
|
|
|
8222
8415
|
}
|
|
8223
8416
|
|
|
8224
8417
|
// src/components/games/DailyQuizGame.tsx
|
|
8225
|
-
import { useState as
|
|
8418
|
+
import { useState as useState41 } from "react";
|
|
8226
8419
|
import { Fragment as Fragment18, jsx as jsx84, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
8227
8420
|
function parseClientState6(json) {
|
|
8228
8421
|
if (!json) return null;
|
|
@@ -8263,8 +8456,8 @@ function DailyQuizGame({
|
|
|
8263
8456
|
}) {
|
|
8264
8457
|
const s = ui.games.dailyQuiz;
|
|
8265
8458
|
const title = gameTitle({ gameId: "daily-quiz" }, ui.games.titles);
|
|
8266
|
-
const [selections, setSelections] =
|
|
8267
|
-
const [page, setPage] =
|
|
8459
|
+
const [selections, setSelections] = useState41(/* @__PURE__ */ new Map());
|
|
8460
|
+
const [page, setPage] = useState41(0);
|
|
8268
8461
|
const clientState = parseClientState6(result?.clientStateJson);
|
|
8269
8462
|
const results = clientState?.results ?? [];
|
|
8270
8463
|
const isRevealed = results.length > 0 || result?.alreadyPlayed === true;
|
|
@@ -8374,7 +8567,7 @@ function DailyQuizGame({
|
|
|
8374
8567
|
}
|
|
8375
8568
|
|
|
8376
8569
|
// src/components/games/MatchdayPredictorGame.tsx
|
|
8377
|
-
import { useId as useId7, useState as
|
|
8570
|
+
import { useId as useId7, useState as useState42 } from "react";
|
|
8378
8571
|
import { jsx as jsx85, jsxs as jsxs73 } from "react/jsx-runtime";
|
|
8379
8572
|
var SCORER_SEARCH_THRESHOLD = 9;
|
|
8380
8573
|
function parseClientState7(json) {
|
|
@@ -8470,11 +8663,11 @@ function MatchdayPredictorGame({
|
|
|
8470
8663
|
onBack
|
|
8471
8664
|
}) {
|
|
8472
8665
|
const t = ui.games.predictor;
|
|
8473
|
-
const [homeScore, setHomeScore] =
|
|
8474
|
-
const [awayScore, setAwayScore] =
|
|
8475
|
-
const [firstScorerPlayerId, setFirstScorerPlayerId] =
|
|
8476
|
-
const [lastEdited, setLastEdited] =
|
|
8477
|
-
const [query, setQuery] =
|
|
8666
|
+
const [homeScore, setHomeScore] = useState42(0);
|
|
8667
|
+
const [awayScore, setAwayScore] = useState42(0);
|
|
8668
|
+
const [firstScorerPlayerId, setFirstScorerPlayerId] = useState42(null);
|
|
8669
|
+
const [lastEdited, setLastEdited] = useState42("home");
|
|
8670
|
+
const [query, setQuery] = useState42("");
|
|
8478
8671
|
const searchId = useId7();
|
|
8479
8672
|
const clientState = parseClientState7(result?.clientStateJson);
|
|
8480
8673
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -8642,7 +8835,7 @@ function MatchdayPredictorGame({
|
|
|
8642
8835
|
}
|
|
8643
8836
|
|
|
8644
8837
|
// src/components/games/StartingXiGame.tsx
|
|
8645
|
-
import { useId as useId8, useState as
|
|
8838
|
+
import { useId as useId8, useState as useState43 } from "react";
|
|
8646
8839
|
import { Fragment as Fragment19, jsx as jsx86, jsxs as jsxs74 } from "react/jsx-runtime";
|
|
8647
8840
|
var POINTS_PER_STARTER = 8;
|
|
8648
8841
|
var XI_SIZE = 11;
|
|
@@ -8686,9 +8879,9 @@ function StartingXiGame({
|
|
|
8686
8879
|
lockAtUtc
|
|
8687
8880
|
}) {
|
|
8688
8881
|
const t = ui.games.startingXi;
|
|
8689
|
-
const [slotPlayers, setSlotPlayers] =
|
|
8690
|
-
const [active, setActive] =
|
|
8691
|
-
const [query, setQuery] =
|
|
8882
|
+
const [slotPlayers, setSlotPlayers] = useState43(() => Array(XI_SIZE).fill(null));
|
|
8883
|
+
const [active, setActive] = useState43(0);
|
|
8884
|
+
const [query, setQuery] = useState43("");
|
|
8692
8885
|
const searchId = useId8();
|
|
8693
8886
|
const clientState = parseClientState8(result?.clientStateJson);
|
|
8694
8887
|
const alreadyPlayed = result?.alreadyPlayed === true;
|
|
@@ -8828,7 +9021,7 @@ function StartingXiGame({
|
|
|
8828
9021
|
}
|
|
8829
9022
|
|
|
8830
9023
|
// src/components/games/StatLadderGame.tsx
|
|
8831
|
-
import { useId as useId9, useState as
|
|
9024
|
+
import { useId as useId9, useState as useState44 } from "react";
|
|
8832
9025
|
import { jsx as jsx87, jsxs as jsxs75 } from "react/jsx-runtime";
|
|
8833
9026
|
function ladderClue(ladder) {
|
|
8834
9027
|
const mystery = ladder.find((r) => r.rank === 2);
|
|
@@ -8865,8 +9058,8 @@ function StatLadderGame({
|
|
|
8865
9058
|
onBack
|
|
8866
9059
|
}) {
|
|
8867
9060
|
const t = ui.games.statLadder;
|
|
8868
|
-
const [query, setQuery] =
|
|
8869
|
-
const [selectedId, setSelectedId] =
|
|
9061
|
+
const [query, setQuery] = useState44("");
|
|
9062
|
+
const [selectedId, setSelectedId] = useState44(null);
|
|
8870
9063
|
const searchId = useId9();
|
|
8871
9064
|
const clientState = parseClientState9(result?.clientStateJson);
|
|
8872
9065
|
const revealed = clientState != null;
|
|
@@ -9073,8 +9266,8 @@ function GameScreenHost({
|
|
|
9073
9266
|
ui
|
|
9074
9267
|
}) {
|
|
9075
9268
|
const { gameId, fixtureId, gameDay = "", lockAtUtc = null } = selected;
|
|
9076
|
-
const [configJson, setConfigJson] =
|
|
9077
|
-
|
|
9269
|
+
const [configJson, setConfigJson] = useState45(null);
|
|
9270
|
+
useEffect27(() => {
|
|
9078
9271
|
setConfigJson(null);
|
|
9079
9272
|
if (!conversation) return;
|
|
9080
9273
|
let cancelled = false;
|
|
@@ -9097,12 +9290,12 @@ function GameScreenHost({
|
|
|
9097
9290
|
fixtureId: fixtureId || void 0,
|
|
9098
9291
|
locale: ui.games.lang
|
|
9099
9292
|
});
|
|
9100
|
-
|
|
9293
|
+
useEffect27(() => {
|
|
9101
9294
|
if (conversation) hydrate();
|
|
9102
9295
|
}, [conversation, gameId]);
|
|
9103
|
-
const hydrateRef =
|
|
9296
|
+
const hydrateRef = useRef24(hydrate);
|
|
9104
9297
|
hydrateRef.current = hydrate;
|
|
9105
|
-
|
|
9298
|
+
useEffect27(() => {
|
|
9106
9299
|
if (!FIXTURE_GAME_IDS.has(gameId)) return;
|
|
9107
9300
|
if (rawStatus !== "pending") return;
|
|
9108
9301
|
const timerId = setInterval(() => {
|
|
@@ -9214,65 +9407,11 @@ function GameScreenHost({
|
|
|
9214
9407
|
return /* @__PURE__ */ jsx89("div", { className: "ss-w-gscreen", "data-testid": "gscreen", "data-lock-at": lockAtUtc ?? void 0, children: renderScreen() });
|
|
9215
9408
|
}
|
|
9216
9409
|
|
|
9217
|
-
// src/components/games/ui/fonts.ts
|
|
9218
|
-
var FONTS_LINK_ID = "ss-w-games-fonts";
|
|
9219
|
-
var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
|
|
9220
|
-
function ensureGamesFonts(doc = document) {
|
|
9221
|
-
if (!doc.head) return;
|
|
9222
|
-
if (doc.getElementById(FONTS_LINK_ID)) return;
|
|
9223
|
-
const link = doc.createElement("link");
|
|
9224
|
-
link.id = FONTS_LINK_ID;
|
|
9225
|
-
link.rel = "stylesheet";
|
|
9226
|
-
link.href = FONTS_HREF;
|
|
9227
|
-
doc.head.appendChild(link);
|
|
9228
|
-
}
|
|
9229
|
-
|
|
9230
|
-
// src/components/GamesPanel.tsx
|
|
9231
|
-
import { jsx as jsx90 } from "react/jsx-runtime";
|
|
9232
|
-
function GamesPanel({
|
|
9233
|
-
loggedIn,
|
|
9234
|
-
games,
|
|
9235
|
-
ui,
|
|
9236
|
-
conversation,
|
|
9237
|
-
leaderboard,
|
|
9238
|
-
refreshHub
|
|
9239
|
-
}) {
|
|
9240
|
-
const [selected, setSelected] = useState43(null);
|
|
9241
|
-
useEffect25(() => {
|
|
9242
|
-
ensureGamesFonts();
|
|
9243
|
-
}, []);
|
|
9244
|
-
if (!loggedIn) return /* @__PURE__ */ jsx90(GamesLoginWall, { ui });
|
|
9245
|
-
if (selected !== null) {
|
|
9246
|
-
return /* @__PURE__ */ jsx90("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ jsx90(
|
|
9247
|
-
GameScreenHost,
|
|
9248
|
-
{
|
|
9249
|
-
selected,
|
|
9250
|
-
onBack: () => {
|
|
9251
|
-
setSelected(null);
|
|
9252
|
-
refreshHub?.();
|
|
9253
|
-
},
|
|
9254
|
-
onPlayed: refreshHub,
|
|
9255
|
-
conversation: conversation ?? null,
|
|
9256
|
-
ui
|
|
9257
|
-
}
|
|
9258
|
-
) });
|
|
9259
|
-
}
|
|
9260
|
-
return /* @__PURE__ */ jsx90("div", { className: "ss-g-hub-wrap", "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ jsx90(
|
|
9261
|
-
GamesHub,
|
|
9262
|
-
{
|
|
9263
|
-
games,
|
|
9264
|
-
onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
|
|
9265
|
-
myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
|
|
9266
|
-
ui
|
|
9267
|
-
}
|
|
9268
|
-
) });
|
|
9269
|
-
}
|
|
9270
|
-
|
|
9271
9410
|
// src/components/Leaderboard.tsx
|
|
9272
|
-
import { useState as
|
|
9411
|
+
import { useState as useState46 } from "react";
|
|
9273
9412
|
|
|
9274
9413
|
// src/components/LeaderboardRow.tsx
|
|
9275
|
-
import { jsx as
|
|
9414
|
+
import { jsx as jsx90, jsxs as jsxs77 } from "react/jsx-runtime";
|
|
9276
9415
|
function formatPoints(n) {
|
|
9277
9416
|
return n.toLocaleString("en");
|
|
9278
9417
|
}
|
|
@@ -9286,8 +9425,8 @@ function LeaderboardWeeklyRow({
|
|
|
9286
9425
|
"#",
|
|
9287
9426
|
row.rank
|
|
9288
9427
|
] }),
|
|
9289
|
-
/* @__PURE__ */
|
|
9290
|
-
/* @__PURE__ */
|
|
9428
|
+
/* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
9429
|
+
/* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-points", children: formatPoints(row.points) }),
|
|
9291
9430
|
row.currentStreak > 0 && /* @__PURE__ */ jsxs77("span", { className: "ss-w-lb2-streak", children: [
|
|
9292
9431
|
"\u{1F525} ",
|
|
9293
9432
|
row.currentStreak
|
|
@@ -9304,13 +9443,13 @@ function LeaderboardAllTimeRow({
|
|
|
9304
9443
|
"#",
|
|
9305
9444
|
row.rank
|
|
9306
9445
|
] }),
|
|
9307
|
-
/* @__PURE__ */
|
|
9308
|
-
/* @__PURE__ */
|
|
9446
|
+
/* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-handle", children: row.handle }),
|
|
9447
|
+
/* @__PURE__ */ jsx90("span", { className: "ss-w-lb2-points", children: formatPoints(row.allTimePoints) })
|
|
9309
9448
|
] });
|
|
9310
9449
|
}
|
|
9311
9450
|
|
|
9312
9451
|
// src/components/LeaderboardEmpty.tsx
|
|
9313
|
-
import { jsx as
|
|
9452
|
+
import { jsx as jsx91, jsxs as jsxs78 } from "react/jsx-runtime";
|
|
9314
9453
|
function LeaderboardEmpty({
|
|
9315
9454
|
segment,
|
|
9316
9455
|
lastWeek,
|
|
@@ -9320,8 +9459,8 @@ function LeaderboardEmpty({
|
|
|
9320
9459
|
}) {
|
|
9321
9460
|
if (segment === "alltime") {
|
|
9322
9461
|
return /* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
|
|
9323
|
-
/* @__PURE__ */
|
|
9324
|
-
/* @__PURE__ */
|
|
9462
|
+
/* @__PURE__ */ jsx91("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
|
|
9463
|
+
/* @__PURE__ */ jsx91("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
|
|
9325
9464
|
] });
|
|
9326
9465
|
}
|
|
9327
9466
|
const fresh = lastWeek != null;
|
|
@@ -9329,38 +9468,38 @@ function LeaderboardEmpty({
|
|
|
9329
9468
|
const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
|
|
9330
9469
|
return /* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-empty", children: [
|
|
9331
9470
|
weeklyPrize && /* @__PURE__ */ jsxs78("div", { className: "ss-w-prize", children: [
|
|
9332
|
-
/* @__PURE__ */
|
|
9333
|
-
/* @__PURE__ */
|
|
9471
|
+
/* @__PURE__ */ jsx91("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
|
|
9472
|
+
/* @__PURE__ */ jsx91("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx91("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
|
|
9334
9473
|
] }),
|
|
9335
9474
|
/* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-empty-hero", children: [
|
|
9336
|
-
/* @__PURE__ */
|
|
9337
|
-
/* @__PURE__ */
|
|
9338
|
-
/* @__PURE__ */
|
|
9339
|
-
onPlay && /* @__PURE__ */
|
|
9475
|
+
/* @__PURE__ */ jsx91("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
|
|
9476
|
+
/* @__PURE__ */ jsx91("h4", { className: "ss-w-lb-empty-title", children: title }),
|
|
9477
|
+
/* @__PURE__ */ jsx91("p", { className: "ss-w-lb-empty-body", children: body }),
|
|
9478
|
+
onPlay && /* @__PURE__ */ jsx91("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
|
|
9340
9479
|
] }),
|
|
9341
9480
|
fresh && lastWeek && /* @__PURE__ */ jsxs78("div", { className: "ss-w-lb-last", children: [
|
|
9342
|
-
/* @__PURE__ */
|
|
9343
|
-
/* @__PURE__ */
|
|
9344
|
-
/* @__PURE__ */
|
|
9345
|
-
/* @__PURE__ */
|
|
9481
|
+
/* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
|
|
9482
|
+
/* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
|
|
9483
|
+
/* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
|
|
9484
|
+
/* @__PURE__ */ jsx91("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
|
|
9346
9485
|
] })
|
|
9347
9486
|
] });
|
|
9348
9487
|
}
|
|
9349
9488
|
|
|
9350
9489
|
// src/components/Leaderboard.tsx
|
|
9351
|
-
import { Fragment as Fragment20, jsx as
|
|
9490
|
+
import { Fragment as Fragment20, jsx as jsx92, jsxs as jsxs79 } from "react/jsx-runtime";
|
|
9352
9491
|
function Leaderboard({
|
|
9353
9492
|
data,
|
|
9354
9493
|
ui,
|
|
9355
9494
|
onPlay
|
|
9356
9495
|
}) {
|
|
9357
|
-
const [segment, setSegment] =
|
|
9496
|
+
const [segment, setSegment] = useState46("weekly");
|
|
9358
9497
|
const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
|
|
9359
9498
|
const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
|
|
9360
9499
|
const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
|
|
9361
9500
|
return /* @__PURE__ */ jsxs79("div", { className: "ss-w-lb2", children: [
|
|
9362
9501
|
/* @__PURE__ */ jsxs79("div", { className: "ss-w-seg", children: [
|
|
9363
|
-
/* @__PURE__ */
|
|
9502
|
+
/* @__PURE__ */ jsx92(
|
|
9364
9503
|
"button",
|
|
9365
9504
|
{
|
|
9366
9505
|
type: "button",
|
|
@@ -9370,7 +9509,7 @@ function Leaderboard({
|
|
|
9370
9509
|
children: ui.leaderboardThisWeek
|
|
9371
9510
|
}
|
|
9372
9511
|
),
|
|
9373
|
-
/* @__PURE__ */
|
|
9512
|
+
/* @__PURE__ */ jsx92(
|
|
9374
9513
|
"button",
|
|
9375
9514
|
{
|
|
9376
9515
|
type: "button",
|
|
@@ -9381,7 +9520,7 @@ function Leaderboard({
|
|
|
9381
9520
|
}
|
|
9382
9521
|
)
|
|
9383
9522
|
] }),
|
|
9384
|
-
isEmpty ? /* @__PURE__ */
|
|
9523
|
+
isEmpty ? /* @__PURE__ */ jsx92(
|
|
9385
9524
|
LeaderboardEmpty,
|
|
9386
9525
|
{
|
|
9387
9526
|
segment,
|
|
@@ -9391,14 +9530,14 @@ function Leaderboard({
|
|
|
9391
9530
|
ui
|
|
9392
9531
|
}
|
|
9393
9532
|
) : /* @__PURE__ */ jsxs79(Fragment20, { children: [
|
|
9394
|
-
/* @__PURE__ */
|
|
9533
|
+
/* @__PURE__ */ jsx92("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx92(
|
|
9395
9534
|
LeaderboardWeeklyRow,
|
|
9396
9535
|
{
|
|
9397
9536
|
row,
|
|
9398
9537
|
isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
|
|
9399
9538
|
},
|
|
9400
9539
|
row.operatorUserId
|
|
9401
|
-
)) : data.allTimeTop.map((row) => /* @__PURE__ */
|
|
9540
|
+
)) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx92(
|
|
9402
9541
|
LeaderboardAllTimeRow,
|
|
9403
9542
|
{
|
|
9404
9543
|
row,
|
|
@@ -9406,18 +9545,18 @@ function Leaderboard({
|
|
|
9406
9545
|
},
|
|
9407
9546
|
row.operatorUserId
|
|
9408
9547
|
)) }),
|
|
9409
|
-
/* @__PURE__ */
|
|
9410
|
-
myRow != null && (offBoard ? /* @__PURE__ */
|
|
9411
|
-
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */
|
|
9412
|
-
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */
|
|
9548
|
+
/* @__PURE__ */ jsx92("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
|
|
9549
|
+
myRow != null && (offBoard ? /* @__PURE__ */ jsx92("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs79("div", { className: "ss-w-lb2-rows", children: [
|
|
9550
|
+
segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx92(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
|
|
9551
|
+
segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx92(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
|
|
9413
9552
|
] })),
|
|
9414
|
-
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */
|
|
9553
|
+
segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx92("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx92("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx92("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
|
|
9415
9554
|
] })
|
|
9416
9555
|
] });
|
|
9417
9556
|
}
|
|
9418
9557
|
|
|
9419
9558
|
// src/components/LeaderboardPanel.tsx
|
|
9420
|
-
import { jsx as
|
|
9559
|
+
import { jsx as jsx93 } from "react/jsx-runtime";
|
|
9421
9560
|
var EMPTY_PAYLOAD = {
|
|
9422
9561
|
week: "",
|
|
9423
9562
|
weeklyTop: [],
|
|
@@ -9428,19 +9567,216 @@ var EMPTY_PAYLOAD = {
|
|
|
9428
9567
|
lastWeek: null
|
|
9429
9568
|
};
|
|
9430
9569
|
function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
|
|
9570
|
+
if (!loggedIn) return /* @__PURE__ */ jsx93(GamesLoginWall, { ui });
|
|
9571
|
+
if (data === null && loading) return /* @__PURE__ */ jsx93("div", { className: "ss-w-mon-list" });
|
|
9572
|
+
return /* @__PURE__ */ jsx93("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx93(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
|
|
9573
|
+
}
|
|
9574
|
+
|
|
9575
|
+
// src/components/games/ui/fonts.ts
|
|
9576
|
+
var FONTS_LINK_ID = "ss-w-games-fonts";
|
|
9577
|
+
var FONTS_HREF = "https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Barlow:wght@400;500;600;700&display=swap";
|
|
9578
|
+
function ensureGamesFonts(doc = document) {
|
|
9579
|
+
if (!doc.head) return;
|
|
9580
|
+
if (doc.getElementById(FONTS_LINK_ID)) return;
|
|
9581
|
+
const link = doc.createElement("link");
|
|
9582
|
+
link.id = FONTS_LINK_ID;
|
|
9583
|
+
link.rel = "stylesheet";
|
|
9584
|
+
link.href = FONTS_HREF;
|
|
9585
|
+
doc.head.appendChild(link);
|
|
9586
|
+
}
|
|
9587
|
+
|
|
9588
|
+
// src/components/GamesPanel.tsx
|
|
9589
|
+
import { jsx as jsx94, jsxs as jsxs80 } from "react/jsx-runtime";
|
|
9590
|
+
function GamesPanel({
|
|
9591
|
+
loggedIn,
|
|
9592
|
+
games,
|
|
9593
|
+
ui,
|
|
9594
|
+
conversation,
|
|
9595
|
+
leaderboard,
|
|
9596
|
+
leaderboardLoading,
|
|
9597
|
+
refreshHub
|
|
9598
|
+
}) {
|
|
9599
|
+
const [selected, setSelected] = useState47(null);
|
|
9600
|
+
const [segment, setSegment] = useState47("play");
|
|
9601
|
+
useEffect28(() => {
|
|
9602
|
+
ensureGamesFonts();
|
|
9603
|
+
}, []);
|
|
9431
9604
|
if (!loggedIn) return /* @__PURE__ */ jsx94(GamesLoginWall, { ui });
|
|
9432
|
-
if (
|
|
9433
|
-
|
|
9605
|
+
if (selected !== null) {
|
|
9606
|
+
return /* @__PURE__ */ jsx94("div", { className: "ss-w-gscreen-wrap", lang: ui.games.lang, children: /* @__PURE__ */ jsx94(
|
|
9607
|
+
GameScreenHost,
|
|
9608
|
+
{
|
|
9609
|
+
selected,
|
|
9610
|
+
onBack: () => {
|
|
9611
|
+
setSelected(null);
|
|
9612
|
+
refreshHub?.();
|
|
9613
|
+
},
|
|
9614
|
+
onPlayed: refreshHub,
|
|
9615
|
+
conversation: conversation ?? null,
|
|
9616
|
+
ui
|
|
9617
|
+
}
|
|
9618
|
+
) });
|
|
9619
|
+
}
|
|
9620
|
+
return /* @__PURE__ */ jsxs80("div", { className: "ss-g-hub-wrap", lang: ui.games.lang, children: [
|
|
9621
|
+
/* @__PURE__ */ jsxs80("div", { className: "ss-w-seg", children: [
|
|
9622
|
+
/* @__PURE__ */ jsx94(
|
|
9623
|
+
"button",
|
|
9624
|
+
{
|
|
9625
|
+
type: "button",
|
|
9626
|
+
className: "ss-w-seg-btn",
|
|
9627
|
+
...segment === "play" ? { "data-on": "" } : {},
|
|
9628
|
+
onClick: () => setSegment("play"),
|
|
9629
|
+
children: ui.gamesPlaySegment
|
|
9630
|
+
}
|
|
9631
|
+
),
|
|
9632
|
+
/* @__PURE__ */ jsx94(
|
|
9633
|
+
"button",
|
|
9634
|
+
{
|
|
9635
|
+
type: "button",
|
|
9636
|
+
className: "ss-w-seg-btn",
|
|
9637
|
+
...segment === "leaderboard" ? { "data-on": "" } : {},
|
|
9638
|
+
onClick: () => setSegment("leaderboard"),
|
|
9639
|
+
children: ui.tabLeaderboard
|
|
9640
|
+
}
|
|
9641
|
+
)
|
|
9642
|
+
] }),
|
|
9643
|
+
segment === "play" ? /* @__PURE__ */ jsx94("div", { "data-testid": "games-hub", lang: ui.games.lang, children: /* @__PURE__ */ jsx94(
|
|
9644
|
+
GamesHub,
|
|
9645
|
+
{
|
|
9646
|
+
games,
|
|
9647
|
+
onOpen: (g) => setSelected({ gameId: g.gameId, fixtureId: g.fixtureId, gameDay: g.gameDay, lockAtUtc: g.lockAtUtc ?? null }),
|
|
9648
|
+
myWeeklyRow: leaderboard?.myWeeklyRow ?? null,
|
|
9649
|
+
ui
|
|
9650
|
+
}
|
|
9651
|
+
) }) : /* @__PURE__ */ jsx94(
|
|
9652
|
+
LeaderboardPanel,
|
|
9653
|
+
{
|
|
9654
|
+
loggedIn,
|
|
9655
|
+
data: leaderboard ?? null,
|
|
9656
|
+
loading: leaderboardLoading ?? false,
|
|
9657
|
+
onPlay: () => setSegment("play"),
|
|
9658
|
+
ui
|
|
9659
|
+
}
|
|
9660
|
+
)
|
|
9661
|
+
] });
|
|
9662
|
+
}
|
|
9663
|
+
|
|
9664
|
+
// src/components/Fixtures.tsx
|
|
9665
|
+
import { jsx as jsx95, jsxs as jsxs81 } from "react/jsx-runtime";
|
|
9666
|
+
function groupByRound(fixtures) {
|
|
9667
|
+
const groups = [];
|
|
9668
|
+
for (const fx of fixtures) {
|
|
9669
|
+
const last = groups[groups.length - 1];
|
|
9670
|
+
if (last && last.round === fx.round) last.items.push(fx);
|
|
9671
|
+
else groups.push({ round: fx.round, items: [fx] });
|
|
9672
|
+
}
|
|
9673
|
+
return groups;
|
|
9674
|
+
}
|
|
9675
|
+
function Fixtures({ fixtures, loading, ui }) {
|
|
9676
|
+
if (fixtures.length === 0) {
|
|
9677
|
+
if (loading) return /* @__PURE__ */ jsx95("div", { className: "ss-w-mon-list" });
|
|
9678
|
+
return /* @__PURE__ */ jsx95("div", { className: "ss-w-mon-empty", children: ui.clubFixturesEmpty });
|
|
9679
|
+
}
|
|
9680
|
+
return /* @__PURE__ */ jsx95("div", { className: "ss-w-mon-list", children: groupByRound(fixtures).map((group, gi) => /* @__PURE__ */ jsxs81("div", { children: [
|
|
9681
|
+
group.round && /* @__PURE__ */ jsx95("div", { className: "ss-w-club-eyebrow", children: group.round }),
|
|
9682
|
+
group.items.map((fx) => {
|
|
9683
|
+
const played = fx.homeScore !== null && fx.awayScore !== null;
|
|
9684
|
+
const kickoff = fx.matchDateTime ? ui.bettingKickoff(fx.matchDateTime) : null;
|
|
9685
|
+
return /* @__PURE__ */ jsxs81("div", { className: "ss-w-mon", children: [
|
|
9686
|
+
/* @__PURE__ */ jsxs81("div", { className: "ss-w-mon-top", children: [
|
|
9687
|
+
fx.competitionName && /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-comp", children: fx.competitionName }),
|
|
9688
|
+
!played && kickoff && /* @__PURE__ */ jsxs81("span", { className: "ss-w-mon-pill", children: [
|
|
9689
|
+
kickoff.dayLabel,
|
|
9690
|
+
" \xB7 ",
|
|
9691
|
+
kickoff.time
|
|
9692
|
+
] })
|
|
9693
|
+
] }),
|
|
9694
|
+
/* @__PURE__ */ jsxs81("div", { className: "ss-w-mon-main", children: [
|
|
9695
|
+
/* @__PURE__ */ jsx95("span", { className: "ss-w-mon-side", children: /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-name", children: fx.homeTeamName }) }),
|
|
9696
|
+
played ? /* @__PURE__ */ jsxs81("span", { className: "ss-w-mon-score", children: [
|
|
9697
|
+
fx.homeScore,
|
|
9698
|
+
/* @__PURE__ */ jsx95("i", { children: "-" }),
|
|
9699
|
+
fx.awayScore
|
|
9700
|
+
] }) : /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-vs", children: "vs" }),
|
|
9701
|
+
/* @__PURE__ */ jsx95("span", { className: "ss-w-mon-side ss-w-mon-side--away", children: /* @__PURE__ */ jsx95("span", { className: "ss-w-mon-name", children: fx.awayTeamName }) })
|
|
9702
|
+
] })
|
|
9703
|
+
] }, fx.id);
|
|
9704
|
+
})
|
|
9705
|
+
] }, `${gi}-${group.round ?? "none"}`)) });
|
|
9706
|
+
}
|
|
9707
|
+
|
|
9708
|
+
// src/components/Standings.tsx
|
|
9709
|
+
import { jsx as jsx96, jsxs as jsxs82 } from "react/jsx-runtime";
|
|
9710
|
+
function groupByTable(rows) {
|
|
9711
|
+
const groups = [];
|
|
9712
|
+
for (const row of rows) {
|
|
9713
|
+
const last = groups[groups.length - 1];
|
|
9714
|
+
if (last && last.table === row.table) last.items.push(row);
|
|
9715
|
+
else groups.push({ table: row.table, items: [row] });
|
|
9716
|
+
}
|
|
9717
|
+
return groups;
|
|
9718
|
+
}
|
|
9719
|
+
function Standings({ standings, loading, ui }) {
|
|
9720
|
+
if (standings === null && loading) return /* @__PURE__ */ jsx96("div", { className: "ss-w-mon-list" });
|
|
9721
|
+
if (standings === null || standings.length === 0) return /* @__PURE__ */ jsx96("div", { className: "ss-w-mon-empty", children: ui.clubStandingsEmpty });
|
|
9722
|
+
return /* @__PURE__ */ jsx96("div", { className: "ss-w-mon-list", children: groupByTable(standings).map((group, gi) => /* @__PURE__ */ jsxs82("div", { className: "ss-w-table-wrap", children: [
|
|
9723
|
+
group.table && /* @__PURE__ */ jsx96("div", { className: "ss-w-club-eyebrow", children: group.table }),
|
|
9724
|
+
/* @__PURE__ */ jsxs82("table", { className: "ss-w-md-table", children: [
|
|
9725
|
+
/* @__PURE__ */ jsx96("thead", { children: /* @__PURE__ */ jsxs82("tr", { children: [
|
|
9726
|
+
/* @__PURE__ */ jsx96("th", { children: "#" }),
|
|
9727
|
+
/* @__PURE__ */ jsx96("th", { children: ui.standingsColClub }),
|
|
9728
|
+
/* @__PURE__ */ jsx96("th", { children: ui.standingsColPlayed }),
|
|
9729
|
+
/* @__PURE__ */ jsx96("th", { children: ui.standingsColWon }),
|
|
9730
|
+
/* @__PURE__ */ jsx96("th", { children: ui.standingsColDrawn }),
|
|
9731
|
+
/* @__PURE__ */ jsx96("th", { children: ui.standingsColLost }),
|
|
9732
|
+
/* @__PURE__ */ jsx96("th", { children: ui.standingsColGoalDiff }),
|
|
9733
|
+
/* @__PURE__ */ jsx96("th", { children: ui.standingsColPoints })
|
|
9734
|
+
] }) }),
|
|
9735
|
+
/* @__PURE__ */ jsx96("tbody", { children: group.items.map((row) => /* @__PURE__ */ jsxs82("tr", { children: [
|
|
9736
|
+
/* @__PURE__ */ jsx96("td", { children: row.position }),
|
|
9737
|
+
/* @__PURE__ */ jsx96("td", { children: row.teamName }),
|
|
9738
|
+
/* @__PURE__ */ jsx96("td", { children: row.playedGames }),
|
|
9739
|
+
/* @__PURE__ */ jsx96("td", { children: row.wins }),
|
|
9740
|
+
/* @__PURE__ */ jsx96("td", { children: row.draws }),
|
|
9741
|
+
/* @__PURE__ */ jsx96("td", { children: row.losses }),
|
|
9742
|
+
/* @__PURE__ */ jsx96("td", { children: row.goalDifference }),
|
|
9743
|
+
/* @__PURE__ */ jsx96("td", { children: row.points })
|
|
9744
|
+
] }, row.teamId)) })
|
|
9745
|
+
] })
|
|
9746
|
+
] }, `${gi}-${group.table ?? "none"}`)) });
|
|
9747
|
+
}
|
|
9748
|
+
|
|
9749
|
+
// src/components/Squad.tsx
|
|
9750
|
+
import { jsx as jsx97, jsxs as jsxs83 } from "react/jsx-runtime";
|
|
9751
|
+
function groupByPosition(players) {
|
|
9752
|
+
const groups = [];
|
|
9753
|
+
for (const p of players) {
|
|
9754
|
+
const last = groups[groups.length - 1];
|
|
9755
|
+
if (last && last.positionName === p.positionName) last.items.push(p);
|
|
9756
|
+
else groups.push({ positionName: p.positionName, items: [p] });
|
|
9757
|
+
}
|
|
9758
|
+
return groups;
|
|
9759
|
+
}
|
|
9760
|
+
function Squad({ squad, loading, ui }) {
|
|
9761
|
+
if (squad === null && loading) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list" });
|
|
9762
|
+
if (squad === null || squad.length === 0) return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-empty", children: ui.clubSquadEmpty });
|
|
9763
|
+
return /* @__PURE__ */ jsx97("div", { className: "ss-w-mon-list", children: groupByPosition(squad).map((group, gi) => /* @__PURE__ */ jsxs83("div", { children: [
|
|
9764
|
+
group.positionName && /* @__PURE__ */ jsx97("div", { className: "ss-w-club-eyebrow", children: group.positionName }),
|
|
9765
|
+
group.items.map((p) => /* @__PURE__ */ jsxs83("div", { className: "ss-w-sq-row", children: [
|
|
9766
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-num", children: p.jerseyNumber ?? "" }),
|
|
9767
|
+
/* @__PURE__ */ jsx97("span", { className: "ss-w-sq-name", children: p.playerName })
|
|
9768
|
+
] }, p.playerId))
|
|
9769
|
+
] }, `${gi}-${group.positionName ?? "none"}`)) });
|
|
9434
9770
|
}
|
|
9435
9771
|
|
|
9436
9772
|
// src/components/PresetSpeedDial.tsx
|
|
9437
9773
|
import { useId as useId10 } from "react";
|
|
9438
|
-
import { jsx as
|
|
9774
|
+
import { jsx as jsx98, jsxs as jsxs84 } from "react/jsx-runtime";
|
|
9439
9775
|
function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef, buttonRef }) {
|
|
9440
9776
|
const pillsId = useId10();
|
|
9441
9777
|
const tabIndex = expanded ? 0 : -1;
|
|
9442
|
-
return /* @__PURE__ */
|
|
9443
|
-
/* @__PURE__ */
|
|
9778
|
+
return /* @__PURE__ */ jsxs84("div", { ref: rootRef, className: "ss-w-dial", children: [
|
|
9779
|
+
/* @__PURE__ */ jsxs84(
|
|
9444
9780
|
"button",
|
|
9445
9781
|
{
|
|
9446
9782
|
ref: buttonRef,
|
|
@@ -9451,36 +9787,36 @@ function PresetSpeedDial({ expanded, showDot, strings, onToggle, onOpen, rootRef
|
|
|
9451
9787
|
"aria-label": strings.dialName,
|
|
9452
9788
|
onClick: onToggle,
|
|
9453
9789
|
children: [
|
|
9454
|
-
/* @__PURE__ */
|
|
9455
|
-
/* @__PURE__ */
|
|
9456
|
-
showDot && !expanded ? /* @__PURE__ */
|
|
9790
|
+
/* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--open", children: /* @__PURE__ */ jsx98(SlidersIcon, {}) }),
|
|
9791
|
+
/* @__PURE__ */ jsx98("span", { className: "ss-w-dial-icon ss-w-dial-icon--close", children: /* @__PURE__ */ jsx98(CloseIcon, {}) }),
|
|
9792
|
+
showDot && !expanded ? /* @__PURE__ */ jsx98("span", { className: "ss-w-dial-dot", "aria-hidden": "true" }) : null
|
|
9457
9793
|
]
|
|
9458
9794
|
}
|
|
9459
9795
|
),
|
|
9460
|
-
/* @__PURE__ */
|
|
9461
|
-
/* @__PURE__ */
|
|
9462
|
-
/* @__PURE__ */
|
|
9463
|
-
/* @__PURE__ */
|
|
9796
|
+
/* @__PURE__ */ jsxs84("div", { id: pillsId, className: "ss-w-dial-pills", "data-open": expanded ? "" : void 0, children: [
|
|
9797
|
+
/* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("numbers"), children: [
|
|
9798
|
+
/* @__PURE__ */ jsx98(SlidersIcon, {}),
|
|
9799
|
+
/* @__PURE__ */ jsx98("span", { className: "ss-w-dial-pill-label", children: strings.setNumbers })
|
|
9464
9800
|
] }),
|
|
9465
|
-
/* @__PURE__ */
|
|
9466
|
-
/* @__PURE__ */
|
|
9467
|
-
/* @__PURE__ */
|
|
9801
|
+
/* @__PURE__ */ jsxs84("button", { type: "button", className: "ss-w-dial-pill", tabIndex, onClick: () => onOpen("combo"), children: [
|
|
9802
|
+
/* @__PURE__ */ jsx98(ComboIcon, {}),
|
|
9803
|
+
/* @__PURE__ */ jsx98("span", { className: "ss-w-dial-pill-label", children: strings.buildCombo })
|
|
9468
9804
|
] })
|
|
9469
9805
|
] })
|
|
9470
9806
|
] });
|
|
9471
9807
|
}
|
|
9472
9808
|
|
|
9473
9809
|
// src/components/PresetTools.tsx
|
|
9474
|
-
import { Fragment as Fragment21, useEffect as
|
|
9475
|
-
import { Fragment as Fragment22, jsx as
|
|
9810
|
+
import { Fragment as Fragment21, useEffect as useEffect29, useId as useId11, useRef as useRef25, useState as useState48 } from "react";
|
|
9811
|
+
import { Fragment as Fragment22, jsx as jsx99, jsxs as jsxs85 } from "react/jsx-runtime";
|
|
9476
9812
|
var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
9477
9813
|
function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
9478
|
-
const dialogRef =
|
|
9814
|
+
const dialogRef = useRef25(null);
|
|
9479
9815
|
const titleId = useId11();
|
|
9480
|
-
|
|
9816
|
+
useEffect29(() => {
|
|
9481
9817
|
dialogRef.current?.focus();
|
|
9482
9818
|
}, []);
|
|
9483
|
-
|
|
9819
|
+
useEffect29(() => {
|
|
9484
9820
|
const onKey = (e) => {
|
|
9485
9821
|
if (e.key !== "Escape") return;
|
|
9486
9822
|
e.stopPropagation();
|
|
@@ -9510,79 +9846,79 @@ function PresetToolModal({ title, closeLabel, onClose, children, footer }) {
|
|
|
9510
9846
|
first.focus();
|
|
9511
9847
|
}
|
|
9512
9848
|
};
|
|
9513
|
-
return /* @__PURE__ */
|
|
9514
|
-
/* @__PURE__ */
|
|
9515
|
-
/* @__PURE__ */
|
|
9516
|
-
/* @__PURE__ */
|
|
9849
|
+
return /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-backdrop", children: /* @__PURE__ */ jsxs85("div", { ref: dialogRef, className: "ss-w-tool", role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, onKeyDown: trapTab, children: [
|
|
9850
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-head", children: [
|
|
9851
|
+
/* @__PURE__ */ jsx99("h2", { id: titleId, className: "ss-w-tool-title", children: title }),
|
|
9852
|
+
/* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx99(CloseIcon, {}) })
|
|
9517
9853
|
] }),
|
|
9518
|
-
/* @__PURE__ */
|
|
9519
|
-
footer ? /* @__PURE__ */
|
|
9854
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-tool-body", children }),
|
|
9855
|
+
footer ? /* @__PURE__ */ jsx99("div", { className: "ss-w-tool-foot", children: footer }) : null
|
|
9520
9856
|
] }) });
|
|
9521
9857
|
}
|
|
9522
9858
|
function fillTemplate(template, slots) {
|
|
9523
9859
|
return template.split(/(\{[a-z]+\})/).filter((part) => part !== "").map((part, i) => {
|
|
9524
9860
|
const key = /^\{([a-z]+)\}$/.exec(part)?.[1];
|
|
9525
|
-
return /* @__PURE__ */
|
|
9861
|
+
return /* @__PURE__ */ jsx99(Fragment21, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
|
|
9526
9862
|
});
|
|
9527
9863
|
}
|
|
9528
9864
|
function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
|
|
9529
9865
|
const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
|
|
9530
|
-
return /* @__PURE__ */
|
|
9531
|
-
/* @__PURE__ */
|
|
9532
|
-
/* @__PURE__ */
|
|
9866
|
+
return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
|
|
9867
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
|
|
9868
|
+
/* @__PURE__ */ jsx99("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
|
|
9533
9869
|
const c = choices2[Number(e.target.value)];
|
|
9534
9870
|
if (c) onChoose(c.value);
|
|
9535
|
-
}, children: choices2.map((c, i) => /* @__PURE__ */
|
|
9871
|
+
}, children: choices2.map((c, i) => /* @__PURE__ */ jsx99("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
|
|
9536
9872
|
] });
|
|
9537
9873
|
}
|
|
9538
9874
|
function ChoiceSelect({ currentIdx, sizeLabels, optionLabels, label, onChoose }) {
|
|
9539
9875
|
const sizeText = sizeLabels[currentIdx] ?? "";
|
|
9540
|
-
return /* @__PURE__ */
|
|
9541
|
-
/* @__PURE__ */
|
|
9542
|
-
/* @__PURE__ */
|
|
9876
|
+
return /* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-num", children: [
|
|
9877
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: sizeText }),
|
|
9878
|
+
/* @__PURE__ */ jsx99("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__ */ jsx99("option", { value: String(i), children: opt }, i)) })
|
|
9543
9879
|
] });
|
|
9544
9880
|
}
|
|
9545
9881
|
function SendButton({ label, display, disabled, onClick }) {
|
|
9546
|
-
return /* @__PURE__ */
|
|
9882
|
+
return /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
|
|
9547
9883
|
}
|
|
9548
9884
|
function PickList({ picks, formatKickoff }) {
|
|
9549
|
-
return /* @__PURE__ */
|
|
9550
|
-
/* @__PURE__ */
|
|
9885
|
+
return /* @__PURE__ */ jsx99("ul", { className: "ss-w-tool-picks", role: "list", children: picks.map((p) => /* @__PURE__ */ jsxs85("li", { className: "ss-w-tool-pick", children: [
|
|
9886
|
+
/* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-pick-match", children: [
|
|
9551
9887
|
p.homeTeamName,
|
|
9552
9888
|
" \u2013 ",
|
|
9553
9889
|
p.awayTeamName
|
|
9554
9890
|
] }),
|
|
9555
|
-
/* @__PURE__ */
|
|
9891
|
+
/* @__PURE__ */ jsxs85("span", { className: "ss-w-tool-pick-sel", children: [
|
|
9556
9892
|
p.marketLabel,
|
|
9557
9893
|
": ",
|
|
9558
9894
|
p.selectionLabel,
|
|
9559
9895
|
p.line ? ` ${p.line}` : ""
|
|
9560
9896
|
] }),
|
|
9561
|
-
/* @__PURE__ */
|
|
9562
|
-
/* @__PURE__ */
|
|
9897
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-pick-kick", children: formatKickoff(p.kickoffUtc) }),
|
|
9898
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-pick-price", children: p.price.toFixed(2) })
|
|
9563
9899
|
] }, p.matchOddsId)) });
|
|
9564
9900
|
}
|
|
9565
9901
|
function ComboPreview({ cell, formatKickoff }) {
|
|
9566
|
-
return /* @__PURE__ */
|
|
9567
|
-
/* @__PURE__ */
|
|
9568
|
-
/* @__PURE__ */
|
|
9902
|
+
return /* @__PURE__ */ jsxs85(Fragment22, { children: [
|
|
9903
|
+
/* @__PURE__ */ jsx99(PickList, { picks: cell.combo.legs, formatKickoff }),
|
|
9904
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-tool-math", children: cell.combo.multiplication })
|
|
9569
9905
|
] });
|
|
9570
9906
|
}
|
|
9571
9907
|
function Unavailable({ text }) {
|
|
9572
|
-
return /* @__PURE__ */
|
|
9908
|
+
return /* @__PURE__ */ jsx99("p", { className: "ss-w-tool-unavailable", children: text });
|
|
9573
9909
|
}
|
|
9574
9910
|
function AskRow({ icon, ask, ready, send }) {
|
|
9575
|
-
return /* @__PURE__ */
|
|
9576
|
-
/* @__PURE__ */
|
|
9577
|
-
/* @__PURE__ */
|
|
9578
|
-
/* @__PURE__ */
|
|
9579
|
-
ready ? /* @__PURE__ */
|
|
9911
|
+
return /* @__PURE__ */ jsxs85("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
|
|
9912
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
|
|
9913
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-main", children: [
|
|
9914
|
+
/* @__PURE__ */ jsx99("p", { className: "ss-w-tool-ask", children: ask }),
|
|
9915
|
+
ready ? /* @__PURE__ */ jsx99("span", { className: "ss-w-tool-ready", children: ready }) : null
|
|
9580
9916
|
] }),
|
|
9581
9917
|
send
|
|
9582
9918
|
] });
|
|
9583
9919
|
}
|
|
9584
9920
|
function RoundSend({ label, display, disabled, onClick }) {
|
|
9585
|
-
return /* @__PURE__ */
|
|
9921
|
+
return /* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx99(SendIcon, {}) });
|
|
9586
9922
|
}
|
|
9587
9923
|
var BIG_COMBO = { total: 50, legs: 6 };
|
|
9588
9924
|
function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
@@ -9591,15 +9927,15 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9591
9927
|
const totals = comboTotals(grid);
|
|
9592
9928
|
const legChoices = comboLegChoices(grid);
|
|
9593
9929
|
const count = FIXED_SINGLES_COUNT;
|
|
9594
|
-
const [maxPrice, setMaxPrice] =
|
|
9595
|
-
const [minPrice, setMinPrice] =
|
|
9596
|
-
const [start] =
|
|
9597
|
-
const [total, setTotal] =
|
|
9598
|
-
const [legs, setLegs] =
|
|
9599
|
-
const [bigStart] =
|
|
9600
|
-
const [bigTotal, setBigTotal] =
|
|
9601
|
-
const [bigLegs, setBigLegs] =
|
|
9602
|
-
const [announcement, setAnnouncement] =
|
|
9930
|
+
const [maxPrice, setMaxPrice] = useState48(() => startSingles(grid.singles, limits, START.maxPrice, count));
|
|
9931
|
+
const [minPrice, setMinPrice] = useState48(() => startSingles(grid.singlesFrom, floors, START.minPrice, count));
|
|
9932
|
+
const [start] = useState48(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
|
|
9933
|
+
const [total, setTotal] = useState48(start.total);
|
|
9934
|
+
const [legs, setLegs] = useState48(start.legs);
|
|
9935
|
+
const [bigStart] = useState48(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
|
|
9936
|
+
const [bigTotal, setBigTotal] = useState48(bigStart.total);
|
|
9937
|
+
const [bigLegs, setBigLegs] = useState48(bigStart.legs);
|
|
9938
|
+
const [announcement, setAnnouncement] = useState48("");
|
|
9603
9939
|
const maxCell = findSingles(grid.singles, maxPrice, count);
|
|
9604
9940
|
const minCell = findSingles(grid.singlesFrom, minPrice, count);
|
|
9605
9941
|
const comboCell = findCombo(grid, total, legs);
|
|
@@ -9643,95 +9979,95 @@ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
|
|
|
9643
9979
|
const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
|
|
9644
9980
|
const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
|
|
9645
9981
|
const markets = grid.markets ?? [];
|
|
9646
|
-
const [marketIdx, setMarketIdx] =
|
|
9982
|
+
const [marketIdx, setMarketIdx] = useState48(0);
|
|
9647
9983
|
const marketCell = markets[marketIdx] ?? null;
|
|
9648
9984
|
const marketLabels = markets.map((c) => strings.marketShort(c.marketDeveloperName, c.marketLabel, c.selectionLabel ?? null));
|
|
9649
9985
|
const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
|
|
9650
9986
|
const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
|
|
9651
|
-
return /* @__PURE__ */
|
|
9652
|
-
/* @__PURE__ */
|
|
9987
|
+
return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
|
|
9988
|
+
/* @__PURE__ */ jsx99(
|
|
9653
9989
|
AskRow,
|
|
9654
9990
|
{
|
|
9655
9991
|
icon: "\u{1F3AF}",
|
|
9656
9992
|
ask: fillTemplate(strings.maxPriceRow, {
|
|
9657
9993
|
count: String(count),
|
|
9658
|
-
price: /* @__PURE__ */
|
|
9994
|
+
price: /* @__PURE__ */ jsx99(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
|
|
9659
9995
|
}),
|
|
9660
9996
|
ready: singlesReady(maxCell),
|
|
9661
|
-
send: /* @__PURE__ */
|
|
9997
|
+
send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
|
|
9662
9998
|
if (maxCell) onSend(maxPriceAsk(maxCell, strings));
|
|
9663
9999
|
} })
|
|
9664
10000
|
}
|
|
9665
10001
|
),
|
|
9666
|
-
/* @__PURE__ */
|
|
10002
|
+
/* @__PURE__ */ jsx99(
|
|
9667
10003
|
AskRow,
|
|
9668
10004
|
{
|
|
9669
10005
|
icon: "\u{1F4C8}",
|
|
9670
10006
|
ask: fillTemplate(strings.minPriceRow, {
|
|
9671
10007
|
count: String(count),
|
|
9672
|
-
price: /* @__PURE__ */
|
|
10008
|
+
price: /* @__PURE__ */ jsx99(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
|
|
9673
10009
|
}),
|
|
9674
10010
|
ready: singlesReady(minCell),
|
|
9675
|
-
send: /* @__PURE__ */
|
|
10011
|
+
send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
|
|
9676
10012
|
if (minCell) onSend(minPriceAsk(minCell, strings));
|
|
9677
10013
|
} })
|
|
9678
10014
|
}
|
|
9679
10015
|
),
|
|
9680
|
-
/* @__PURE__ */
|
|
10016
|
+
/* @__PURE__ */ jsx99(
|
|
9681
10017
|
AskRow,
|
|
9682
10018
|
{
|
|
9683
10019
|
icon: "\u2728",
|
|
9684
10020
|
ask: fillTemplate(strings.comboRow, {
|
|
9685
|
-
legs: /* @__PURE__ */
|
|
9686
|
-
total: /* @__PURE__ */
|
|
10021
|
+
legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
|
|
10022
|
+
total: /* @__PURE__ */ jsx99(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
|
|
9687
10023
|
}),
|
|
9688
10024
|
ready: comboReady(comboCell),
|
|
9689
|
-
send: /* @__PURE__ */
|
|
10025
|
+
send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
|
|
9690
10026
|
if (comboCell) onSend(comboAsk(comboCell, strings));
|
|
9691
10027
|
} })
|
|
9692
10028
|
}
|
|
9693
10029
|
),
|
|
9694
|
-
/* @__PURE__ */
|
|
10030
|
+
/* @__PURE__ */ jsx99(
|
|
9695
10031
|
AskRow,
|
|
9696
10032
|
{
|
|
9697
10033
|
icon: "\u{1F3C6}",
|
|
9698
10034
|
ask: fillTemplate(strings.bigComboRow, {
|
|
9699
|
-
legs: /* @__PURE__ */
|
|
9700
|
-
total: /* @__PURE__ */
|
|
10035
|
+
legs: /* @__PURE__ */ jsx99(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
|
|
10036
|
+
total: /* @__PURE__ */ jsx99(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
|
|
9701
10037
|
}),
|
|
9702
10038
|
ready: comboReady(bigCell),
|
|
9703
|
-
send: /* @__PURE__ */
|
|
10039
|
+
send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
|
|
9704
10040
|
if (bigCell) onSend(comboAsk(bigCell, strings));
|
|
9705
10041
|
} })
|
|
9706
10042
|
}
|
|
9707
10043
|
),
|
|
9708
|
-
markets.length > 0 && /* @__PURE__ */
|
|
10044
|
+
markets.length > 0 && /* @__PURE__ */ jsx99(
|
|
9709
10045
|
AskRow,
|
|
9710
10046
|
{
|
|
9711
10047
|
icon: "\u26BD",
|
|
9712
10048
|
ask: fillTemplate(strings.marketRow, {
|
|
9713
|
-
market: /* @__PURE__ */
|
|
10049
|
+
market: /* @__PURE__ */ jsx99(ChoiceSelect, { currentIdx: marketIdx, sizeLabels: marketLabels, optionLabels: marketLabels, label: strings.marketName, onChoose: chooseMarket })
|
|
9714
10050
|
}),
|
|
9715
10051
|
ready: marketCell ? strings.readyCount(marketCell.count) : null,
|
|
9716
|
-
send: /* @__PURE__ */
|
|
10052
|
+
send: /* @__PURE__ */ jsx99(RoundSend, { label: strings.send, display: marketCell ? marketDisplay(marketCell, strings) : "", disabled: !marketCell || streaming, onClick: () => {
|
|
9717
10053
|
if (marketCell) onSend(marketAsk(marketCell, strings));
|
|
9718
10054
|
} })
|
|
9719
10055
|
}
|
|
9720
10056
|
),
|
|
9721
|
-
/* @__PURE__ */
|
|
10057
|
+
/* @__PURE__ */ jsx99("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
|
|
9722
10058
|
] });
|
|
9723
10059
|
}
|
|
9724
10060
|
function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal, initialLegs, onSend, onClose }) {
|
|
9725
10061
|
const totals = comboTotals(grid);
|
|
9726
10062
|
const legChoices = comboLegChoices(grid);
|
|
9727
|
-
const [start] =
|
|
9728
|
-
const [total, setTotal] =
|
|
9729
|
-
const [legs, setLegs] =
|
|
10063
|
+
const [start] = useState48(() => initialTotal === void 0 ? startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs) : null);
|
|
10064
|
+
const [total, setTotal] = useState48(() => initialTotal !== void 0 ? nearest(totals, initialTotal) : start.total);
|
|
10065
|
+
const [legs, setLegs] = useState48(() => {
|
|
9730
10066
|
if (initialTotal === void 0) return initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : start.legs;
|
|
9731
10067
|
const from = initialLegs !== void 0 ? clampLegs(legChoices, initialLegs) : startValue(legChoices, START.comboLegs);
|
|
9732
10068
|
return legsForTotal(grid, nearest(totals, initialTotal), from);
|
|
9733
10069
|
});
|
|
9734
|
-
const [announcement, setAnnouncement] =
|
|
10070
|
+
const [announcement, setAnnouncement] = useState48("");
|
|
9735
10071
|
const cell = findCombo(grid, total, legs);
|
|
9736
10072
|
const minLegs = legChoices[0] ?? legs;
|
|
9737
10073
|
const maxLegs = legChoices[legChoices.length - 1] ?? legs;
|
|
@@ -9742,29 +10078,29 @@ function BuildComboTool({ grid, strings, streaming, formatKickoff, initialTotal,
|
|
|
9742
10078
|
const d = strings.comboDisplay(nextLegs, nextTotal);
|
|
9743
10079
|
setAnnouncement(findCombo(grid, nextTotal, nextLegs) ? d : `${d}. ${strings.unavailable}`);
|
|
9744
10080
|
};
|
|
9745
|
-
const footer = /* @__PURE__ */
|
|
10081
|
+
const footer = /* @__PURE__ */ jsx99(SendButton, { label: strings.send, display, disabled: !cell || streaming, onClick: () => {
|
|
9746
10082
|
if (cell) onSend(comboAsk(cell, strings));
|
|
9747
10083
|
} });
|
|
9748
|
-
return /* @__PURE__ */
|
|
9749
|
-
/* @__PURE__ */
|
|
9750
|
-
/* @__PURE__ */
|
|
9751
|
-
/* @__PURE__ */
|
|
10084
|
+
return /* @__PURE__ */ jsxs85(PresetToolModal, { title: strings.buildCombo, closeLabel: strings.close, onClose, footer, children: [
|
|
10085
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.totalLabel, children: [
|
|
10086
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.totalLabel }),
|
|
10087
|
+
/* @__PURE__ */ jsx99("div", { className: "ss-w-tool-chips", children: totals.map((t) => /* @__PURE__ */ jsx99("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)) })
|
|
9752
10088
|
] }),
|
|
9753
|
-
/* @__PURE__ */
|
|
9754
|
-
/* @__PURE__ */
|
|
9755
|
-
/* @__PURE__ */
|
|
9756
|
-
/* @__PURE__ */
|
|
9757
|
-
/* @__PURE__ */
|
|
9758
|
-
/* @__PURE__ */
|
|
10089
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-section", role: "group", "aria-label": strings.matchesLabel, children: [
|
|
10090
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-label", "aria-hidden": "true", children: strings.matchesLabel }),
|
|
10091
|
+
/* @__PURE__ */ jsxs85("div", { className: "ss-w-tool-stepper", children: [
|
|
10092
|
+
/* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.fewerMatches, disabled: legs <= minLegs, onClick: () => choose(total, legs - 1), children: "\u2212" }),
|
|
10093
|
+
/* @__PURE__ */ jsx99("span", { className: "ss-w-tool-count", children: legs }),
|
|
10094
|
+
/* @__PURE__ */ jsx99("button", { type: "button", className: "ss-w-tool-step", "aria-label": strings.moreMatches, disabled: legs >= maxLegs, onClick: () => choose(total, legs + 1), children: "+" })
|
|
9759
10095
|
] })
|
|
9760
10096
|
] }),
|
|
9761
|
-
cell ? /* @__PURE__ */
|
|
9762
|
-
/* @__PURE__ */
|
|
10097
|
+
cell ? /* @__PURE__ */ jsx99(ComboPreview, { cell, formatKickoff }) : /* @__PURE__ */ jsx99(Unavailable, { text: strings.unavailable }),
|
|
10098
|
+
/* @__PURE__ */ jsx99("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
|
|
9763
10099
|
] });
|
|
9764
10100
|
}
|
|
9765
10101
|
|
|
9766
10102
|
// src/usePresetDial.ts
|
|
9767
|
-
import { useCallback as
|
|
10103
|
+
import { useCallback as useCallback19, useEffect as useEffect30, useRef as useRef26, useState as useState49 } from "react";
|
|
9768
10104
|
function sendInFlight(messages, isStreaming) {
|
|
9769
10105
|
const last = messages[messages.length - 1];
|
|
9770
10106
|
return isStreaming && !!last && last.role === "assistant" && !last.done && !last.isGreeting;
|
|
@@ -9778,25 +10114,25 @@ function lastUserId(messages) {
|
|
|
9778
10114
|
}
|
|
9779
10115
|
var SCROLL_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "PageUp", "PageDown", "Home", "End", " "]);
|
|
9780
10116
|
function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming, activeTab }) {
|
|
9781
|
-
const [expanded, setExpanded] =
|
|
9782
|
-
const fold =
|
|
9783
|
-
const toggle =
|
|
10117
|
+
const [expanded, setExpanded] = useState49(() => !sendInFlight(messages, isStreaming));
|
|
10118
|
+
const fold = useCallback19(() => setExpanded(false), []);
|
|
10119
|
+
const toggle = useCallback19(() => setExpanded((e) => !e), []);
|
|
9784
10120
|
const currentUserId = lastUserId(messages);
|
|
9785
|
-
const userIdRef =
|
|
9786
|
-
|
|
10121
|
+
const userIdRef = useRef26(currentUserId);
|
|
10122
|
+
useEffect30(() => {
|
|
9787
10123
|
if (currentUserId === userIdRef.current) return;
|
|
9788
10124
|
userIdRef.current = currentUserId;
|
|
9789
10125
|
setExpanded(false);
|
|
9790
10126
|
}, [currentUserId]);
|
|
9791
|
-
const tabRef =
|
|
9792
|
-
|
|
10127
|
+
const tabRef = useRef26(activeTab);
|
|
10128
|
+
useEffect30(() => {
|
|
9793
10129
|
if (activeTab === tabRef.current) return;
|
|
9794
10130
|
tabRef.current = activeTab;
|
|
9795
10131
|
setExpanded(false);
|
|
9796
10132
|
}, [activeTab]);
|
|
9797
|
-
const expandedRef =
|
|
10133
|
+
const expandedRef = useRef26(expanded);
|
|
9798
10134
|
expandedRef.current = expanded;
|
|
9799
|
-
|
|
10135
|
+
useEffect30(() => {
|
|
9800
10136
|
const onEscape = (e) => {
|
|
9801
10137
|
const dial = dialRef.current;
|
|
9802
10138
|
if (e.key !== "Escape" || !dial || !e.composedPath().includes(dial)) return;
|
|
@@ -9809,7 +10145,7 @@ function usePresetDial({ layerRef, dialRef, dialButtonRef, messages, isStreaming
|
|
|
9809
10145
|
window.addEventListener("keydown", onEscape, true);
|
|
9810
10146
|
return () => window.removeEventListener("keydown", onEscape, true);
|
|
9811
10147
|
}, [dialRef, dialButtonRef]);
|
|
9812
|
-
|
|
10148
|
+
useEffect30(() => {
|
|
9813
10149
|
if (!expanded) return;
|
|
9814
10150
|
const layer = layerRef.current;
|
|
9815
10151
|
const inDial = (e) => {
|
|
@@ -9861,11 +10197,11 @@ function markToolSeen() {
|
|
|
9861
10197
|
}
|
|
9862
10198
|
|
|
9863
10199
|
// src/components/ChatPanel.tsx
|
|
9864
|
-
import { Fragment as Fragment23, jsx as
|
|
10200
|
+
import { Fragment as Fragment23, jsx as jsx100, jsxs as jsxs86 } from "react/jsx-runtime";
|
|
9865
10201
|
var FULLSCREEN_QUERY = "(max-width: 639px)";
|
|
9866
10202
|
function useIsModal() {
|
|
9867
|
-
const [modal, setModal] =
|
|
9868
|
-
|
|
10203
|
+
const [modal, setModal] = useState50(false);
|
|
10204
|
+
useEffect31(() => {
|
|
9869
10205
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
9870
10206
|
const mql = window.matchMedia(FULLSCREEN_QUERY);
|
|
9871
10207
|
const sync = () => setModal(mql.matches);
|
|
@@ -9876,10 +10212,10 @@ function useIsModal() {
|
|
|
9876
10212
|
return modal;
|
|
9877
10213
|
}
|
|
9878
10214
|
var HIDDEN_LAYER_STYLE = { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" };
|
|
9879
|
-
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, loggedIn, conversation, presetGrid }) {
|
|
10215
|
+
function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, gamesResult, leaderboardResult, clubFixturesResult, clubStandingsResult, clubSquadResult, loggedIn, conversation, presetGrid }) {
|
|
9880
10216
|
const { state, close, stop, send, reset } = controller;
|
|
9881
10217
|
const isModal = useIsModal();
|
|
9882
|
-
|
|
10218
|
+
useEffect31(() => {
|
|
9883
10219
|
const onKey = (e) => {
|
|
9884
10220
|
if (e.key === "Escape") close();
|
|
9885
10221
|
};
|
|
@@ -9895,19 +10231,19 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9895
10231
|
monitor?.setActiveTab("chat");
|
|
9896
10232
|
send(text, { grounding });
|
|
9897
10233
|
};
|
|
9898
|
-
|
|
10234
|
+
useEffect31(() => {
|
|
9899
10235
|
if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
|
|
9900
10236
|
}, [monitor, state.isStreaming, state.messages.length]);
|
|
9901
10237
|
const onChatTab = !monitor || monitor.activeTab === "chat";
|
|
9902
|
-
const layerRef =
|
|
9903
|
-
const dialRef =
|
|
9904
|
-
const dialButtonRef =
|
|
9905
|
-
const inputRef =
|
|
9906
|
-
const limitRef =
|
|
9907
|
-
const typedSendRef =
|
|
9908
|
-
const focusAfterCloseRef =
|
|
9909
|
-
const [tool, setTool] =
|
|
9910
|
-
const [toolSeen, setToolSeen] =
|
|
10238
|
+
const layerRef = useRef27(null);
|
|
10239
|
+
const dialRef = useRef27(null);
|
|
10240
|
+
const dialButtonRef = useRef27(null);
|
|
10241
|
+
const inputRef = useRef27(null);
|
|
10242
|
+
const limitRef = useRef27(null);
|
|
10243
|
+
const typedSendRef = useRef27(false);
|
|
10244
|
+
const focusAfterCloseRef = useRef27(null);
|
|
10245
|
+
const [tool, setTool] = useState50(null);
|
|
10246
|
+
const [toolSeen, setToolSeen] = useState50(readToolSeen);
|
|
9911
10247
|
const dial = usePresetDial({
|
|
9912
10248
|
layerRef,
|
|
9913
10249
|
dialRef,
|
|
@@ -9919,53 +10255,53 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9919
10255
|
const { fold } = dial;
|
|
9920
10256
|
const paused = isPaused(state.limit);
|
|
9921
10257
|
const showDial = !!presetGrid && onChatTab && !tool && !paused;
|
|
9922
|
-
|
|
10258
|
+
useEffect31(() => {
|
|
9923
10259
|
if (paused) setTool(null);
|
|
9924
10260
|
}, [paused]);
|
|
9925
|
-
|
|
10261
|
+
useEffect31(() => {
|
|
9926
10262
|
if (!paused) return;
|
|
9927
10263
|
if (typedSendRef.current) limitRef.current?.focus();
|
|
9928
10264
|
typedSendRef.current = false;
|
|
9929
10265
|
}, [paused]);
|
|
9930
|
-
const openTool =
|
|
10266
|
+
const openTool = useCallback20((next) => {
|
|
9931
10267
|
fold();
|
|
9932
10268
|
markToolSeen();
|
|
9933
10269
|
setToolSeen(true);
|
|
9934
10270
|
setTool(next);
|
|
9935
10271
|
}, [fold]);
|
|
9936
|
-
const onPill =
|
|
10272
|
+
const onPill = useCallback20((kind) => openTool(kind === "numbers" ? { kind: "numbers" } : { kind: "combo" }), [openTool]);
|
|
9937
10273
|
const toolsValue = useMemo5(
|
|
9938
10274
|
() => presetGrid && !paused ? { openBuilder: (total, legs) => openTool({ kind: "combo", total, legs }), changeLabel: ui.presets.changeCombo } : null,
|
|
9939
10275
|
[presetGrid, paused, openTool, ui.presets.changeCombo]
|
|
9940
10276
|
);
|
|
9941
|
-
const closeTool =
|
|
10277
|
+
const closeTool = useCallback20(() => {
|
|
9942
10278
|
focusAfterCloseRef.current = "dial";
|
|
9943
10279
|
setTool(null);
|
|
9944
10280
|
}, []);
|
|
9945
|
-
const sendAsk =
|
|
10281
|
+
const sendAsk = useCallback20((ask) => {
|
|
9946
10282
|
focusAfterCloseRef.current = "composer";
|
|
9947
10283
|
setTool(null);
|
|
9948
10284
|
monitor?.setActiveTab("chat");
|
|
9949
10285
|
send(ask.message, { displayText: ask.displayText, preset: ask.preset });
|
|
9950
10286
|
}, [monitor, send]);
|
|
9951
|
-
const formatKickoff =
|
|
10287
|
+
const formatKickoff = useCallback20((kickoffUtc) => {
|
|
9952
10288
|
const k = ui.bettingKickoff(kickoffUtc);
|
|
9953
10289
|
return `${k.dayLabel} ${k.time}`;
|
|
9954
10290
|
}, [ui]);
|
|
9955
|
-
|
|
10291
|
+
useEffect31(() => {
|
|
9956
10292
|
if (tool) return;
|
|
9957
10293
|
const target = focusAfterCloseRef.current;
|
|
9958
10294
|
focusAfterCloseRef.current = null;
|
|
9959
10295
|
if (target === "dial") dialButtonRef.current?.focus();
|
|
9960
10296
|
else if (target === "composer") inputRef.current?.focus();
|
|
9961
10297
|
}, [tool]);
|
|
9962
|
-
|
|
10298
|
+
useEffect31(() => {
|
|
9963
10299
|
if (!tool || onChatTab && presetGrid) return;
|
|
9964
10300
|
focusAfterCloseRef.current = "composer";
|
|
9965
10301
|
setTool(null);
|
|
9966
10302
|
}, [tool, onChatTab, presetGrid]);
|
|
9967
|
-
return /* @__PURE__ */
|
|
9968
|
-
/* @__PURE__ */
|
|
10303
|
+
return /* @__PURE__ */ jsxs86("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
|
|
10304
|
+
/* @__PURE__ */ jsx100(
|
|
9969
10305
|
ChatHeader,
|
|
9970
10306
|
{
|
|
9971
10307
|
onClose: close,
|
|
@@ -9978,7 +10314,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9978
10314
|
moreOptionsLabel: ui.moreOptions
|
|
9979
10315
|
}
|
|
9980
10316
|
),
|
|
9981
|
-
monitor && /* @__PURE__ */
|
|
10317
|
+
monitor && /* @__PURE__ */ jsx100(
|
|
9982
10318
|
TabBar,
|
|
9983
10319
|
{
|
|
9984
10320
|
monitor,
|
|
@@ -9987,12 +10323,13 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
9987
10323
|
oddsCount: monitor.pins.filter((p) => p.kind !== "match").length,
|
|
9988
10324
|
todayCount: discovery?.liveCount ?? 0,
|
|
9989
10325
|
hasToday: discovery ? visibleGroupsOf(discovery.groups, discovery.states).length > 0 : false,
|
|
9990
|
-
gamesEnabled: gamesResult?.enabled ?? false
|
|
10326
|
+
gamesEnabled: gamesResult?.enabled ?? false,
|
|
10327
|
+
clubEnabled: clubFixturesResult?.enabled ?? false
|
|
9991
10328
|
}
|
|
9992
10329
|
),
|
|
9993
|
-
/* @__PURE__ */
|
|
9994
|
-
/* @__PURE__ */
|
|
9995
|
-
showDial ? /* @__PURE__ */
|
|
10330
|
+
/* @__PURE__ */ jsxs86("div", { ref: layerRef, className: "ss-w-chat-layer", "data-dial": presetGrid ? "" : void 0, style: onChatTab ? void 0 : HIDDEN_LAYER_STYLE, children: [
|
|
10331
|
+
/* @__PURE__ */ jsx100(PresetToolsContext.Provider, { value: toolsValue, children: /* @__PURE__ */ jsx100(MessageList, { controller, ui, slip, onDashboardTap, monitor }) }),
|
|
10332
|
+
showDial ? /* @__PURE__ */ jsx100(
|
|
9996
10333
|
PresetSpeedDial,
|
|
9997
10334
|
{
|
|
9998
10335
|
expanded: dial.expanded,
|
|
@@ -10004,12 +10341,15 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10004
10341
|
buttonRef: dialButtonRef
|
|
10005
10342
|
}
|
|
10006
10343
|
) : null,
|
|
10007
|
-
tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */
|
|
10344
|
+
tool && presetGrid && onChatTab && !paused ? tool.kind === "numbers" ? /* @__PURE__ */ jsx100(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx100(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
|
|
10008
10345
|
] }),
|
|
10009
|
-
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */
|
|
10010
|
-
monitor && monitor.activeTab === "following" && /* @__PURE__ */
|
|
10011
|
-
monitor && monitor.activeTab === "odds" && /* @__PURE__ */
|
|
10012
|
-
monitor && monitor.activeTab === "
|
|
10346
|
+
monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx100(TodayPanel, { discovery, ui, monitor }),
|
|
10347
|
+
monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx100(MatchesPanel, { monitor, ui, slip, onAsk: paused ? void 0 : handleAsk }),
|
|
10348
|
+
monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx100(OddsPanel, { monitor, ui, slip }),
|
|
10349
|
+
monitor && monitor.activeTab === "fixtures" && /* @__PURE__ */ jsx100(Fixtures, { fixtures: clubFixturesResult?.fixtures ?? [], loading: clubFixturesResult?.loading ?? false, ui }),
|
|
10350
|
+
monitor && monitor.activeTab === "standings" && /* @__PURE__ */ jsx100(Standings, { standings: clubStandingsResult?.data ?? null, loading: clubStandingsResult?.loading ?? false, ui }),
|
|
10351
|
+
monitor && monitor.activeTab === "squad" && /* @__PURE__ */ jsx100(Squad, { squad: clubSquadResult?.data ?? null, loading: clubSquadResult?.loading ?? false, ui }),
|
|
10352
|
+
monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx100(
|
|
10013
10353
|
GamesPanel,
|
|
10014
10354
|
{
|
|
10015
10355
|
loggedIn: !!loggedIn,
|
|
@@ -10017,25 +10357,16 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10017
10357
|
ui,
|
|
10018
10358
|
conversation,
|
|
10019
10359
|
leaderboard: leaderboardResult?.data ?? null,
|
|
10360
|
+
leaderboardLoading: leaderboardResult?.loading ?? false,
|
|
10020
10361
|
refreshHub: () => {
|
|
10021
10362
|
gamesResult.refresh();
|
|
10022
10363
|
leaderboardResult?.refresh();
|
|
10023
10364
|
}
|
|
10024
10365
|
}
|
|
10025
10366
|
),
|
|
10026
|
-
monitor
|
|
10027
|
-
|
|
10028
|
-
|
|
10029
|
-
loggedIn: !!loggedIn,
|
|
10030
|
-
data: leaderboardResult.data,
|
|
10031
|
-
loading: leaderboardResult.loading,
|
|
10032
|
-
onPlay: () => monitor.setActiveTab("games"),
|
|
10033
|
-
ui
|
|
10034
|
-
}
|
|
10035
|
-
),
|
|
10036
|
-
(!monitor || monitor.activeTab !== "games" && monitor.activeTab !== "leaderboard") && /* @__PURE__ */ jsxs82(Fragment23, { children: [
|
|
10037
|
-
/* @__PURE__ */ jsx97("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
|
|
10038
|
-
paused ? null : /* @__PURE__ */ jsx97(
|
|
10367
|
+
(!monitor || monitor.activeTab !== "games") && /* @__PURE__ */ jsxs86(Fragment23, { children: [
|
|
10368
|
+
/* @__PURE__ */ jsx100("div", { ref: limitRef, className: "ss-w-limit", role: "status", tabIndex: -1, children: state.limit ? limitText(state.limit, ui) : null }),
|
|
10369
|
+
paused ? null : /* @__PURE__ */ jsx100(
|
|
10039
10370
|
ChatInput,
|
|
10040
10371
|
{
|
|
10041
10372
|
ref: inputRef,
|
|
@@ -10054,9 +10385,9 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
|
|
|
10054
10385
|
}
|
|
10055
10386
|
|
|
10056
10387
|
// src/components/HostEventsProvider.tsx
|
|
10057
|
-
import { jsx as
|
|
10388
|
+
import { jsx as jsx101 } from "react/jsx-runtime";
|
|
10058
10389
|
function HostEventsProvider({ value, children }) {
|
|
10059
|
-
return /* @__PURE__ */
|
|
10390
|
+
return /* @__PURE__ */ jsx101(SlipStateContext.Provider, { value: value.slipState, children });
|
|
10060
10391
|
}
|
|
10061
10392
|
|
|
10062
10393
|
// src/styles/css.generated.ts
|
|
@@ -11212,6 +11543,11 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11212
11543
|
.ss-w-mk-ctx-right { display: flex; align-items: center; gap: 6px; margin-left: auto; flex: none; }
|
|
11213
11544
|
/* flex:1 keeps the composer pinned to the panel bottom when a tab is empty */
|
|
11214
11545
|
.ss-w-mon-empty { flex: 1; padding: 24px 16px; text-align: center; font-size: 12.5px; color: var(--ss-w-faint); }
|
|
11546
|
+
/* shared group-header label for Club Fixtures (round) and Squad (position) list groups */
|
|
11547
|
+
.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; }
|
|
11548
|
+
.ss-w-sq-row { display: flex; align-items: center; gap: 10px; padding: 7px 2px; border-bottom: 1px solid var(--ss-w-line); }
|
|
11549
|
+
.ss-w-sq-num { flex: none; width: 20px; text-align: right; font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ss-w-faint); }
|
|
11550
|
+
.ss-w-sq-name { font-size: 13px; font-weight: 600; color: var(--ss-w-ink); }
|
|
11215
11551
|
/* Per-pin unavailable state: the pin's context line still rendered above (score, name, unpin), but
|
|
11216
11552
|
the pin has neither a card nor history (compose-time rescue failed) -- a small inline note beats
|
|
11217
11553
|
a bare context line with nothing under it. */
|
|
@@ -11815,7 +12151,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
11815
12151
|
`;
|
|
11816
12152
|
|
|
11817
12153
|
// src/StatsWidget.tsx
|
|
11818
|
-
import { jsx as
|
|
12154
|
+
import { jsx as jsx102 } from "react/jsx-runtime";
|
|
11819
12155
|
function buildClient(props) {
|
|
11820
12156
|
try {
|
|
11821
12157
|
if ("client" in props && props.client) {
|
|
@@ -11849,14 +12185,14 @@ function StatsWidget(props) {
|
|
|
11849
12185
|
[built?.client]
|
|
11850
12186
|
);
|
|
11851
12187
|
const ui = useMemo6(() => normalizeUi(props.config ?? { operatorId: "", publicKey: "" }), [props.config]);
|
|
11852
|
-
const rootRef =
|
|
11853
|
-
const introDoneRef =
|
|
11854
|
-
const markIntroDone =
|
|
12188
|
+
const rootRef = useRef28(null);
|
|
12189
|
+
const introDoneRef = useRef28(false);
|
|
12190
|
+
const markIntroDone = useCallback21(() => {
|
|
11855
12191
|
introDoneRef.current = true;
|
|
11856
12192
|
}, []);
|
|
11857
12193
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
11858
12194
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
11859
|
-
const [hasToday, setHasToday] =
|
|
12195
|
+
const [hasToday, setHasToday] = useState51(false);
|
|
11860
12196
|
const liveCardWatches = useMemo6(() => {
|
|
11861
12197
|
const seen = /* @__PURE__ */ new Set();
|
|
11862
12198
|
const out = [];
|
|
@@ -11871,25 +12207,27 @@ function StatsWidget(props) {
|
|
|
11871
12207
|
return out;
|
|
11872
12208
|
}, [controller.state.messages]);
|
|
11873
12209
|
const locale = cfg?.locale;
|
|
12210
|
+
const clubFixturesResult = useClubFixtures(built?.conversation ?? null);
|
|
11874
12211
|
const monitor = useLiveMonitor({
|
|
11875
12212
|
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins, locale) : Promise.resolve(null),
|
|
11876
12213
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|
|
11877
12214
|
storageKey: `ss-w-pins:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`,
|
|
11878
12215
|
isOpen: controller.state.isOpen,
|
|
11879
12216
|
hasToday,
|
|
11880
|
-
watches: liveCardWatches
|
|
12217
|
+
watches: liveCardWatches,
|
|
12218
|
+
clubEnabled: clubFixturesResult.enabled
|
|
11881
12219
|
});
|
|
11882
12220
|
const operatorUserId = cfg?.userContext?.operatorUserId;
|
|
11883
12221
|
const anonymousUserId = cfg?.userContext?.anonymousUserId;
|
|
11884
|
-
const getSchedule =
|
|
12222
|
+
const getSchedule = useCallback21(
|
|
11885
12223
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
11886
12224
|
[built, operatorUserId, anonymousUserId]
|
|
11887
12225
|
);
|
|
11888
|
-
const postLeagueStar =
|
|
12226
|
+
const postLeagueStar = useCallback21(
|
|
11889
12227
|
(competitionId, starred) => built ? built.conversation.starLeague(competitionId, starred, operatorUserId, anonymousUserId) : Promise.resolve(null),
|
|
11890
12228
|
[built, operatorUserId, anonymousUserId]
|
|
11891
12229
|
);
|
|
11892
|
-
const getStates =
|
|
12230
|
+
const getStates = useCallback21(
|
|
11893
12231
|
(matchIds) => built ? built.conversation.getStates(matchIds) : Promise.resolve(null),
|
|
11894
12232
|
[built]
|
|
11895
12233
|
);
|
|
@@ -11908,11 +12246,11 @@ function StatsWidget(props) {
|
|
|
11908
12246
|
pinnedMatchIds
|
|
11909
12247
|
});
|
|
11910
12248
|
const todayHasContent = visibleGroupsOf(discovery.groups, discovery.states).length > 0;
|
|
11911
|
-
|
|
12249
|
+
useEffect32(() => {
|
|
11912
12250
|
setHasToday(todayHasContent);
|
|
11913
12251
|
}, [todayHasContent]);
|
|
11914
|
-
const prevLiveSnapshotRef =
|
|
11915
|
-
|
|
12252
|
+
const prevLiveSnapshotRef = useRef28(monitor.snapshot);
|
|
12253
|
+
useEffect32(() => {
|
|
11916
12254
|
const snap = monitor.snapshot;
|
|
11917
12255
|
if (!snap || snap === prevLiveSnapshotRef.current) return;
|
|
11918
12256
|
prevLiveSnapshotRef.current = snap;
|
|
@@ -11948,14 +12286,16 @@ function StatsWidget(props) {
|
|
|
11948
12286
|
}, [monitor.snapshot]);
|
|
11949
12287
|
const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
11950
12288
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
11951
|
-
const
|
|
12289
|
+
const clubStandingsResult = useClubStandings(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12290
|
+
const clubSquadResult = useClubSquad(built?.conversation ?? null, { activeTab: monitor.activeTab, enabled: clubFixturesResult.enabled });
|
|
12291
|
+
const getPricePresets = useCallback21(
|
|
11952
12292
|
(locale2) => built ? built.conversation.getPricePresets(locale2, { pool: "open" }) : Promise.resolve(null),
|
|
11953
12293
|
[built]
|
|
11954
12294
|
);
|
|
11955
12295
|
const presetGrid = usePresetGrid({ getPricePresets, isOpen: controller.state.isOpen, locale: ui.presets.lang });
|
|
11956
12296
|
const markTodayActivity = monitor.markTodayActivity;
|
|
11957
|
-
const prevLiveCountRef =
|
|
11958
|
-
|
|
12297
|
+
const prevLiveCountRef = useRef28(0);
|
|
12298
|
+
useEffect32(() => {
|
|
11959
12299
|
const rose = prevLiveCountRef.current === 0 && discovery.liveCount > 0;
|
|
11960
12300
|
prevLiveCountRef.current = discovery.liveCount;
|
|
11961
12301
|
if (rose) markTodayActivity();
|
|
@@ -12005,11 +12345,11 @@ function StatsWidget(props) {
|
|
|
12005
12345
|
})
|
|
12006
12346
|
}));
|
|
12007
12347
|
const conversationId = controller.state.conversationId ?? void 0;
|
|
12008
|
-
|
|
12348
|
+
useEffect32(() => {
|
|
12009
12349
|
if (!logger) return;
|
|
12010
12350
|
logger.setIdentity({ operatorUserId, anonymousUserId, conversationId });
|
|
12011
12351
|
}, [logger, operatorUserId, anonymousUserId, conversationId]);
|
|
12012
|
-
|
|
12352
|
+
useEffect32(() => {
|
|
12013
12353
|
if (!logger) return;
|
|
12014
12354
|
logger.resume();
|
|
12015
12355
|
const onHide = () => {
|
|
@@ -12027,14 +12367,14 @@ function StatsWidget(props) {
|
|
|
12027
12367
|
logger.dispose();
|
|
12028
12368
|
};
|
|
12029
12369
|
}, [logger]);
|
|
12030
|
-
|
|
12370
|
+
useEffect32(() => {
|
|
12031
12371
|
if (!built || !ui.injectStyles) return;
|
|
12032
12372
|
const node = rootRef.current?.getRootNode();
|
|
12033
12373
|
if (node) injectStyles(node);
|
|
12034
12374
|
}, [built, ui.injectStyles]);
|
|
12035
12375
|
if (!built) return null;
|
|
12036
12376
|
const attrs = themeAttrs(ui);
|
|
12037
|
-
return /* @__PURE__ */
|
|
12377
|
+
return /* @__PURE__ */ jsx102(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx102(HostEventsProvider, { value: hostEvents, children: /* @__PURE__ */ jsx102("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__ */ jsx102(
|
|
12038
12378
|
ChatPanel,
|
|
12039
12379
|
{
|
|
12040
12380
|
controller,
|
|
@@ -12045,11 +12385,14 @@ function StatsWidget(props) {
|
|
|
12045
12385
|
discovery,
|
|
12046
12386
|
gamesResult,
|
|
12047
12387
|
leaderboardResult,
|
|
12388
|
+
clubFixturesResult,
|
|
12389
|
+
clubStandingsResult,
|
|
12390
|
+
clubSquadResult,
|
|
12048
12391
|
loggedIn: !!operatorUserId,
|
|
12049
12392
|
conversation: built?.conversation ?? null,
|
|
12050
12393
|
presetGrid
|
|
12051
12394
|
}
|
|
12052
|
-
) : /* @__PURE__ */
|
|
12395
|
+
) : /* @__PURE__ */ jsx102(
|
|
12053
12396
|
ChatFab,
|
|
12054
12397
|
{
|
|
12055
12398
|
label: ui.launcherLabel,
|