Clean up chart sizing code (#977)
* Clean up chart sizing code * Do all the chart sizing work in same batch
This commit is contained in:
parent
38b7c898f6
commit
89e26d077e
|
@ -1,4 +1,4 @@
|
||||||
import { useMemo, useRef } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { last, sortBy } from 'lodash'
|
import { last, sortBy } from 'lodash'
|
||||||
import { scaleTime, scaleLinear } from 'd3-scale'
|
import { scaleTime, scaleLinear } from 'd3-scale'
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@ import { Bet } from 'common/bet'
|
||||||
import { getProbability, getInitialProbability } from 'common/calculate'
|
import { getProbability, getInitialProbability } from 'common/calculate'
|
||||||
import { BinaryContract } from 'common/contract'
|
import { BinaryContract } from 'common/contract'
|
||||||
import { DAY_MS } from 'common/util/time'
|
import { DAY_MS } from 'common/util/time'
|
||||||
import { useIsMobile } from 'web/hooks/use-is-mobile'
|
|
||||||
import {
|
import {
|
||||||
TooltipProps,
|
TooltipProps,
|
||||||
MARGIN_X,
|
MARGIN_X,
|
||||||
|
@ -17,7 +16,6 @@ import {
|
||||||
formatPct,
|
formatPct,
|
||||||
} from '../helpers'
|
} from '../helpers'
|
||||||
import { HistoryPoint, SingleValueHistoryChart } from '../generic-charts'
|
import { HistoryPoint, SingleValueHistoryChart } from '../generic-charts'
|
||||||
import { useElementWidth } from 'web/hooks/use-element-width'
|
|
||||||
import { Row } from 'web/components/layout/row'
|
import { Row } from 'web/components/layout/row'
|
||||||
import { Avatar } from 'web/components/avatar'
|
import { Avatar } from 'web/components/avatar'
|
||||||
|
|
||||||
|
@ -45,10 +43,11 @@ const BinaryChartTooltip = (props: TooltipProps<Date, HistoryPoint<Bet>>) => {
|
||||||
export const BinaryContractChart = (props: {
|
export const BinaryContractChart = (props: {
|
||||||
contract: BinaryContract
|
contract: BinaryContract
|
||||||
bets: Bet[]
|
bets: Bet[]
|
||||||
height?: number
|
width: number
|
||||||
|
height: number
|
||||||
onMouseOver?: (p: HistoryPoint<Bet> | undefined) => void
|
onMouseOver?: (p: HistoryPoint<Bet> | undefined) => void
|
||||||
}) => {
|
}) => {
|
||||||
const { contract, bets, onMouseOver } = props
|
const { contract, bets, width, height, onMouseOver } = props
|
||||||
const [start, end] = getDateRange(contract)
|
const [start, end] = getDateRange(contract)
|
||||||
const startP = getInitialProbability(contract)
|
const startP = getInitialProbability(contract)
|
||||||
const endP = getProbability(contract)
|
const endP = getProbability(contract)
|
||||||
|
@ -67,16 +66,9 @@ export const BinaryContractChart = (props: {
|
||||||
Date.now()
|
Date.now()
|
||||||
)
|
)
|
||||||
const visibleRange = [start, rightmostDate]
|
const visibleRange = [start, rightmostDate]
|
||||||
const isMobile = useIsMobile(800)
|
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
|
||||||
const width = useElementWidth(containerRef) ?? 0
|
|
||||||
const height = props.height ?? (isMobile ? 150 : 250)
|
|
||||||
const xScale = scaleTime(visibleRange, [0, width - MARGIN_X])
|
const xScale = scaleTime(visibleRange, [0, width - MARGIN_X])
|
||||||
const yScale = scaleLinear([0, 1], [height - MARGIN_Y, 0])
|
const yScale = scaleLinear([0, 1], [height - MARGIN_Y, 0])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={containerRef}>
|
|
||||||
{width > 0 && (
|
|
||||||
<SingleValueHistoryChart
|
<SingleValueHistoryChart
|
||||||
w={width}
|
w={width}
|
||||||
h={height}
|
h={height}
|
||||||
|
@ -88,7 +80,5 @@ export const BinaryContractChart = (props: {
|
||||||
Tooltip={BinaryChartTooltip}
|
Tooltip={BinaryChartTooltip}
|
||||||
pct
|
pct
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useMemo, useRef } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { last, sum, sortBy, groupBy } from 'lodash'
|
import { last, sum, sortBy, groupBy } from 'lodash'
|
||||||
import { scaleTime, scaleLinear } from 'd3-scale'
|
import { scaleTime, scaleLinear } from 'd3-scale'
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@ import { Bet } from 'common/bet'
|
||||||
import { Answer } from 'common/answer'
|
import { Answer } from 'common/answer'
|
||||||
import { FreeResponseContract, MultipleChoiceContract } from 'common/contract'
|
import { FreeResponseContract, MultipleChoiceContract } from 'common/contract'
|
||||||
import { getOutcomeProbability } from 'common/calculate'
|
import { getOutcomeProbability } from 'common/calculate'
|
||||||
import { useIsMobile } from 'web/hooks/use-is-mobile'
|
|
||||||
import { DAY_MS } from 'common/util/time'
|
import { DAY_MS } from 'common/util/time'
|
||||||
import {
|
import {
|
||||||
TooltipProps,
|
TooltipProps,
|
||||||
|
@ -18,7 +17,6 @@ import {
|
||||||
formatDateInRange,
|
formatDateInRange,
|
||||||
} from '../helpers'
|
} from '../helpers'
|
||||||
import { MultiPoint, MultiValueHistoryChart } from '../generic-charts'
|
import { MultiPoint, MultiValueHistoryChart } from '../generic-charts'
|
||||||
import { useElementWidth } from 'web/hooks/use-element-width'
|
|
||||||
import { Row } from 'web/components/layout/row'
|
import { Row } from 'web/components/layout/row'
|
||||||
import { Avatar } from 'web/components/avatar'
|
import { Avatar } from 'web/components/avatar'
|
||||||
|
|
||||||
|
@ -146,10 +144,11 @@ const Legend = (props: { className?: string; items: LegendItem[] }) => {
|
||||||
export const ChoiceContractChart = (props: {
|
export const ChoiceContractChart = (props: {
|
||||||
contract: FreeResponseContract | MultipleChoiceContract
|
contract: FreeResponseContract | MultipleChoiceContract
|
||||||
bets: Bet[]
|
bets: Bet[]
|
||||||
height?: number
|
width: number
|
||||||
|
height: number
|
||||||
onMouseOver?: (p: MultiPoint<Bet> | undefined) => void
|
onMouseOver?: (p: MultiPoint<Bet> | undefined) => void
|
||||||
}) => {
|
}) => {
|
||||||
const { contract, bets, onMouseOver } = props
|
const { contract, bets, width, height, onMouseOver } = props
|
||||||
const [start, end] = getDateRange(contract)
|
const [start, end] = getDateRange(contract)
|
||||||
const answers = useMemo(
|
const answers = useMemo(
|
||||||
() => getTrackedAnswers(contract, CATEGORY_COLORS.length),
|
() => getTrackedAnswers(contract, CATEGORY_COLORS.length),
|
||||||
|
@ -173,10 +172,6 @@ export const ChoiceContractChart = (props: {
|
||||||
Date.now()
|
Date.now()
|
||||||
)
|
)
|
||||||
const visibleRange = [start, rightmostDate]
|
const visibleRange = [start, rightmostDate]
|
||||||
const isMobile = useIsMobile(800)
|
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
|
||||||
const width = useElementWidth(containerRef) ?? 0
|
|
||||||
const height = props.height ?? (isMobile ? 250 : 350)
|
|
||||||
const xScale = scaleTime(visibleRange, [0, width - MARGIN_X])
|
const xScale = scaleTime(visibleRange, [0, width - MARGIN_X])
|
||||||
const yScale = scaleLinear([0, 1], [height - MARGIN_Y, 0])
|
const yScale = scaleLinear([0, 1], [height - MARGIN_Y, 0])
|
||||||
|
|
||||||
|
@ -212,8 +207,6 @@ export const ChoiceContractChart = (props: {
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={containerRef}>
|
|
||||||
{width > 0 && (
|
|
||||||
<MultiValueHistoryChart
|
<MultiValueHistoryChart
|
||||||
w={width}
|
w={width}
|
||||||
h={height}
|
h={height}
|
||||||
|
@ -225,7 +218,5 @@ export const ChoiceContractChart = (props: {
|
||||||
Tooltip={ChoiceTooltip}
|
Tooltip={ChoiceTooltip}
|
||||||
pct
|
pct
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,8 @@ import { NumericContractChart } from './numeric'
|
||||||
export const ContractChart = (props: {
|
export const ContractChart = (props: {
|
||||||
contract: Contract
|
contract: Contract
|
||||||
bets: Bet[]
|
bets: Bet[]
|
||||||
height?: number
|
width: number
|
||||||
|
height: number
|
||||||
}) => {
|
}) => {
|
||||||
const { contract } = props
|
const { contract } = props
|
||||||
switch (contract.outcomeType) {
|
switch (contract.outcomeType) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useMemo, useRef } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { range } from 'lodash'
|
import { range } from 'lodash'
|
||||||
import { scaleLinear } from 'd3-scale'
|
import { scaleLinear } from 'd3-scale'
|
||||||
|
|
||||||
|
@ -6,10 +6,8 @@ import { formatLargeNumber } from 'common/util/format'
|
||||||
import { getDpmOutcomeProbabilities } from 'common/calculate-dpm'
|
import { getDpmOutcomeProbabilities } from 'common/calculate-dpm'
|
||||||
import { NumericContract } from 'common/contract'
|
import { NumericContract } from 'common/contract'
|
||||||
import { NUMERIC_GRAPH_COLOR } from 'common/numeric-constants'
|
import { NUMERIC_GRAPH_COLOR } from 'common/numeric-constants'
|
||||||
import { useIsMobile } from 'web/hooks/use-is-mobile'
|
|
||||||
import { TooltipProps, MARGIN_X, MARGIN_Y, formatPct } from '../helpers'
|
import { TooltipProps, MARGIN_X, MARGIN_Y, formatPct } from '../helpers'
|
||||||
import { DistributionPoint, DistributionChart } from '../generic-charts'
|
import { DistributionPoint, DistributionChart } from '../generic-charts'
|
||||||
import { useElementWidth } from 'web/hooks/use-element-width'
|
|
||||||
|
|
||||||
const getNumericChartData = (contract: NumericContract) => {
|
const getNumericChartData = (contract: NumericContract) => {
|
||||||
const { totalShares, bucketCount, min, max } = contract
|
const { totalShares, bucketCount, min, max } = contract
|
||||||
|
@ -36,22 +34,17 @@ const NumericChartTooltip = (
|
||||||
|
|
||||||
export const NumericContractChart = (props: {
|
export const NumericContractChart = (props: {
|
||||||
contract: NumericContract
|
contract: NumericContract
|
||||||
height?: number
|
width: number
|
||||||
|
height: number
|
||||||
onMouseOver?: (p: DistributionPoint | undefined) => void
|
onMouseOver?: (p: DistributionPoint | undefined) => void
|
||||||
}) => {
|
}) => {
|
||||||
const { contract, onMouseOver } = props
|
const { contract, width, height, onMouseOver } = props
|
||||||
const { min, max } = contract
|
const { min, max } = contract
|
||||||
const data = useMemo(() => getNumericChartData(contract), [contract])
|
const data = useMemo(() => getNumericChartData(contract), [contract])
|
||||||
const isMobile = useIsMobile(800)
|
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
|
||||||
const width = useElementWidth(containerRef) ?? 0
|
|
||||||
const height = props.height ?? (isMobile ? 150 : 250)
|
|
||||||
const maxY = Math.max(...data.map((d) => d.y))
|
const maxY = Math.max(...data.map((d) => d.y))
|
||||||
const xScale = scaleLinear([min, max], [0, width - MARGIN_X])
|
const xScale = scaleLinear([min, max], [0, width - MARGIN_X])
|
||||||
const yScale = scaleLinear([0, maxY], [height - MARGIN_Y, 0])
|
const yScale = scaleLinear([0, maxY], [height - MARGIN_Y, 0])
|
||||||
return (
|
return (
|
||||||
<div ref={containerRef}>
|
|
||||||
{width > 0 && (
|
|
||||||
<DistributionChart
|
<DistributionChart
|
||||||
w={width}
|
w={width}
|
||||||
h={height}
|
h={height}
|
||||||
|
@ -62,7 +55,5 @@ export const NumericContractChart = (props: {
|
||||||
onMouseOver={onMouseOver}
|
onMouseOver={onMouseOver}
|
||||||
Tooltip={NumericChartTooltip}
|
Tooltip={NumericChartTooltip}
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { useMemo, useRef } from 'react'
|
import { useMemo } from 'react'
|
||||||
import { last, sortBy } from 'lodash'
|
import { last, sortBy } from 'lodash'
|
||||||
import { scaleTime, scaleLog, scaleLinear } from 'd3-scale'
|
import { scaleTime, scaleLog, scaleLinear } from 'd3-scale'
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ import { getInitialProbability, getProbability } from 'common/calculate'
|
||||||
import { formatLargeNumber } from 'common/util/format'
|
import { formatLargeNumber } from 'common/util/format'
|
||||||
import { PseudoNumericContract } from 'common/contract'
|
import { PseudoNumericContract } from 'common/contract'
|
||||||
import { NUMERIC_GRAPH_COLOR } from 'common/numeric-constants'
|
import { NUMERIC_GRAPH_COLOR } from 'common/numeric-constants'
|
||||||
import { useIsMobile } from 'web/hooks/use-is-mobile'
|
|
||||||
import {
|
import {
|
||||||
TooltipProps,
|
TooltipProps,
|
||||||
MARGIN_X,
|
MARGIN_X,
|
||||||
|
@ -18,7 +17,6 @@ import {
|
||||||
formatDateInRange,
|
formatDateInRange,
|
||||||
} from '../helpers'
|
} from '../helpers'
|
||||||
import { HistoryPoint, SingleValueHistoryChart } from '../generic-charts'
|
import { HistoryPoint, SingleValueHistoryChart } from '../generic-charts'
|
||||||
import { useElementWidth } from 'web/hooks/use-element-width'
|
|
||||||
import { Row } from 'web/components/layout/row'
|
import { Row } from 'web/components/layout/row'
|
||||||
import { Avatar } from 'web/components/avatar'
|
import { Avatar } from 'web/components/avatar'
|
||||||
|
|
||||||
|
@ -59,10 +57,11 @@ const PseudoNumericChartTooltip = (
|
||||||
export const PseudoNumericContractChart = (props: {
|
export const PseudoNumericContractChart = (props: {
|
||||||
contract: PseudoNumericContract
|
contract: PseudoNumericContract
|
||||||
bets: Bet[]
|
bets: Bet[]
|
||||||
height?: number
|
width: number
|
||||||
|
height: number
|
||||||
onMouseOver?: (p: HistoryPoint<Bet> | undefined) => void
|
onMouseOver?: (p: HistoryPoint<Bet> | undefined) => void
|
||||||
}) => {
|
}) => {
|
||||||
const { contract, bets, onMouseOver } = props
|
const { contract, bets, width, height, onMouseOver } = props
|
||||||
const { min, max, isLogScale } = contract
|
const { min, max, isLogScale } = contract
|
||||||
const [start, end] = getDateRange(contract)
|
const [start, end] = getDateRange(contract)
|
||||||
const scaleP = useMemo(
|
const scaleP = useMemo(
|
||||||
|
@ -86,19 +85,12 @@ export const PseudoNumericContractChart = (props: {
|
||||||
Date.now()
|
Date.now()
|
||||||
)
|
)
|
||||||
const visibleRange = [start, rightmostDate]
|
const visibleRange = [start, rightmostDate]
|
||||||
const isMobile = useIsMobile(800)
|
const xScale = scaleTime(visibleRange, [0, width ?? 0 - MARGIN_X])
|
||||||
const containerRef = useRef<HTMLDivElement>(null)
|
|
||||||
const width = useElementWidth(containerRef) ?? 0
|
|
||||||
const height = props.height ?? (isMobile ? 150 : 250)
|
|
||||||
const xScale = scaleTime(visibleRange, [0, width - MARGIN_X])
|
|
||||||
// clamp log scale to make sure zeroes go to the bottom
|
// clamp log scale to make sure zeroes go to the bottom
|
||||||
const yScale = isLogScale
|
const yScale = isLogScale
|
||||||
? scaleLog([Math.max(min, 1), max], [height - MARGIN_Y, 0]).clamp(true)
|
? scaleLog([Math.max(min, 1), max], [height ?? 0 - MARGIN_Y, 0]).clamp(true)
|
||||||
: scaleLinear([min, max], [height - MARGIN_Y, 0])
|
: scaleLinear([min, max], [height ?? 0 - MARGIN_Y, 0])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={containerRef}>
|
|
||||||
{width > 0 && (
|
|
||||||
<SingleValueHistoryChart
|
<SingleValueHistoryChart
|
||||||
w={width}
|
w={width}
|
||||||
h={height}
|
h={height}
|
||||||
|
@ -109,7 +101,5 @@ export const PseudoNumericContractChart = (props: {
|
||||||
Tooltip={PseudoNumericChartTooltip}
|
Tooltip={PseudoNumericChartTooltip}
|
||||||
color={NUMERIC_GRAPH_COLOR}
|
color={NUMERIC_GRAPH_COLOR}
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,8 @@
|
||||||
import React from 'react'
|
import React, { useEffect, useRef, useState } from 'react'
|
||||||
|
|
||||||
import { tradingAllowed } from 'web/lib/firebase/contracts'
|
import { tradingAllowed } from 'web/lib/firebase/contracts'
|
||||||
import { Col } from '../layout/col'
|
import { Col } from '../layout/col'
|
||||||
import {
|
import { ContractChart } from 'web/components/charts/contract'
|
||||||
BinaryContractChart,
|
|
||||||
NumericContractChart,
|
|
||||||
PseudoNumericContractChart,
|
|
||||||
ChoiceContractChart,
|
|
||||||
} from 'web/components/charts/contract'
|
|
||||||
import { useUser } from 'web/hooks/use-user'
|
import { useUser } from 'web/hooks/use-user'
|
||||||
import { Row } from '../layout/row'
|
import { Row } from '../layout/row'
|
||||||
import { Linkify } from '../linkify'
|
import { Linkify } from '../linkify'
|
||||||
|
@ -48,8 +43,43 @@ const BetWidget = (props: { contract: CPMMContract }) => {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const NumericOverview = (props: { contract: NumericContract }) => {
|
const SizedContractChart = (props: {
|
||||||
const { contract } = props
|
contract: Contract
|
||||||
|
bets: Bet[]
|
||||||
|
fullHeight: number
|
||||||
|
mobileHeight: number
|
||||||
|
}) => {
|
||||||
|
const { contract, bets, fullHeight, mobileHeight } = props
|
||||||
|
const containerRef = useRef<HTMLDivElement>(null)
|
||||||
|
const [chartWidth, setChartWidth] = useState<number>()
|
||||||
|
const [chartHeight, setChartHeight] = useState<number>()
|
||||||
|
useEffect(() => {
|
||||||
|
const handleResize = () => {
|
||||||
|
setChartHeight(window.innerWidth < 800 ? mobileHeight : fullHeight)
|
||||||
|
setChartWidth(containerRef.current?.clientWidth)
|
||||||
|
}
|
||||||
|
handleResize()
|
||||||
|
window.addEventListener('resize', handleResize)
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('resize', handleResize)
|
||||||
|
}
|
||||||
|
}, [fullHeight, mobileHeight])
|
||||||
|
return (
|
||||||
|
<div ref={containerRef}>
|
||||||
|
{chartWidth != null && chartHeight != null && (
|
||||||
|
<ContractChart
|
||||||
|
contract={contract}
|
||||||
|
bets={bets}
|
||||||
|
width={chartWidth}
|
||||||
|
height={chartHeight}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const NumericOverview = (props: { contract: NumericContract; bets: Bet[] }) => {
|
||||||
|
const { contract, bets } = props
|
||||||
return (
|
return (
|
||||||
<Col className="gap-1 md:gap-2">
|
<Col className="gap-1 md:gap-2">
|
||||||
<Col className="gap-3 px-2 sm:gap-4">
|
<Col className="gap-3 px-2 sm:gap-4">
|
||||||
|
@ -66,7 +96,12 @@ const NumericOverview = (props: { contract: NumericContract }) => {
|
||||||
contract={contract}
|
contract={contract}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
<NumericContractChart contract={contract} />
|
<SizedContractChart
|
||||||
|
contract={contract}
|
||||||
|
bets={bets}
|
||||||
|
fullHeight={250}
|
||||||
|
mobileHeight={150}
|
||||||
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -86,7 +121,12 @@ const BinaryOverview = (props: { contract: BinaryContract; bets: Bet[] }) => {
|
||||||
/>
|
/>
|
||||||
</Row>
|
</Row>
|
||||||
</Col>
|
</Col>
|
||||||
<BinaryContractChart contract={contract} bets={bets} />
|
<SizedContractChart
|
||||||
|
contract={contract}
|
||||||
|
bets={bets}
|
||||||
|
fullHeight={250}
|
||||||
|
mobileHeight={150}
|
||||||
|
/>
|
||||||
<Row className="items-center justify-between gap-4 xl:hidden">
|
<Row className="items-center justify-between gap-4 xl:hidden">
|
||||||
{tradingAllowed(contract) && (
|
{tradingAllowed(contract) && (
|
||||||
<BinaryMobileBetting contract={contract} />
|
<BinaryMobileBetting contract={contract} />
|
||||||
|
@ -111,9 +151,12 @@ const ChoiceOverview = (props: {
|
||||||
<FreeResponseResolutionOrChance contract={contract} truncate="none" />
|
<FreeResponseResolutionOrChance contract={contract} truncate="none" />
|
||||||
)}
|
)}
|
||||||
</Col>
|
</Col>
|
||||||
<Col className={'mb-1 gap-y-2'}>
|
<SizedContractChart
|
||||||
<ChoiceContractChart contract={contract} bets={bets} />
|
contract={contract}
|
||||||
</Col>
|
bets={bets}
|
||||||
|
fullHeight={350}
|
||||||
|
mobileHeight={250}
|
||||||
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -139,7 +182,12 @@ const PseudoNumericOverview = (props: {
|
||||||
{tradingAllowed(contract) && <BetWidget contract={contract} />}
|
{tradingAllowed(contract) && <BetWidget contract={contract} />}
|
||||||
</Row>
|
</Row>
|
||||||
</Col>
|
</Col>
|
||||||
<PseudoNumericContractChart contract={contract} bets={bets} />
|
<SizedContractChart
|
||||||
|
contract={contract}
|
||||||
|
bets={bets}
|
||||||
|
fullHeight={250}
|
||||||
|
mobileHeight={150}
|
||||||
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -153,7 +201,7 @@ export const ContractOverview = (props: {
|
||||||
case 'BINARY':
|
case 'BINARY':
|
||||||
return <BinaryOverview contract={contract} bets={bets} />
|
return <BinaryOverview contract={contract} bets={bets} />
|
||||||
case 'NUMERIC':
|
case 'NUMERIC':
|
||||||
return <NumericOverview contract={contract} />
|
return <NumericOverview contract={contract} bets={bets} />
|
||||||
case 'PSEUDO_NUMERIC':
|
case 'PSEUDO_NUMERIC':
|
||||||
return <PseudoNumericOverview contract={contract} bets={bets} />
|
return <PseudoNumericOverview contract={contract} bets={bets} />
|
||||||
case 'FREE_RESPONSE':
|
case 'FREE_RESPONSE':
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
import { RefObject, useState, useEffect } from 'react'
|
|
||||||
|
|
||||||
// todo: consider consolidation with use-measure-size
|
|
||||||
export const useElementWidth = <T extends Element>(ref: RefObject<T>) => {
|
|
||||||
const [width, setWidth] = useState<number>()
|
|
||||||
useEffect(() => {
|
|
||||||
const handleResize = () => {
|
|
||||||
setWidth(ref.current?.clientWidth)
|
|
||||||
}
|
|
||||||
handleResize()
|
|
||||||
window.addEventListener('resize', handleResize)
|
|
||||||
return () => {
|
|
||||||
window.removeEventListener('resize', handleResize)
|
|
||||||
}
|
|
||||||
}, [ref])
|
|
||||||
return width
|
|
||||||
}
|
|
|
@ -79,7 +79,7 @@ export function ContractEmbed(props: { contract: Contract; bets: Bet[] }) {
|
||||||
|
|
||||||
const href = `https://${DOMAIN}${contractPath(contract)}`
|
const href = `https://${DOMAIN}${contractPath(contract)}`
|
||||||
|
|
||||||
const { setElem, height: graphHeight } = useMeasureSize()
|
const { setElem, width: graphWidth, height: graphHeight } = useMeasureSize()
|
||||||
|
|
||||||
const [betPanelOpen, setBetPanelOpen] = useState(false)
|
const [betPanelOpen, setBetPanelOpen] = useState(false)
|
||||||
|
|
||||||
|
@ -132,7 +132,14 @@ export function ContractEmbed(props: { contract: Contract; bets: Bet[] }) {
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="mx-1 mb-2 min-h-0 flex-1" ref={setElem}>
|
<div className="mx-1 mb-2 min-h-0 flex-1" ref={setElem}>
|
||||||
<ContractChart contract={contract} bets={bets} height={graphHeight} />
|
{graphWidth != null && graphHeight != null && (
|
||||||
|
<ContractChart
|
||||||
|
contract={contract}
|
||||||
|
bets={bets}
|
||||||
|
width={graphWidth}
|
||||||
|
height={graphHeight}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Col>
|
</Col>
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user