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