diff --git a/packages/trader/src/AppV2/Components/TradeParameters/Duration/__tests__/duration_container.spec.tsx b/packages/trader/src/AppV2/Components/TradeParameters/Duration/__tests__/duration_container.spec.tsx index b034d9fc6d52..5326da52b145 100644 --- a/packages/trader/src/AppV2/Components/TradeParameters/Duration/__tests__/duration_container.spec.tsx +++ b/packages/trader/src/AppV2/Components/TradeParameters/Duration/__tests__/duration_container.spec.tsx @@ -20,6 +20,7 @@ global.HTMLElement.prototype.scrollIntoView = jest.fn(); jest.mock('Stores/Modules/Trading/Helpers/contract-type', () => ({ ContractType: { getTradingEvents: jest.fn(), + getTradingDays: jest.fn(), }, })); diff --git a/packages/trader/src/AppV2/Components/TradeParameters/Duration/datepicker.tsx b/packages/trader/src/AppV2/Components/TradeParameters/Duration/datepicker.tsx index 8c37678d1506..32a8534219b5 100644 --- a/packages/trader/src/AppV2/Components/TradeParameters/Duration/datepicker.tsx +++ b/packages/trader/src/AppV2/Components/TradeParameters/Duration/datepicker.tsx @@ -4,6 +4,11 @@ import React, { useEffect } from 'react'; import { ContractType } from 'Stores/Modules/Trading/Helpers/contract-type'; import { useTraderStore } from 'Stores/useTraderStores'; +type TMarketEvent = { + dates: string[]; + descrip: string; +}; + const DaysDatepicker = ({ start_date, end_date, @@ -19,14 +24,27 @@ const DaysDatepicker = ({ const onChangeCalendarMonth = React.useCallback( async (e = toMoment().format('YYYY-MM-DD')) => { + const new_market_events: TMarketEvent[] = []; let new_disabled_days: number[] = []; - const events = await ContractType.getTradingEvents(e, symbol); + + const [events, trading_days] = await Promise.all([ + ContractType.getTradingEvents(e, symbol), + ContractType.getTradingDays(e, symbol), + ]); + + if (trading_days) { + const all_days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const; + new_disabled_days = all_days + .map((day: (typeof all_days)[number], index) => (!trading_days.includes(day) ? index : -1)) + .filter(index => index !== -1); + } + events?.forEach(evt => { - const dates = evt.dates.split(', '); - const idx = dates.indexOf('Fridays'); - if (idx !== -1) { - new_disabled_days = [6, 0]; - } + const dates = evt.dates.split(', '); // convert dates str into array + new_market_events.push({ + dates, + descrip: evt.descrip, + }); }); if (isMounted()) { diff --git a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/__tests__/trading-date-picker.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/__tests__/trading-date-picker.spec.tsx index c87f247d1029..c1689b106b91 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/__tests__/trading-date-picker.spec.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/__tests__/trading-date-picker.spec.tsx @@ -25,6 +25,7 @@ jest.mock('Stores/Modules/Trading/Helpers/contract-type', () => ({ descrip: "New Year's Day", }, ]), + getTradingDays: jest.fn(() => ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']), }, })); describe('', () => { diff --git a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.tsx b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.tsx index 3d381517144c..49bd03040658 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.tsx +++ b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.tsx @@ -63,7 +63,7 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }: TT const getMomentContractStartDateTime = () => { return setTime( toMoment(getMinDuration()), - isTimeValid(start_time ?? '') ? start_time : server_time?.format('HH:mm:ss') ?? '' + isTimeValid(start_time ?? '') ? start_time : (server_time?.format('HH:mm:ss') ?? '') ); }; @@ -126,13 +126,21 @@ const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }: TT async (e = toMoment().format('YYYY-MM-DD')) => { const new_market_events: TMarketEvent[] = []; let new_disabled_days: number[] = []; - const events = await ContractType.getTradingEvents(e, symbol); + + const [events, trading_days] = await Promise.all([ + ContractType.getTradingEvents(e, symbol), + ContractType.getTradingDays(e, symbol), + ]); + + if (trading_days) { + const all_days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const; + new_disabled_days = all_days.reduce((disabled, day, index) => { + return trading_days.includes(day) ? disabled : [...disabled, index]; + }, []); + } + events?.forEach(evt => { const dates = evt.dates.split(', '); // convert dates str into array - const idx = dates.indexOf('Fridays'); - if (idx !== -1) { - new_disabled_days = [6, 0]; // Sat, Sun - } new_market_events.push({ dates, descrip: evt.descrip, diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts b/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts index c9cb8f7f3dce..5abb90d4e3bc 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/contract-type.ts @@ -452,6 +452,24 @@ export const ContractType = (() => { return trading_events[date][underlying as string]; }; + const getTradingDays = async (date: string, underlying: string | null = null) => { + if (!date || !underlying) return null; + + const response: TradingTimesResponse = await WS.tradingTimes(date); + const trading_times = response.trading_times as TradingTimes; + + if (!getPropertyValue(response, ['trading_times', 'markets'])) return null; + + const symbol_data = trading_times.markets.flatMap( + market => + market.submarkets?.flatMap( + submarket => submarket.symbols?.find(symbol => symbol.symbol === underlying) || [] + ) || [] + )[0]; + + return symbol_data?.trading_days || null; + }; + const getTradingTimes = async ( date: string | null, underlying: string | null = null @@ -719,6 +737,7 @@ export const ContractType = (() => { getStartTime, getStartType, getTradingEvents, + getTradingDays, getTradingTimes, getContractCategories: () => ({ contract_types_list: available_categories,