From 3c558430307bf2ea83c7232799e4bbb8d17b26dc Mon Sep 17 00:00:00 2001 From: James Grugett Date: Fri, 6 May 2022 16:06:18 -0400 Subject: [PATCH] Add numeric resolution panel --- web/components/resolution-panel.tsx | 113 +++++++++++++++++++++++- web/components/yes-no-selector.tsx | 31 +++++++ web/pages/[username]/[contractSlug].tsx | 20 ++++- 3 files changed, 157 insertions(+), 7 deletions(-) diff --git a/web/components/resolution-panel.tsx b/web/components/resolution-panel.tsx index 7645f039..4e6b57bd 100644 --- a/web/components/resolution-panel.tsx +++ b/web/components/resolution-panel.tsx @@ -2,17 +2,23 @@ import clsx from 'clsx' import React, { useEffect, useState } from 'react' import { Col } from './layout/col' -import { Title } from './title' import { User } from '../lib/firebase/users' -import { YesNoCancelSelector } from './yes-no-selector' +import { NumberCancelSelector, YesNoCancelSelector } from './yes-no-selector' import { Spacer } from './layout/spacer' import { ResolveConfirmationButton } from './confirmation-button' import { resolveMarket } from '../lib/firebase/api-call' import { ProbabilitySelector } from './probability-selector' import { DPM_CREATOR_FEE } from '../../common/fees' import { getProbability } from '../../common/calculate' -import { Binary, CPMM, DPM, FullContract } from '../../common/contract' +import { + Binary, + CPMM, + DPM, + FullContract, + NumericContract, +} from '../../common/contract' import { formatMoney } from '../../common/util/format' +import { BucketAmountInput } from './amount-input' export function ResolutionPanel(props: { creator: User @@ -129,3 +135,104 @@ export function ResolutionPanel(props: { ) } + +export function NumericResolutionPanel(props: { + creator: User + contract: NumericContract + className?: string +}) { + useEffect(() => { + // warm up cloud function + resolveMarket({} as any).catch() + }, []) + + const { contract, className } = props + const { bucketCount, min, max } = contract + + const [outcomeMode, setOutcomeMode] = useState< + 'NUMBER' | 'CANCEL' | undefined + >() + const [outcome, setOutcome] = useState() + + const [isSubmitting, setIsSubmitting] = useState(false) + const [valueError, setValueError] = useState() + const [error, setError] = useState(undefined) + + const resolve = async () => { + if (!outcome) return + + setIsSubmitting(true) + + const result = await resolveMarket({ + outcome: outcome, + contractId: contract.id, + }).then((r) => r.data) + + console.log('resolved', outcome, 'result:', result) + + if (result?.status !== 'success') { + setError(result?.message || 'Error resolving market') + } + setIsSubmitting(false) + } + + const submitButtonClass = + outcome === 'CANCEL' + ? 'bg-yellow-400 hover:bg-yellow-500' + : outcome + ? 'btn-primary' + : 'btn-disabled' + + console.log('outcome', outcome) + + return ( + +
Resolve market
+ +
Outcome
+ + + + + + + + {outcomeMode === 'NUMBER' && ( + <> + + setOutcome(outcome ? `${outcome}` : undefined) + } + error={valueError} + setError={setValueError} + disabled={isSubmitting} + /> + + )} + +
+ {outcome === 'CANCEL' ? ( + <>All trades will be returned with no fees. + ) : ( + <>Resolving this market will immediately pay out traders. + )} +
+ + + + {!!error &&
{error}
} + + + + ) +} diff --git a/web/components/yes-no-selector.tsx b/web/components/yes-no-selector.tsx index 4bb7949f..699dbd02 100644 --- a/web/components/yes-no-selector.tsx +++ b/web/components/yes-no-selector.tsx @@ -195,6 +195,37 @@ export function BuyButton(props: { className?: string; onClick?: () => void }) { ) } +export function NumberCancelSelector(props: { + selected: 'NUMBER' | 'CANCEL' | undefined + onSelect: (selected: 'NUMBER' | 'CANCEL') => void + className?: string + btnClassName?: string +}) { + const { selected, onSelect, className } = props + + const btnClassName = clsx('px-6 flex-1', props.btnClassName) + + return ( + + + + + + ) +} + function Button(props: { className?: string onClick?: () => void diff --git a/web/pages/[username]/[contractSlug].tsx b/web/pages/[username]/[contractSlug].tsx index c092adfa..394f744c 100644 --- a/web/pages/[username]/[contractSlug].tsx +++ b/web/pages/[username]/[contractSlug].tsx @@ -7,7 +7,10 @@ import { ContractOverview } from '../../components/contract/contract-overview' import { BetPanel } from '../../components/bet-panel' import { Col } from '../../components/layout/col' import { useUser } from '../../hooks/use-user' -import { ResolutionPanel } from '../../components/resolution-panel' +import { + NumericResolutionPanel, + ResolutionPanel, +} from '../../components/resolution-panel' import { Title } from '../../components/title' import { Spacer } from '../../components/layout/spacer' import { listUsers, User } from '../../lib/firebase/users' @@ -141,9 +144,18 @@ export function ContractPageContent(props: FirstArgument) { ) : ( ))} - {allowResolve && ( - - )} + {allowResolve && + (isNumeric ? ( + + ) : ( + + ))} ) : null