76 lines
2.0 KiB
TypeScript
76 lines
2.0 KiB
TypeScript
"use client"
|
|
|
|
import { create } from "zustand"
|
|
import { SportEnum } from "./betting-types"
|
|
import type { AppEvent } from "./betting-types"
|
|
import {
|
|
fetchEvents,
|
|
fetchOddsForEvent,
|
|
apiEventToAppEvent,
|
|
getListMarketsFromOddsResponse,
|
|
} from "./betting-api"
|
|
|
|
const LIVE_PAGE_SIZE = 24
|
|
|
|
/** Start of today in UTC, RFC3339 — for live events first_start_time */
|
|
function getFirstStartTimeToday(): string {
|
|
const d = new Date()
|
|
d.setUTCHours(0, 0, 0, 0)
|
|
return d.toISOString()
|
|
}
|
|
|
|
type LiveState = {
|
|
events: AppEvent[]
|
|
loading: boolean
|
|
error: string | null
|
|
sportId: number
|
|
setSportId: (sportId: number) => void
|
|
loadLiveEvents: () => Promise<void>
|
|
}
|
|
|
|
export const useLiveStore = create<LiveState>((set, get) => ({
|
|
events: [],
|
|
loading: false,
|
|
error: null,
|
|
sportId: SportEnum.SOCCER,
|
|
|
|
setSportId: (sportId) => {
|
|
set({ sportId })
|
|
get().loadLiveEvents()
|
|
},
|
|
|
|
loadLiveEvents: async () => {
|
|
const { sportId } = get()
|
|
set({ loading: true, error: null })
|
|
try {
|
|
const first_start_time = getFirstStartTimeToday()
|
|
const res = await fetchEvents({
|
|
sport_id: sportId,
|
|
page: 1,
|
|
page_size: LIVE_PAGE_SIZE,
|
|
first_start_time,
|
|
is_live: true,
|
|
// no league_id - get all leagues
|
|
})
|
|
const apiEvents = (res.data ?? []).filter((e) => e.is_live === true)
|
|
const oddsResponses = await Promise.all(
|
|
apiEvents.map((e) => fetchOddsForEvent(e.id).catch(() => ({ data: [] as typeof res.data })))
|
|
)
|
|
const newEvents: AppEvent[] = apiEvents.map((e, i) => {
|
|
const oddsList = oddsResponses[i]?.data ?? []
|
|
const listMarkets = getListMarketsFromOddsResponse(oddsList)
|
|
const appEvent = apiEventToAppEvent(e, listMarkets) as AppEvent
|
|
appEvent.rawOdds = oddsList
|
|
return appEvent
|
|
})
|
|
set({ events: newEvents, loading: false })
|
|
} catch (err) {
|
|
set({
|
|
loading: false,
|
|
error: err instanceof Error ? err.message : "Failed to load live events",
|
|
events: [],
|
|
})
|
|
}
|
|
},
|
|
}))
|