57 lines
1.6 KiB
TypeScript
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,
|
||
|
}
|
||
|
}
|