import { Contract } from 'common/contract' import { Bet } from 'common/bet' import { useEffect, useState } from 'react' import { partition, sumBy } from 'lodash' import { safeLocalStorage } from 'web/lib/util/local' export const useSaveShares = ( contract: Contract, userBets: Bet[] | undefined, freeResponseAnswerOutcome?: string ) => { const [savedShares, setSavedShares] = useState< | { yesShares: number noShares: number yesFloorShares: number noFloorShares: number } | undefined >() // TODO: How do we handle numeric yes / no bets? - maybe bet amounts above vs below the highest peak const [yesBets, noBets] = partition(userBets ?? [], (bet) => freeResponseAnswerOutcome ? bet.outcome === freeResponseAnswerOutcome : bet.outcome === 'YES' ) const [yesShares, noShares] = [ sumBy(yesBets, (bet) => bet.shares), sumBy(noBets, (bet) => bet.shares), ] const yesFloorShares = Math.round(yesShares) === 0 ? 0 : Math.floor(yesShares) const noFloorShares = Math.round(noShares) === 0 ? 0 : Math.floor(noShares) useEffect(() => { const local = safeLocalStorage() // Save yes and no shares to local storage. const savedShares = local?.getItem(`${contract.id}-shares`) if (!userBets && savedShares) { setSavedShares(JSON.parse(savedShares)) } if (userBets) { const updatedShares = { yesShares, noShares } local?.setItem(`${contract.id}-shares`, JSON.stringify(updatedShares)) } }, [contract.id, userBets, noShares, yesShares]) if (userBets) return { yesShares, noShares, yesFloorShares, noFloorShares } return ( savedShares ?? { yesShares: 0, noShares: 0, yesFloorShares: 0, noFloorShares: 0, } ) }