stacker.news/components/price.js

80 lines
2.0 KiB
JavaScript
Raw Normal View History

2021-11-28 17:29:17 +00:00
import React, { useContext, useEffect, useState } from 'react'
import { useQuery } from '@apollo/client'
2022-07-30 13:25:46 +00:00
import { fixedDecimal } from '../lib/format'
2022-09-12 23:42:09 +00:00
import { useMe } from './me'
import { PRICE } from '../fragments/price'
2023-02-08 19:38:04 +00:00
import { CURRENCY_SYMBOLS } from '../lib/currency'
2021-04-12 18:05:09 +00:00
2021-11-28 17:29:17 +00:00
export const PriceContext = React.createContext({
price: null,
fiatSymbol: null
2021-11-28 17:29:17 +00:00
})
export function usePrice () {
return useContext(PriceContext)
2021-11-28 17:29:17 +00:00
}
export function PriceProvider ({ price, children }) {
2022-09-18 01:07:14 +00:00
const me = useMe()
2023-01-28 00:08:58 +00:00
const fiatCurrency = me?.fiatCurrency
const { data } = useQuery(PRICE, { variables: { fiatCurrency }, pollInterval: 30000, fetchPolicy: 'cache-and-network' })
2021-04-12 18:05:09 +00:00
2021-11-28 17:29:17 +00:00
const contextValue = {
price: data?.price || price,
fiatSymbol: CURRENCY_SYMBOLS[fiatCurrency] || '$'
2021-11-28 17:29:17 +00:00
}
return (
<PriceContext.Provider value={contextValue}>
{children}
</PriceContext.Provider>
)
}
2023-05-01 20:58:30 +00:00
export default function Price ({ className }) {
2021-11-28 17:29:17 +00:00
const [asSats, setAsSats] = useState(undefined)
useEffect(() => {
2021-11-28 17:29:17 +00:00
setAsSats(localStorage.getItem('asSats'))
}, [])
const { price, fiatSymbol } = usePrice()
2023-03-04 18:16:50 +00:00
if (!price || price < 0) return null
2021-04-12 18:05:09 +00:00
2021-04-29 18:43:17 +00:00
const handleClick = () => {
2021-12-05 17:37:55 +00:00
if (asSats === 'yep') {
localStorage.setItem('asSats', '1btc')
setAsSats('1btc')
} else if (asSats === '1btc') {
2021-04-29 18:43:17 +00:00
localStorage.removeItem('asSats')
setAsSats(undefined)
} else {
localStorage.setItem('asSats', 'yep')
setAsSats('yep')
}
}
2023-05-01 20:58:30 +00:00
const compClassName = (className || '') + ' text-reset pointer'
2021-12-05 17:37:55 +00:00
if (asSats === 'yep') {
2021-04-29 15:56:28 +00:00
return (
2023-05-01 20:58:30 +00:00
<div className={compClassName} onClick={handleClick} variant='link'>
2022-09-12 23:42:09 +00:00
{fixedDecimal(100000000 / price, 0) + ` sats/${fiatSymbol}`}
2023-05-01 20:58:30 +00:00
</div>
2021-04-29 15:56:28 +00:00
)
}
2021-12-05 17:37:55 +00:00
if (asSats === '1btc') {
return (
2023-05-01 20:58:30 +00:00
<div className={compClassName} onClick={handleClick} variant='link'>
2021-12-05 17:37:55 +00:00
1sat=1sat
2023-05-01 20:58:30 +00:00
</div>
2021-12-05 17:37:55 +00:00
)
}
2021-04-29 15:56:28 +00:00
return (
2023-05-01 20:58:30 +00:00
<div className={compClassName} onClick={handleClick} variant='link'>
2022-09-12 23:42:09 +00:00
{fiatSymbol + fixedDecimal(price, 0)}
2023-05-01 20:58:30 +00:00
</div>
2021-04-29 15:56:28 +00:00
)
2021-04-12 18:05:09 +00:00
}