manifold/web/components/use-save-binary-shares.ts

57 lines
1.6 KiB
TypeScript

import { BinaryContract, PseudoNumericContract } 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 useSaveBinaryShares = (
contract: BinaryContract | PseudoNumericContract,
userBets: Bet[] | undefined
) => {
const [savedShares, setSavedShares] = useState({ yesShares: 0, noShares: 0 })
const [yesBets, noBets] = partition(
userBets ?? [],
(bet) => bet.outcome === 'YES'
)
const [yesShares, noShares] = userBets
? [sumBy(yesBets, (bet) => bet.shares), sumBy(noBets, (bet) => bet.shares)]
: [savedShares.yesShares, savedShares.noShares]
useEffect(() => {
const local = safeLocalStorage()
// Read shares from local storage.
const savedShares = local?.getItem(`${contract.id}-shares`)
if (savedShares) {
setSavedShares(JSON.parse(savedShares))
}
if (userBets) {
// Save shares to local storage.
const sharesData = JSON.stringify({ yesShares, noShares })
local?.setItem(`${contract.id}-shares`, sharesData)
}
}, [contract.id, userBets, noShares, yesShares])
const hasYesShares = yesShares >= 1
const hasNoShares = noShares >= 1
const sharesOutcome = hasYesShares
? ('YES' as const)
: hasNoShares
? ('NO' as const)
: undefined
const shares =
sharesOutcome === 'YES' ? yesShares : sharesOutcome === 'NO' ? noShares : 0
return {
yesShares,
noShares,
shares,
sharesOutcome,
hasYesShares,
hasNoShares,
}
}