Fortune-PlayLogic/lib/store/betslip-store.ts

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;
},
}));