fix(deal-ticket): show expiresAt field value from state only, add required validation (#4626)
This commit is contained in:
parent
e765c247ef
commit
952e906eac
@ -1,7 +1,12 @@
|
|||||||
import { useRef, useCallback, useEffect } from 'react';
|
import { useRef, useCallback, useEffect } from 'react';
|
||||||
import { useVegaWallet } from '@vegaprotocol/wallet';
|
import { useVegaWallet } from '@vegaprotocol/wallet';
|
||||||
import type { StopOrdersSubmission } 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 type { Control, UseFormWatch } from 'react-hook-form';
|
||||||
import { useForm, Controller, useController } from 'react-hook-form';
|
import { useForm, Controller, useController } from 'react-hook-form';
|
||||||
import * as Schema from '@vegaprotocol/types';
|
import * as Schema from '@vegaprotocol/types';
|
||||||
@ -60,6 +65,7 @@ const getDefaultValues = (
|
|||||||
expire: false,
|
expire: false,
|
||||||
expiryStrategy: Schema.StopOrderExpiryStrategy.EXPIRY_STRATEGY_SUBMIT,
|
expiryStrategy: Schema.StopOrderExpiryStrategy.EXPIRY_STRATEGY_SUBMIT,
|
||||||
size: '0',
|
size: '0',
|
||||||
|
oco: false,
|
||||||
ocoType: type,
|
ocoType: type,
|
||||||
ocoTimeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK,
|
ocoTimeInForce: Schema.OrderTimeInForce.TIME_IN_FORCE_FOK,
|
||||||
ocoTriggerType: 'price',
|
ocoTriggerType: 'price',
|
||||||
@ -522,6 +528,7 @@ export const StopOrder = ({ market, marketPrice, submit }: StopOrderProps) => {
|
|||||||
const rawPrice = watch('price');
|
const rawPrice = watch('price');
|
||||||
const rawSize = watch('size');
|
const rawSize = watch('size');
|
||||||
const oco = watch('oco');
|
const oco = watch('oco');
|
||||||
|
const expiresAt = watch('expiresAt');
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const size = storedFormValues?.[dealTicketType]?.size;
|
const size = storedFormValues?.[dealTicketType]?.size;
|
||||||
@ -719,7 +726,17 @@ export const StopOrder = ({ market, marketPrice, submit }: StopOrderProps) => {
|
|||||||
const { onChange: onCheckedChange, value } = field;
|
const { onChange: onCheckedChange, value } = field;
|
||||||
return (
|
return (
|
||||||
<Checkbox
|
<Checkbox
|
||||||
onCheckedChange={onCheckedChange}
|
onCheckedChange={(value) => {
|
||||||
|
if (
|
||||||
|
value &&
|
||||||
|
(!expiresAt || new Date(expiresAt).getTime() < Date.now())
|
||||||
|
) {
|
||||||
|
setValue('expiresAt', formatForInput(new Date()), {
|
||||||
|
shouldValidate: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
onCheckedChange(value);
|
||||||
|
}}
|
||||||
checked={value}
|
checked={value}
|
||||||
name="expire"
|
name="expire"
|
||||||
label={t('Expire')}
|
label={t('Expire')}
|
||||||
@ -767,6 +784,7 @@ export const StopOrder = ({ market, marketPrice, submit }: StopOrderProps) => {
|
|||||||
name="expiresAt"
|
name="expiresAt"
|
||||||
control={control}
|
control={control}
|
||||||
rules={{
|
rules={{
|
||||||
|
required: t('You need provide a expiry time/date'),
|
||||||
validate: validateExpiration,
|
validate: validateExpiration,
|
||||||
}}
|
}}
|
||||||
render={({ field }) => {
|
render={({ field }) => {
|
||||||
|
@ -34,6 +34,7 @@ import {
|
|||||||
removeDecimal,
|
removeDecimal,
|
||||||
validateAmount,
|
validateAmount,
|
||||||
toDecimal,
|
toDecimal,
|
||||||
|
formatForInput,
|
||||||
} from '@vegaprotocol/utils';
|
} from '@vegaprotocol/utils';
|
||||||
import { activeOrdersProvider } from '@vegaprotocol/orders';
|
import { activeOrdersProvider } from '@vegaprotocol/orders';
|
||||||
import { getDerivedPrice } from '@vegaprotocol/markets';
|
import { getDerivedPrice } from '@vegaprotocol/markets';
|
||||||
@ -174,6 +175,7 @@ export const DealTicket = ({
|
|||||||
const rawPrice = watch('price');
|
const rawPrice = watch('price');
|
||||||
const iceberg = watch('iceberg');
|
const iceberg = watch('iceberg');
|
||||||
const peakSize = watch('peakSize');
|
const peakSize = watch('peakSize');
|
||||||
|
const expiresAt = watch('expiresAt');
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const size = storedFormValues?.[dealTicketType]?.size;
|
const size = storedFormValues?.[dealTicketType]?.size;
|
||||||
@ -465,7 +467,17 @@ export const DealTicket = ({
|
|||||||
<TimeInForceSelector
|
<TimeInForceSelector
|
||||||
value={field.value}
|
value={field.value}
|
||||||
orderType={type}
|
orderType={type}
|
||||||
onSelect={field.onChange}
|
onSelect={(value) => {
|
||||||
|
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}
|
market={market}
|
||||||
marketData={marketData}
|
marketData={marketData}
|
||||||
errorMessage={errors.timeInForce?.message}
|
errorMessage={errors.timeInForce?.message}
|
||||||
@ -478,6 +490,7 @@ export const DealTicket = ({
|
|||||||
name="expiresAt"
|
name="expiresAt"
|
||||||
control={control}
|
control={control}
|
||||||
rules={{
|
rules={{
|
||||||
|
required: t('You need provide a expiry time/date'),
|
||||||
validate: validateExpiration,
|
validate: validateExpiration,
|
||||||
}}
|
}}
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
|
@ -18,10 +18,6 @@ export const ExpirySelector = ({
|
|||||||
onSelect,
|
onSelect,
|
||||||
errorMessage,
|
errorMessage,
|
||||||
}: ExpirySelectorProps) => {
|
}: ExpirySelectorProps) => {
|
||||||
const now = useRef(new Date());
|
|
||||||
const date = value ? new Date(value) : now.current;
|
|
||||||
const dateFormatted = formatForInput(date);
|
|
||||||
const minDate = formatForInput(date);
|
|
||||||
return (
|
return (
|
||||||
<div className="mb-4">
|
<div className="mb-4">
|
||||||
<TradingFormGroup
|
<TradingFormGroup
|
||||||
@ -33,9 +29,9 @@ export const ExpirySelector = ({
|
|||||||
data-testid="date-picker-field"
|
data-testid="date-picker-field"
|
||||||
id="expiration"
|
id="expiration"
|
||||||
type="datetime-local"
|
type="datetime-local"
|
||||||
value={dateFormatted}
|
value={value && formatForInput(new Date(value))}
|
||||||
onChange={(e) => onSelect(e.target.value)}
|
onChange={(e) => onSelect(e.target.value)}
|
||||||
min={minDate}
|
min={formatForInput(useRef(new Date()).current)}
|
||||||
hasError={!!errorMessage}
|
hasError={!!errorMessage}
|
||||||
/>
|
/>
|
||||||
{errorMessage && (
|
{errorMessage && (
|
||||||
|
Loading…
Reference in New Issue
Block a user