diff --git a/e2e/screenshots/simulator/recurring/Recurring_limit_limit/simulator-input-price.png b/e2e/screenshots/simulator/recurring/Recurring_limit_limit/simulator-input-price.png index 0eaeb2525..cefd7a622 100644 Binary files a/e2e/screenshots/simulator/recurring/Recurring_limit_limit/simulator-input-price.png and b/e2e/screenshots/simulator/recurring/Recurring_limit_limit/simulator-input-price.png differ diff --git a/e2e/screenshots/simulator/recurring/Recurring_range_limit/simulator-input-price.png b/e2e/screenshots/simulator/recurring/Recurring_range_limit/simulator-input-price.png index 21186cabc..6829b3aa2 100644 Binary files a/e2e/screenshots/simulator/recurring/Recurring_range_limit/simulator-input-price.png and b/e2e/screenshots/simulator/recurring/Recurring_range_limit/simulator-input-price.png differ diff --git a/e2e/screenshots/simulator/recurring/Recurring_range_range/simulator-results-animation.png b/e2e/screenshots/simulator/recurring/Recurring_range_range/simulator-results-animation.png index 4400e81ba..9d36b78da 100644 Binary files a/e2e/screenshots/simulator/recurring/Recurring_range_range/simulator-results-animation.png and b/e2e/screenshots/simulator/recurring/Recurring_range_range/simulator-results-animation.png differ diff --git a/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/form.png b/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/form.png index 94e5c5ea9..7c3c27db6 100644 Binary files a/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/form.png and b/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/form.png differ diff --git a/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/my-strategy.png b/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/my-strategy.png index cb1f16d9b..655a6dec5 100644 Binary files a/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/my-strategy.png and b/e2e/screenshots/strategy/disposable/Disposable_buy_limit/create/my-strategy.png differ diff --git a/e2e/screenshots/strategy/disposable/Disposable_buy_limit/deposit/form.png b/e2e/screenshots/strategy/disposable/Disposable_buy_limit/deposit/form.png index ac5d38ff2..20c921452 100644 Binary files a/e2e/screenshots/strategy/disposable/Disposable_buy_limit/deposit/form.png and b/e2e/screenshots/strategy/disposable/Disposable_buy_limit/deposit/form.png differ diff --git a/e2e/screenshots/strategy/disposable/Disposable_buy_range/deposit/form.png b/e2e/screenshots/strategy/disposable/Disposable_buy_range/deposit/form.png index a3ed96b5f..1164ba92f 100644 Binary files a/e2e/screenshots/strategy/disposable/Disposable_buy_range/deposit/form.png and b/e2e/screenshots/strategy/disposable/Disposable_buy_range/deposit/form.png differ diff --git a/e2e/screenshots/strategy/disposable/Disposable_sell_limit/create/my-strategy.png b/e2e/screenshots/strategy/disposable/Disposable_sell_limit/create/my-strategy.png index 2d59c1dca..8b8940a04 100644 Binary files a/e2e/screenshots/strategy/disposable/Disposable_sell_limit/create/my-strategy.png and b/e2e/screenshots/strategy/disposable/Disposable_sell_limit/create/my-strategy.png differ diff --git a/e2e/screenshots/strategy/overlapping/Overlapping/duplicate/form.png b/e2e/screenshots/strategy/overlapping/Overlapping/duplicate/form.png index 7545ba6f7..51a4b98d4 100644 Binary files a/e2e/screenshots/strategy/overlapping/Overlapping/duplicate/form.png and b/e2e/screenshots/strategy/overlapping/Overlapping/duplicate/form.png differ diff --git a/e2e/screenshots/strategy/recurring/Recurring_limit_limit/create/my-strategy.png b/e2e/screenshots/strategy/recurring/Recurring_limit_limit/create/my-strategy.png index d91f58763..f15cfeff3 100644 Binary files a/e2e/screenshots/strategy/recurring/Recurring_limit_limit/create/my-strategy.png and b/e2e/screenshots/strategy/recurring/Recurring_limit_limit/create/my-strategy.png differ diff --git a/e2e/screenshots/strategy/recurring/Recurring_limit_limit/deposit/form.png b/e2e/screenshots/strategy/recurring/Recurring_limit_limit/deposit/form.png index b447aae49..8aa67cd3a 100644 Binary files a/e2e/screenshots/strategy/recurring/Recurring_limit_limit/deposit/form.png and b/e2e/screenshots/strategy/recurring/Recurring_limit_limit/deposit/form.png differ diff --git a/e2e/screenshots/strategy/recurring/Recurring_limit_range/create/my-strategy.png b/e2e/screenshots/strategy/recurring/Recurring_limit_range/create/my-strategy.png index 293670ad3..3c006f5ba 100644 Binary files a/e2e/screenshots/strategy/recurring/Recurring_limit_range/create/my-strategy.png and b/e2e/screenshots/strategy/recurring/Recurring_limit_range/create/my-strategy.png differ diff --git a/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/form.png b/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/form.png index 78cdd4d14..b832884cd 100644 Binary files a/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/form.png and b/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/form.png differ diff --git a/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/my-strategy.png b/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/my-strategy.png index 57eced296..9172cadac 100644 Binary files a/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/my-strategy.png and b/e2e/screenshots/strategy/recurring/Recurring_range_limit/create/my-strategy.png differ diff --git a/e2e/screenshots/strategy/recurring/Recurring_range_limit/deposit/form.png b/e2e/screenshots/strategy/recurring/Recurring_range_limit/deposit/form.png index 36ca07eb5..af13f6508 100644 Binary files a/e2e/screenshots/strategy/recurring/Recurring_range_limit/deposit/form.png and b/e2e/screenshots/strategy/recurring/Recurring_range_limit/deposit/form.png differ diff --git a/e2e/tests/strategy/disposable/create.ts b/e2e/tests/strategy/disposable/create.ts index 24e27ec1a..a34a9ea7b 100644 --- a/e2e/tests/strategy/disposable/create.ts +++ b/e2e/tests/strategy/disposable/create.ts @@ -57,10 +57,10 @@ export const create = (testCase: CreateStrategyTestCase) => { const tooltip = await strategy.priceTooltip(direction); if (setting === 'limit') { - expect(tooltip.price()).toHaveText(output.min); + await expect(tooltip.price()).toHaveText(output.min); } else { - expect(tooltip.minPrice()).toHaveText(output.min); - expect(tooltip.maxPrice()).toHaveText(output.max); + await expect(tooltip.minPrice()).toHaveText(output.min); + await expect(tooltip.maxPrice()).toHaveText(output.max); } await tooltip.waitForDetached(); diff --git a/e2e/tests/strategy/disposable/duplicate.ts b/e2e/tests/strategy/disposable/duplicate.ts index 1bc924860..6596f881f 100644 --- a/e2e/tests/strategy/disposable/duplicate.ts +++ b/e2e/tests/strategy/disposable/duplicate.ts @@ -47,10 +47,10 @@ export const duplicate = (testCase: CreateStrategyTestCase) => { const tooltip = await duplicate.priceTooltip(direction); if (setting === 'limit') { - expect(tooltip.price()).toHaveText(output.min); + await expect(tooltip.price()).toHaveText(output.min); } else { - expect(tooltip.minPrice()).toHaveText(output.min); - expect(tooltip.maxPrice()).toHaveText(output.max); + await expect(tooltip.minPrice()).toHaveText(output.min); + await expect(tooltip.maxPrice()).toHaveText(output.max); } await tooltip.waitForDetached(); }); diff --git a/e2e/tests/strategy/disposable/undercut.ts b/e2e/tests/strategy/disposable/undercut.ts index 2a7c15f55..0246f5168 100644 --- a/e2e/tests/strategy/disposable/undercut.ts +++ b/e2e/tests/strategy/disposable/undercut.ts @@ -48,10 +48,10 @@ export const undercut = (testCase: CreateStrategyTestCase) => { const tooltip = await duplicate.priceTooltip(direction); if (setting === 'limit') { - expect(tooltip.price()).toHaveText(output.min); + await expect(tooltip.price()).toHaveText(output.min); } else { - expect(tooltip.minPrice()).toHaveText(output.min); - expect(tooltip.maxPrice()).toHaveText(output.max); + await expect(tooltip.minPrice()).toHaveText(output.min); + await expect(tooltip.maxPrice()).toHaveText(output.max); } await tooltip.waitForDetached(); }); diff --git a/src/components/simulator/input/SimInputChart.tsx b/src/components/simulator/input/SimInputChart.tsx index 62c5b7496..9cccd32c4 100644 --- a/src/components/simulator/input/SimInputChart.tsx +++ b/src/components/simulator/input/SimInputChart.tsx @@ -117,6 +117,8 @@ export const SimInputChart = ({ type={simulationType} overlappingSpread={spread} zoomBehavior="normal" + start={state.start} + end={state.end} /> )} diff --git a/src/components/simulator/input/SimInputStrategyType.tsx b/src/components/simulator/input/SimInputStrategyType.tsx index 74f0398ee..37dae65f2 100644 --- a/src/components/simulator/input/SimInputStrategyType.tsx +++ b/src/components/simulator/input/SimInputStrategyType.tsx @@ -1,10 +1,10 @@ -import { FC, ReactNode } from 'react'; +import { ReactNode } from 'react'; import { Tooltip } from 'components/common/tooltip/Tooltip'; import { ReactComponent as IconTwoRanges } from 'assets/icons/recurring.svg'; import { ReactComponent as IconOverlappingStrategy } from 'assets/icons/overlapping.svg'; import { cn } from 'utils/helpers'; import { SimulatorType } from 'libs/routing/routes/sim'; -import { Link } from 'libs/routing'; +import { Link, useSearch } from 'libs/routing'; interface ItemProps { title: string; @@ -13,12 +13,10 @@ interface ItemProps { tooltipText: string; } -interface Props { - baseToken?: string; - quoteToken?: string; -} - -export const SimInputStrategyType: FC = ({ baseToken, quoteToken }) => { +export const SimInputStrategyType = () => { + const { baseToken, quoteToken, start, end } = useSearch({ + from: '/simulate/', + }); const items: ItemProps[] = [ { title: 'Recurring', @@ -54,7 +52,7 @@ export const SimInputStrategyType: FC = ({ baseToken, quoteToken }) => { aria-controls={'panel-' + label} key={label} to={to} - search={{ baseToken, quoteToken }} + search={{ baseToken, quoteToken, start, end }} className={cn( 'rounded-10 text-14 font-weight-500 group flex size-full flex-row items-center justify-center gap-8 bg-black px-8 py-16 outline-white', 'md:px-12', diff --git a/src/components/strategies/common/StrategyChartHistory.tsx b/src/components/strategies/common/StrategyChartHistory.tsx index e63e54054..7309310cd 100644 --- a/src/components/strategies/common/StrategyChartHistory.tsx +++ b/src/components/strategies/common/StrategyChartHistory.tsx @@ -2,10 +2,10 @@ import { ChartPrices, OnPriceUpdates, } from 'components/strategies/common/d3Chart'; -import { useSearch } from '@tanstack/react-router'; +import { useNavigate, useSearch } from '@tanstack/react-router'; import { useGetTokenPriceHistory } from 'libs/queries/extApi/tokenPrice'; import { TradeSearch } from 'libs/routing'; -import { FC, useEffect, useRef, useState } from 'react'; +import { FC, useCallback, useEffect, useRef, useState } from 'react'; import { BaseOrder } from 'components/strategies/common/types'; import { useMarketPrice } from 'hooks/useMarketPrice'; import { TradeTypes } from 'libs/routing/routes/trade'; @@ -67,6 +67,7 @@ export const StrategyChartHistory: FC = (props) => { const { base, quote, type, order0, order1, activities } = props; const { priceStart, priceEnd } = useSearch({ strict: false }) as TradeSearch; const { marketPrice: externalPrice } = useMarketPrice({ base, quote }); + const nav = useNavigate(); const marketPrice = props.marketPrice ? Number(props.marketPrice) @@ -83,6 +84,22 @@ export const StrategyChartHistory: FC = (props) => { }); const [bounds, setBounds] = useState(getBounds(order0, order1, direction)); + const updatePriceRange = useCallback( + (range: { start?: string; end?: string }) => { + nav({ + to: '.', + search: (s) => ({ + ...s, + priceStart: range.start, + priceEnd: range.end, + }), + resetScroll: false, + replace: true, + }); + }, + [nav] + ); + const updatePrices: OnPriceUpdates = ({ buy, sell }) => { const newPrices = { buy: { @@ -104,8 +121,8 @@ export const StrategyChartHistory: FC = (props) => { const { data, isPending, isError } = useGetTokenPriceHistory({ baseToken: base.address, quoteToken: quote.address, - start: priceStart ?? defaultStart().toString(), - end: priceEnd ?? defaultEnd().toString(), + start: defaultStart().toString(), + end: defaultEnd().toString(), }); useEffect(() => { @@ -154,6 +171,9 @@ export const StrategyChartHistory: FC = (props) => { overlappingSpread={props.spread} activities={activities} zoomBehavior={activities ? 'normal' : 'extended'} + start={priceStart} + end={priceEnd} + onRangeUpdates={updatePriceRange} /> ); }; diff --git a/src/components/strategies/common/d3Chart/D3PriceHistory.tsx b/src/components/strategies/common/d3Chart/D3PriceHistory.tsx index 46309028f..9ffa1d0fc 100644 --- a/src/components/strategies/common/d3Chart/D3PriceHistory.tsx +++ b/src/components/strategies/common/d3Chart/D3PriceHistory.tsx @@ -1,3 +1,4 @@ +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { CandlestickData, D3ChartSettings, @@ -12,13 +13,11 @@ import { D3ChartCandlesticks, OnPriceUpdates, } from './D3ChartCandlesticks'; -import { FC, useEffect, useMemo, useRef, useState } from 'react'; import { D3ZoomEvent, scaleBand, select, zoom, - ZoomBehavior, zoomIdentity, ZoomTransform, } from 'd3'; @@ -79,16 +78,13 @@ const useZoom = ( data: CandlestickData[], behavior: TransformBehavior ) => { - const zoomHandler = useRef>(null); const [transform, setTransform] = useState(); - const selection = select('#interactive-chart'); - const chartArea = select('.chart-area'); - const extent = getExtentConfig(behavior, data.length, dms.width); - - useEffect(() => { + const zoomHandler = useMemo(() => { let k = 0; - zoomHandler.current = zoom() + const extent = getExtentConfig(behavior, data.length, dms.width); + const chartArea = select('.chart-area'); + const handler = zoom() .scaleExtent(extent.zoom) .translateExtent(extent.translate) .filter((e: Event) => { @@ -101,33 +97,44 @@ const useZoom = ( if (e.transform.k === k) chartArea.style('cursor', 'grab'); setTransform(e.transform); }) - .on('end', () => chartArea.style('cursor', '')); - selection.call(zoomHandler.current); - }, [chartArea, extent.translate, extent.zoom, selection]); + .on('end', () => { + chartArea.style('cursor', ''); + }); + return handler; + }, [behavior, data.length, dms.width]); - const zoomRange = (from: string, days: number) => { - const baseXScale = (() => { - if (behavior === 'normal') { - return scaleBand() - .domain(data.map((d) => d.date.toString())) - .range([0, dms.boundedWidth]) - .paddingInner(0.5); - } else { - return scaleBand() - .domain(getExtendedRange(data.map((d) => d.date))) - .range([dms.boundedWidth * -0.5, dms.boundedWidth * 1.5]) - .paddingInner(0.5); - } - })(); + useEffect(() => { + select('#interactive-chart').call(zoomHandler); + }, [zoomHandler]); - const scale = data.length / days; - const translateX = baseXScale(from)!; - const transition = selection.transition().duration(500); - const transform = zoomIdentity.scale(scale).translate(-1 * translateX, 0); - zoomHandler.current?.transform(transition, transform); - }; + const zoomRange = useCallback( + (from: string, days: number, duration = 500) => { + const baseXScale = (() => { + if (behavior === 'normal') { + return scaleBand() + .domain(data.map((d) => d.date.toString())) + .range([0, dms.boundedWidth]) + .paddingInner(0.5); + } else { + return scaleBand() + .domain(getExtendedRange(data.map((d) => d.date))) + .range([dms.boundedWidth * -0.5, dms.boundedWidth * 1.5]) + .paddingInner(0.5); + } + })(); - return { transform, zoomRange }; + const selection = select('#interactive-chart'); + const scale = data.length / days; + const translateX = baseXScale(from)!; + const transition = selection.transition().duration(duration); + const transform = zoomIdentity.scale(scale).translate(-1 * translateX, 0); + zoomHandler?.transform(transition, transform); + return new Promise((res) => setTimeout(res, duration)); + }, + [behavior, data, dms.boundedWidth, zoomHandler] + ); + + return { transform, zoomRange, zoomHandler }; }; const getExtendedRange = (range: number[]) => { @@ -149,7 +156,7 @@ interface Props { prices: ChartPrices; onPriceUpdates: OnPriceUpdates; onDragEnd: OnPriceUpdates; - onRangeUpdates?: (params: RangeUpdate) => void; + onRangeUpdates: (params: RangeUpdate) => void; marketPrice?: number; bounds: ChartPrices; isLimit?: { buy: boolean; sell: boolean }; @@ -158,6 +165,8 @@ interface Props { readonly?: boolean; activities?: Activity[]; zoomBehavior?: TransformBehavior; + start?: string; + end?: string; } const presetDays = [ @@ -176,17 +185,22 @@ export const D3PriceHistory: FC = (props) => { zoomBehavior = 'normal', onRangeUpdates, } = props; + const [listenOnZoom, setListenOnZoom] = useState(false); const [drawingMode, setDrawingMode] = useState(); const [drawings, setDrawings] = useState([]); const [ref, dms] = useChartDimensions(chartSettings); - const { transform: zoomTransform, zoomRange } = useZoom( - dms, - data, - zoomBehavior + const { + transform: zoomTransform, + zoomRange, + zoomHandler, + } = useZoom(dms, data, zoomBehavior); + + const zoomX = useCallback( + (d: number) => (zoomTransform ? zoomTransform.applyX(d) : d), + [zoomTransform] ); const xScale = useMemo(() => { - const zoomX = (d: number) => (zoomTransform ? zoomTransform.applyX(d) : d); if (zoomBehavior === 'normal') { return scaleBand() .domain(data.map((d) => d.date.toString())) @@ -198,7 +212,7 @@ export const D3PriceHistory: FC = (props) => { .range([dms.boundedWidth * -0.5, dms.boundedWidth * 1.5].map(zoomX)) .paddingInner(0.5); } - }, [data, dms.boundedWidth, zoomBehavior, zoomTransform]); + }, [data, dms.boundedWidth, zoomBehavior, zoomX]); const yDomain = useMemo(() => { const candles = data.filter((point) => xScale(point.date.toString())! > 0); @@ -211,11 +225,6 @@ export const D3PriceHistory: FC = (props) => { domainTolerance: 0.1, }); - const invertX = scaleBandInvert(xScale); - - const start = invertX(xScale.bandwidth() / 2) ?? xScale.domain()[0]; - const end = invertX(dms.boundedWidth) ?? xScale.domain().at(-1); - const disabledDates = [ { before: new Date(Number(xScale.domain()[0]) * 1000), @@ -223,22 +232,53 @@ export const D3PriceHistory: FC = (props) => { }, ]; - useEffect(() => { - const id = setTimeout(() => { - if (onRangeUpdates) onRangeUpdates({ start, end }); - }, 100); - return () => clearTimeout(id); - }, [onRangeUpdates, start, end]); - - const zoomFromTo = ({ start, end }: { start?: Date; end?: Date }) => { - if (!start || !end) return; - zoomRange(toUnixUTC(startOfDay(start)), differenceInDays(end, start) + 1); + const zoomFromTo = async (range: { start?: Date; end?: Date }) => { + if (!range.start || !range.end) return; + setListenOnZoom(false); + const start = toUnixUTC(startOfDay(range.start)); + const end = toUnixUTC(startOfDay(range.end)); + await zoomRange(start, differenceInDays(range.end, range.start) + 1); + onRangeUpdates({ start, end }); + setListenOnZoom(true); }; - const zoomIn = (days: number) => { - zoomRange(data.at(days * -1)!.date.toString(), days); + const zoomIn = async (days: number) => { + setListenOnZoom(false); + const start = data.at(days * -1)!.date.toString(); + const end = data.at(-1)!.date.toString(); + await zoomRange(start, days); + onRangeUpdates({ start, end }); + setListenOnZoom(true); }; + // Update range only on manual zoom update + useEffect(() => { + if (!listenOnZoom) return; + // Need custom event else it override existing one + zoomHandler.on('end.update', () => { + const invertX = scaleBandInvert(xScale); + const start = invertX(xScale.bandwidth() / 2); + const end = invertX(dms.boundedWidth); + onRangeUpdates({ start, end }); + }); + return () => { + zoomHandler.on('end.update', null); + }; + }, [dms.boundedWidth, onRangeUpdates, xScale, zoomHandler, listenOnZoom]); + + useEffect(() => { + if (!zoomRange || listenOnZoom) return; + if (props.start && props.end) { + const from = fromUnixUTC(props.start); + const to = fromUnixUTC(props.end); + zoomRange(props.start, differenceInDays(to, from) + 1, 0); + } + // Prevent zoom end event to update range on init + setTimeout(() => setListenOnZoom(true), 100); + // This effect should happens only once, when start, end and zoomRange are ready + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.start, props.end, zoomRange]); + return ( = (props) => { className="rounded-8 border-0" defaultStart={defaultStartDate()} defaultEnd={defaultEndDate()} - start={fromUnixUTC(start)} - end={fromUnixUTC(end)} + start={fromUnixUTC(props.start) || defaultStartDate()} + end={fromUnixUTC(props.end) || defaultEndDate()} onConfirm={zoomFromTo} options={{ disabled: disabledDates, diff --git a/src/components/strategies/edit/EditPriceNav.tsx b/src/components/strategies/edit/EditPriceNav.tsx index fd9ded91b..a11b26b9e 100644 --- a/src/components/strategies/edit/EditPriceNav.tsx +++ b/src/components/strategies/edit/EditPriceNav.tsx @@ -55,7 +55,11 @@ export const EditPriceNav = ({ editType }: { editType: EditTypes }) => { ({ + ...priceSearchFn[link.id](strategy, editType), + priceStart, + priceEnd, + })} params={params} replace={true} aria-current={pathName.includes(link.id) ? 'page' : 'false'} diff --git a/src/libs/routing/routes/sim.tsx b/src/libs/routing/routes/sim.tsx index 527338189..84fdee106 100644 --- a/src/libs/routing/routes/sim.tsx +++ b/src/libs/routing/routes/sim.tsx @@ -1,6 +1,5 @@ import { redirect, createRoute } from '@tanstack/react-router'; import { SimulatorProvider } from 'components/simulator/result/SimulatorProvider'; -import { endOfDay, getUnixTime, startOfDay, sub } from 'date-fns'; import { rootRoute } from 'libs/routing/routes/root'; import { getLastVisitedPair, @@ -48,16 +47,9 @@ export const simulatorInputRootRoute = createRoute({ } }, validateSearch: (search: Record): StrategyInputBase => { - const start = - Number(search.start) > 0 - ? (search.start as string) - : getUnixTime(startOfDay(sub(new Date(), { days: 364 }))).toString(); - const end = - Number(search.end) > 0 - ? (search.end as string) - : getUnixTime(endOfDay(new Date())).toString(); - - if (Number(start) > Number(end)) { + const { start, end } = search; + + if (start && end && Number(start) > Number(end)) { throw new Error('Invalid date range'); } @@ -72,8 +64,8 @@ export const simulatorInputRootRoute = createRoute({ return { baseToken, quoteToken, - start, - end, + start: start as string | undefined, + end: end as string | undefined, }; }, }); diff --git a/src/libs/routing/routes/strategyEdit.ts b/src/libs/routing/routes/strategyEdit.ts index c4cc6bded..2fe32394b 100644 --- a/src/libs/routing/routes/strategyEdit.ts +++ b/src/libs/routing/routes/strategyEdit.ts @@ -41,8 +41,8 @@ export const editStrategyLayout = createRoute({ path: '/strategies/edit/$strategyId', component: EditStrategyPageLayout, validateSearch: searchValidator({ - priceStart: v.optional(validNumber, defaultStart().toString()), - priceEnd: v.optional(validNumber, defaultEnd().toString()), + priceStart: v.optional(validNumber), + priceEnd: v.optional(validNumber), editType: v.picklist(['editPrices', 'renew', 'deposit', 'withdraw']), }), }); diff --git a/src/libs/routing/routes/trade.ts b/src/libs/routing/routes/trade.ts index 02b0edd6e..7033124d0 100644 --- a/src/libs/routing/routes/trade.ts +++ b/src/libs/routing/routes/trade.ts @@ -11,10 +11,9 @@ import { TradeRoot } from 'pages/trade/root'; import { TradeMarket } from 'pages/trade/market'; import { TradeRecurring } from 'pages/trade/recurring'; import { TradeOverlapping } from 'pages/trade/overlapping'; -import { defaultEnd, defaultStart } from 'components/strategies/common/utils'; import { OverlappingSearch } from 'components/strategies/common/types'; -import * as v from 'valibot'; import { MarginalPriceOptions } from '@bancor/carbon-sdk/strategy-management'; +import * as v from 'valibot'; // TRADE TYPE export type StrategyType = 'recurring' | 'disposable' | 'overlapping'; @@ -75,8 +74,8 @@ const tradePage = createRoute({ validateSearch: searchValidator({ base: v.optional(v.fallback(validAddress, '')), quote: v.optional(v.fallback(validAddress, '')), - priceStart: v.optional(validNumber, defaultStart().toString()), - priceEnd: v.optional(validNumber, defaultEnd().toString()), + priceStart: v.optional(validNumber), + priceEnd: v.optional(validNumber), }), }); diff --git a/src/pages/simulator/overlapping/index.tsx b/src/pages/simulator/overlapping/index.tsx index d1304a531..4a0485393 100644 --- a/src/pages/simulator/overlapping/index.tsx +++ b/src/pages/simulator/overlapping/index.tsx @@ -138,10 +138,7 @@ export const SimulatorInputOverlappingPage = () => { quoteToken={searchState.quoteToken} noPriceHistory={isError} /> - + { quoteToken={searchState.quoteToken} noPriceHistory={isError} /> - +