From 40cd2b095d3760bfc6541b2dfa23d00c7d2a56fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20G=C5=82ownia?= Date: Fri, 25 Aug 2023 12:42:35 +0200 Subject: [PATCH] fix(deal-ticket): show expiresAt fiel value from state only, add require validation --- .../deal-ticket/deal-ticket-stop-order.tsx | 22 +++++++++++++++++-- .../components/deal-ticket/deal-ticket.tsx | 15 ++++++++++++- .../deal-ticket/expiry-selector.tsx | 8 ++----- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/libs/deal-ticket/src/components/deal-ticket/deal-ticket-stop-order.tsx b/libs/deal-ticket/src/components/deal-ticket/deal-ticket-stop-order.tsx index 7fd0fd064..e946e6d02 100644 --- a/libs/deal-ticket/src/components/deal-ticket/deal-ticket-stop-order.tsx +++ b/libs/deal-ticket/src/components/deal-ticket/deal-ticket-stop-order.tsx @@ -1,7 +1,12 @@ import { useRef, useCallback, useEffect } from 'react'; import { useVegaWallet } from '@vegaprotocol/wallet'; import type { StopOrdersSubmission } from '@vegaprotocol/wallet'; -import { removeDecimal, toDecimal, validateAmount } from '@vegaprotocol/utils'; +import { + formatForInput, + removeDecimal, + toDecimal, + validateAmount, +} from '@vegaprotocol/utils'; import type { Control, UseFormWatch } from 'react-hook-form'; import { useForm, Controller, useController } from 'react-hook-form'; import * as Schema from '@vegaprotocol/types'; @@ -60,6 +65,7 @@ const getDefaultValues = ( expire: false, expiryStrategy: Schema.StopOrderExpiryStrategy.EXPIRY_STRATEGY_SUBMIT, size: '0', + oco: false, ocoType: type, ocoTimeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK, ocoTriggerType: 'price', @@ -522,6 +528,7 @@ export const StopOrder = ({ market, marketPrice, submit }: StopOrderProps) => { const rawPrice = watch('price'); const rawSize = watch('size'); const oco = watch('oco'); + const expiresAt = watch('expiresAt'); useEffect(() => { const size = storedFormValues?.[dealTicketType]?.size; @@ -719,7 +726,17 @@ export const StopOrder = ({ market, marketPrice, submit }: StopOrderProps) => { const { onChange: onCheckedChange, value } = field; return ( { + if ( + value && + (!expiresAt || new Date(expiresAt).getTime() < Date.now()) + ) { + setValue('expiresAt', formatForInput(new Date()), { + shouldValidate: true, + }); + } + onCheckedChange(value); + }} checked={value} name="expire" label={t('Expire')} @@ -767,6 +784,7 @@ export const StopOrder = ({ market, marketPrice, submit }: StopOrderProps) => { name="expiresAt" control={control} rules={{ + required: t('You need provide a expiry time/date'), validate: validateExpiration, }} render={({ field }) => { diff --git a/libs/deal-ticket/src/components/deal-ticket/deal-ticket.tsx b/libs/deal-ticket/src/components/deal-ticket/deal-ticket.tsx index 47cbab79b..496c312c5 100644 --- a/libs/deal-ticket/src/components/deal-ticket/deal-ticket.tsx +++ b/libs/deal-ticket/src/components/deal-ticket/deal-ticket.tsx @@ -34,6 +34,7 @@ import { removeDecimal, validateAmount, toDecimal, + formatForInput, } from '@vegaprotocol/utils'; import { activeOrdersProvider } from '@vegaprotocol/orders'; import { getDerivedPrice } from '@vegaprotocol/markets'; @@ -174,6 +175,7 @@ export const DealTicket = ({ const rawPrice = watch('price'); const iceberg = watch('iceberg'); const peakSize = watch('peakSize'); + const expiresAt = watch('expiresAt'); useEffect(() => { const size = storedFormValues?.[dealTicketType]?.size; @@ -465,7 +467,17 @@ export const DealTicket = ({ { + if ( + value === Schema.OrderTimeInForce.TIME_IN_FORCE_GTT && + (!expiresAt || new Date(expiresAt).getTime() < Date.now()) + ) { + setValue('expiresAt', formatForInput(new Date()), { + shouldValidate: true, + }); + } + field.onChange(value); + }} market={market} marketData={marketData} errorMessage={errors.timeInForce?.message} @@ -478,6 +490,7 @@ export const DealTicket = ({ name="expiresAt" control={control} rules={{ + required: t('You need provide a expiry time/date'), validate: validateExpiration, }} render={({ field }) => ( diff --git a/libs/deal-ticket/src/components/deal-ticket/expiry-selector.tsx b/libs/deal-ticket/src/components/deal-ticket/expiry-selector.tsx index 190b025fc..5f0d0de51 100644 --- a/libs/deal-ticket/src/components/deal-ticket/expiry-selector.tsx +++ b/libs/deal-ticket/src/components/deal-ticket/expiry-selector.tsx @@ -18,10 +18,6 @@ export const ExpirySelector = ({ onSelect, errorMessage, }: ExpirySelectorProps) => { - const now = useRef(new Date()); - const date = value ? new Date(value) : now.current; - const dateFormatted = formatForInput(date); - const minDate = formatForInput(date); return (
onSelect(e.target.value)} - min={minDate} + min={formatForInput(useRef(new Date()).current)} hasError={!!errorMessage} /> {errorMessage && (