75 lines
2.1 KiB
TypeScript
75 lines
2.1 KiB
TypeScript
import { create } from "zustand";
|
|
|
|
export type OddsFormat = "decimal" | "fractional" | "american";
|
|
|
|
export type Bet = {
|
|
id: string;
|
|
event: string;
|
|
league: string;
|
|
market: string;
|
|
selection: string;
|
|
odds: number;
|
|
stake?: number;
|
|
};
|
|
|
|
type BetslipState = {
|
|
bets: Bet[];
|
|
oddsFormat: OddsFormat;
|
|
defaultStake: number;
|
|
addBet: (bet: Bet) => void;
|
|
removeBet: (id: string) => void;
|
|
clearBets: () => void;
|
|
updateStake: (id: string, stake: number) => void;
|
|
setOddsFormat: (format: OddsFormat) => void;
|
|
setDefaultStake: (stake: number) => void;
|
|
getTotalOdds: () => number;
|
|
getTotalStake: () => number;
|
|
getPotentialWin: () => number;
|
|
};
|
|
|
|
export const useBetslipStore = create<BetslipState>((set, get) => ({
|
|
bets: [],
|
|
oddsFormat: "decimal",
|
|
defaultStake: 10,
|
|
addBet: (bet) =>
|
|
set((state) => {
|
|
const exists = state.bets.some((b) => b.id === bet.id);
|
|
if (exists) {
|
|
// Toggle off if already selected
|
|
return { bets: state.bets.filter((b) => b.id !== bet.id) };
|
|
}
|
|
return { bets: [...state.bets, { ...bet, stake: state.defaultStake }] };
|
|
}),
|
|
removeBet: (id) =>
|
|
set((state) => ({
|
|
bets: state.bets.filter((bet) => bet.id !== id),
|
|
})),
|
|
clearBets: () => set({ bets: [] }),
|
|
updateStake: (id, stake) =>
|
|
set((state) => ({
|
|
bets: state.bets.map((b) => (b.id === id ? { ...b, stake } : b)),
|
|
})),
|
|
setOddsFormat: (format) => set({ oddsFormat: format }),
|
|
setDefaultStake: (stake) => set({ defaultStake: stake }),
|
|
getTotalOdds: () => {
|
|
const bets = get().bets;
|
|
if (bets.length === 0) return 0;
|
|
return bets.reduce((acc, b) => acc * b.odds, 1);
|
|
},
|
|
getTotalStake: () => {
|
|
const bets = get().bets;
|
|
return bets.reduce((acc, b) => acc + (b.stake ?? 0), 0);
|
|
},
|
|
getPotentialWin: () => {
|
|
const bets = get().bets;
|
|
if (bets.length === 0) return 0;
|
|
if (bets.length === 1) {
|
|
const b = bets[0];
|
|
return (b.stake ?? 0) * b.odds;
|
|
}
|
|
// Accumulator: use first bet's stake
|
|
const stake = bets[0].stake ?? 0;
|
|
const totalOdds = bets.reduce((acc, b) => acc * b.odds, 1);
|
|
return stake * totalOdds;
|
|
},
|
|
})); |