@sensiblestats/widget-react 0.68.0 → 0.69.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 +15 -0
- package/dist/index.cjs +764 -622
- 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 +873 -731
- package/dist/index.js.map +1 -1
- package/dist/styles.css +6 -0
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -72,6 +72,12 @@ var STRINGS = {
|
|
|
72
72
|
showMore: (n) => `Show ${n} more`,
|
|
73
73
|
oddsLabel: "Odds",
|
|
74
74
|
liveLabel: "Live",
|
|
75
|
+
liveCard: {
|
|
76
|
+
stale: (time) => `Prices from ${time}`,
|
|
77
|
+
suspended: "Market suspended",
|
|
78
|
+
noPrice: "No live price available",
|
|
79
|
+
fullTime: "Full time"
|
|
80
|
+
},
|
|
75
81
|
yourMarketTag: "Your market",
|
|
76
82
|
marketFloorLabel: "Market price \xB7 not a value pick",
|
|
77
83
|
addToSlip: "Add to slip",
|
|
@@ -372,6 +378,12 @@ var STRINGS = {
|
|
|
372
378
|
showMore: (n) => `${n} tane daha g\xF6ster`,
|
|
373
379
|
oddsLabel: "Oran",
|
|
374
380
|
liveLabel: "Canl\u0131",
|
|
381
|
+
liveCard: {
|
|
382
|
+
stale: (time) => `${time} itibar\u0131yla fiyatlar`,
|
|
383
|
+
suspended: "Market ask\u0131ya al\u0131nd\u0131",
|
|
384
|
+
noPrice: "Canl\u0131 fiyat mevcut de\u011Fil",
|
|
385
|
+
fullTime: "Ma\xE7 bitti"
|
|
386
|
+
},
|
|
375
387
|
yourMarketTag: "\u0130lgilendi\u011Fin bahis",
|
|
376
388
|
marketFloorLabel: "Piyasa oran\u0131 \xB7 de\u011Fer bahsi de\u011Fil",
|
|
377
389
|
addToSlip: "Kupona ekle",
|
|
@@ -673,6 +685,7 @@ function normalizeUi(cfg) {
|
|
|
673
685
|
accent: cfg.accent,
|
|
674
686
|
logoUrl: cfg.logoUrl,
|
|
675
687
|
headerTitle: cfg.headerTitle,
|
|
688
|
+
locale: cfg.locale ?? "en",
|
|
676
689
|
rawBettingLabels: isEnglishLocale(cfg.locale),
|
|
677
690
|
cta: cfg.cta,
|
|
678
691
|
surface: cfg.surface,
|
|
@@ -779,7 +792,8 @@ function normalizeUi(cfg) {
|
|
|
779
792
|
gamePlay: strings.gamePlay,
|
|
780
793
|
gameLocked: strings.gameLocked,
|
|
781
794
|
gameVoided: strings.gameVoided,
|
|
782
|
-
games: strings.games
|
|
795
|
+
games: strings.games,
|
|
796
|
+
liveCard: strings.liveCard
|
|
783
797
|
};
|
|
784
798
|
}
|
|
785
799
|
function toClientOptions(cfg) {
|
|
@@ -791,115 +805,456 @@ function toUserContext(cfg) {
|
|
|
791
805
|
return cfg.userContext && Object.keys(cfg.userContext).length > 0 ? cfg.userContext : void 0;
|
|
792
806
|
}
|
|
793
807
|
|
|
794
|
-
// src/
|
|
795
|
-
var
|
|
796
|
-
var
|
|
797
|
-
var
|
|
798
|
-
var
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
if (
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
const
|
|
811
|
-
|
|
812
|
-
|
|
808
|
+
// src/chart.ts
|
|
809
|
+
var CHART_VIEW_W = 320;
|
|
810
|
+
var CHART_VIEW_H = 140;
|
|
811
|
+
var PLOT_X0 = 40;
|
|
812
|
+
var PLOT_X1 = 312;
|
|
813
|
+
var PLOT_Y0 = 10;
|
|
814
|
+
var PLOT_Y1 = 110;
|
|
815
|
+
var MARKER_MAX_POINTS = 8;
|
|
816
|
+
var FLAT_DOMAIN_PAD = 0.05;
|
|
817
|
+
var round2 = (n) => Math.round(n * 100) / 100;
|
|
818
|
+
function projectSeries(samples) {
|
|
819
|
+
if (samples.length < 2) return null;
|
|
820
|
+
const tMin = samples[0].atMs;
|
|
821
|
+
const tMax = samples[samples.length - 1].atMs;
|
|
822
|
+
if (tMax <= tMin) return null;
|
|
823
|
+
const prices = samples.map((s) => s.price);
|
|
824
|
+
const pMin = Math.min(...prices);
|
|
825
|
+
const pMax = Math.max(...prices);
|
|
826
|
+
let yMin;
|
|
827
|
+
let yMax;
|
|
828
|
+
if (pMax === pMin) {
|
|
829
|
+
yMin = pMin - FLAT_DOMAIN_PAD;
|
|
830
|
+
yMax = pMax + FLAT_DOMAIN_PAD;
|
|
831
|
+
} else {
|
|
832
|
+
const pad = (pMax - pMin) * 0.1;
|
|
833
|
+
yMin = pMin - pad;
|
|
834
|
+
yMax = pMax + pad;
|
|
835
|
+
}
|
|
836
|
+
const x = (atMs) => round2(PLOT_X0 + (atMs - tMin) / (tMax - tMin) * (PLOT_X1 - PLOT_X0));
|
|
837
|
+
const y = (price) => round2(PLOT_Y1 - (price - yMin) / (yMax - yMin) * (PLOT_Y1 - PLOT_Y0));
|
|
838
|
+
const projected = samples.map((s) => ({ x: x(s.atMs), y: y(s.price) }));
|
|
839
|
+
const path = projected.map((p, i) => `${i === 0 ? "M" : "L"}${p.x} ${p.y}`).join(" ");
|
|
840
|
+
return {
|
|
841
|
+
path,
|
|
842
|
+
markers: samples.length <= MARKER_MAX_POINTS ? projected : [],
|
|
843
|
+
// The real extremes, never the padded bounds: a gridline label is a price, and the padded
|
|
844
|
+
// bounds are prices nobody was ever offered. A flat series has one real extreme, not two —
|
|
845
|
+
// two identical gridlines would collide on both React key and rendered text.
|
|
846
|
+
gridlines: pMax === pMin ? [{ y: y(pMax), price: pMax }] : [
|
|
847
|
+
{ y: y(pMax), price: pMax },
|
|
848
|
+
{ y: y(pMin), price: pMin }
|
|
849
|
+
],
|
|
850
|
+
viewBox: `0 0 ${CHART_VIEW_W} ${CHART_VIEW_H}`,
|
|
851
|
+
startMs: tMin,
|
|
852
|
+
endMs: tMax
|
|
853
|
+
};
|
|
813
854
|
}
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
return
|
|
855
|
+
|
|
856
|
+
// src/model.ts
|
|
857
|
+
function str(v) {
|
|
858
|
+
return typeof v === "string" && v.length > 0 ? v : void 0;
|
|
818
859
|
}
|
|
819
|
-
function
|
|
820
|
-
|
|
821
|
-
if (result.status === "price_changed") return result.accepted;
|
|
822
|
-
return result.status === "added" || result.status === "duplicate";
|
|
860
|
+
function num(v) {
|
|
861
|
+
return typeof v === "number" && Number.isFinite(v) ? String(v) : void 0;
|
|
823
862
|
}
|
|
824
|
-
function
|
|
825
|
-
if (!
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
return result.accepted ? "added" : "price_changed";
|
|
832
|
-
case "rejected":
|
|
833
|
-
return result.reason;
|
|
863
|
+
function readStatCells(raw) {
|
|
864
|
+
if (!Array.isArray(raw)) return [];
|
|
865
|
+
const cells = [];
|
|
866
|
+
for (const entry of raw) {
|
|
867
|
+
const label = str(entry.label);
|
|
868
|
+
const value = num(entry.value) ?? str(entry.value);
|
|
869
|
+
if (label !== void 0 && value !== void 0) cells.push({ label, value });
|
|
834
870
|
}
|
|
871
|
+
return cells;
|
|
835
872
|
}
|
|
836
|
-
function
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
873
|
+
function toCardVM(card) {
|
|
874
|
+
const entityType = str(card.entityType)?.toLowerCase();
|
|
875
|
+
const kind = entityType === "player" ? "player" : entityType === "team" ? "team" : "generic";
|
|
876
|
+
const scopes = Array.isArray(card.scopes) ? card.scopes.map((s) => {
|
|
877
|
+
const label = str(s.label);
|
|
878
|
+
if (!label) return null;
|
|
879
|
+
return {
|
|
880
|
+
competitionId: typeof s.competitionId === "number" ? s.competitionId : null,
|
|
881
|
+
label,
|
|
882
|
+
image: str(s.imagePath),
|
|
883
|
+
stats: readStatCells(s.stats)
|
|
884
|
+
};
|
|
885
|
+
}).filter((s) => s !== null) : [];
|
|
886
|
+
return {
|
|
887
|
+
id: String(card.entityId),
|
|
888
|
+
kind,
|
|
889
|
+
name: card.canonicalName,
|
|
890
|
+
image: str(card.imagePath) ?? str(card.imageUrl) ?? str(card.image_url) ?? str(card.logoUrl) ?? str(card.logo),
|
|
891
|
+
sub: str(card.subtitle) ?? str(card.teamName) ?? str(card.leagueName) ?? str(card.position),
|
|
892
|
+
season: str(card.seasonName),
|
|
893
|
+
scopes
|
|
894
|
+
};
|
|
850
895
|
}
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
// src/components/ChatHeader.tsx
|
|
859
|
-
var import_react2 = require("react");
|
|
860
|
-
|
|
861
|
-
// src/assets/logo.ts
|
|
862
|
-
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
863
|
-
|
|
864
|
-
// src/components/Icons.tsx
|
|
865
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
866
|
-
function SsMark({ className }) {
|
|
867
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { className, src: SS_LOGO_DATA_URI, alt: "", "aria-hidden": "true" });
|
|
896
|
+
function toActionVM(action) {
|
|
897
|
+
const label = str(action.actionLabel) ?? str(action.label) ?? str(action.text) ?? str(action.title) ?? "Continue";
|
|
898
|
+
const actionId = str(action.actionId) ?? str(action.id);
|
|
899
|
+
const actionRef = str(action.actionRef);
|
|
900
|
+
const message = str(action.actionValue) ?? str(action.message) ?? str(action.query) ?? label;
|
|
901
|
+
return { label, actionId, actionRef, message };
|
|
868
902
|
}
|
|
869
|
-
function
|
|
870
|
-
|
|
903
|
+
function toChipVM(intent) {
|
|
904
|
+
const text = str(intent.text) ?? str(intent.label) ?? str(intent.title);
|
|
905
|
+
return text ? { text } : null;
|
|
871
906
|
}
|
|
872
|
-
function
|
|
873
|
-
return
|
|
907
|
+
function chipFromText(text) {
|
|
908
|
+
return { text };
|
|
874
909
|
}
|
|
875
|
-
function
|
|
876
|
-
|
|
910
|
+
function joinSelection(label, line) {
|
|
911
|
+
if (label && line && label.includes(line)) return label;
|
|
912
|
+
return [label, line].filter(Boolean).join(" ") || void 0;
|
|
877
913
|
}
|
|
878
|
-
function
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
914
|
+
function toInsightVM(insight) {
|
|
915
|
+
const market = str(insight.marketLabel) ?? str(insight.marketDeveloperName) ?? "";
|
|
916
|
+
const selectionLabel = str(insight.selectionLabel);
|
|
917
|
+
const selectionLine = str(insight.line);
|
|
918
|
+
const selection = joinSelection(selectionLabel, selectionLine);
|
|
919
|
+
const value = insight.odds?.value;
|
|
920
|
+
const odds = typeof value === "number" && Number.isFinite(value) ? value.toFixed(2) : void 0;
|
|
921
|
+
const oddsValue = insight.odds?.value;
|
|
922
|
+
const matchOddsId = typeof insight.odds?.matchOddsId === "number" ? insight.odds.matchOddsId : void 0;
|
|
923
|
+
const home = str(insight.homeTeamName);
|
|
924
|
+
const away = str(insight.awayTeamName);
|
|
925
|
+
const fixture = home && away ? `${home} vs ${away}` : void 0;
|
|
926
|
+
const competition = str(insight.competitionName);
|
|
927
|
+
const previousValue = insight.odds?.previousValue;
|
|
928
|
+
const previous = typeof previousValue === "number" && Number.isFinite(previousValue) ? previousValue : void 0;
|
|
929
|
+
const direction = insight.odds?.movementDirection === "shortened" || insight.odds?.movementDirection === "drifted" ? insight.odds.movementDirection : void 0;
|
|
930
|
+
return {
|
|
931
|
+
id: str(insight.insightId) ?? `${str(insight.ruleId) ?? "insight"}:${num(insight.matchId) ?? ""}`,
|
|
932
|
+
market,
|
|
933
|
+
selection,
|
|
934
|
+
odds,
|
|
935
|
+
// The wire payload carries bookmakerId (not a name); render a name only if one is present.
|
|
936
|
+
bookmaker: str(insight.odds?.bookmakerName),
|
|
937
|
+
isLive: insight.odds?.isLive === true,
|
|
938
|
+
phase: str(insight.phase),
|
|
939
|
+
fixture,
|
|
940
|
+
competition,
|
|
941
|
+
text: str(insight.text) ?? "",
|
|
942
|
+
disclaimer: str(insight.disclaimer),
|
|
943
|
+
matchId: typeof insight.matchId === "number" ? insight.matchId : 0,
|
|
944
|
+
matchOddsId,
|
|
945
|
+
marketDeveloperName: str(insight.marketDeveloperName),
|
|
946
|
+
selectionLabel: str(insight.selectionLabel),
|
|
947
|
+
line: str(insight.line),
|
|
948
|
+
addToSlipEnabled: insight.addToSlipEnabled === true,
|
|
949
|
+
pinEnabled: insight.pinEnabled === true,
|
|
950
|
+
isMarketFloor: insight.isMarketFloor === true,
|
|
951
|
+
oddsDecimal: typeof oddsValue === "number" && Number.isFinite(oddsValue) ? oddsValue : void 0,
|
|
952
|
+
quotedAtUtc: str(insight.odds?.quotedAtUtc),
|
|
953
|
+
previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
|
|
954
|
+
movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0,
|
|
955
|
+
homeTeamName: home,
|
|
956
|
+
awayTeamName: away,
|
|
957
|
+
homeCrest: str(insight.homeTeamImagePath),
|
|
958
|
+
awayCrest: str(insight.awayTeamImagePath),
|
|
959
|
+
competitionCrest: str(insight.competitionImagePath),
|
|
960
|
+
kickoffUtc: str(insight.kickoffUtc),
|
|
961
|
+
kickoffLabel: str(insight.kickoffLabel)
|
|
962
|
+
};
|
|
884
963
|
}
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
964
|
+
function toSlipSelection(vm, conversationId) {
|
|
965
|
+
if (vm.matchOddsId === void 0 || vm.oddsDecimal === void 0) return null;
|
|
966
|
+
const selection = {
|
|
967
|
+
matchOddsId: vm.matchOddsId,
|
|
968
|
+
matchId: vm.matchId,
|
|
969
|
+
oddsDecimal: vm.oddsDecimal
|
|
970
|
+
};
|
|
971
|
+
if (vm.quotedAtUtc !== void 0) selection.quotedAtUtc = vm.quotedAtUtc;
|
|
972
|
+
if (vm.id !== void 0) selection.insightId = vm.id;
|
|
973
|
+
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
974
|
+
return selection;
|
|
975
|
+
}
|
|
976
|
+
function toMarketOddsVM(card) {
|
|
977
|
+
const rows = Array.isArray(card.rows) ? card.rows : [];
|
|
978
|
+
const toRow = (r, i) => {
|
|
979
|
+
const selection = joinSelection(str(r.selectionLabel), str(r.line)) ?? "";
|
|
980
|
+
const price = typeof r.price === "number" && Number.isFinite(r.price) ? r.price : void 0;
|
|
981
|
+
const previous = typeof r.previousPrice === "number" && Number.isFinite(r.previousPrice) ? r.previousPrice : void 0;
|
|
982
|
+
const direction = r.movementDirection === "shortened" || r.movementDirection === "drifted" ? r.movementDirection : void 0;
|
|
983
|
+
return {
|
|
984
|
+
key: `${selection}:${str(r.line) ?? ""}:${i}`,
|
|
985
|
+
selection,
|
|
986
|
+
selectionLabel: str(r.selectionLabel),
|
|
987
|
+
line: str(r.line),
|
|
988
|
+
odds: price !== void 0 ? price.toFixed(2) : "",
|
|
989
|
+
oddsDecimal: price,
|
|
990
|
+
matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
|
|
991
|
+
quotedAtUtc: str(r.quotedAtUtc),
|
|
992
|
+
isMain: r.isMainLine !== false,
|
|
993
|
+
// === true, not !== false: a server that has not shipped the field yet leaves it undefined,
|
|
994
|
+
// and undefined must read as open rather than hiding every price on the card.
|
|
995
|
+
isSuspended: r.isSuspended === true,
|
|
996
|
+
previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
|
|
997
|
+
movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0
|
|
998
|
+
};
|
|
999
|
+
};
|
|
1000
|
+
const vms = rows.map(toRow).filter((r) => r.selection && r.odds && !r.isSuspended);
|
|
1001
|
+
const home = str(card.homeTeamName);
|
|
1002
|
+
const away = str(card.awayTeamName);
|
|
1003
|
+
const updated = rows.map((r) => str(r.quotedAtUtc)).filter((v) => !!v).sort();
|
|
1004
|
+
return {
|
|
1005
|
+
id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}`,
|
|
1006
|
+
market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
|
|
1007
|
+
fixture: home && away ? `${home} vs ${away}` : void 0,
|
|
1008
|
+
homeTeamName: home,
|
|
1009
|
+
awayTeamName: away,
|
|
1010
|
+
homeCrest: str(card.homeTeamImagePath),
|
|
1011
|
+
awayCrest: str(card.awayTeamImagePath),
|
|
1012
|
+
competitionCrest: str(card.competitionImagePath),
|
|
1013
|
+
competition: str(card.competitionName),
|
|
1014
|
+
kickoffUtc: str(card.kickoffUtc),
|
|
1015
|
+
kickoffLabel: str(card.kickoffLabel),
|
|
1016
|
+
bookmaker: rows.map((r) => str(r.bookmakerName)).find(Boolean),
|
|
1017
|
+
updatedAt: updated.length > 0 ? updated[updated.length - 1] : void 0,
|
|
1018
|
+
isLive: rows.some((r) => r.isLive === true),
|
|
1019
|
+
matchId: typeof card.matchId === "number" ? card.matchId : 0,
|
|
1020
|
+
mainRows: vms.filter((r) => r.isMain),
|
|
1021
|
+
moreRows: vms.filter((r) => !r.isMain),
|
|
1022
|
+
disclaimer: str(card.disclaimer),
|
|
1023
|
+
addToSlipEnabled: card.addToSlipEnabled === true,
|
|
1024
|
+
marketDeveloperName: str(card.marketDeveloperName),
|
|
1025
|
+
mainLine: str(card.mainLine),
|
|
1026
|
+
pinEnabled: card.pinEnabled === true,
|
|
1027
|
+
statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
|
|
1028
|
+
tag: card.tag === "your_market" ? "your_market" : void 0,
|
|
1029
|
+
live: card.live ?? null
|
|
1030
|
+
};
|
|
1031
|
+
}
|
|
1032
|
+
function toOddsMovementVM(card) {
|
|
1033
|
+
const raw = Array.isArray(card.points) ? card.points : [];
|
|
1034
|
+
const samples = [];
|
|
1035
|
+
for (const p of raw) {
|
|
1036
|
+
const price = typeof p.price === "number" && Number.isFinite(p.price) ? p.price : void 0;
|
|
1037
|
+
const atMs = typeof p.atUtc === "string" ? Date.parse(p.atUtc) : NaN;
|
|
1038
|
+
if (price === void 0 || Number.isNaN(atMs)) continue;
|
|
1039
|
+
samples.push({ atMs, price });
|
|
1040
|
+
}
|
|
1041
|
+
samples.sort((a, b) => a.atMs - b.atMs);
|
|
1042
|
+
const asNumber = (v) => typeof v === "number" && Number.isFinite(v) ? v : void 0;
|
|
1043
|
+
const opening = asNumber(card.openingPrice);
|
|
1044
|
+
const current = asNumber(card.currentPrice);
|
|
1045
|
+
const home = str(card.homeTeamName);
|
|
1046
|
+
const away = str(card.awayTeamName);
|
|
1047
|
+
const selection = joinSelection(str(card.selectionLabel), str(card.line)) ?? "";
|
|
1048
|
+
const bookmakerId = typeof card.bookmakerId === "number" ? card.bookmakerId : "";
|
|
1049
|
+
return {
|
|
1050
|
+
id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}:${selection}:${bookmakerId}`,
|
|
1051
|
+
matchId: typeof card.matchId === "number" ? card.matchId : 0,
|
|
1052
|
+
market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
|
|
1053
|
+
marketDeveloperName: str(card.marketDeveloperName),
|
|
1054
|
+
selection,
|
|
1055
|
+
selectionLabel: str(card.selectionLabel),
|
|
1056
|
+
line: str(card.line),
|
|
1057
|
+
fixture: home && away ? `${home} vs ${away}` : void 0,
|
|
1058
|
+
competition: str(card.competitionName),
|
|
1059
|
+
bookmaker: str(card.bookmakerName),
|
|
1060
|
+
opening: opening !== void 0 ? opening.toFixed(2) : "",
|
|
1061
|
+
current: current !== void 0 ? current.toFixed(2) : "",
|
|
1062
|
+
direction: card.movementDirection === "shortened" || card.movementDirection === "drifted" ? card.movementDirection : void 0,
|
|
1063
|
+
windowHours: asNumber(card.windowHours) ?? 0,
|
|
1064
|
+
excludedCount: asNumber(card.excludedSuspendedCount) ?? 0,
|
|
1065
|
+
isSuspended: card.isSuspended === true,
|
|
1066
|
+
disclaimer: str(card.disclaimer),
|
|
1067
|
+
geometry: projectSeries(samples),
|
|
1068
|
+
observationCount: samples.length,
|
|
1069
|
+
pinEnabled: card.pinEnabled === true,
|
|
1070
|
+
matchOddsId: typeof card.matchOddsId === "number" ? card.matchOddsId : void 0
|
|
1071
|
+
};
|
|
1072
|
+
}
|
|
1073
|
+
function marketOddsRowToSlipSelection(vm, row, conversationId) {
|
|
1074
|
+
if (row.matchOddsId === void 0 || row.oddsDecimal === void 0) return null;
|
|
1075
|
+
const selection = { matchOddsId: row.matchOddsId, matchId: vm.matchId, oddsDecimal: row.oddsDecimal };
|
|
1076
|
+
if (row.quotedAtUtc !== void 0) selection.quotedAtUtc = row.quotedAtUtc;
|
|
1077
|
+
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
1078
|
+
return selection;
|
|
1079
|
+
}
|
|
1080
|
+
function finite(v) {
|
|
1081
|
+
return typeof v === "number" && Number.isFinite(v) ? v : void 0;
|
|
1082
|
+
}
|
|
1083
|
+
function toComboLegVM(leg) {
|
|
1084
|
+
if (!leg || typeof leg !== "object") return null;
|
|
1085
|
+
const price = finite(leg.price);
|
|
1086
|
+
const matchOddsId = finite(leg.matchOddsId);
|
|
1087
|
+
const matchId = finite(leg.matchId);
|
|
1088
|
+
const home = str(leg.homeTeamName);
|
|
1089
|
+
const away = str(leg.awayTeamName);
|
|
1090
|
+
const selectionLabel = str(leg.selectionLabel);
|
|
1091
|
+
const insight = leg.insight && typeof leg.insight === "object" ? leg.insight : void 0;
|
|
1092
|
+
const insightId = str(insight?.insightId);
|
|
1093
|
+
const statText = str(insight?.text);
|
|
1094
|
+
if (price === void 0 || matchOddsId === void 0 || matchId === void 0 || !home || !away || !selectionLabel || !insightId || !statText) return null;
|
|
1095
|
+
const line = str(leg.line);
|
|
1096
|
+
return {
|
|
1097
|
+
key: `${matchOddsId}`,
|
|
1098
|
+
matchId,
|
|
1099
|
+
homeTeamName: home,
|
|
1100
|
+
awayTeamName: away,
|
|
1101
|
+
homeCrest: str(leg.homeTeamImagePath),
|
|
1102
|
+
awayCrest: str(leg.awayTeamImagePath),
|
|
1103
|
+
competition: str(leg.competitionName),
|
|
1104
|
+
kickoffUtc: str(leg.kickoffUtc),
|
|
1105
|
+
kickoffLabel: str(leg.kickoffLabel),
|
|
1106
|
+
market: str(leg.marketLabel) ?? str(leg.marketDeveloperName) ?? "",
|
|
1107
|
+
marketDeveloperName: str(leg.marketDeveloperName) ?? "",
|
|
1108
|
+
selection: joinSelection(selectionLabel, line) ?? selectionLabel,
|
|
1109
|
+
selectionLabel,
|
|
1110
|
+
line,
|
|
1111
|
+
odds: price.toFixed(2),
|
|
1112
|
+
oddsDecimal: price,
|
|
1113
|
+
matchOddsId,
|
|
1114
|
+
quotedAtUtc: str(leg.quotedAtUtc),
|
|
1115
|
+
insightId,
|
|
1116
|
+
statText
|
|
1117
|
+
};
|
|
1118
|
+
}
|
|
1119
|
+
function toComboCardVM(card) {
|
|
1120
|
+
const rawLegs = Array.isArray(card?.legs) ? card.legs : [];
|
|
1121
|
+
const multiplication = str(card?.multiplication);
|
|
1122
|
+
if (rawLegs.length < 2 || !multiplication) return null;
|
|
1123
|
+
const legs = [];
|
|
1124
|
+
for (const raw of rawLegs) {
|
|
1125
|
+
const vm = toComboLegVM(raw);
|
|
1126
|
+
if (!vm) return null;
|
|
1127
|
+
legs.push(vm);
|
|
1128
|
+
}
|
|
1129
|
+
return {
|
|
1130
|
+
id: str(card.comboId) ?? legs.map((l) => l.matchOddsId).join("-"),
|
|
1131
|
+
legs,
|
|
1132
|
+
multiplication,
|
|
1133
|
+
replacedNote: str(card.replacedNote),
|
|
1134
|
+
addToSlipEnabled: card.addToSlipEnabled === true
|
|
1135
|
+
};
|
|
1136
|
+
}
|
|
1137
|
+
function comboLegToSlipSelection(leg, conversationId) {
|
|
1138
|
+
const selection = {
|
|
1139
|
+
matchOddsId: leg.matchOddsId,
|
|
1140
|
+
matchId: leg.matchId,
|
|
1141
|
+
oddsDecimal: leg.oddsDecimal,
|
|
1142
|
+
insightId: leg.insightId
|
|
1143
|
+
};
|
|
1144
|
+
if (leg.quotedAtUtc !== void 0) selection.quotedAtUtc = leg.quotedAtUtc;
|
|
1145
|
+
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
1146
|
+
return selection;
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
// src/slip.ts
|
|
1150
|
+
var ADD_TO_SLIP_TIMEOUT_MS = 1e4;
|
|
1151
|
+
var MAX_SELECTION = 64;
|
|
1152
|
+
var MAX_LINE = 32;
|
|
1153
|
+
var MAX_ODDS = 1e4;
|
|
1154
|
+
function slipPickFields(selection, label, line) {
|
|
1155
|
+
const fields = {};
|
|
1156
|
+
if (Number.isSafeInteger(selection.matchId) && selection.matchId > 0) fields.matchId = selection.matchId;
|
|
1157
|
+
if (label && label.trim() && label.length <= MAX_SELECTION) fields.selection = label;
|
|
1158
|
+
if (line && line.trim() && line.length <= MAX_LINE) fields.line = line;
|
|
1159
|
+
const odds = selection.oddsDecimal;
|
|
1160
|
+
if (Number.isFinite(odds) && odds > 1 && odds <= MAX_ODDS) fields.odds = odds;
|
|
1161
|
+
return fields;
|
|
1162
|
+
}
|
|
1163
|
+
function chipSelection(market, matchId, conversationId) {
|
|
1164
|
+
if (!market || !market.addToSlipEnabled || typeof market.matchOddsId !== "number" || typeof market.price !== "number") return null;
|
|
1165
|
+
const selection = { matchOddsId: market.matchOddsId, matchId, oddsDecimal: market.price };
|
|
1166
|
+
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
1167
|
+
return selection;
|
|
1168
|
+
}
|
|
1169
|
+
function wasAdded(result) {
|
|
1170
|
+
if (!result) return true;
|
|
1171
|
+
if (result.status === "price_changed") return result.accepted;
|
|
1172
|
+
return result.status === "added";
|
|
1173
|
+
}
|
|
1174
|
+
function isTerminal(result) {
|
|
1175
|
+
if (!result) return true;
|
|
1176
|
+
if (result.status === "price_changed") return result.accepted;
|
|
1177
|
+
return result.status === "added" || result.status === "duplicate";
|
|
1178
|
+
}
|
|
1179
|
+
function slipOutcome(result) {
|
|
1180
|
+
if (!result) return "added";
|
|
1181
|
+
switch (result.status) {
|
|
1182
|
+
case "added":
|
|
1183
|
+
case "duplicate":
|
|
1184
|
+
return result.status;
|
|
1185
|
+
case "price_changed":
|
|
1186
|
+
return result.accepted ? "added" : "price_changed";
|
|
1187
|
+
case "rejected":
|
|
1188
|
+
return result.reason;
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
function resultToToast(result, shownOdds, ui) {
|
|
1192
|
+
if (!result) return { kind: "success", text: ui.slipAdded };
|
|
1193
|
+
switch (result.status) {
|
|
1194
|
+
case "added":
|
|
1195
|
+
return { kind: "success", text: ui.slipAdded };
|
|
1196
|
+
case "duplicate":
|
|
1197
|
+
return { kind: "success", text: ui.slipDuplicate };
|
|
1198
|
+
case "price_changed":
|
|
1199
|
+
return result.accepted ? { kind: "success", text: ui.slipPriceChanged(shownOdds, result.newOddsDecimal.toFixed(2)) } : { kind: "error", text: ui.slipPriceNotAccepted(shownOdds, result.newOddsDecimal.toFixed(2)) };
|
|
1200
|
+
case "rejected":
|
|
1201
|
+
if (result.reason === "login_required") return { kind: "error", text: ui.slipLoginRequired };
|
|
1202
|
+
if (result.reason === "suspended") return { kind: "error", text: ui.slipSuspended };
|
|
1203
|
+
return { kind: "error", text: result.message ?? ui.slipFailed };
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
// src/useHostEvents.ts
|
|
1208
|
+
var import_react40 = require("react");
|
|
1209
|
+
|
|
1210
|
+
// src/components/ChatPanel.tsx
|
|
1211
|
+
var import_react39 = require("react");
|
|
1212
|
+
|
|
1213
|
+
// src/components/ChatHeader.tsx
|
|
1214
|
+
var import_react2 = require("react");
|
|
1215
|
+
|
|
1216
|
+
// src/assets/logo.ts
|
|
1217
|
+
var SS_LOGO_DATA_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAYAAAAuSOLAAAAAAXNSR0IArs4c6QAAAJplWElmTU0AKgAAAAgAAwESAAMAAAABAAEAAAExAAIAAAA9AAAAModpAAQAAAABAAAAcAAAAABBZG9iZSBQaG90b3Nob3AgMjYuMTAgKDIwMjUwNzMwLm0uMzE2NiAwN2IxMjM0KSAgKE1hY2ludG9zaCkAAAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAI6oAMABAAAAAEAAAI6AAAAACwGtVwAAAQwaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QzBGRTM5NjM5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6QzBGRTM5NjI5NEJEMTFGMEJGNjZEMjUyN0U0MzU5RUM8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0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";
|
|
1218
|
+
|
|
1219
|
+
// src/components/Icons.tsx
|
|
1220
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
1221
|
+
function SsMark({ className }) {
|
|
1222
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", { className, src: SS_LOGO_DATA_URI, alt: "", "aria-hidden": "true" });
|
|
1223
|
+
}
|
|
1224
|
+
function SendIcon() {
|
|
1225
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "currentColor", d: "M3 20l18-8L3 4v6l12 2-12 2z" }) });
|
|
1226
|
+
}
|
|
1227
|
+
function CloseIcon() {
|
|
1228
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "none", d: "M18 6L6 18M6 6l12 12", stroke: "currentColor", strokeWidth: "2" }) });
|
|
1229
|
+
}
|
|
1230
|
+
function ChevronIcon() {
|
|
1231
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", d: "M9 5l7 7-7 7" }) });
|
|
1232
|
+
}
|
|
1233
|
+
function KebabIcon() {
|
|
1234
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { viewBox: "0 0 24 24", width: "1em", height: "1em", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("g", { fill: "currentColor", children: [
|
|
1235
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "5", r: "1.6" }),
|
|
1236
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "1.6" }),
|
|
1237
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "19", r: "1.6" })
|
|
1238
|
+
] }) });
|
|
1239
|
+
}
|
|
1240
|
+
var DASHBOARD_EMOJI = {
|
|
1241
|
+
football: "\u26BD",
|
|
1242
|
+
"goal-net": "\u{1F945}",
|
|
1243
|
+
btts: "\u{1F91D}",
|
|
1244
|
+
card: "\u{1F7E8}",
|
|
1245
|
+
"corner-flag": "\u{1F6A9}",
|
|
1246
|
+
player: "\u{1F464}",
|
|
1247
|
+
target: "\u{1F3AF}",
|
|
1248
|
+
trophy: "\u{1F3C6}",
|
|
1249
|
+
"chart-line": "\u{1F4C8}",
|
|
1250
|
+
"chart-bar": "\u{1F4CA}",
|
|
1251
|
+
chat: "\u{1F4AC}",
|
|
1252
|
+
fire: "\u{1F525}",
|
|
1253
|
+
sparkle: "\u2728"
|
|
1254
|
+
};
|
|
1255
|
+
function DashboardIcon({ name }) {
|
|
1256
|
+
const glyph = Object.prototype.hasOwnProperty.call(DASHBOARD_EMOJI, name) ? DASHBOARD_EMOJI[name] : DASHBOARD_EMOJI.target;
|
|
1257
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ss-w-dash-emoji", "aria-hidden": "true", children: glyph });
|
|
903
1258
|
}
|
|
904
1259
|
|
|
905
1260
|
// src/components/BrandMark.tsx
|
|
@@ -976,523 +1331,183 @@ function ChatHeader({
|
|
|
976
1331
|
type: "button",
|
|
977
1332
|
className: "ss-w-menu-item",
|
|
978
1333
|
role: "menuitem",
|
|
979
|
-
ref: firstItemRef,
|
|
980
|
-
onClick: runNewConversation,
|
|
981
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: newConversationLabel })
|
|
982
|
-
}
|
|
983
|
-
) }) : null
|
|
984
|
-
] }) : null,
|
|
985
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", className: "ss-w-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CloseIcon, {}) })
|
|
986
|
-
] });
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
// src/components/MessageList.tsx
|
|
990
|
-
var import_react21 = require("react");
|
|
991
|
-
|
|
992
|
-
// src/presets.ts
|
|
993
|
-
var CLIENT_CAPABILITIES = ["price_presets"];
|
|
994
|
-
var PRICE_TILE_PREFIX = "goal-preset-";
|
|
995
|
-
function isPriceTile(tile) {
|
|
996
|
-
const id = tile.signal?.entityId;
|
|
997
|
-
return typeof id === "string" && id.startsWith(PRICE_TILE_PREFIX);
|
|
998
|
-
}
|
|
999
|
-
function tileDisplayText(tile) {
|
|
1000
|
-
const subtitle = tile.subtitle?.trim();
|
|
1001
|
-
return isPriceTile(tile) && subtitle ? subtitle : tile.title;
|
|
1002
|
-
}
|
|
1003
|
-
var MAX_BUBBLE_ASKS = 2;
|
|
1004
|
-
function bubbleAsks(messages) {
|
|
1005
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
1006
|
-
const m = messages[i];
|
|
1007
|
-
if (!m || m.role !== "assistant" || !m.isGreeting) continue;
|
|
1008
|
-
const dashboard = m.greetingDashboard;
|
|
1009
|
-
if (!dashboard) return [];
|
|
1010
|
-
const asks = [];
|
|
1011
|
-
dashboard.tiles.forEach((tile, index) => {
|
|
1012
|
-
const label = tile.subtitle?.trim();
|
|
1013
|
-
if (asks.length < MAX_BUBBLE_ASKS && isPriceTile(tile) && label) asks.push({ tile, index, position: asks.length, layout: dashboard.layout, label });
|
|
1014
|
-
});
|
|
1015
|
-
return asks;
|
|
1016
|
-
}
|
|
1017
|
-
return [];
|
|
1018
|
-
}
|
|
1019
|
-
function runBubbleAsk(ask, deps) {
|
|
1020
|
-
deps.log?.log({ name: "popup_ask_tap", outcome: String(ask.position) });
|
|
1021
|
-
deps.open();
|
|
1022
|
-
deps.setActiveTab("chat");
|
|
1023
|
-
const displayText = tileDisplayText(ask.tile);
|
|
1024
|
-
deps.send(ask.tile.actionValue, ask.tile.actionRef ? { actionRef: ask.tile.actionRef, displayText } : { displayText });
|
|
1025
|
-
deps.onDashboardTap?.(ask.tile, ask.index, ask.layout);
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
// src/components/Markdown.tsx
|
|
1029
|
-
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
1030
|
-
var import_remark_gfm = __toESM(require("remark-gfm"), 1);
|
|
1031
|
-
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
1032
|
-
var components = {
|
|
1033
|
-
a: ({ children, href }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", className: "ss-w-md-link", children }),
|
|
1034
|
-
table: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("table", { className: "ss-w-md-table", children }) }),
|
|
1035
|
-
ul: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "ss-w-md-ul", children }),
|
|
1036
|
-
ol: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ol", { className: "ss-w-md-ol", children }),
|
|
1037
|
-
code: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("code", { className: "ss-w-md-code", children })
|
|
1038
|
-
};
|
|
1039
|
-
function Markdown({ text }) {
|
|
1040
|
-
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-md", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default], components, children: text }) });
|
|
1041
|
-
}
|
|
1042
|
-
|
|
1043
|
-
// src/components/EntityCardList.tsx
|
|
1044
|
-
var import_react3 = require("react");
|
|
1045
|
-
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1046
|
-
var MAX_VISIBLE = 3;
|
|
1047
|
-
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
1048
|
-
function initials(name) {
|
|
1049
|
-
return name.split(/\s+/).slice(0, 2).map((w) => w[0] ?? "").join("").toUpperCase();
|
|
1050
|
-
}
|
|
1051
|
-
function shortSeason(season) {
|
|
1052
|
-
return season.replace(/\d{4}/g, (year) => year.slice(2));
|
|
1053
|
-
}
|
|
1054
|
-
function Crest({ image, label }) {
|
|
1055
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1056
|
-
"span",
|
|
1057
|
-
{
|
|
1058
|
-
className: "ss-w-ecard-crest",
|
|
1059
|
-
style: { backgroundImage: `url(${image})` },
|
|
1060
|
-
...label ? { role: "img", title: label, "aria-label": label } : { "aria-hidden": "true" }
|
|
1061
|
-
}
|
|
1062
|
-
);
|
|
1063
|
-
}
|
|
1064
|
-
function FormBar({ w, d, l }) {
|
|
1065
|
-
if (w + d + l === 0) return null;
|
|
1066
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-form", "aria-hidden": "true", children: [
|
|
1067
|
-
w > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-w", style: { flexGrow: w } }) : null,
|
|
1068
|
-
d > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-d", style: { flexGrow: d } }) : null,
|
|
1069
|
-
l > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-l", style: { flexGrow: l } }) : null
|
|
1070
|
-
] });
|
|
1071
|
-
}
|
|
1072
|
-
function StatCellView({ s }) {
|
|
1073
|
-
const m = RECORD_RE.exec(s.value);
|
|
1074
|
-
if (m) {
|
|
1075
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
|
|
1076
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FormBar, { w: Number(m[1]), d: Number(m[2]), l: Number(m[3]) }) }),
|
|
1077
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.value })
|
|
1078
|
-
] });
|
|
1079
|
-
}
|
|
1080
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
|
|
1081
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: s.value }),
|
|
1082
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.label })
|
|
1083
|
-
] });
|
|
1084
|
-
}
|
|
1085
|
-
function StatStrip({ stats }) {
|
|
1086
|
-
if (stats.length === 0) return null;
|
|
1087
|
-
const cols = Math.min(stats.length, 4);
|
|
1088
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-strip", style: { gridTemplateColumns: `repeat(${cols}, 1fr)` }, children: stats.map((s) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatCellView, { s }, s.label + s.value)) });
|
|
1089
|
-
}
|
|
1090
|
-
function CardHeader({ c, showScopeCrest }) {
|
|
1091
|
-
const onlyScope = c.scopes.length === 1 ? c.scopes[0] : null;
|
|
1092
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-hd", children: [
|
|
1093
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1094
|
-
"span",
|
|
1095
|
-
{
|
|
1096
|
-
className: c.kind === "team" ? "ss-w-thumb ss-w-team" : "ss-w-thumb",
|
|
1097
|
-
style: c.image ? { backgroundImage: `url(${c.image})` } : void 0,
|
|
1098
|
-
children: c.image ? "" : initials(c.name)
|
|
1099
|
-
}
|
|
1100
|
-
),
|
|
1101
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-idtext", children: [
|
|
1102
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-nm", children: c.name }),
|
|
1103
|
-
c.sub ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-sub", children: c.sub }) : null
|
|
1104
|
-
] }),
|
|
1105
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-meta", children: [
|
|
1106
|
-
showScopeCrest && onlyScope?.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: onlyScope.image, label: onlyScope.label }) : null,
|
|
1107
|
-
c.season ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-season", children: shortSeason(c.season) }) : null
|
|
1108
|
-
] })
|
|
1109
|
-
] });
|
|
1110
|
-
}
|
|
1111
|
-
function ScopeTabs({ scopes, active, onSelect }) {
|
|
1112
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-scopes", role: "tablist", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1113
|
-
"button",
|
|
1114
|
-
{
|
|
1115
|
-
type: "button",
|
|
1116
|
-
role: "tab",
|
|
1117
|
-
className: "ss-w-ecard-scope",
|
|
1118
|
-
"aria-selected": i === active,
|
|
1119
|
-
"aria-label": s.label,
|
|
1120
|
-
title: s.label,
|
|
1121
|
-
onClick: () => onSelect(i),
|
|
1122
|
-
children: s.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: s.image }) : s.label
|
|
1123
|
-
},
|
|
1124
|
-
String(s.competitionId ?? "all")
|
|
1125
|
-
)) });
|
|
1126
|
-
}
|
|
1127
|
-
function EntityCardItem({ c }) {
|
|
1128
|
-
const [active, setActive] = (0, import_react3.useState)(0);
|
|
1129
|
-
const hasBody = c.scopes.length > 0;
|
|
1130
|
-
if (!hasBody) {
|
|
1131
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: false }) });
|
|
1132
|
-
}
|
|
1133
|
-
const multi = c.scopes.length > 1;
|
|
1134
|
-
const scope = c.scopes[multi ? c.scopes[active] ? active : 0 : 0];
|
|
1135
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard", "data-kind": c.kind, children: [
|
|
1136
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: !multi }),
|
|
1137
|
-
multi ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ScopeTabs, { scopes: c.scopes, active, onSelect: setActive }) : null,
|
|
1138
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatStrip, { stats: scope.stats })
|
|
1139
|
-
] });
|
|
1140
|
-
}
|
|
1141
|
-
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
1142
|
-
const [expanded, setExpanded] = (0, import_react3.useState)(false);
|
|
1143
|
-
if (cards.length === 0) return null;
|
|
1144
|
-
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
1145
|
-
const overflow = cards.length - MAX_VISIBLE;
|
|
1146
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-cards", children: [
|
|
1147
|
-
visible.map((c) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EntityCardItem, { c }, c.id)),
|
|
1148
|
-
overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "ss-w-cards-more", disabled, onClick: () => setExpanded((v) => !v), children: expanded ? showLessLabel : showMoreLabel(overflow) }) : null
|
|
1334
|
+
ref: firstItemRef,
|
|
1335
|
+
onClick: runNewConversation,
|
|
1336
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: newConversationLabel })
|
|
1337
|
+
}
|
|
1338
|
+
) }) : null
|
|
1339
|
+
] }) : null,
|
|
1340
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { type: "button", className: "ss-w-close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CloseIcon, {}) })
|
|
1149
1341
|
] });
|
|
1150
1342
|
}
|
|
1151
1343
|
|
|
1152
|
-
// src/components/
|
|
1153
|
-
var
|
|
1154
|
-
var import_widget_sdk = require("@sensiblestats/widget-sdk");
|
|
1155
|
-
|
|
1156
|
-
// src/chart.ts
|
|
1157
|
-
var CHART_VIEW_W = 320;
|
|
1158
|
-
var CHART_VIEW_H = 140;
|
|
1159
|
-
var PLOT_X0 = 40;
|
|
1160
|
-
var PLOT_X1 = 312;
|
|
1161
|
-
var PLOT_Y0 = 10;
|
|
1162
|
-
var PLOT_Y1 = 110;
|
|
1163
|
-
var MARKER_MAX_POINTS = 8;
|
|
1164
|
-
var FLAT_DOMAIN_PAD = 0.05;
|
|
1165
|
-
var round2 = (n) => Math.round(n * 100) / 100;
|
|
1166
|
-
function projectSeries(samples) {
|
|
1167
|
-
if (samples.length < 2) return null;
|
|
1168
|
-
const tMin = samples[0].atMs;
|
|
1169
|
-
const tMax = samples[samples.length - 1].atMs;
|
|
1170
|
-
if (tMax <= tMin) return null;
|
|
1171
|
-
const prices = samples.map((s) => s.price);
|
|
1172
|
-
const pMin = Math.min(...prices);
|
|
1173
|
-
const pMax = Math.max(...prices);
|
|
1174
|
-
let yMin;
|
|
1175
|
-
let yMax;
|
|
1176
|
-
if (pMax === pMin) {
|
|
1177
|
-
yMin = pMin - FLAT_DOMAIN_PAD;
|
|
1178
|
-
yMax = pMax + FLAT_DOMAIN_PAD;
|
|
1179
|
-
} else {
|
|
1180
|
-
const pad = (pMax - pMin) * 0.1;
|
|
1181
|
-
yMin = pMin - pad;
|
|
1182
|
-
yMax = pMax + pad;
|
|
1183
|
-
}
|
|
1184
|
-
const x = (atMs) => round2(PLOT_X0 + (atMs - tMin) / (tMax - tMin) * (PLOT_X1 - PLOT_X0));
|
|
1185
|
-
const y = (price) => round2(PLOT_Y1 - (price - yMin) / (yMax - yMin) * (PLOT_Y1 - PLOT_Y0));
|
|
1186
|
-
const projected = samples.map((s) => ({ x: x(s.atMs), y: y(s.price) }));
|
|
1187
|
-
const path = projected.map((p, i) => `${i === 0 ? "M" : "L"}${p.x} ${p.y}`).join(" ");
|
|
1188
|
-
return {
|
|
1189
|
-
path,
|
|
1190
|
-
markers: samples.length <= MARKER_MAX_POINTS ? projected : [],
|
|
1191
|
-
// The real extremes, never the padded bounds: a gridline label is a price, and the padded
|
|
1192
|
-
// bounds are prices nobody was ever offered. A flat series has one real extreme, not two —
|
|
1193
|
-
// two identical gridlines would collide on both React key and rendered text.
|
|
1194
|
-
gridlines: pMax === pMin ? [{ y: y(pMax), price: pMax }] : [
|
|
1195
|
-
{ y: y(pMax), price: pMax },
|
|
1196
|
-
{ y: y(pMin), price: pMin }
|
|
1197
|
-
],
|
|
1198
|
-
viewBox: `0 0 ${CHART_VIEW_W} ${CHART_VIEW_H}`,
|
|
1199
|
-
startMs: tMin,
|
|
1200
|
-
endMs: tMax
|
|
1201
|
-
};
|
|
1202
|
-
}
|
|
1344
|
+
// src/components/MessageList.tsx
|
|
1345
|
+
var import_react21 = require("react");
|
|
1203
1346
|
|
|
1204
|
-
// src/
|
|
1205
|
-
|
|
1206
|
-
|
|
1347
|
+
// src/presets.ts
|
|
1348
|
+
var CLIENT_CAPABILITIES = ["price_presets"];
|
|
1349
|
+
var PRICE_TILE_PREFIX = "goal-preset-";
|
|
1350
|
+
function isPriceTile(tile) {
|
|
1351
|
+
const id = tile.signal?.entityId;
|
|
1352
|
+
return typeof id === "string" && id.startsWith(PRICE_TILE_PREFIX);
|
|
1207
1353
|
}
|
|
1208
|
-
function
|
|
1209
|
-
|
|
1354
|
+
function tileDisplayText(tile) {
|
|
1355
|
+
const subtitle = tile.subtitle?.trim();
|
|
1356
|
+
return isPriceTile(tile) && subtitle ? subtitle : tile.title;
|
|
1210
1357
|
}
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
const
|
|
1217
|
-
if (
|
|
1358
|
+
var MAX_BUBBLE_ASKS = 2;
|
|
1359
|
+
function bubbleAsks(messages) {
|
|
1360
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
1361
|
+
const m = messages[i];
|
|
1362
|
+
if (!m || m.role !== "assistant" || !m.isGreeting) continue;
|
|
1363
|
+
const dashboard = m.greetingDashboard;
|
|
1364
|
+
if (!dashboard) return [];
|
|
1365
|
+
const asks = [];
|
|
1366
|
+
dashboard.tiles.forEach((tile, index) => {
|
|
1367
|
+
const label = tile.subtitle?.trim();
|
|
1368
|
+
if (asks.length < MAX_BUBBLE_ASKS && isPriceTile(tile) && label) asks.push({ tile, index, position: asks.length, layout: dashboard.layout, label });
|
|
1369
|
+
});
|
|
1370
|
+
return asks;
|
|
1218
1371
|
}
|
|
1219
|
-
return
|
|
1220
|
-
}
|
|
1221
|
-
function toCardVM(card) {
|
|
1222
|
-
const entityType = str(card.entityType)?.toLowerCase();
|
|
1223
|
-
const kind = entityType === "player" ? "player" : entityType === "team" ? "team" : "generic";
|
|
1224
|
-
const scopes = Array.isArray(card.scopes) ? card.scopes.map((s) => {
|
|
1225
|
-
const label = str(s.label);
|
|
1226
|
-
if (!label) return null;
|
|
1227
|
-
return {
|
|
1228
|
-
competitionId: typeof s.competitionId === "number" ? s.competitionId : null,
|
|
1229
|
-
label,
|
|
1230
|
-
image: str(s.imagePath),
|
|
1231
|
-
stats: readStatCells(s.stats)
|
|
1232
|
-
};
|
|
1233
|
-
}).filter((s) => s !== null) : [];
|
|
1234
|
-
return {
|
|
1235
|
-
id: String(card.entityId),
|
|
1236
|
-
kind,
|
|
1237
|
-
name: card.canonicalName,
|
|
1238
|
-
image: str(card.imagePath) ?? str(card.imageUrl) ?? str(card.image_url) ?? str(card.logoUrl) ?? str(card.logo),
|
|
1239
|
-
sub: str(card.subtitle) ?? str(card.teamName) ?? str(card.leagueName) ?? str(card.position),
|
|
1240
|
-
season: str(card.seasonName),
|
|
1241
|
-
scopes
|
|
1242
|
-
};
|
|
1243
|
-
}
|
|
1244
|
-
function toActionVM(action) {
|
|
1245
|
-
const label = str(action.actionLabel) ?? str(action.label) ?? str(action.text) ?? str(action.title) ?? "Continue";
|
|
1246
|
-
const actionId = str(action.actionId) ?? str(action.id);
|
|
1247
|
-
const actionRef = str(action.actionRef);
|
|
1248
|
-
const message = str(action.actionValue) ?? str(action.message) ?? str(action.query) ?? label;
|
|
1249
|
-
return { label, actionId, actionRef, message };
|
|
1250
|
-
}
|
|
1251
|
-
function toChipVM(intent) {
|
|
1252
|
-
const text = str(intent.text) ?? str(intent.label) ?? str(intent.title);
|
|
1253
|
-
return text ? { text } : null;
|
|
1254
|
-
}
|
|
1255
|
-
function chipFromText(text) {
|
|
1256
|
-
return { text };
|
|
1257
|
-
}
|
|
1258
|
-
function joinSelection(label, line) {
|
|
1259
|
-
if (label && line && label.includes(line)) return label;
|
|
1260
|
-
return [label, line].filter(Boolean).join(" ") || void 0;
|
|
1261
|
-
}
|
|
1262
|
-
function toInsightVM(insight) {
|
|
1263
|
-
const market = str(insight.marketLabel) ?? str(insight.marketDeveloperName) ?? "";
|
|
1264
|
-
const selectionLabel = str(insight.selectionLabel);
|
|
1265
|
-
const selectionLine = str(insight.line);
|
|
1266
|
-
const selection = joinSelection(selectionLabel, selectionLine);
|
|
1267
|
-
const value = insight.odds?.value;
|
|
1268
|
-
const odds = typeof value === "number" && Number.isFinite(value) ? value.toFixed(2) : void 0;
|
|
1269
|
-
const oddsValue = insight.odds?.value;
|
|
1270
|
-
const matchOddsId = typeof insight.odds?.matchOddsId === "number" ? insight.odds.matchOddsId : void 0;
|
|
1271
|
-
const home = str(insight.homeTeamName);
|
|
1272
|
-
const away = str(insight.awayTeamName);
|
|
1273
|
-
const fixture = home && away ? `${home} vs ${away}` : void 0;
|
|
1274
|
-
const competition = str(insight.competitionName);
|
|
1275
|
-
const previousValue = insight.odds?.previousValue;
|
|
1276
|
-
const previous = typeof previousValue === "number" && Number.isFinite(previousValue) ? previousValue : void 0;
|
|
1277
|
-
const direction = insight.odds?.movementDirection === "shortened" || insight.odds?.movementDirection === "drifted" ? insight.odds.movementDirection : void 0;
|
|
1278
|
-
return {
|
|
1279
|
-
id: str(insight.insightId) ?? `${str(insight.ruleId) ?? "insight"}:${num(insight.matchId) ?? ""}`,
|
|
1280
|
-
market,
|
|
1281
|
-
selection,
|
|
1282
|
-
odds,
|
|
1283
|
-
// The wire payload carries bookmakerId (not a name); render a name only if one is present.
|
|
1284
|
-
bookmaker: str(insight.odds?.bookmakerName),
|
|
1285
|
-
isLive: insight.odds?.isLive === true,
|
|
1286
|
-
phase: str(insight.phase),
|
|
1287
|
-
fixture,
|
|
1288
|
-
competition,
|
|
1289
|
-
text: str(insight.text) ?? "",
|
|
1290
|
-
disclaimer: str(insight.disclaimer),
|
|
1291
|
-
matchId: typeof insight.matchId === "number" ? insight.matchId : 0,
|
|
1292
|
-
matchOddsId,
|
|
1293
|
-
marketDeveloperName: str(insight.marketDeveloperName),
|
|
1294
|
-
selectionLabel: str(insight.selectionLabel),
|
|
1295
|
-
line: str(insight.line),
|
|
1296
|
-
addToSlipEnabled: insight.addToSlipEnabled === true,
|
|
1297
|
-
pinEnabled: insight.pinEnabled === true,
|
|
1298
|
-
isMarketFloor: insight.isMarketFloor === true,
|
|
1299
|
-
oddsDecimal: typeof oddsValue === "number" && Number.isFinite(oddsValue) ? oddsValue : void 0,
|
|
1300
|
-
quotedAtUtc: str(insight.odds?.quotedAtUtc),
|
|
1301
|
-
previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
|
|
1302
|
-
movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0,
|
|
1303
|
-
homeTeamName: home,
|
|
1304
|
-
awayTeamName: away,
|
|
1305
|
-
homeCrest: str(insight.homeTeamImagePath),
|
|
1306
|
-
awayCrest: str(insight.awayTeamImagePath),
|
|
1307
|
-
competitionCrest: str(insight.competitionImagePath),
|
|
1308
|
-
kickoffUtc: str(insight.kickoffUtc),
|
|
1309
|
-
kickoffLabel: str(insight.kickoffLabel)
|
|
1310
|
-
};
|
|
1311
|
-
}
|
|
1312
|
-
function toSlipSelection(vm, conversationId) {
|
|
1313
|
-
if (vm.matchOddsId === void 0 || vm.oddsDecimal === void 0) return null;
|
|
1314
|
-
const selection = {
|
|
1315
|
-
matchOddsId: vm.matchOddsId,
|
|
1316
|
-
matchId: vm.matchId,
|
|
1317
|
-
oddsDecimal: vm.oddsDecimal
|
|
1318
|
-
};
|
|
1319
|
-
if (vm.quotedAtUtc !== void 0) selection.quotedAtUtc = vm.quotedAtUtc;
|
|
1320
|
-
if (vm.id !== void 0) selection.insightId = vm.id;
|
|
1321
|
-
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
1322
|
-
return selection;
|
|
1372
|
+
return [];
|
|
1323
1373
|
}
|
|
1324
|
-
function
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
return {
|
|
1332
|
-
key: `${selection}:${str(r.line) ?? ""}:${i}`,
|
|
1333
|
-
selection,
|
|
1334
|
-
selectionLabel: str(r.selectionLabel),
|
|
1335
|
-
line: str(r.line),
|
|
1336
|
-
odds: price !== void 0 ? price.toFixed(2) : "",
|
|
1337
|
-
oddsDecimal: price,
|
|
1338
|
-
matchOddsId: typeof r.matchOddsId === "number" ? r.matchOddsId : void 0,
|
|
1339
|
-
quotedAtUtc: str(r.quotedAtUtc),
|
|
1340
|
-
isMain: r.isMainLine !== false,
|
|
1341
|
-
// === true, not !== false: a server that has not shipped the field yet leaves it undefined,
|
|
1342
|
-
// and undefined must read as open rather than hiding every price on the card.
|
|
1343
|
-
isSuspended: r.isSuspended === true,
|
|
1344
|
-
previousOdds: previous !== void 0 && direction !== void 0 ? previous.toFixed(2) : void 0,
|
|
1345
|
-
movementDirection: previous !== void 0 && direction !== void 0 ? direction : void 0
|
|
1346
|
-
};
|
|
1347
|
-
};
|
|
1348
|
-
const vms = rows.map(toRow).filter((r) => r.selection && r.odds && !r.isSuspended);
|
|
1349
|
-
const home = str(card.homeTeamName);
|
|
1350
|
-
const away = str(card.awayTeamName);
|
|
1351
|
-
const updated = rows.map((r) => str(r.quotedAtUtc)).filter((v) => !!v).sort();
|
|
1352
|
-
return {
|
|
1353
|
-
id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}`,
|
|
1354
|
-
market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
|
|
1355
|
-
fixture: home && away ? `${home} vs ${away}` : void 0,
|
|
1356
|
-
homeTeamName: home,
|
|
1357
|
-
awayTeamName: away,
|
|
1358
|
-
homeCrest: str(card.homeTeamImagePath),
|
|
1359
|
-
awayCrest: str(card.awayTeamImagePath),
|
|
1360
|
-
competitionCrest: str(card.competitionImagePath),
|
|
1361
|
-
competition: str(card.competitionName),
|
|
1362
|
-
kickoffUtc: str(card.kickoffUtc),
|
|
1363
|
-
kickoffLabel: str(card.kickoffLabel),
|
|
1364
|
-
bookmaker: rows.map((r) => str(r.bookmakerName)).find(Boolean),
|
|
1365
|
-
updatedAt: updated.length > 0 ? updated[updated.length - 1] : void 0,
|
|
1366
|
-
isLive: rows.some((r) => r.isLive === true),
|
|
1367
|
-
matchId: typeof card.matchId === "number" ? card.matchId : 0,
|
|
1368
|
-
mainRows: vms.filter((r) => r.isMain),
|
|
1369
|
-
moreRows: vms.filter((r) => !r.isMain),
|
|
1370
|
-
disclaimer: str(card.disclaimer),
|
|
1371
|
-
addToSlipEnabled: card.addToSlipEnabled === true,
|
|
1372
|
-
marketDeveloperName: str(card.marketDeveloperName),
|
|
1373
|
-
mainLine: str(card.mainLine),
|
|
1374
|
-
pinEnabled: card.pinEnabled === true,
|
|
1375
|
-
statText: card.insight && typeof card.insight === "object" ? str(card.insight.text) : void 0,
|
|
1376
|
-
tag: card.tag === "your_market" ? "your_market" : void 0
|
|
1377
|
-
};
|
|
1374
|
+
function runBubbleAsk(ask, deps) {
|
|
1375
|
+
deps.log?.log({ name: "popup_ask_tap", outcome: String(ask.position) });
|
|
1376
|
+
deps.open();
|
|
1377
|
+
deps.setActiveTab("chat");
|
|
1378
|
+
const displayText = tileDisplayText(ask.tile);
|
|
1379
|
+
deps.send(ask.tile.actionValue, ask.tile.actionRef ? { actionRef: ask.tile.actionRef, displayText } : { displayText });
|
|
1380
|
+
deps.onDashboardTap?.(ask.tile, ask.index, ask.layout);
|
|
1378
1381
|
}
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1382
|
+
|
|
1383
|
+
// src/components/Markdown.tsx
|
|
1384
|
+
var import_react_markdown = __toESM(require("react-markdown"), 1);
|
|
1385
|
+
var import_remark_gfm = __toESM(require("remark-gfm"), 1);
|
|
1386
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
1387
|
+
var components = {
|
|
1388
|
+
a: ({ children, href }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("a", { href, target: "_blank", rel: "noopener noreferrer", className: "ss-w-md-link", children }),
|
|
1389
|
+
table: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("table", { className: "ss-w-md-table", children }) }),
|
|
1390
|
+
ul: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ul", { className: "ss-w-md-ul", children }),
|
|
1391
|
+
ol: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("ol", { className: "ss-w-md-ol", children }),
|
|
1392
|
+
code: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("code", { className: "ss-w-md-code", children })
|
|
1393
|
+
};
|
|
1394
|
+
function Markdown({ text }) {
|
|
1395
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "ss-w-md", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_markdown.default, { remarkPlugins: [import_remark_gfm.default], components, children: text }) });
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
// src/components/EntityCardList.tsx
|
|
1399
|
+
var import_react3 = require("react");
|
|
1400
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1401
|
+
var MAX_VISIBLE = 3;
|
|
1402
|
+
var RECORD_RE = /^(\d+)-(\d+)-(\d+)$/;
|
|
1403
|
+
function initials(name) {
|
|
1404
|
+
return name.split(/\s+/).slice(0, 2).map((w) => w[0] ?? "").join("").toUpperCase();
|
|
1405
|
+
}
|
|
1406
|
+
function shortSeason(season) {
|
|
1407
|
+
return season.replace(/\d{4}/g, (year) => year.slice(2));
|
|
1408
|
+
}
|
|
1409
|
+
function Crest({ image, label }) {
|
|
1410
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1411
|
+
"span",
|
|
1412
|
+
{
|
|
1413
|
+
className: "ss-w-ecard-crest",
|
|
1414
|
+
style: { backgroundImage: `url(${image})` },
|
|
1415
|
+
...label ? { role: "img", title: label, "aria-label": label } : { "aria-hidden": "true" }
|
|
1416
|
+
}
|
|
1417
|
+
);
|
|
1418
|
+
}
|
|
1419
|
+
function FormBar({ w, d, l }) {
|
|
1420
|
+
if (w + d + l === 0) return null;
|
|
1421
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-form", "aria-hidden": "true", children: [
|
|
1422
|
+
w > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-w", style: { flexGrow: w } }) : null,
|
|
1423
|
+
d > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-d", style: { flexGrow: d } }) : null,
|
|
1424
|
+
l > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-form-l", style: { flexGrow: l } }) : null
|
|
1425
|
+
] });
|
|
1426
|
+
}
|
|
1427
|
+
function StatCellView({ s }) {
|
|
1428
|
+
const m = RECORD_RE.exec(s.value);
|
|
1429
|
+
if (m) {
|
|
1430
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
|
|
1431
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(FormBar, { w: Number(m[1]), d: Number(m[2]), l: Number(m[3]) }) }),
|
|
1432
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.value })
|
|
1433
|
+
] });
|
|
1387
1434
|
}
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
const home = str(card.homeTeamName);
|
|
1393
|
-
const away = str(card.awayTeamName);
|
|
1394
|
-
const selection = joinSelection(str(card.selectionLabel), str(card.line)) ?? "";
|
|
1395
|
-
const bookmakerId = typeof card.bookmakerId === "number" ? card.bookmakerId : "";
|
|
1396
|
-
return {
|
|
1397
|
-
id: `${typeof card.matchId === "number" ? card.matchId : 0}:${str(card.marketDeveloperName) ?? ""}:${selection}:${bookmakerId}`,
|
|
1398
|
-
matchId: typeof card.matchId === "number" ? card.matchId : 0,
|
|
1399
|
-
market: str(card.marketLabel) ?? str(card.marketDeveloperName) ?? "",
|
|
1400
|
-
marketDeveloperName: str(card.marketDeveloperName),
|
|
1401
|
-
selection,
|
|
1402
|
-
selectionLabel: str(card.selectionLabel),
|
|
1403
|
-
line: str(card.line),
|
|
1404
|
-
fixture: home && away ? `${home} vs ${away}` : void 0,
|
|
1405
|
-
competition: str(card.competitionName),
|
|
1406
|
-
bookmaker: str(card.bookmakerName),
|
|
1407
|
-
opening: opening !== void 0 ? opening.toFixed(2) : "",
|
|
1408
|
-
current: current !== void 0 ? current.toFixed(2) : "",
|
|
1409
|
-
direction: card.movementDirection === "shortened" || card.movementDirection === "drifted" ? card.movementDirection : void 0,
|
|
1410
|
-
windowHours: asNumber(card.windowHours) ?? 0,
|
|
1411
|
-
excludedCount: asNumber(card.excludedSuspendedCount) ?? 0,
|
|
1412
|
-
isSuspended: card.isSuspended === true,
|
|
1413
|
-
disclaimer: str(card.disclaimer),
|
|
1414
|
-
geometry: projectSeries(samples),
|
|
1415
|
-
observationCount: samples.length,
|
|
1416
|
-
pinEnabled: card.pinEnabled === true,
|
|
1417
|
-
matchOddsId: typeof card.matchOddsId === "number" ? card.matchOddsId : void 0
|
|
1418
|
-
};
|
|
1435
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-cell", children: [
|
|
1436
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-cval", children: s.value }),
|
|
1437
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-clabel", children: s.label })
|
|
1438
|
+
] });
|
|
1419
1439
|
}
|
|
1420
|
-
function
|
|
1421
|
-
if (
|
|
1422
|
-
const
|
|
1423
|
-
|
|
1424
|
-
if (conversationId !== void 0) selection.conversationId = conversationId;
|
|
1425
|
-
return selection;
|
|
1440
|
+
function StatStrip({ stats }) {
|
|
1441
|
+
if (stats.length === 0) return null;
|
|
1442
|
+
const cols = Math.min(stats.length, 4);
|
|
1443
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-strip", style: { gridTemplateColumns: `repeat(${cols}, 1fr)` }, children: stats.map((s) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatCellView, { s }, s.label + s.value)) });
|
|
1426
1444
|
}
|
|
1427
|
-
function
|
|
1428
|
-
|
|
1445
|
+
function CardHeader({ c, showScopeCrest }) {
|
|
1446
|
+
const onlyScope = c.scopes.length === 1 ? c.scopes[0] : null;
|
|
1447
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard-hd", children: [
|
|
1448
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1449
|
+
"span",
|
|
1450
|
+
{
|
|
1451
|
+
className: c.kind === "team" ? "ss-w-thumb ss-w-team" : "ss-w-thumb",
|
|
1452
|
+
style: c.image ? { backgroundImage: `url(${c.image})` } : void 0,
|
|
1453
|
+
children: c.image ? "" : initials(c.name)
|
|
1454
|
+
}
|
|
1455
|
+
),
|
|
1456
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-idtext", children: [
|
|
1457
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-nm", children: c.name }),
|
|
1458
|
+
c.sub ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-sub", children: c.sub }) : null
|
|
1459
|
+
] }),
|
|
1460
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "ss-w-ecard-meta", children: [
|
|
1461
|
+
showScopeCrest && onlyScope?.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: onlyScope.image, label: onlyScope.label }) : null,
|
|
1462
|
+
c.season ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "ss-w-ecard-season", children: shortSeason(c.season) }) : null
|
|
1463
|
+
] })
|
|
1464
|
+
] });
|
|
1429
1465
|
}
|
|
1430
|
-
function
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
matchId,
|
|
1446
|
-
homeTeamName: home,
|
|
1447
|
-
awayTeamName: away,
|
|
1448
|
-
homeCrest: str(leg.homeTeamImagePath),
|
|
1449
|
-
awayCrest: str(leg.awayTeamImagePath),
|
|
1450
|
-
competition: str(leg.competitionName),
|
|
1451
|
-
kickoffUtc: str(leg.kickoffUtc),
|
|
1452
|
-
kickoffLabel: str(leg.kickoffLabel),
|
|
1453
|
-
market: str(leg.marketLabel) ?? str(leg.marketDeveloperName) ?? "",
|
|
1454
|
-
marketDeveloperName: str(leg.marketDeveloperName) ?? "",
|
|
1455
|
-
selection: joinSelection(selectionLabel, line) ?? selectionLabel,
|
|
1456
|
-
selectionLabel,
|
|
1457
|
-
line,
|
|
1458
|
-
odds: price.toFixed(2),
|
|
1459
|
-
oddsDecimal: price,
|
|
1460
|
-
matchOddsId,
|
|
1461
|
-
quotedAtUtc: str(leg.quotedAtUtc),
|
|
1462
|
-
insightId,
|
|
1463
|
-
statText
|
|
1464
|
-
};
|
|
1466
|
+
function ScopeTabs({ scopes, active, onSelect }) {
|
|
1467
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard-scopes", role: "tablist", children: scopes.map((s, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
1468
|
+
"button",
|
|
1469
|
+
{
|
|
1470
|
+
type: "button",
|
|
1471
|
+
role: "tab",
|
|
1472
|
+
className: "ss-w-ecard-scope",
|
|
1473
|
+
"aria-selected": i === active,
|
|
1474
|
+
"aria-label": s.label,
|
|
1475
|
+
title: s.label,
|
|
1476
|
+
onClick: () => onSelect(i),
|
|
1477
|
+
children: s.image ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Crest, { image: s.image }) : s.label
|
|
1478
|
+
},
|
|
1479
|
+
String(s.competitionId ?? "all")
|
|
1480
|
+
)) });
|
|
1465
1481
|
}
|
|
1466
|
-
function
|
|
1467
|
-
const
|
|
1468
|
-
const
|
|
1469
|
-
if (
|
|
1470
|
-
|
|
1471
|
-
for (const raw of rawLegs) {
|
|
1472
|
-
const vm = toComboLegVM(raw);
|
|
1473
|
-
if (!vm) return null;
|
|
1474
|
-
legs.push(vm);
|
|
1482
|
+
function EntityCardItem({ c }) {
|
|
1483
|
+
const [active, setActive] = (0, import_react3.useState)(0);
|
|
1484
|
+
const hasBody = c.scopes.length > 0;
|
|
1485
|
+
if (!hasBody) {
|
|
1486
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "ss-w-ecard ss-w-ecard-bare", "data-kind": c.kind, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: false }) });
|
|
1475
1487
|
}
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
};
|
|
1488
|
+
const multi = c.scopes.length > 1;
|
|
1489
|
+
const scope = c.scopes[multi ? c.scopes[active] ? active : 0 : 0];
|
|
1490
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-ecard", "data-kind": c.kind, children: [
|
|
1491
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CardHeader, { c, showScopeCrest: !multi }),
|
|
1492
|
+
multi ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ScopeTabs, { scopes: c.scopes, active, onSelect: setActive }) : null,
|
|
1493
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatStrip, { stats: scope.stats })
|
|
1494
|
+
] });
|
|
1483
1495
|
}
|
|
1484
|
-
function
|
|
1485
|
-
const
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
return selection;
|
|
1496
|
+
function EntityCardList({ cards, disabled, showLessLabel = "Show less", showMoreLabel = (n) => `Show ${n} more` }) {
|
|
1497
|
+
const [expanded, setExpanded] = (0, import_react3.useState)(false);
|
|
1498
|
+
if (cards.length === 0) return null;
|
|
1499
|
+
const visible = expanded ? cards : cards.slice(0, MAX_VISIBLE);
|
|
1500
|
+
const overflow = cards.length - MAX_VISIBLE;
|
|
1501
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "ss-w-cards", children: [
|
|
1502
|
+
visible.map((c) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EntityCardItem, { c }, c.id)),
|
|
1503
|
+
overflow > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { type: "button", className: "ss-w-cards-more", disabled, onClick: () => setExpanded((v) => !v), children: expanded ? showLessLabel : showMoreLabel(overflow) }) : null
|
|
1504
|
+
] });
|
|
1494
1505
|
}
|
|
1495
1506
|
|
|
1507
|
+
// src/components/AddToSlipButton.tsx
|
|
1508
|
+
var import_react7 = require("react");
|
|
1509
|
+
var import_widget_sdk = require("@sensiblestats/widget-sdk");
|
|
1510
|
+
|
|
1496
1511
|
// src/eventLogContext.ts
|
|
1497
1512
|
var import_react4 = require("react");
|
|
1498
1513
|
var EventLogContext = (0, import_react4.createContext)(null);
|
|
@@ -2050,8 +2065,8 @@ function ComboCardList({ cards, ui, slip }) {
|
|
|
2050
2065
|
// src/components/MarketOddsCardList.tsx
|
|
2051
2066
|
var import_react12 = require("react");
|
|
2052
2067
|
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
2053
|
-
function OddsRow({ vm, row, ui, slip, inSlipIds, history }) {
|
|
2054
|
-
const selection = vm.addToSlipEnabled ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
|
|
2068
|
+
function OddsRow({ vm, row, ui, slip, inSlipIds, history, suppressSlip }) {
|
|
2069
|
+
const selection = vm.addToSlipEnabled && !suppressSlip ? marketOddsRowToSlipSelection(vm, row, slip.conversationId) : null;
|
|
2055
2070
|
const inSlip = !!inSlipIds && row.matchOddsId != null && !!inSlipIds[row.matchOddsId];
|
|
2056
2071
|
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-mo-row", children: [
|
|
2057
2072
|
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-mo-sel", children: row.selection }),
|
|
@@ -2069,17 +2084,34 @@ function OddsRow({ vm, row, ui, slip, inSlipIds, history }) {
|
|
|
2069
2084
|
"\u2713 ",
|
|
2070
2085
|
ui.inSlipLabel
|
|
2071
2086
|
] }) : null,
|
|
2072
|
-
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui })
|
|
2087
|
+
!suppressSlip ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SlipButton, { selection, shownOdds: row.odds, marketDeveloperName: vm.marketDeveloperName, selectionLabel: row.selectionLabel, line: row.line, slip, ui }) : null
|
|
2073
2088
|
] });
|
|
2074
2089
|
}
|
|
2090
|
+
var STALE_AFTER_MS = 12e4;
|
|
2091
|
+
function fmtHhMm(iso, locale) {
|
|
2092
|
+
return new Date(iso).toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit", hour12: false });
|
|
2093
|
+
}
|
|
2075
2094
|
function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }) {
|
|
2076
2095
|
const [open, setOpen] = (0, import_react12.useState)(false);
|
|
2077
2096
|
const kickoffFallback = vm.kickoffUtc && ui?.bettingKickoff ? ui.bettingKickoff(vm.kickoffUtc) : void 0;
|
|
2078
2097
|
const kickoff = vm.kickoffLabel ?? (kickoffFallback ? `${kickoffFallback.dayLabel} ${kickoffFallback.time}` : void 0);
|
|
2079
2098
|
const hasNamedTeams = !!vm.homeTeamName && !!vm.awayTeamName;
|
|
2080
|
-
const
|
|
2099
|
+
const live = vm.live ?? null;
|
|
2100
|
+
const closedReason = live?.closedReason ?? null;
|
|
2101
|
+
const isClosed = closedReason !== null;
|
|
2102
|
+
const asOfMs = live ? new Date(live.asOfUtc).getTime() : NaN;
|
|
2103
|
+
const isStale = live != null && !isClosed && (vm.awaitingLiveUpdate === true || Date.now() - asOfMs > STALE_AFTER_MS);
|
|
2104
|
+
const staleTime = isStale && live ? fmtHhMm(live.asOfUtc, ui?.locale ?? "en") : null;
|
|
2105
|
+
const [, setStaleTick] = (0, import_react12.useState)(0);
|
|
2106
|
+
const watchStale = live != null && !isClosed && !isStale;
|
|
2107
|
+
(0, import_react12.useEffect)(() => {
|
|
2108
|
+
if (!watchStale) return;
|
|
2109
|
+
const id = window.setTimeout(() => setStaleTick((n) => n + 1), Math.max(0, asOfMs + STALE_AFTER_MS - Date.now()) + 1);
|
|
2110
|
+
return () => window.clearTimeout(id);
|
|
2111
|
+
}, [watchStale, asOfMs]);
|
|
2112
|
+
const showPin = !!monitor && vm.pinEnabled && !live;
|
|
2081
2113
|
const history = showPin && !pinRef && !hideHeader ? monitor : void 0;
|
|
2082
|
-
const showHeader = !!vm.competition || vm.isLive || !!kickoff || showPin;
|
|
2114
|
+
const showHeader = !!vm.competition || vm.isLive || !!kickoff || showPin || !!live;
|
|
2083
2115
|
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: hideHeader ? "ss-w-mocard ss-w-mocard--bare" : "ss-w-mocard", children: [
|
|
2084
2116
|
!hideHeader && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
2085
2117
|
showHeader ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-bi-header", children: [
|
|
@@ -2088,7 +2120,14 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
2088
2120
|
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-bi-comp", children: vm.competition })
|
|
2089
2121
|
] }) : null }),
|
|
2090
2122
|
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ss-w-bi-header-right", children: [
|
|
2091
|
-
|
|
2123
|
+
live && !isClosed ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
2124
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ss-w-bi-score", children: [
|
|
2125
|
+
live.homeScore,
|
|
2126
|
+
"\u2013",
|
|
2127
|
+
live.awayScore
|
|
2128
|
+
] }),
|
|
2129
|
+
live.minuteLabel ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-bi-min", children: live.minuteLabel }) : null
|
|
2130
|
+
] }) : !live && vm.isLive ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "ss-w-bi-live", children: [
|
|
2092
2131
|
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "ss-w-bi-live-dot", "aria-hidden": "true" }),
|
|
2093
2132
|
ui?.liveLabel ?? "Live"
|
|
2094
2133
|
] }) : null,
|
|
@@ -2118,14 +2157,17 @@ function MarketOddsCard({ vm, ui, slip, monitor, inSlipIds, hideHeader, pinRef }
|
|
|
2118
2157
|
] }) : null
|
|
2119
2158
|
] }),
|
|
2120
2159
|
vm.statText && !hideHeader && !pinRef ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-mo-stat", children: vm.statText }) : null,
|
|
2121
|
-
/* @__PURE__ */ (0, import_jsx_runtime15.
|
|
2122
|
-
|
|
2123
|
-
|
|
2160
|
+
isClosed ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-mo-closed", children: closedReason === "suspended" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: ui?.liveCard.suspended ?? "Market suspended" }) : closedReason === "no_live_price" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: ui?.liveCard.noPrice ?? "No live price available" }) : closedReason === "full_time" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: ui?.liveCard.fullTime ?? "Full time" }) : null }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
2161
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "ss-w-mo-rows", children: [
|
|
2162
|
+
vm.mainRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)),
|
|
2163
|
+
open ? vm.moreRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(OddsRow, { vm, row, ui, slip, inSlipIds, history, suppressSlip: isStale }, row.key)) : null
|
|
2164
|
+
] }),
|
|
2165
|
+
vm.moreRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("button", { type: "button", className: "ss-w-mo-more", "aria-expanded": open, onClick: () => setOpen((v) => !v), children: [
|
|
2166
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: open ? ui?.hideLines ?? "Hide lines" : `${ui?.moreLines ?? "More lines"} (${vm.moreRows.length})` }),
|
|
2167
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: `ss-w-mo-more-chev${open ? " ss-w-mo-more-chev-up" : ""}`, "aria-hidden": "true" })
|
|
2168
|
+
] }) : null,
|
|
2169
|
+
staleTime ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "ss-w-mo-stale", children: ui?.liveCard.stale(staleTime) ?? `Prices from ${staleTime}` }) : null
|
|
2124
2170
|
] }),
|
|
2125
|
-
vm.moreRows.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("button", { type: "button", className: "ss-w-mo-more", "aria-expanded": open, onClick: () => setOpen((v) => !v), children: [
|
|
2126
|
-
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: open ? ui?.hideLines ?? "Hide lines" : `${ui?.moreLines ?? "More lines"} (${vm.moreRows.length})` }),
|
|
2127
|
-
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: `ss-w-mo-more-chev${open ? " ss-w-mo-more-chev-up" : ""}`, "aria-hidden": "true" })
|
|
2128
|
-
] }) : null,
|
|
2129
2171
|
vm.bookmaker ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "ss-w-mo-foot", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: vm.bookmaker }) }) : null,
|
|
2130
2172
|
vm.disclaimer ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "ss-w-bi-disc", children: vm.disclaimer }) : null
|
|
2131
2173
|
] });
|
|
@@ -7292,6 +7334,21 @@ var import_widget_sdk4 = require("@sensiblestats/widget-sdk");
|
|
|
7292
7334
|
// src/reducer.ts
|
|
7293
7335
|
var import_widget_sdk3 = require("@sensiblestats/widget-sdk");
|
|
7294
7336
|
var POPUP_MAX = 160;
|
|
7337
|
+
function markAwaitingLiveUpdate(messages, held = []) {
|
|
7338
|
+
if (!messages.some((m) => m.role === "assistant" && m.marketOdds.some((vm) => vm.live != null))) return messages;
|
|
7339
|
+
const heldFlags = /* @__PURE__ */ new Map();
|
|
7340
|
+
for (const m of held) {
|
|
7341
|
+
if (m.role !== "assistant") continue;
|
|
7342
|
+
for (const vm of m.marketOdds) if (vm.live != null) heldFlags.set(`${m.id}|${vm.id}`, vm.awaitingLiveUpdate === true);
|
|
7343
|
+
}
|
|
7344
|
+
return messages.map((m) => {
|
|
7345
|
+
if (m.role !== "assistant" || !m.marketOdds.some((vm) => vm.live != null)) return m;
|
|
7346
|
+
return {
|
|
7347
|
+
...m,
|
|
7348
|
+
marketOdds: m.marketOdds.map((vm) => vm.live != null ? { ...vm, awaitingLiveUpdate: heldFlags.get(`${m.id}|${vm.id}`) ?? true } : vm)
|
|
7349
|
+
};
|
|
7350
|
+
});
|
|
7351
|
+
}
|
|
7295
7352
|
function initialState(starters) {
|
|
7296
7353
|
return { isOpen: false, messages: [], isStreaming: false, status: null, actionsLoading: false, starters, configuredStarters: starters, error: null, lastUserInput: null, lastDisplayText: null, popupText: null, conversationId: null };
|
|
7297
7354
|
}
|
|
@@ -7383,7 +7440,7 @@ function reducer(state, action) {
|
|
|
7383
7440
|
case "RESTORE":
|
|
7384
7441
|
return {
|
|
7385
7442
|
...state,
|
|
7386
|
-
messages: action.messages,
|
|
7443
|
+
messages: markAwaitingLiveUpdate(action.messages, state.messages),
|
|
7387
7444
|
conversationId: action.conversationId,
|
|
7388
7445
|
isStreaming: false,
|
|
7389
7446
|
status: null,
|
|
@@ -7397,6 +7454,22 @@ function reducer(state, action) {
|
|
|
7397
7454
|
return { ...state, error: action.error, isStreaming: false, status: null, actionsLoading: false, messages: mapActive(state, (t) => ({ ...t, done: true })) };
|
|
7398
7455
|
case "STOP":
|
|
7399
7456
|
return { ...state, isStreaming: false, status: null, actionsLoading: false, messages: mapActive(state, (t) => ({ ...t, done: true })) };
|
|
7457
|
+
case "UPDATE_LIVE_CARD": {
|
|
7458
|
+
const { matchId, live, mainRows, moreRows, addToSlipEnabled } = action;
|
|
7459
|
+
return {
|
|
7460
|
+
...state,
|
|
7461
|
+
messages: state.messages.map((m) => {
|
|
7462
|
+
if (m.role !== "assistant") return m;
|
|
7463
|
+
if (!m.marketOdds.some((vm) => vm.matchId === matchId && vm.live != null)) return m;
|
|
7464
|
+
return {
|
|
7465
|
+
...m,
|
|
7466
|
+
marketOdds: m.marketOdds.map(
|
|
7467
|
+
(vm) => vm.matchId === matchId && vm.live != null ? { ...vm, live, mainRows, moreRows, addToSlipEnabled, awaitingLiveUpdate: false } : vm
|
|
7468
|
+
)
|
|
7469
|
+
};
|
|
7470
|
+
})
|
|
7471
|
+
};
|
|
7472
|
+
}
|
|
7400
7473
|
case "LIVE_REFRESH":
|
|
7401
7474
|
return {
|
|
7402
7475
|
...state,
|
|
@@ -7569,7 +7642,7 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
|
|
|
7569
7642
|
const restored = payload != null && payload !== "expired" && payload !== "corrupt";
|
|
7570
7643
|
const base = initialState(starterTexts.map(chipFromText));
|
|
7571
7644
|
if (restored) {
|
|
7572
|
-
return { state: { ...base, messages: payload.messages, conversationId: payload.conversationId, starters: [] }, restored: true, stale: false };
|
|
7645
|
+
return { state: { ...base, messages: markAwaitingLiveUpdate(payload.messages), conversationId: payload.conversationId, starters: [] }, restored: true, stale: false };
|
|
7573
7646
|
}
|
|
7574
7647
|
return { state: base, restored: false, stale: payload === "expired" || payload === "corrupt" };
|
|
7575
7648
|
}, []);
|
|
@@ -7742,7 +7815,7 @@ function useChatStream(conversation, starterTexts, greetingMessage, storageKey)
|
|
|
7742
7815
|
}, [storageKey, conversation, clearFallbackTimer, fireGreeting]);
|
|
7743
7816
|
const getLiveDashboard = (0, import_react42.useCallback)(() => conversation.getLiveDashboard(), [conversation]);
|
|
7744
7817
|
useLiveDashboardPoll({ messages: state.messages, dispatch, getLiveDashboard });
|
|
7745
|
-
return { state, open, close, stop, toggle, send, retry, dismissPopup, reset };
|
|
7818
|
+
return { state, open, close, stop, toggle, send, retry, dismissPopup, reset, _dispatch: dispatch };
|
|
7746
7819
|
}
|
|
7747
7820
|
|
|
7748
7821
|
// src/useLiveMonitor.ts
|
|
@@ -7759,6 +7832,7 @@ function useTabs(initial = "chat") {
|
|
|
7759
7832
|
var GOAL_OR_RED = /* @__PURE__ */ new Set(["goal", "red"]);
|
|
7760
7833
|
var MIN_POLL_MS = 5e3;
|
|
7761
7834
|
var DEFAULT_POLL_MS = 6e4;
|
|
7835
|
+
var LIVE_WATCH_POLL_MS = 12e3;
|
|
7762
7836
|
function eventIdentity(e) {
|
|
7763
7837
|
return `${e.type}:${e.side}:${e.minuteLabel}:${e.player ?? ""}`;
|
|
7764
7838
|
}
|
|
@@ -7790,6 +7864,8 @@ function useLiveMonitor(opts) {
|
|
|
7790
7864
|
const [marketOdds, setMarketOdds] = (0, import_react44.useState)({});
|
|
7791
7865
|
const pinsRef = (0, import_react44.useRef)(pins);
|
|
7792
7866
|
pinsRef.current = pins;
|
|
7867
|
+
const watchesRef = (0, import_react44.useRef)(opts.watches ?? []);
|
|
7868
|
+
watchesRef.current = opts.watches ?? [];
|
|
7793
7869
|
const activeTabRef = (0, import_react44.useRef)(activeTab);
|
|
7794
7870
|
activeTabRef.current = activeTab;
|
|
7795
7871
|
const snapshotRef = (0, import_react44.useRef)(snapshot);
|
|
@@ -7907,10 +7983,11 @@ function useLiveMonitor(opts) {
|
|
|
7907
7983
|
const getLiveMonitorRef = (0, import_react44.useRef)(opts.getLiveMonitor);
|
|
7908
7984
|
getLiveMonitorRef.current = opts.getLiveMonitor;
|
|
7909
7985
|
const tick = (0, import_react44.useCallback)(async () => {
|
|
7910
|
-
|
|
7986
|
+
const allPins = [...pinsRef.current, ...watchesRef.current];
|
|
7987
|
+
if (inFlightRef.current || disabledRef.current || allPins.length === 0) return;
|
|
7911
7988
|
inFlightRef.current = true;
|
|
7912
7989
|
try {
|
|
7913
|
-
const snap = await getLiveMonitorRef.current(
|
|
7990
|
+
const snap = await getLiveMonitorRef.current(allPins);
|
|
7914
7991
|
if (!mountedRef.current) return;
|
|
7915
7992
|
if (snap === null) {
|
|
7916
7993
|
disabledRef.current = true;
|
|
@@ -7933,8 +8010,10 @@ function useLiveMonitor(opts) {
|
|
|
7933
8010
|
});
|
|
7934
8011
|
scheduleRef.current = () => {
|
|
7935
8012
|
window.clearTimeout(timerRef.current);
|
|
7936
|
-
|
|
7937
|
-
|
|
8013
|
+
const hasWork = pinsRef.current.length > 0 || watchesRef.current.length > 0;
|
|
8014
|
+
if (!mountedRef.current || disabledRef.current || !hasWork || document.visibilityState === "hidden") return;
|
|
8015
|
+
const fallbackMs = watchesRef.current.length > 0 ? LIVE_WATCH_POLL_MS : DEFAULT_POLL_MS;
|
|
8016
|
+
const hinted = snapshotRef.current ? snapshotRef.current.nextPollSeconds * 1e3 : fallbackMs;
|
|
7938
8017
|
timerRef.current = window.setTimeout(() => void tick(), Math.max(MIN_POLL_MS, hinted));
|
|
7939
8018
|
};
|
|
7940
8019
|
(0, import_react44.useEffect)(() => {
|
|
@@ -7945,14 +8024,21 @@ function useLiveMonitor(opts) {
|
|
|
7945
8024
|
}, []);
|
|
7946
8025
|
const prevPinsLengthRef = (0, import_react44.useRef)(0);
|
|
7947
8026
|
(0, import_react44.useEffect)(() => {
|
|
7948
|
-
const wasEmpty = prevPinsLengthRef.current === 0;
|
|
8027
|
+
const wasEmpty = prevPinsLengthRef.current === 0 && watchesRef.current.length === 0;
|
|
7949
8028
|
prevPinsLengthRef.current = pins.length;
|
|
7950
|
-
if (pins.length === 0) {
|
|
8029
|
+
if (pins.length === 0 && watchesRef.current.length === 0) {
|
|
7951
8030
|
window.clearTimeout(timerRef.current);
|
|
7952
8031
|
return;
|
|
7953
8032
|
}
|
|
7954
8033
|
if (wasEmpty) void tick();
|
|
7955
8034
|
}, [pins.length, tick]);
|
|
8035
|
+
const prevWatchesLengthRef = (0, import_react44.useRef)(0);
|
|
8036
|
+
const watchesLength = opts.watches?.length ?? 0;
|
|
8037
|
+
(0, import_react44.useEffect)(() => {
|
|
8038
|
+
const wasEmpty = prevWatchesLengthRef.current === 0 && pinsRef.current.length === 0;
|
|
8039
|
+
prevWatchesLengthRef.current = watchesLength;
|
|
8040
|
+
if (wasEmpty && watchesLength > 0) void tick();
|
|
8041
|
+
}, [watchesLength, tick]);
|
|
7956
8042
|
(0, import_react44.useEffect)(() => {
|
|
7957
8043
|
const matchPins = pins.filter((p) => p.kind === "match").length;
|
|
7958
8044
|
const marketPins = pins.length - matchPins;
|
|
@@ -8789,6 +8875,12 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
|
|
|
8789
8875
|
.ss-w-mo-more-chev { width: 7px; height: 7px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: translateY(-2px) rotate(45deg); transition: transform .15s ease; }
|
|
8790
8876
|
.ss-w-mo-more-chev-up { transform: translateY(1px) rotate(-135deg); }
|
|
8791
8877
|
.ss-w-mo-rows { display: flex; flex-direction: column; gap: 4px; }
|
|
8878
|
+
/* Stage 4: live card score+minute in header (R18). */
|
|
8879
|
+
.ss-w-bi-score { font-size: 13px; font-weight: 700; color: var(--ss-w-ink); white-space: nowrap; }
|
|
8880
|
+
.ss-w-bi-min { font-size: 11px; font-weight: 600; color: var(--ss-w-faint); white-space: nowrap; }
|
|
8881
|
+
/* D12: closed state message row; D13: stale-price notice. */
|
|
8882
|
+
.ss-w-mo-closed { padding: 6px 0; font-size: 12.5px; color: var(--ss-w-faint); }
|
|
8883
|
+
.ss-w-mo-stale { margin: 0; font-size: 11px; color: var(--ss-w-faint); }
|
|
8792
8884
|
/* The card's stat, in the Live tab accordion's insight style. No row below it is marked (R17). */
|
|
8793
8885
|
.ss-w-mo-stat { font-size: 12px; color: var(--ss-w-ink); background: color-mix(in srgb, var(--ss-w-accent) 9%, var(--ss-w-panel)); border-radius: 8px; padding: 7px 9px; }
|
|
8794
8886
|
.ss-w-mo-row { display: flex; align-items: center; gap: 10px; padding: 4px 0; border-bottom: 1px dashed var(--ss-w-line); }
|
|
@@ -9991,12 +10083,27 @@ function StatsWidget(props) {
|
|
|
9991
10083
|
const convStorageKey = `ss-w-conv:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`;
|
|
9992
10084
|
const controller = useChatStream(built?.conversation ?? emptyConversation(), ui.starters, built ? ui.greetingMessage : void 0, convStorageKey);
|
|
9993
10085
|
const [hasToday, setHasToday] = (0, import_react50.useState)(false);
|
|
10086
|
+
const liveCardWatches = (0, import_react50.useMemo)(() => {
|
|
10087
|
+
const seen = /* @__PURE__ */ new Set();
|
|
10088
|
+
const out = [];
|
|
10089
|
+
for (const msg of controller.state.messages) {
|
|
10090
|
+
if (msg.role !== "assistant") continue;
|
|
10091
|
+
for (const vm of msg.marketOdds) {
|
|
10092
|
+
if (vm.live == null || seen.has(vm.matchId)) continue;
|
|
10093
|
+
seen.add(vm.matchId);
|
|
10094
|
+
out.push({ key: `live:card:${vm.matchId}`, kind: "market", matchId: vm.matchId, marketDeveloperName: vm.marketDeveloperName ?? "FULLTIME_RESULT" });
|
|
10095
|
+
}
|
|
10096
|
+
}
|
|
10097
|
+
return out;
|
|
10098
|
+
}, [controller.state.messages]);
|
|
10099
|
+
const locale = cfg?.locale;
|
|
9994
10100
|
const monitor = useLiveMonitor({
|
|
9995
|
-
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins) : Promise.resolve(null),
|
|
10101
|
+
getLiveMonitor: (pins) => built ? built.conversation.getLiveMonitor(pins, locale) : Promise.resolve(null),
|
|
9996
10102
|
getMarketOdds: (matchId, dev) => built ? built.conversation.getMarketOdds(matchId, dev) : Promise.resolve(null),
|
|
9997
10103
|
storageKey: `ss-w-pins:${cfg?.operatorId ?? ""}:${cfg?.userContext?.operatorUserId ?? "anon"}`,
|
|
9998
10104
|
isOpen: controller.state.isOpen,
|
|
9999
|
-
hasToday
|
|
10105
|
+
hasToday,
|
|
10106
|
+
watches: liveCardWatches
|
|
10000
10107
|
});
|
|
10001
10108
|
const getSchedule = (0, import_react50.useCallback)(
|
|
10002
10109
|
(localDate, utcOffsetMinutes) => built ? built.conversation.getSchedule(localDate, utcOffsetMinutes) : Promise.resolve(null),
|
|
@@ -10021,6 +10128,41 @@ function StatsWidget(props) {
|
|
|
10021
10128
|
(0, import_react50.useEffect)(() => {
|
|
10022
10129
|
setHasToday(todayHasContent);
|
|
10023
10130
|
}, [todayHasContent]);
|
|
10131
|
+
const prevLiveSnapshotRef = (0, import_react50.useRef)(monitor.snapshot);
|
|
10132
|
+
(0, import_react50.useEffect)(() => {
|
|
10133
|
+
const snap = monitor.snapshot;
|
|
10134
|
+
if (!snap || snap === prevLiveSnapshotRef.current) return;
|
|
10135
|
+
prevLiveSnapshotRef.current = snap;
|
|
10136
|
+
for (const market of snap.markets) {
|
|
10137
|
+
if (!market.key.startsWith("live:card:")) continue;
|
|
10138
|
+
const matchId = parseInt(market.key.slice("live:card:".length), 10);
|
|
10139
|
+
if (!Number.isFinite(matchId)) continue;
|
|
10140
|
+
let mainRows = [];
|
|
10141
|
+
let moreRows = [];
|
|
10142
|
+
let addToSlipEnabled = false;
|
|
10143
|
+
if (market.card) {
|
|
10144
|
+
const updated = toMarketOddsVM(market.card);
|
|
10145
|
+
mainRows = updated.mainRows;
|
|
10146
|
+
moreRows = updated.moreRows;
|
|
10147
|
+
addToSlipEnabled = updated.addToSlipEnabled;
|
|
10148
|
+
}
|
|
10149
|
+
let closedReason = null;
|
|
10150
|
+
if (market.phase === "fullTime" || market.phase === "postponed") closedReason = "full_time";
|
|
10151
|
+
else if (market.isSuspended) closedReason = "suspended";
|
|
10152
|
+
else if (!market.card) closedReason = "no_live_price";
|
|
10153
|
+
const live = {
|
|
10154
|
+
phase: market.phase,
|
|
10155
|
+
homeScore: market.homeScore ?? null,
|
|
10156
|
+
awayScore: market.awayScore ?? null,
|
|
10157
|
+
minuteLabel: market.minuteLabel ?? null,
|
|
10158
|
+
isSuspended: market.isSuspended,
|
|
10159
|
+
isSettled: market.isSettled,
|
|
10160
|
+
asOfUtc: market.asOfUtc,
|
|
10161
|
+
closedReason
|
|
10162
|
+
};
|
|
10163
|
+
controller._dispatch?.({ kind: "UPDATE_LIVE_CARD", matchId, live, mainRows, moreRows, addToSlipEnabled });
|
|
10164
|
+
}
|
|
10165
|
+
}, [monitor.snapshot]);
|
|
10024
10166
|
const gamesResult = useGames(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
10025
10167
|
const leaderboardResult = useLeaderboard(built?.conversation ?? null, { activeTab: monitor.activeTab });
|
|
10026
10168
|
const markTodayActivity = monitor.markTodayActivity;
|