@orderly.network/ui-tpsl 3.0.0-beta.3 → 3.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -17,6 +17,7 @@ var SymbolBadge = (props) => {
17
17
  const badge = brokerName ?? brokerId ?? void 0;
18
18
  return /* @__PURE__ */ jsx(SymbolBadge$1, { badge, fullName: brokerNameRaw });
19
19
  };
20
+ var LIQ_DISTANCE_THRESHOLD = 10;
20
21
  var OrderInfo = (props) => {
21
22
  const { t } = useTranslation();
22
23
  const { order: order2, symbolLeverage } = props;
@@ -29,6 +30,8 @@ var OrderInfo = (props) => {
29
30
  props.marginMode
30
31
  );
31
32
  const currentLeverage = symbolLeverage || leverage;
33
+ const markPriceValue = markPrice?.data;
34
+ const estLiqPrice = props.estLiqPrice === 0 || !markPriceValue || markPriceValue === 0 || Math.abs((props.estLiqPrice ?? 0) - markPriceValue) / markPriceValue >= LIQ_DISTANCE_THRESHOLD ? "--" : props.estLiqPrice ?? "--";
32
35
  return /* @__PURE__ */ jsxs(
33
36
  Flex,
34
37
  {
@@ -152,7 +155,7 @@ var OrderInfo = (props) => {
152
155
  className: "oui-text-warning",
153
156
  size: "2xs",
154
157
  dp: props.quoteDP ?? 2,
155
- children: props.estLiqPrice ?? "--"
158
+ children: estLiqPrice
156
159
  }
157
160
  )
158
161
  ] })
@@ -285,6 +288,10 @@ var usePNLInputBuilder = (props) => {
285
288
  return `${type.toLowerCase()}_offset`;
286
289
  case "Offset%" /* PERCENTAGE */:
287
290
  return `${type.toLowerCase()}_offset_percentage`;
291
+ case "OffsetFromMark" /* OFFSET_FROM_MARK */:
292
+ return `${type.toLowerCase()}_offset_from_mark`;
293
+ case "PercentageFromMark" /* PERCENTAGE_FROM_MARK */:
294
+ return `${type.toLowerCase()}_offset_percentage_from_mark`;
288
295
  default:
289
296
  return `${type.toLowerCase()}_pnl`;
290
297
  }
@@ -302,15 +309,34 @@ var usePNLInputBuilder = (props) => {
302
309
  {
303
310
  label: t("tpsl.offset"),
304
311
  value: "Offset" /* OFFSET */,
305
- testId: `${"Offset" /* OFFSET */}_mneu_item`
312
+ testId: `${"Offset" /* OFFSET */}_menu_item`
306
313
  },
307
314
  {
308
- label: `${t("tpsl.offset")}%`,
315
+ label: t("tpsl.offsetPercent"),
309
316
  value: "Offset%" /* PERCENTAGE */,
310
317
  testId: `${"Offset%" /* PERCENTAGE */}_menu_item`
318
+ },
319
+ {
320
+ label: t("tpsl.offsetMark"),
321
+ value: "OffsetFromMark" /* OFFSET_FROM_MARK */,
322
+ testId: `${"OffsetFromMark" /* OFFSET_FROM_MARK */}_menu_item`
323
+ },
324
+ {
325
+ label: t("tpsl.offsetPercentMark"),
326
+ value: "PercentageFromMark" /* PERCENTAGE_FROM_MARK */,
327
+ testId: `${"PercentageFromMark" /* PERCENTAGE_FROM_MARK */}_menu_item`
311
328
  }
312
329
  ];
313
330
  }, [t]);
331
+ const modeLabelMap = useMemo(() => {
332
+ return {
333
+ ["PnL" /* PnL */]: t("tpsl.pnl"),
334
+ ["Offset" /* OFFSET */]: t("tpsl.offsetHolder"),
335
+ ["Offset%" /* PERCENTAGE */]: t("tpsl.offsetHolder"),
336
+ ["OffsetFromMark" /* OFFSET_FROM_MARK */]: t("tpsl.offsetHolder"),
337
+ ["PercentageFromMark" /* PERCENTAGE_FROM_MARK */]: t("tpsl.offsetHolder")
338
+ };
339
+ }, [t]);
314
340
  const percentageSuffix = useRef("");
