Added radio buttons to market creation (non functional)
This commit is contained in:
parent
c3be126337
commit
645e891b73
|
@ -28,6 +28,7 @@ export type FullContract<
|
||||||
isResolved: boolean
|
isResolved: boolean
|
||||||
resolutionTime?: number // When the contract creator resolved the market
|
resolutionTime?: number // When the contract creator resolved the market
|
||||||
resolution?: string
|
resolution?: string
|
||||||
|
resolutionType: 'manual' | 'combined' | 'automatic'
|
||||||
|
|
||||||
closeEmailsSent?: number
|
closeEmailsSent?: number
|
||||||
|
|
||||||
|
@ -97,7 +98,9 @@ export type Numeric = {
|
||||||
}
|
}
|
||||||
|
|
||||||
export type outcomeType = 'BINARY' | 'MULTI' | 'FREE_RESPONSE' | 'NUMERIC'
|
export type outcomeType = 'BINARY' | 'MULTI' | 'FREE_RESPONSE' | 'NUMERIC'
|
||||||
|
export type resolutionType = 'MANUAL' | 'COMBINED' | 'AUTOMATIC'
|
||||||
export const OUTCOME_TYPES = ['BINARY', 'MULTI', 'FREE_RESPONSE', 'NUMERIC']
|
export const OUTCOME_TYPES = ['BINARY', 'MULTI', 'FREE_RESPONSE', 'NUMERIC']
|
||||||
|
export const RESOLUTION_TYPES = ['MANUAL', 'COMBINED', 'AUTOMATIC']
|
||||||
|
|
||||||
export const MAX_QUESTION_LENGTH = 480
|
export const MAX_QUESTION_LENGTH = 480
|
||||||
export const MAX_DESCRIPTION_LENGTH = 10000
|
export const MAX_DESCRIPTION_LENGTH = 10000
|
||||||
|
|
|
@ -8,6 +8,7 @@ import {
|
||||||
FreeResponse,
|
FreeResponse,
|
||||||
Numeric,
|
Numeric,
|
||||||
outcomeType,
|
outcomeType,
|
||||||
|
resolutionType,
|
||||||
} from './contract'
|
} from './contract'
|
||||||
import { User } from './user'
|
import { User } from './user'
|
||||||
import { parseTags } from './util/parse'
|
import { parseTags } from './util/parse'
|
||||||
|
@ -25,6 +26,7 @@ export function getNewContract(
|
||||||
ante: number,
|
ante: number,
|
||||||
closeTime: number,
|
closeTime: number,
|
||||||
extraTags: string[],
|
extraTags: string[],
|
||||||
|
resolutionType: resolutionType,
|
||||||
|
|
||||||
// used for numeric markets
|
// used for numeric markets
|
||||||
bucketCount: number,
|
bucketCount: number,
|
||||||
|
|
|
@ -12,6 +12,7 @@ import {
|
||||||
MAX_TAG_LENGTH,
|
MAX_TAG_LENGTH,
|
||||||
Numeric,
|
Numeric,
|
||||||
OUTCOME_TYPES,
|
OUTCOME_TYPES,
|
||||||
|
RESOLUTION_TYPES
|
||||||
} from '../../common/contract'
|
} from '../../common/contract'
|
||||||
import { slugify } from '../../common/util/slugify'
|
import { slugify } from '../../common/util/slugify'
|
||||||
import { randomString } from '../../common/util/random'
|
import { randomString } from '../../common/util/random'
|
||||||
|
@ -44,6 +45,7 @@ export const createContract = newEndpoint(['POST'], async (req, _res) => {
|
||||||
min,
|
min,
|
||||||
max,
|
max,
|
||||||
manaLimitPerUser,
|
manaLimitPerUser,
|
||||||
|
resolutionType,
|
||||||
} = req.body || {}
|
} = req.body || {}
|
||||||
|
|
||||||
if (!question || typeof question != 'string')
|
if (!question || typeof question != 'string')
|
||||||
|
@ -87,6 +89,11 @@ export const createContract = newEndpoint(['POST'], async (req, _res) => {
|
||||||
)
|
)
|
||||||
throw new APIError(400, 'Invalid initial probability')
|
throw new APIError(400, 'Invalid initial probability')
|
||||||
|
|
||||||
|
resolutionType = resolutionType ?? 'MANUAL'
|
||||||
|
|
||||||
|
if (!RESOLUTION_TYPES.includes(resolutionType))
|
||||||
|
throw new APIError(400, 'Invalid resolutionType')
|
||||||
|
|
||||||
// Uses utc time on server:
|
// Uses utc time on server:
|
||||||
const yesterday = new Date()
|
const yesterday = new Date()
|
||||||
yesterday.setUTCDate(yesterday.getUTCDate() - 1)
|
yesterday.setUTCDate(yesterday.getUTCDate() - 1)
|
||||||
|
@ -138,7 +145,8 @@ export const createContract = newEndpoint(['POST'], async (req, _res) => {
|
||||||
NUMERIC_BUCKET_COUNT,
|
NUMERIC_BUCKET_COUNT,
|
||||||
min ?? 0,
|
min ?? 0,
|
||||||
max ?? 0,
|
max ?? 0,
|
||||||
manaLimitPerUser ?? 0
|
manaLimitPerUser ?? 0,
|
||||||
|
resolutionType,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!isFree && ante) await chargeUser(creator.id, ante, true)
|
if (!isFree && ante) await chargeUser(creator.id, ante, true)
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { FIXED_ANTE, MINIMUM_ANTE } from 'common/antes'
|
||||||
import { InfoTooltip } from 'web/components/info-tooltip'
|
import { InfoTooltip } from 'web/components/info-tooltip'
|
||||||
import { Page } from 'web/components/page'
|
import { Page } from 'web/components/page'
|
||||||
import { Row } from 'web/components/layout/row'
|
import { Row } from 'web/components/layout/row'
|
||||||
import { MAX_DESCRIPTION_LENGTH, outcomeType } from 'common/contract'
|
import { MAX_DESCRIPTION_LENGTH, outcomeType, resolutionType } from 'common/contract'
|
||||||
import { formatMoney } from 'common/util/format'
|
import { formatMoney } from 'common/util/format'
|
||||||
import { useHasCreatedContractToday } from 'web/hooks/use-has-created-contract-today'
|
import { useHasCreatedContractToday } from 'web/hooks/use-has-created-contract-today'
|
||||||
import { removeUndefinedProps } from 'common/util/object'
|
import { removeUndefinedProps } from 'common/util/object'
|
||||||
|
@ -64,6 +64,7 @@ export function NewContract(props: { question: string; tag?: string }) {
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
const [outcomeType, setOutcomeType] = useState<outcomeType>('BINARY')
|
const [outcomeType, setOutcomeType] = useState<outcomeType>('BINARY')
|
||||||
|
const [resolutionType, setResolutionType] = useState<resolutionType>('MANUAL')
|
||||||
const [initialProb, setInitialProb] = useState(50)
|
const [initialProb, setInitialProb] = useState(50)
|
||||||
const [minString, setMinString] = useState('')
|
const [minString, setMinString] = useState('')
|
||||||
const [maxString, setMaxString] = useState('')
|
const [maxString, setMaxString] = useState('')
|
||||||
|
@ -365,6 +366,48 @@ export function NewContract(props: { question: string; tag?: string }) {
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<Spacer h={4} />
|
||||||
|
<label className="label mt-1">
|
||||||
|
<span className="my-1">Resolution type</span>
|
||||||
|
</label>
|
||||||
|
<Row className="form-control gap-2">
|
||||||
|
<label className="label cursor-pointer gap-2">
|
||||||
|
<input
|
||||||
|
className="radio"
|
||||||
|
type="radio"
|
||||||
|
name="res"
|
||||||
|
checked={resolutionType === 'MANUAL'}
|
||||||
|
value="MANUAL"
|
||||||
|
onChange={() => setResolutionType('MANUAL')}
|
||||||
|
disabled={isSubmitting}
|
||||||
|
/>
|
||||||
|
<span className="label-text">Manual</span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label className="label cursor-pointer gap-2">
|
||||||
|
<input
|
||||||
|
className="radio"
|
||||||
|
type="radio"
|
||||||
|
name="res"
|
||||||
|
checked={resolutionType === 'COMBINED'}
|
||||||
|
value="COMBINED"
|
||||||
|
onChange={() => setResolutionType('COMBINED')}
|
||||||
|
disabled={isSubmitting}
|
||||||
|
/>
|
||||||
|
<span className="label-text">Combined (experimental)</span>
|
||||||
|
</label>
|
||||||
|
<label className="label cursor-pointer gap-2">
|
||||||
|
<input
|
||||||
|
className="radio"
|
||||||
|
type="radio"
|
||||||
|
name="res"
|
||||||
|
checked={resolutionType === 'AUTOMATIC'}
|
||||||
|
value="AUTOMATIC"
|
||||||
|
onChange={() => setResolutionType('AUTOMATIC')}
|
||||||
|
/>
|
||||||
|
<span className="label-text">Automatic (experimental)</span>
|
||||||
|
</label>
|
||||||
|
</Row>
|
||||||
<Spacer h={4} />
|
<Spacer h={4} />
|
||||||
|
|
||||||
<div className="form-control mb-1 items-start">
|
<div className="form-control mb-1 items-start">
|
||||||
|
|
Loading…
Reference in New Issue
Block a user