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