315
341
  const onValueChange = (value2) => {
316
342
  props.onChange(key, value2);
@@ -321,7 +347,7 @@ var usePNLInputBuilder = (props) => {
321
347
  onRenderBefore: (value2, options2) => {
322
348
  value2 = `${value2}`;
323
349
  if (value2 === "" || value2 === "-") return "";
324
- if (mode === "Offset%" /* PERCENTAGE */) {
350
+ if (mode === "Offset%" /* PERCENTAGE */ || mode === "PercentageFromMark" /* PERCENTAGE_FROM_MARK */) {
325
351
  try {
326
352
  return `${new Decimal(
327
353
  value2.replace(
@@ -332,7 +358,7 @@ var usePNLInputBuilder = (props) => {
332
358
  } catch {
333
359
  return "";
334
360
  }
335
- } else if (mode === "Offset" /* OFFSET */) {
361
+ } else if (mode === "Offset" /* OFFSET */ || mode === "OffsetFromMark" /* OFFSET_FROM_MARK */) {
336
362
  value2 = todpIfNeed(value2, dp);
337
363
  } else ;
338
364
  return `${value2}`;
@@ -341,7 +367,7 @@ var usePNLInputBuilder = (props) => {
341
367
  if (/^\-?0{2,}$/.test(value2)) {
342
368
  return "0";
343
369
  }
344
- if (mode === "Offset%" /* PERCENTAGE */) {
370
+ if (mode === "Offset%" /* PERCENTAGE */ || mode === "PercentageFromMark" /* PERCENTAGE_FROM_MARK */) {
345
371
  if (value2 !== "") {
346
372
  value2 = todpIfNeed(value2, 2);
347
373
  const endStr = value2.match(/\.0{0,2}$/);
@@ -370,6 +396,7 @@ var usePNLInputBuilder = (props) => {
370
396
  return {
371
397
  mode,
372
398
  modes,
399
+ modeLabelMap,
373
400
  type: props.type,
374
401
  formatter,
375
402
  onModeChange: (mode2) => {
@@ -386,6 +413,7 @@ var PNLInput = (props) => {
386
413
  const {
387
414
  mode,
388
415
  modes,
416
+ modeLabelMap,
389
417
  onModeChange,
390
418
  onValueChange,
391
419
  quote,
@@ -393,26 +421,19 @@ var PNLInput = (props) => {
393
421
  value,
394
422
  pnl
395
423
  } = props;
396
- const { t } = useTranslation();
397
- const [prefix, setPrefix] = useState(mode);
398
- const [placeholder, setPlaceholder] = useState(
399
- mode === "Offset%" /* PERCENTAGE */ ? "%" : quote
400
- );
424
+ const [isInputFocused, setIsInputFocused] = useState(false);
401
425
  const color = useMemo(() => {
402
426
  const num = Number(pnl);
403
427
  if (isNaN(num) || num === 0) return "";
404
428
  if (num > 0) return "oui-text-trade-profit";
405
429
  if (num < 0) return "oui-text-trade-loss";
406
430
  }, [pnl]);
407
- useEffect(() => {
408
- const label = modes.find((item) => item.value === mode)?.label;
409
- setPrefix(label);
410
- setPlaceholder(mode === "Offset%" /* PERCENTAGE */ ? "%" : quote);
411
- }, [mode, modes]);
431
+ const prefixLabel = String(modeLabelMap[mode] ?? mode ?? "");
432
+ const placeholder = isInputFocused ? "" : mode === "Offset%" /* PERCENTAGE */ || mode === "PercentageFromMark" /* PERCENTAGE_FROM_MARK */ ? "%" : quote;
412
433
  return /* @__PURE__ */ jsx(
413
434
  Input,
414
435
  {
415
- prefix,
436
+ prefix: prefixLabel,
416
437
  size: {
417
438
  initial: "lg",
418
439
  lg: "md"
@@ -435,15 +456,15 @@ var PNLInput = (props) => {
435
456
  root: "oui-outline-line-12 focus-within:oui-outline-primary-light"
436
457
  },
437
458
  onFocus: () => {
438
- setPlaceholder("");
459
+ setIsInputFocused(true);
439
460
  props.setFocus(true);
440
461
  },
441
462
  onBlur: () => {
442
- setPlaceholder(mode === "Offset%" /* PERCENTAGE */ ? "%" : quote);
463
+ setIsInputFocused(false);
443
464
  props.setFocus(false);
444
465
  },
445
466
  suffix: /* @__PURE__ */ jsxs(Fragment, { children: [
446
- mode === "Offset%" /* PERCENTAGE */ && !!value && /* @__PURE__ */ jsx(
467
+ (mode === "Offset%" /* PERCENTAGE */ || mode === "PercentageFromMark" /* PERCENTAGE_FROM_MARK */) && !!value && /* @__PURE__ */ jsx(
447
468
  Text,
448
469
  {
449
470
  size: "2xs",
@@ -472,7 +493,7 @@ var PNLMenus = (props) => {
472
493
  menu: props.modes,
473
494
  align: "end",
474
495
  size: "xs",
475
- className: "oui-min-w-[80px]",
496
+ className: "oui-min-w-[120px]",
476
497
  onSelect: (item) => props.onModeChange(item),
477
498
  children: /* @__PURE__ */ jsx("button", { className: "oui-p-2", children: /* @__PURE__ */ jsx(CaretDownIcon, { size: 12, color: "white" }) })
478
499
  }
@@ -1025,6 +1046,8 @@ var TPSL = (props) => {
1025
1046
  PnL: TPSL_OrderEntity.tp_pnl?.toString() ?? void 0,
1026
1047
  Offset: TPSL_OrderEntity.tp_offset?.toString() ?? void 0,
1027
1048
  "Offset%": TPSL_OrderEntity.tp_offset_percentage?.toString() ?? void 0,
1049
+ OffsetFromMark: TPSL_OrderEntity.tp_offset_from_mark?.toString() ?? void 0,
1050
+ PercentageFromMark: TPSL_OrderEntity.tp_offset_percentage_from_mark?.toString() ?? void 0,
1028
1051
  order_price: TPSL_OrderEntity.tp_order_price?.toString() ?? void 0,
1029
1052
  order_type: TPSL_OrderEntity.tp_order_type ?? OrderType.MARKET
1030
1053
  },
@@ -1062,6 +1085,8 @@ var TPSL = (props) => {
1062
1085
  PnL: TPSL_OrderEntity.sl_pnl?.toString() ?? void 0,
1063
1086
  Offset: TPSL_OrderEntity.sl_offset?.toString() ?? void 0,
1064
1087
  "Offset%": TPSL_OrderEntity.sl_offset_percentage?.toString() ?? void 0,
1088
+ OffsetFromMark: TPSL_OrderEntity.sl_offset_from_mark?.toString() ?? void 0,
1089
+ PercentageFromMark: TPSL_OrderEntity.sl_offset_percentage_from_mark?.toString() ?? void 0,
1065
1090
  order_price: TPSL_OrderEntity.sl_order_price?.toString() ?? void 0,
1066
1091
  order_type: TPSL_OrderEntity.sl_order_type ?? OrderType.MARKET
1067
1092
  },
@@ -1686,6 +1711,8 @@ var TPSLAdvancedUI = (props) => {
1686
1711
  PnL: formattedOrder.tp_pnl ?? "",
1687
1712
  Offset: formattedOrder.tp_offset ?? "",
1688
1713
  "Offset%": formattedOrder.tp_offset_percentage ?? "",
1714
+ OffsetFromMark: formattedOrder.tp_offset_from_mark ?? "",
1715
+ PercentageFromMark: formattedOrder.tp_offset_percentage_from_mark ?? "",
1689
1716
  ROI: formattedOrder.tp_ROI ?? ""
1690
1717
  });
1691
1718
  const [slValues, setSlValues] = useState({
@@ -1696,6 +1723,8 @@ var TPSLAdvancedUI = (props) => {
1696
1723
  PnL: formattedOrder.sl_pnl ?? "",
1697
1724
  Offset: formattedOrder.sl_offset ?? "",
1698
1725
  "Offset%": formattedOrder.sl_offset_percentage ?? "",
1726
+ OffsetFromMark: formattedOrder.sl_offset_from_mark ?? "",
1727
+ PercentageFromMark: formattedOrder.sl_offset_percentage_from_mark ?? "",
1699
1728
  ROI: formattedOrder.sl_ROI ?? ""
1700
1729
  });
1701
1730
  useEffect(() => {
@@ -1708,6 +1737,8 @@ var TPSLAdvancedUI = (props) => {
1708
1737
  PnL: formattedOrder.tp_pnl ?? "",
1709
1738
  Offset: formattedOrder.tp_offset ?? "",
1710
1739
  "Offset%": formattedOrder.tp_offset_percentage ?? "",
1740
+ OffsetFromMark: formattedOrder.tp_offset_from_mark ?? "",
1741
+ PercentageFromMark: formattedOrder.tp_offset_percentage_from_mark ?? "",
1711
1742
  ROI: formattedOrder.tp_ROI ?? ""
1712
1743
  }));
1713
1744
  }, [formattedOrder]);
@@ -1721,6 +1752,8 @@ var TPSLAdvancedUI = (props) => {
1721
1752
  PnL: formattedOrder.sl_pnl ?? "",
1722
1753
  Offset: formattedOrder.sl_offset ?? "",
1723
1754
  "Offset%": formattedOrder.sl_offset_percentage ?? "",
1755
+ OffsetFromMark: formattedOrder.sl_offset_from_mark ?? "",
1756
+ PercentageFromMark: formattedOrder.sl_offset_percentage_from_mark ?? "",
1724
1757
  ROI: formattedOrder.sl_ROI ?? ""
1725
1758
  }));
1726
1759
  }, [formattedOrder]);
@@ -1951,16 +1984,23 @@ var useTPSLAdvanced = (props) => {
1951
1984
  sl_pnl: order2.sl_pnl,
1952
1985
  sl_offset: order2.sl_offset,
1953
1986
  sl_offset_percentage: order2.sl_offset_percentage,
1987
+ sl_offset_from_mark: order2.sl_offset_from_mark,
1988
+ sl_offset_percentage_from_mark: order2.sl_offset_percentage_from_mark,
1954
1989
  tp_pnl: order2.tp_pnl,
1955
1990
  tp_offset: order2.tp_offset,
1956
1991
  tp_offset_percentage: order2.tp_offset_percentage,
1992
+ tp_offset_from_mark: order2.tp_offset_from_mark,
1993
+ tp_offset_percentage_from_mark: order2.tp_offset_percentage_from_mark,
1957
1994
  margin_mode: order2.margin_mode
1958
1995
  }
1959
1996
  });
1960
1997
  const slPriceError = useTpslPriceChecker({
1961
1998
  slPrice: formattedOrder.sl_trigger_price,
1962
1999
  liqPrice: state.estLiqPrice,
1963
- side: formattedOrder.side
2000
+ side: formattedOrder.side,
2001
+ markPrice: state.markPrice,
2002
+ currentPosition: state.currentPosition,
2003
+ orderQuantity: Number(formattedOrder.order_quantity)
1964
2004
  });
1965
2005
  const onSubmit = () => {
1966
2006
  const isSlPriceError = slPriceError?.sl_trigger_price?.type === ERROR_MSG_CODES.SL_PRICE_ERROR;
@@ -2634,7 +2674,6 @@ var TPSLDetailUI = (props) => {
2634
2674
  symbolInfo
2635
2675
  } = props;
2636
2676
  const { estLiqPrice } = useTPSLDetailContext();
2637
- console.log("----- position", position);
2638
2677
  return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(ScrollArea, { className: cn(isMobile && "oui-h-[calc(100vh-100px)]"), children: [
2639
2678
  /* @__PURE__ */ jsx(
2640
2679
  OrderInfo,
@@ -3473,6 +3512,8 @@ var EditBracketOrderUI = (props) => {
3473
3512
  PnL: formattedOrder.tp_pnl ?? "",
3474
3513
  Offset: formattedOrder.tp_offset ?? "",
3475
3514
  "Offset%": formattedOrder.tp_offset_percentage ?? "",
3515
+ OffsetFromMark: formattedOrder.tp_offset_from_mark ?? "",
3516
+ PercentageFromMark: formattedOrder.tp_offset_percentage_from_mark ?? "",
3476
3517
  ROI: formattedOrder.tp_ROI ?? ""
3477
3518
  });
3478
3519
  const [slValues, setSlValues] = useState({
@@ -3483,6 +3524,8 @@ var EditBracketOrderUI = (props) => {
3483
3524
  PnL: formattedOrder.sl_pnl ?? "",
3484
3525
  Offset: formattedOrder.sl_offset ?? "",
3485
3526
  "Offset%": formattedOrder.sl_offset_percentage ?? "",
3527
+ OffsetFromMark: formattedOrder.sl_offset_from_mark ?? "",
3528
+ PercentageFromMark: formattedOrder.sl_offset_percentage_from_mark ?? "",
3486
3529
  ROI: formattedOrder.sl_ROI ?? ""
3487
3530
  });
3488
3531
  useEffect(() => {
@@ -3495,6 +3538,8 @@ var EditBracketOrderUI = (props) => {
3495
3538
  PnL: formattedOrder.tp_pnl ?? "",
3496
3539
  Offset: formattedOrder.tp_offset ?? "",
3497
3540
  "Offset%": formattedOrder.tp_offset_percentage ?? "",
3541
+ OffsetFromMark: formattedOrder.tp_offset_from_mark ?? "",
3542
+ PercentageFromMark: formattedOrder.tp_offset_percentage_from_mark ?? "",
3498
3543
  ROI: formattedOrder.tp_ROI ?? ""
3499
3544
  }));
3500
3545
  }, [formattedOrder]);
@@ -3508,6 +3553,8 @@ var EditBracketOrderUI = (props) => {
3508
3553
  PnL: formattedOrder.sl_pnl ?? "",
3509
3554
  Offset: formattedOrder.sl_offset ?? "",
3510
3555
  "Offset%": formattedOrder.sl_offset_percentage ?? "",
3556
+ OffsetFromMark: formattedOrder.sl_offset_from_mark ?? "",
3557
+ PercentageFromMark: formattedOrder.sl_offset_percentage_from_mark ?? "",
3511
3558
  ROI: formattedOrder.sl_ROI ?? ""
3512
3559
  }));
3513
3560
  }, [formattedOrder]);