@orderly.network/ui-leverage 2.10.2 → 3.0.0-beta.0
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.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +38 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { FC } from 'react';
|
|
3
3
|
import { SliderMarks } from '@orderly.network/ui';
|
|
4
|
-
import { OrderSide } from '@orderly.network/types';
|
|
4
|
+
import { OrderSide, MarginMode } from '@orderly.network/types';
|
|
5
5
|
|
|
6
6
|
type LeverageEditorProps = {
|
|
7
7
|
close?: () => void;
|
|
@@ -58,6 +58,7 @@ type SymbolLeverageScriptOptions = {
|
|
|
58
58
|
symbol: string;
|
|
59
59
|
side?: OrderSide;
|
|
60
60
|
curLeverage: number;
|
|
61
|
+
marginMode: MarginMode;
|
|
61
62
|
};
|
|
62
63
|
|
|
63
64
|
type SymbolLeverageWidgetProps = {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { FC } from 'react';
|
|
3
3
|
import { SliderMarks } from '@orderly.network/ui';
|
|
4
|
-
import { OrderSide } from '@orderly.network/types';
|
|
4
|
+
import { OrderSide, MarginMode } from '@orderly.network/types';
|
|
5
5
|
|
|
6
6
|
type LeverageEditorProps = {
|
|
7
7
|
close?: () => void;
|
|
@@ -58,6 +58,7 @@ type SymbolLeverageScriptOptions = {
|
|
|
58
58
|
symbol: string;
|
|
59
59
|
side?: OrderSide;
|
|
60
60
|
curLeverage: number;
|
|
61
|
+
marginMode: MarginMode;
|
|
61
62
|
};
|
|
62
63
|
|
|
63
64
|
type SymbolLeverageWidgetProps = {
|
package/dist/index.js
CHANGED
|
@@ -341,7 +341,7 @@ var LeverageEditor = (props) => {
|
|
|
341
341
|
return /* @__PURE__ */ jsxRuntime.jsx(Leverage, { ...state });
|
|
342
342
|
};
|
|
343
343
|
var useSymbolLeverageScript = (options) => {
|
|
344
|
-
const { curLeverage = 1, symbol, side } = options;
|
|
344
|
+
const { curLeverage = 1, symbol, side, marginMode } = options;
|
|
345
345
|
const [showSliderTip, setShowSliderTip] = React.useState(false);
|
|
346
346
|
const [leverage, setLeverage] = React.useState(curLeverage);
|
|
347
347
|
const { t } = i18n.useTranslation();
|
|
@@ -351,6 +351,9 @@ var useSymbolLeverageScript = (options) => {
|
|
|
351
351
|
update,
|
|
352
352
|
isLoading
|
|
353
353
|
} = hooks.useSymbolLeverage(symbol);
|
|
354
|
+
React.useEffect(() => {
|
|
355
|
+
setLeverage(curLeverage);
|
|
356
|
+
}, [curLeverage]);
|
|
354
357
|
const maxLeverage = originalMaxLeverage;
|
|
355
358
|
const {
|
|
356
359
|
position,
|
|
@@ -358,7 +361,7 @@ var useSymbolLeverageScript = (options) => {
|
|
|
358
361
|
maxPositionLeverage,
|
|
359
362
|
overMaxPositionLeverage,
|
|
360
363
|
overRequiredMargin
|
|
361
|
-
} = useCalc({ symbol, leverage, maxLeverage });
|
|
364
|
+
} = useCalc({ symbol, leverage, maxLeverage, marginMode });
|
|
362
365
|
const formattedLeverageLevers = React.useMemo(() => {
|
|
363
366
|
return generateLeverageLeversForSelector(maxLeverage);
|
|
364
367
|
}, [maxLeverage]);
|
|
@@ -402,7 +405,7 @@ var useSymbolLeverageScript = (options) => {
|
|
|
402
405
|
);
|
|
403
406
|
const onConfirmSave = async () => {
|
|
404
407
|
try {
|
|
405
|
-
update?.({ leverage, symbol }).then(
|
|
408
|
+
update?.({ leverage, symbol, margin_mode: marginMode }).then(
|
|
406
409
|
(res) => {
|
|
407
410
|
if (res.success) {
|
|
408
411
|
options?.close?.();
|
|
@@ -461,7 +464,8 @@ var useSymbolLeverageScript = (options) => {
|
|
|
461
464
|
overMaxPositionLeverage,
|
|
462
465
|
overRequiredMargin,
|
|
463
466
|
isBuy,
|
|
464
|
-
isMobile
|
|
467
|
+
isMobile,
|
|
468
|
+
marginMode
|
|
465
469
|
};
|
|
466
470
|
};
|
|
467
471
|
var generateLeverageLeversForSelector = (max) => {
|
|
@@ -532,7 +536,7 @@ var generateLeverageLevers = (max) => {
|
|
|
532
536
|
return result;
|
|
533
537
|
};
|
|
534
538
|
function useCalc(inputs) {
|
|
535
|
-
const { symbol, leverage, maxLeverage } = inputs;
|
|
539
|
+
const { symbol, leverage, maxLeverage, marginMode } = inputs;
|
|
536
540
|
const symbolsInfo = hooks.useSymbolsInfo();
|
|
537
541
|
const { data: accountInfo } = hooks.useAccountInfo();
|
|
538
542
|
const { data: markPrices } = hooks.useMarkPricesStream();
|
|
@@ -546,9 +550,11 @@ function useCalc(inputs) {
|
|
|
546
550
|
});
|
|
547
551
|
const position = React.useMemo(() => {
|
|
548
552
|
if (symbol && positions?.rows?.length) {
|
|
549
|
-
return positions.rows.find(
|
|
553
|
+
return positions.rows.find(
|
|
554
|
+
(item) => item.symbol === symbol && item.margin_mode === marginMode
|
|
555
|
+
);
|
|
550
556
|
}
|
|
551
|
-
}, [positions, symbol]);
|
|
557
|
+
}, [positions, symbol, marginMode]);
|
|
552
558
|
const maxPositionLeverage = React.useMemo(() => {
|
|
553
559
|
const IMRFactor = accountInfo?.imr_factor?.[symbol];
|
|
554
560
|
const notional = position?.notional;
|
|
@@ -578,7 +584,7 @@ function useCalc(inputs) {
|
|
|
578
584
|
return utils.zero;
|
|
579
585
|
}
|
|
580
586
|
const positionList = leverage ? positions?.rows.map((item) => {
|
|
581
|
-
if (item.symbol === symbol) {
|
|
587
|
+
if (item.symbol === symbol && item.margin_mode === marginMode) {
|
|
582
588
|
return {
|
|
583
589
|
...item,
|
|
584
590
|
leverage
|
|
@@ -586,12 +592,18 @@ function useCalc(inputs) {
|
|
|
586
592
|
}
|
|
587
593
|
return item;
|
|
588
594
|
}) : positions?.rows;
|
|
595
|
+
const maxLeverageBySymbol = positionList?.reduce((acc, item) => {
|
|
596
|
+
if (item.margin_mode !== types.MarginMode.ISOLATED && item.leverage && !acc[item.symbol]) {
|
|
597
|
+
acc[item.symbol] = item.leverage;
|
|
598
|
+
}
|
|
599
|
+
return acc;
|
|
600
|
+
}, {}) ?? {};
|
|
589
601
|
const totalInitialMarginWithOrders = perp.account.totalInitialMarginWithQty({
|
|
590
602
|
positions: positionList,
|
|
603
|
+
orders: [],
|
|
591
604
|
markPrices,
|
|
592
605
|
IMR_Factors: accountInfo.imr_factor,
|
|
593
|
-
|
|
594
|
-
maxLeverage: accountInfo.max_leverage,
|
|
606
|
+
maxLeverageBySymbol,
|
|
595
607
|
symbolInfo: symbolsInfo
|
|
596
608
|
});
|
|
597
609
|
const freeCollateral2 = perp.account.freeCollateral({
|
|
@@ -606,7 +618,8 @@ function useCalc(inputs) {
|
|
|
606
618
|
markPrices,
|
|
607
619
|
totalCollateral,
|
|
608
620
|
leverage,
|
|
609
|
-
symbol
|
|
621
|
+
symbol,
|
|
622
|
+
marginMode
|
|
610
623
|
]);
|
|
611
624
|
const overRequiredMargin = React.useMemo(() => {
|
|
612
625
|
return freeCollateral.eq(0) || freeCollateral.isNegative();
|
|
@@ -642,7 +655,13 @@ var SymbolLeverage = (props) => {
|
|
|
642
655
|
className: ui.cn(["oui-ml-auto oui-flex oui-items-center oui-gap-1"]),
|
|
643
656
|
children: [
|
|
644
657
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { color: props.isBuy ? "success" : "danger", size: "xs", children: props.isBuy ? t("common.long") : t("common.short") }),
|
|
645
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
658
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
659
|
+
LeverageBadge,
|
|
660
|
+
{
|
|
661
|
+
leverage: props.currentLeverage,
|
|
662
|
+
marginMode: props.marginMode
|
|
663
|
+
}
|
|
664
|
+
)
|
|
646
665
|
]
|
|
647
666
|
}
|
|
648
667
|
)
|
|
@@ -704,7 +723,11 @@ var SymbolLeverage = (props) => {
|
|
|
704
723
|
] })
|
|
705
724
|
] });
|
|
706
725
|
};
|
|
707
|
-
var LeverageBadge = ({
|
|
726
|
+
var LeverageBadge = ({
|
|
727
|
+
leverage,
|
|
728
|
+
marginMode
|
|
729
|
+
}) => {
|
|
730
|
+
const { t } = i18n.useTranslation();
|
|
708
731
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
709
732
|
"div",
|
|
710
733
|
{
|
|
@@ -714,8 +737,8 @@ var LeverageBadge = ({ leverage }) => {
|
|
|
714
737
|
"oui-text-2xs oui-font-semibold oui-text-base-contrast-36"
|
|
715
738
|
),
|
|
716
739
|
children: [
|
|
717
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: "
|
|
718
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text.numeral, { dp: 0, size: "2xs", unit: "X", children: leverage })
|
|
740
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { children: marginMode === void 0 ? "--" : marginMode === types.MarginMode.ISOLATED ? t("marginMode.isolated") : t("marginMode.cross") }),
|
|
741
|
+
leverage === void 0 ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "2xs", children: "--" }) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text.numeral, { dp: 0, size: "2xs", unit: "X", children: leverage })
|
|
719
742
|
]
|
|
720
743
|
}
|
|
721
744
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/leverage.ui.tsx","../src/leverage.script.ts","../src/leverage.widget.tsx","../src/symbolLeverage/symbolLeverage.script.tsx","../src/symbolLeverage/symbolLeverage.ui.tsx","../src/symbolLeverage/symbolLeverage.widget.tsx","../src/symbolLeverage/index.ts","../src/index.ts"],"names":["jsx","cn","React","inputFormatter","useId","jsxs","ReduceIcon","Flex","Input","PlusIcon","useTranslation","Button","Text","Box","Slider","value","useState","useLeverage","useMemo","leverage","useCallback","toast","useScreen","useSymbolLeverage","modal","OrderSide","useSymbolsInfo","useAccountInfo","useMarkPricesStream","usePortfolio","useLocalStorage","usePositionStream","maxPositionLeverage","positionsPerp","zero","accountPerp","freeCollateral","TokenIcon","Badge","Divider","Trans","registerSimpleSheet","i18n","registerSimpleDialog"],"mappings":"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","file":"index.js","sourcesContent":["import React, { FC, useId } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Button,\n Flex,\n Input,\n Slider,\n Text,\n cn,\n PlusIcon,\n ReduceIcon,\n inputFormatter,\n InputFormatter,\n} from \"@orderly.network/ui\";\nimport { LeverageScriptReturns } from \"./leverage.script\";\n\nconst IconButton: React.FC<{\n Icon: React.ComponentType<any>;\n onClick: React.MouseEventHandler<SVGSVGElement>;\n disabled: boolean;\n}> = (props) => {\n const { Icon, onClick, disabled } = props;\n return (\n <Icon\n onClick={disabled ? undefined : onClick}\n className={cn(\n \"oui-m-2 oui-text-base-contrast oui-transition-all\",\n disabled\n ? \"oui-cursor-not-allowed oui-opacity-20\"\n : \"oui-cursor-pointer oui-opacity-100\",\n )}\n />\n );\n};\n\ntype LeverageInputProps = LeverageProps & {\n classNames?: {\n input?: string;\n unit?: string;\n };\n onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n};\n\nexport const LeverageInput: React.FC<LeverageInputProps> = (props) => {\n const formatters = React.useMemo<InputFormatter[]>(\n () => [inputFormatter.numberFormatter, inputFormatter.dpFormatter(0)],\n [],\n );\n const id = useId();\n return (\n <label\n htmlFor={id}\n className={cn(\n \"oui-w-full\",\n \"oui-rounded\",\n \"oui-bg-base-6\",\n \"oui-flex\",\n \"oui-items-center\",\n \"oui-justify-between\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-light\",\n \"oui-input-root\",\n )}\n >\n <IconButton\n Icon={ReduceIcon}\n onClick={props.onLeverageReduce}\n disabled={props.isReduceDisabled}\n />\n <Flex itemAlign=\"center\" justify=\"center\" className=\"oui-mr-4\">\n <Input\n value={props.value}\n id={id}\n autoComplete=\"off\"\n classNames={{\n input: cn(\"oui-text-right oui-text-[24px]\"),\n root: cn(\n \"oui-w-12\",\n \"oui-px-0\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-none\",\n ),\n }}\n formatters={formatters}\n onChange={props.onInputChange}\n onBlur={props.onInputBlur}\n />\n <div\n className={cn(\n \"oui-ml-1 oui-mt-1 oui-select-none\",\n \"oui-text-base oui-text-base-contrast-36\",\n )}\n >\n x\n </div>\n </Flex>\n <IconButton\n Icon={PlusIcon}\n onClick={props.onLeverageIncrease}\n disabled={props.isIncreaseDisabled}\n />\n </label>\n );\n};\n\nexport type LeverageProps = LeverageScriptReturns;\n\nexport const Leverage: FC<LeverageProps> = (props) => {\n const { currentLeverage } = props;\n const { t } = useTranslation();\n return (\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <LeverageFooter {...props} />\n </Flex>\n );\n};\n\nexport const LeverageFooter: FC<LeverageProps & { isMobile?: boolean }> = (\n props,\n) => {\n const { t } = useTranslation();\n return (\n <Flex direction={\"row\"} gap={2} width={\"100%\"} mt={0} pt={5}>\n <Button\n variant=\"contained\"\n color=\"gray\"\n fullWidth\n onClick={props.onCancel}\n data-testid=\"oui-testid-leverage-cancel-btn\"\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.cancel\")}\n </Button>\n <Button\n fullWidth\n loading={props.isLoading}\n onClick={props.onSave}\n data-testid=\"oui-testid-leverage-save-btn\"\n disabled={props.disabled}\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.save\")}\n </Button>\n </Flex>\n );\n};\n\nexport type LeverageHeaderProps = Pick<LeverageProps, \"currentLeverage\">;\n\nexport const LeverageHeader: FC<LeverageHeaderProps> = (props) => {\n const { t } = useTranslation();\n const { currentLeverage } = props;\n return (\n <Flex justify={\"center\"} width={\"100%\"} mb={2}>\n <Flex gap={1}>\n {`${t(\"common.current\")}:`}\n <Text.numeral unit=\"x\" size={\"sm\"} intensity={80} dp={0}>\n {currentLeverage ?? \"--\"}\n </Text.numeral>\n </Flex>\n </Flex>\n );\n};\n\ninterface LeverageSelectorProps {\n value: number;\n onLeverageChange: (value: number) => void;\n toggles: number[];\n}\n\nexport const LeverageSelector: React.FC<LeverageSelectorProps> = (props) => {\n const { value, onLeverageChange } = props;\n return (\n <Flex\n itemAlign=\"center\"\n justify=\"between\"\n width={\"100%\"}\n mt={4}\n className=\"oui-text-base-contrast-80\"\n >\n {props.toggles.map((option) => (\n <Flex\n key={option}\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(\n `oui-box-border oui-cursor-pointer oui-rounded-md oui-border oui-border-solid oui-bg-clip-padding oui-px-3 oui-py-2.5 oui-transition-all`,\n value === option\n ? \"oui-border-primary oui-bg-base-6\"\n : \"oui-border-line-12\",\n )}\n onClick={() => onLeverageChange?.(option)}\n >\n <Flex\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(`oui-h-3 oui-w-9 oui-select-none`)}\n >\n {option}x\n </Flex>\n </Flex>\n ))}\n </Flex>\n );\n};\n\nexport type LeverageSliderProps = {\n maxLeverage?: number;\n value: number;\n onLeverageChange: (value: number) => void;\n setShowSliderTip: (value: boolean) => void;\n showSliderTip: boolean;\n className?: string;\n onValueCommit?: (value: number[]) => void;\n leverageLevers: number[];\n marks?: { label: string; value: number }[];\n};\n\nconst getMarkPosition = (\n item: number,\n index: number,\n max: number,\n total: number,\n) => {\n // Use the same calculation logic as Slider component marks array\n const min = 1;\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const position = percentPerStep * (item - min);\n\n // Keep boundary adjustments\n if (index === 0) return Math.min(position + 2, 100);\n if (index === total - 1) return Math.max(position - 3, 0);\n return position;\n};\n\nexport const LeverageSlider: FC<LeverageSliderProps> = (props) => {\n const {\n leverageLevers,\n maxLeverage = 0,\n className,\n value,\n showSliderTip,\n marks,\n } = props;\n\n // Use the maximum value of leverageLevers array as slider maximum\n const sliderMax =\n leverageLevers.length > 0 ? Math.max(...leverageLevers) : maxLeverage;\n\n return (\n <Box pt={4} pb={7} width={\"100%\"} className={className}>\n <Slider\n step={1}\n max={maxLeverage}\n min={1}\n // markLabelVisible={true}\n marks={marks}\n // markCount={markCount}\n value={[value]}\n onValueChange={(e) => {\n props.onLeverageChange(e[0]);\n props.setShowSliderTip(true);\n }}\n color=\"primary\"\n onValueCommit={(e) => {\n props.onValueCommit?.(e);\n props.setShowSliderTip(false);\n }}\n showTip={showSliderTip}\n tipFormatter={(value) => {\n return `${value}x`;\n }}\n />\n <div className=\"oui-relative oui-w-full oui-pt-3\">\n {leverageLevers?.map((item, index) => {\n const position = getMarkPosition(\n item,\n index,\n sliderMax,\n leverageLevers.length,\n );\n\n return (\n <button\n key={item}\n onClick={() => {\n props.onLeverageChange(item);\n props.onValueCommit?.([item]);\n }}\n className={cn(\n \"oui-absolute oui-pb-3 oui-text-2xs oui-transform oui--translate-x-1/2\",\n Number(props.value) >= Number(item)\n ? \"oui-text-primary-light\"\n : \"oui-text-base-contrast-54\",\n )}\n style={{\n left: `${position}%`,\n }}\n data-testid={`oui-testid-leverage-${item}-btn`}\n >\n {`${item}x`}\n </button>\n );\n })}\n </div>\n </Box>\n );\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useLeverage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { SliderMarks, toast } from \"@orderly.network/ui\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type LeverageScriptReturns = ReturnType<typeof useLeverageScript>;\n\nexport const useLeverageScript = (options?: UseLeverageScriptOptions) => {\n const [showSliderTip, setShowSliderTip] = useState(false);\n const { t } = useTranslation();\n\n const { curLeverage, maxLeverage, isLoading, leverageLevers, update } =\n useLeverage();\n\n const marks = useMemo<SliderMarks>(() => {\n return leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n }));\n }, [leverageLevers]);\n\n const [leverage, setLeverage] = useState<number>(curLeverage ?? 0);\n\n const step = 100 / ((marks?.length || 0) - 1);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [maxLeverage],\n );\n\n const onSave = async () => {\n try {\n update({ leverage }).then(\n () => {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.log(\"update leverage error\", err);\n }\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n const disabled = !leverage || leverage < 1 || leverage > maxLeverage;\n\n const toggles = useMemo(() => {\n return [5, 10, 20, 50, 100].filter((e) => e <= maxLeverage);\n }, [maxLeverage]);\n\n return {\n leverageLevers,\n currentLeverage: curLeverage,\n value: leverage,\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading: isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles,\n };\n};\n","import { FC } from \"react\";\nimport { Leverage } from \"./leverage.ui\";\nimport { useLeverageScript } from \"./leverage.script\";\n\nexport type LeverageEditorProps = {\n close?: () => void;\n};\n\nexport const LeverageEditor: FC<LeverageEditorProps> = (props) => {\n const state = useLeverageScript({ close: props.close });\n return <Leverage {...state} />;\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n useAccountInfo,\n useLocalStorage,\n useMarkPricesStream,\n usePortfolio,\n usePositionStream,\n useSymbolLeverage,\n useSymbolsInfo,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n account as accountPerp,\n positions as positionsPerp,\n} from \"@orderly.network/perp\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport {\n modal,\n SliderMarks,\n toast,\n useScreen,\n Text,\n} from \"@orderly.network/ui\";\nimport { zero } from \"@orderly.network/utils\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type SymbolLeverageScriptOptions = {\n symbol: string;\n side?: OrderSide;\n curLeverage: number;\n};\n\nexport type SymbolLeverageScriptReturns = ReturnType<\n typeof useSymbolLeverageScript\n>;\n\nexport const useSymbolLeverageScript = (\n options: SymbolLeverageScriptOptions & UseLeverageScriptOptions,\n) => {\n const { curLeverage = 1, symbol, side } = options;\n const [showSliderTip, setShowSliderTip] = useState(false);\n // Local leverage value used by the input and slider; it tracks the in-flight user edits.\n // We seed it with curLeverage but intentionally do not sync further changes to avoid jumping while editing.\n const [leverage, setLeverage] = useState<number>(curLeverage);\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const {\n maxLeverage: originalMaxLeverage,\n update,\n isLoading,\n } = useSymbolLeverage(symbol);\n\n const maxLeverage = originalMaxLeverage;\n\n const {\n position,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n } = useCalc({ symbol: symbol!, leverage, maxLeverage });\n\n const formattedLeverageLevers = useMemo(() => {\n return generateLeverageLeversForSelector(maxLeverage);\n }, [maxLeverage]);\n\n const leverageLevers = useMemo(() => {\n return generateLeverageLevers(maxLeverage);\n }, [maxLeverage]);\n\n const marks = useMemo<SliderMarks>(() => {\n return (\n leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n })) || []\n );\n }, [leverageLevers]);\n\n const step = useMemo(() => {\n return 100 / ((marks?.length || 0) - 1);\n }, [marks]);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [],\n );\n\n const onInputBlur = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n (e) => {\n const inputValue = e.target.value.trim();\n if (inputValue === \"\") {\n setLeverage(curLeverage);\n }\n },\n [curLeverage],\n );\n\n const onConfirmSave = async () => {\n try {\n update?.({ leverage, symbol }).then(\n (res) => {\n if (res.success) {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n } else {\n toast.error(res.message);\n }\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.error(\"update leverage error\", err);\n }\n };\n\n const onSave = async () => {\n modal.confirm({\n title: t(\"leverage.confirm\"),\n content: <Text intensity={54}>{t(\"leverage.confirm.content\")}</Text>,\n onOk: onConfirmSave,\n onCancel: () => {\n return Promise.resolve();\n },\n });\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n\n const isBuy = side\n ? side === OrderSide.BUY\n : position?.position_qty && position.position_qty > 0;\n\n const disabled =\n !leverage ||\n leverage < 1 ||\n leverage > maxLeverage ||\n overRequiredMargin ||\n overMaxPositionLeverage;\n\n return {\n leverageLevers,\n currentLeverage: curLeverage, // Keep the displayed leverage fixed until the user confirms the change.\n value: leverage, // Input and slider reflect the temporary value being edited.\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n onInputBlur,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles: formattedLeverageLevers,\n symbol,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n isBuy,\n isMobile,\n };\n};\n\n// 5x: 1x, 2x, 3x, 4x, 5x\n// 10x: 1x, 3x, 5x, 8x, 10x\n// 20x: 1x, 5x, 10x, 15x, 20x\n// 50x: 1x, 10x, 20x, 35x, 50x\n// 100x: 1x, 20x, 50x, 75x, 100x\nconst generateLeverageLeversForSelector = (max: number) => {\n if (max === 10) {\n return [1, 3, 5, 8, 10];\n } else if (max === 50) {\n return [1, 10, 20, 35, 50];\n }\n\n const min = 1;\n const parts = 5;\n const step = (max - min) / (parts - 1);\n const result: number[] = [];\n for (let i = 0; i < parts; i++) {\n result.push(Math.floor(min + step * i));\n }\n return result;\n};\n/**\n * Generate evenly distributed marks\n * @param max Maximum leverage value\n * @returns Array of evenly distributed marks\n */\nconst generateEvenlyDistributedMarks = (max: number): number[] => {\n const result: number[] = [];\n\n // Check if divisible by 5\n if (max % 5 === 0) {\n // Divisible by 5, divide from 0 to max into 5 intervals (6 marks), 1x represents 0\n const step = max / 5;\n for (let i = 0; i < 6; i++) {\n const value = step * i;\n result.push(value === 0 ? 1 : value); // 0 displays as 1x, other values display normally\n }\n } else {\n // Not divisible by 5, use 25%, 50%, 75% strategy to select nearest integers\n result.push(1); // Always include 1x\n\n // Calculate values at 25%, 50%, 75% positions\n const quarter = max * 0.25;\n const half = max * 0.5;\n const threeQuarter = max * 0.75;\n\n // Select nearest integers\n const quarterRounded = Math.round(quarter);\n const halfRounded = Math.round(half);\n const threeQuarterRounded = Math.round(threeQuarter);\n\n // Add 25% position value (if greater than 1 and not equal to 50%)\n if (quarterRounded > 1 && quarterRounded !== halfRounded) {\n result.push(quarterRounded);\n }\n\n // Add 50% position value (if greater than 1)\n if (halfRounded > 1) {\n result.push(halfRounded);\n }\n\n // Add 75% position value (if greater than 50% and less than max)\n if (threeQuarterRounded > halfRounded && threeQuarterRounded < max) {\n result.push(threeQuarterRounded);\n }\n\n // Add maximum value (if greater than 1)\n if (max > 1) {\n result.push(max);\n }\n }\n\n return result;\n};\n\n// 5x: 1, 2, 3, 4, 5\n// 10x: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n// 20x: 1, 5, 10, 15, 20\n// 50x: 1, 10, 20, 30, 40, 50\n// 100x: 1, 20, 40, 60, 80, 100\nconst generateLeverageLevers = (max: number) => {\n switch (max) {\n case 10:\n return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n case 20:\n return [1, 5, 10, 15, 20];\n case 50:\n return [1, 10, 20, 30, 40, 50];\n case 100:\n return [1, 20, 40, 60, 80, 100];\n }\n\n // Fallback strategy: evenly distribute mark distances, treat 1x as 0\n const result: number[] = [];\n // Optimization\n if (max < 10) {\n // For 10x and below, divide into n equal parts, each with length 1\n for (let i = 1; i <= max; i++) {\n result.push(i);\n }\n } else {\n // Use unified even distribution strategy\n result.push(...generateEvenlyDistributedMarks(max));\n }\n\n return result;\n};\n\nfunction useCalc(inputs: {\n symbol: string;\n leverage: number;\n maxLeverage: number;\n}) {\n const { symbol, leverage, maxLeverage } = inputs;\n\n const symbolsInfo = useSymbolsInfo();\n const { data: accountInfo } = useAccountInfo();\n const { data: markPrices } = useMarkPricesStream();\n const { totalCollateral } = usePortfolio();\n\n const [unPnlPriceBasis, setUnPnlPriceBasic] = useLocalStorage(\n \"unPnlPriceBasis\",\n \"markPrice\",\n );\n const [positions] = usePositionStream(\"all\", {\n calcMode: unPnlPriceBasis,\n });\n\n const position = useMemo(() => {\n if (symbol && positions?.rows?.length) {\n return positions.rows.find((item) => item.symbol === symbol);\n }\n }, [positions, symbol]);\n\n /** the highest allowable leverage. Block users from setting leverage above this limit. */\n const maxPositionLeverage = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n const notional = position?.notional;\n // when user has existing position\n if (IMRFactor && notional) {\n const maxPositionLeverage = positionsPerp.maxPositionLeverage({\n IMRFactor,\n notional,\n });\n return Math.min(maxPositionLeverage, maxLeverage);\n }\n\n // when user has no existing position\n return maxLeverage;\n }, [position, maxLeverage, symbol]);\n\n /** calculate maximum position at current leverage */\n const maxPositionNotional = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n if (leverage && IMRFactor) {\n return positionsPerp.maxPositionNotional({\n leverage,\n IMRFactor,\n });\n }\n }, [leverage, symbol]);\n\n const overMaxPositionLeverage = useMemo(() => {\n return leverage > maxPositionLeverage;\n }, [leverage, maxPositionLeverage]);\n\n // calc free collateral with new leverage\n const freeCollateral = useMemo(() => {\n if (!accountInfo || !markPrices || !symbolsInfo) {\n return zero;\n }\n\n const positionList = leverage\n ? positions?.rows.map((item) => {\n if (item.symbol === symbol) {\n return {\n ...item,\n leverage,\n };\n }\n return item;\n })\n : positions?.rows;\n\n const totalInitialMarginWithOrders = accountPerp.totalInitialMarginWithQty({\n positions: positionList,\n markPrices,\n IMR_Factors: accountInfo.imr_factor,\n // not used\n maxLeverage: accountInfo.max_leverage,\n symbolInfo: symbolsInfo,\n });\n\n const freeCollateral = accountPerp.freeCollateral({\n totalCollateral,\n totalInitialMarginWithOrders,\n });\n\n return freeCollateral;\n }, [\n positions,\n symbolsInfo,\n accountInfo,\n markPrices,\n totalCollateral,\n leverage,\n symbol,\n ]);\n\n const overRequiredMargin = useMemo(() => {\n return freeCollateral.eq(0) || freeCollateral.isNegative();\n }, [freeCollateral]);\n\n return {\n position,\n freeCollateral,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n };\n}\n","import { useTranslation, Trans } from \"@orderly.network/i18n\";\nimport { TokenIcon, Text, Badge, Divider, Flex, cn } from \"@orderly.network/ui\";\nimport { LeverageHeader } from \"../index\";\nimport {\n LeverageInput,\n LeverageSelector,\n LeverageSlider,\n LeverageFooter,\n} from \"../leverage.ui\";\nimport { SymbolLeverageScriptReturns } from \"./symbolLeverage.script\";\n\nexport const SymbolLeverage = (props: SymbolLeverageScriptReturns) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4\">\n <div className=\"oui-flex oui-items-center oui-gap-2\">\n <TokenIcon symbol={props.symbol} className=\"oui-size-5\" />\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size={props.isMobile ? \"xs\" : \"base\"}\n weight=\"semibold\"\n intensity={98}\n >\n {props.symbol}\n </Text.formatted>\n <div\n className={cn([\"oui-ml-auto oui-flex oui-items-center oui-gap-1\"])}\n >\n <Badge color={props.isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {props.isBuy ? t(\"common.long\") : t(\"common.short\")}\n </Badge>\n <LeverageBadge leverage={props.currentLeverage} />\n </div>\n </div>\n <Divider />\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={props.currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <Divider className=\"oui-mb-3 oui-w-full\" />\n <div className=\"oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54\">\n {/* <div>\n <Trans\n i18nKey=\"leverage.maxPositionLeverage.tips\"\n values={{ amount: props.maxPositionNotional }}\n components={[\n // @ts-ignore\n <Text.numeral\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n dp={0}\n />,\n ]}\n />\n </div> */}\n <div>\n <Trans\n i18nKey=\"leverage.maxAvailableLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral\n dp={0}\n suffix=\"x\"\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n />,\n ]}\n />\n </div>\n <div>{t(\"leverage.actualPositionLeverage.tips\")}</div>\n </div>\n <div\n className={cn([\n \"-oui-mb-2\",\n props.overRequiredMargin || props.overMaxPositionLeverage\n ? \"oui-block oui-text-xs oui-font-normal\"\n : \"oui-hidden\",\n ])}\n >\n {props.overRequiredMargin && (\n <div>\n <Text color=\"warning\">\n {t(\"leverage.overRequiredMargin.tips\")}\n </Text>\n </div>\n )}\n {props.overMaxPositionLeverage && (\n <div>\n <Text color=\"warning\">\n <Trans\n i18nKey=\"leverage.overMaxPositionLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral dp={0} suffix=\"X\" as=\"span\" key=\"0\" />,\n ]}\n />\n </Text>\n </div>\n )}\n </div>\n <LeverageFooter {...props} />\n </Flex>\n </div>\n );\n};\n\nconst LeverageBadge = ({ leverage }: { leverage: number }) => {\n return (\n <div\n className={cn(\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-1\",\n \"oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2\",\n \"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\",\n )}\n >\n <Text>Cross</Text>\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport {\n SymbolLeverageScriptOptions,\n useSymbolLeverageScript,\n} from \"./symbolLeverage.script\";\nimport { SymbolLeverage } from \"./symbolLeverage.ui\";\n\nexport type SymbolLeverageWidgetProps = {\n close?: () => void;\n} & SymbolLeverageScriptOptions;\n\nexport const SymbolLeverageWidget: FC<SymbolLeverageWidgetProps> = (props) => {\n const state = useSymbolLeverageScript(props);\n return <SymbolLeverage {...state} />;\n};\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { SymbolLeverageWidget } from \"./symbolLeverage.widget\";\n\nexport {\n SymbolLeverageWidget,\n type SymbolLeverageWidgetProps,\n} from \"./symbolLeverage.widget\";\n\nexport const SymbolLeverageSheetId = \"SymbolLeverageSheetId\";\nexport const SymbolLeverageDialogId = \"SymbolLeverageDialogId\";\n\n// Register sheet version for mobile\nregisterSimpleSheet(SymbolLeverageSheetId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n // content: \"oui-p-5\",\n },\n});\n\n// Register dialog version for desktop\nregisterSimpleDialog(SymbolLeverageDialogId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n content: \"oui-w-[420px]\",\n },\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { LeverageEditor } from \"./leverage.widget\";\n\nexport { LeverageEditor, type LeverageEditorProps } from \"./leverage.widget\";\nexport { Leverage, LeverageSlider, LeverageHeader } from \"./leverage.ui\";\nexport type {\n LeverageProps,\n LeverageSliderProps,\n LeverageHeaderProps,\n} from \"./leverage.ui\";\nexport {\n useLeverageScript,\n type LeverageScriptReturns,\n} from \"./leverage.script\";\nexport * from \"./symbolLeverage\";\n\nexport const LeverageWidgetWithDialogId = \"LeverageWidgetWithDialog\";\nexport const LeverageWidgetWithSheetId = \"LeverageWidgetWithSheet\";\n\nregisterSimpleDialog(LeverageWidgetWithDialogId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n size: \"md\",\n});\n\nregisterSimpleSheet(LeverageWidgetWithSheetId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/leverage.ui.tsx","../src/leverage.script.ts","../src/leverage.widget.tsx","../src/symbolLeverage/symbolLeverage.script.tsx","../src/symbolLeverage/symbolLeverage.ui.tsx","../src/symbolLeverage/symbolLeverage.widget.tsx","../src/symbolLeverage/index.ts","../src/index.ts"],"names":["jsx","cn","React","inputFormatter","useId","jsxs","ReduceIcon","Flex","Input","PlusIcon","useTranslation","Button","Text","Box","Slider","value","useState","useLeverage","useMemo","leverage","useCallback","toast","useScreen","useSymbolLeverage","useEffect","modal","OrderSide","useSymbolsInfo","useAccountInfo","useMarkPricesStream","usePortfolio","useLocalStorage","usePositionStream","maxPositionLeverage","positionsPerp","zero","MarginMode","accountPerp","freeCollateral","TokenIcon","Badge","Divider","Trans","registerSimpleSheet","i18n","registerSimpleDialog"],"mappings":"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","file":"index.js","sourcesContent":["import React, { FC, useId } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Button,\n Flex,\n Input,\n Slider,\n Text,\n cn,\n PlusIcon,\n ReduceIcon,\n inputFormatter,\n InputFormatter,\n} from \"@orderly.network/ui\";\nimport { LeverageScriptReturns } from \"./leverage.script\";\n\nconst IconButton: React.FC<{\n Icon: React.ComponentType<any>;\n onClick: React.MouseEventHandler<SVGSVGElement>;\n disabled: boolean;\n}> = (props) => {\n const { Icon, onClick, disabled } = props;\n return (\n <Icon\n onClick={disabled ? undefined : onClick}\n className={cn(\n \"oui-m-2 oui-text-base-contrast oui-transition-all\",\n disabled\n ? \"oui-cursor-not-allowed oui-opacity-20\"\n : \"oui-cursor-pointer oui-opacity-100\",\n )}\n />\n );\n};\n\ntype LeverageInputProps = LeverageProps & {\n classNames?: {\n input?: string;\n unit?: string;\n };\n onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n};\n\nexport const LeverageInput: React.FC<LeverageInputProps> = (props) => {\n const formatters = React.useMemo<InputFormatter[]>(\n () => [inputFormatter.numberFormatter, inputFormatter.dpFormatter(0)],\n [],\n );\n const id = useId();\n return (\n <label\n htmlFor={id}\n className={cn(\n \"oui-w-full\",\n \"oui-rounded\",\n \"oui-bg-base-6\",\n \"oui-flex\",\n \"oui-items-center\",\n \"oui-justify-between\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-light\",\n \"oui-input-root\",\n )}\n >\n <IconButton\n Icon={ReduceIcon}\n onClick={props.onLeverageReduce}\n disabled={props.isReduceDisabled}\n />\n <Flex itemAlign=\"center\" justify=\"center\" className=\"oui-mr-4\">\n <Input\n value={props.value}\n id={id}\n autoComplete=\"off\"\n classNames={{\n input: cn(\"oui-text-right oui-text-[24px]\"),\n root: cn(\n \"oui-w-12\",\n \"oui-px-0\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-none\",\n ),\n }}\n formatters={formatters}\n onChange={props.onInputChange}\n onBlur={props.onInputBlur}\n />\n <div\n className={cn(\n \"oui-ml-1 oui-mt-1 oui-select-none\",\n \"oui-text-base oui-text-base-contrast-36\",\n )}\n >\n x\n </div>\n </Flex>\n <IconButton\n Icon={PlusIcon}\n onClick={props.onLeverageIncrease}\n disabled={props.isIncreaseDisabled}\n />\n </label>\n );\n};\n\nexport type LeverageProps = LeverageScriptReturns;\n\nexport const Leverage: FC<LeverageProps> = (props) => {\n const { currentLeverage } = props;\n const { t } = useTranslation();\n return (\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <LeverageFooter {...props} />\n </Flex>\n );\n};\n\nexport const LeverageFooter: FC<LeverageProps & { isMobile?: boolean }> = (\n props,\n) => {\n const { t } = useTranslation();\n return (\n <Flex direction={\"row\"} gap={2} width={\"100%\"} mt={0} pt={5}>\n <Button\n variant=\"contained\"\n color=\"gray\"\n fullWidth\n onClick={props.onCancel}\n data-testid=\"oui-testid-leverage-cancel-btn\"\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.cancel\")}\n </Button>\n <Button\n fullWidth\n loading={props.isLoading}\n onClick={props.onSave}\n data-testid=\"oui-testid-leverage-save-btn\"\n disabled={props.disabled}\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.save\")}\n </Button>\n </Flex>\n );\n};\n\nexport type LeverageHeaderProps = Pick<LeverageProps, \"currentLeverage\">;\n\nexport const LeverageHeader: FC<LeverageHeaderProps> = (props) => {\n const { t } = useTranslation();\n const { currentLeverage } = props;\n return (\n <Flex justify={\"center\"} width={\"100%\"} mb={2}>\n <Flex gap={1}>\n {`${t(\"common.current\")}:`}\n <Text.numeral unit=\"x\" size={\"sm\"} intensity={80} dp={0}>\n {currentLeverage ?? \"--\"}\n </Text.numeral>\n </Flex>\n </Flex>\n );\n};\n\ninterface LeverageSelectorProps {\n value: number;\n onLeverageChange: (value: number) => void;\n toggles: number[];\n}\n\nexport const LeverageSelector: React.FC<LeverageSelectorProps> = (props) => {\n const { value, onLeverageChange } = props;\n return (\n <Flex\n itemAlign=\"center\"\n justify=\"between\"\n width={\"100%\"}\n mt={4}\n className=\"oui-text-base-contrast-80\"\n >\n {props.toggles.map((option) => (\n <Flex\n key={option}\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(\n `oui-box-border oui-cursor-pointer oui-rounded-md oui-border oui-border-solid oui-bg-clip-padding oui-px-3 oui-py-2.5 oui-transition-all`,\n value === option\n ? \"oui-border-primary oui-bg-base-6\"\n : \"oui-border-line-12\",\n )}\n onClick={() => onLeverageChange?.(option)}\n >\n <Flex\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(`oui-h-3 oui-w-9 oui-select-none`)}\n >\n {option}x\n </Flex>\n </Flex>\n ))}\n </Flex>\n );\n};\n\nexport type LeverageSliderProps = {\n maxLeverage?: number;\n value: number;\n onLeverageChange: (value: number) => void;\n setShowSliderTip: (value: boolean) => void;\n showSliderTip: boolean;\n className?: string;\n onValueCommit?: (value: number[]) => void;\n leverageLevers: number[];\n marks?: { label: string; value: number }[];\n};\n\nconst getMarkPosition = (\n item: number,\n index: number,\n max: number,\n total: number,\n) => {\n // Use the same calculation logic as Slider component marks array\n const min = 1;\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const position = percentPerStep * (item - min);\n\n // Keep boundary adjustments\n if (index === 0) return Math.min(position + 2, 100);\n if (index === total - 1) return Math.max(position - 3, 0);\n return position;\n};\n\nexport const LeverageSlider: FC<LeverageSliderProps> = (props) => {\n const {\n leverageLevers,\n maxLeverage = 0,\n className,\n value,\n showSliderTip,\n marks,\n } = props;\n\n // Use the maximum value of leverageLevers array as slider maximum\n const sliderMax =\n leverageLevers.length > 0 ? Math.max(...leverageLevers) : maxLeverage;\n\n return (\n <Box pt={4} pb={7} width={\"100%\"} className={className}>\n <Slider\n step={1}\n max={maxLeverage}\n min={1}\n // markLabelVisible={true}\n marks={marks}\n // markCount={markCount}\n value={[value]}\n onValueChange={(e) => {\n props.onLeverageChange(e[0]);\n props.setShowSliderTip(true);\n }}\n color=\"primary\"\n onValueCommit={(e) => {\n props.onValueCommit?.(e);\n props.setShowSliderTip(false);\n }}\n showTip={showSliderTip}\n tipFormatter={(value) => {\n return `${value}x`;\n }}\n />\n <div className=\"oui-relative oui-w-full oui-pt-3\">\n {leverageLevers?.map((item, index) => {\n const position = getMarkPosition(\n item,\n index,\n sliderMax,\n leverageLevers.length,\n );\n\n return (\n <button\n key={item}\n onClick={() => {\n props.onLeverageChange(item);\n props.onValueCommit?.([item]);\n }}\n className={cn(\n \"oui-absolute oui-pb-3 oui-text-2xs oui-transform oui--translate-x-1/2\",\n Number(props.value) >= Number(item)\n ? \"oui-text-primary-light\"\n : \"oui-text-base-contrast-54\",\n )}\n style={{\n left: `${position}%`,\n }}\n data-testid={`oui-testid-leverage-${item}-btn`}\n >\n {`${item}x`}\n </button>\n );\n })}\n </div>\n </Box>\n );\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useLeverage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { SliderMarks, toast } from \"@orderly.network/ui\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type LeverageScriptReturns = ReturnType<typeof useLeverageScript>;\n\nexport const useLeverageScript = (options?: UseLeverageScriptOptions) => {\n const [showSliderTip, setShowSliderTip] = useState(false);\n const { t } = useTranslation();\n\n const { curLeverage, maxLeverage, isLoading, leverageLevers, update } =\n useLeverage();\n\n const marks = useMemo<SliderMarks>(() => {\n return leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n }));\n }, [leverageLevers]);\n\n const [leverage, setLeverage] = useState<number>(curLeverage ?? 0);\n\n const step = 100 / ((marks?.length || 0) - 1);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [maxLeverage],\n );\n\n const onSave = async () => {\n try {\n update({ leverage }).then(\n () => {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.log(\"update leverage error\", err);\n }\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n const disabled = !leverage || leverage < 1 || leverage > maxLeverage;\n\n const toggles = useMemo(() => {\n return [5, 10, 20, 50, 100].filter((e) => e <= maxLeverage);\n }, [maxLeverage]);\n\n return {\n leverageLevers,\n currentLeverage: curLeverage,\n value: leverage,\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading: isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles,\n };\n};\n","import { FC } from \"react\";\nimport { Leverage } from \"./leverage.ui\";\nimport { useLeverageScript } from \"./leverage.script\";\n\nexport type LeverageEditorProps = {\n close?: () => void;\n};\n\nexport const LeverageEditor: FC<LeverageEditorProps> = (props) => {\n const state = useLeverageScript({ close: props.close });\n return <Leverage {...state} />;\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useAccountInfo,\n useLocalStorage,\n useMarkPricesStream,\n usePortfolio,\n usePositionStream,\n useSymbolLeverage,\n useSymbolsInfo,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n account as accountPerp,\n positions as positionsPerp,\n} from \"@orderly.network/perp\";\nimport { MarginMode, OrderSide } from \"@orderly.network/types\";\nimport {\n modal,\n SliderMarks,\n toast,\n useScreen,\n Text,\n} from \"@orderly.network/ui\";\nimport { zero } from \"@orderly.network/utils\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type SymbolLeverageScriptOptions = {\n symbol: string;\n side?: OrderSide;\n curLeverage: number;\n marginMode: MarginMode;\n};\n\nexport type SymbolLeverageScriptReturns = ReturnType<\n typeof useSymbolLeverageScript\n>;\n\nexport const useSymbolLeverageScript = (\n options: SymbolLeverageScriptOptions & UseLeverageScriptOptions,\n) => {\n const { curLeverage = 1, symbol, side, marginMode } = options;\n const [showSliderTip, setShowSliderTip] = useState(false);\n // Local leverage value used by the input and slider; it tracks the in-flight user edits.\n // We seed it with curLeverage but intentionally do not sync further changes to avoid jumping while editing.\n const [leverage, setLeverage] = useState<number>(curLeverage);\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const {\n maxLeverage: originalMaxLeverage,\n update,\n isLoading,\n } = useSymbolLeverage(symbol);\n\n // Sync when external current leverage changes (e.g. symbol or margin mode changed)\n useEffect(() => {\n setLeverage(curLeverage);\n }, [curLeverage]);\n\n const maxLeverage = originalMaxLeverage;\n\n const {\n position,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n } = useCalc({ symbol: symbol!, leverage, maxLeverage, marginMode });\n\n const formattedLeverageLevers = useMemo(() => {\n return generateLeverageLeversForSelector(maxLeverage);\n }, [maxLeverage]);\n\n const leverageLevers = useMemo(() => {\n return generateLeverageLevers(maxLeverage);\n }, [maxLeverage]);\n\n const marks = useMemo<SliderMarks>(() => {\n return (\n leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n })) || []\n );\n }, [leverageLevers]);\n\n const step = useMemo(() => {\n return 100 / ((marks?.length || 0) - 1);\n }, [marks]);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [],\n );\n\n const onInputBlur = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n (e) => {\n const inputValue = e.target.value.trim();\n if (inputValue === \"\") {\n setLeverage(curLeverage);\n }\n },\n [curLeverage],\n );\n\n const onConfirmSave = async () => {\n try {\n update?.({ leverage, symbol, margin_mode: marginMode }).then(\n (res) => {\n if (res.success) {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n } else {\n toast.error(res.message);\n }\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.error(\"update leverage error\", err);\n }\n };\n\n const onSave = async () => {\n modal.confirm({\n title: t(\"leverage.confirm\"),\n content: <Text intensity={54}>{t(\"leverage.confirm.content\")}</Text>,\n onOk: onConfirmSave,\n onCancel: () => {\n return Promise.resolve();\n },\n });\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n\n const isBuy = side\n ? side === OrderSide.BUY\n : position?.position_qty && position.position_qty > 0;\n\n const disabled =\n !leverage ||\n leverage < 1 ||\n leverage > maxLeverage ||\n overRequiredMargin ||\n overMaxPositionLeverage;\n\n return {\n leverageLevers,\n currentLeverage: curLeverage, // Keep the displayed leverage fixed until the user confirms the change.\n value: leverage, // Input and slider reflect the temporary value being edited.\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n onInputBlur,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles: formattedLeverageLevers,\n symbol,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n isBuy,\n isMobile,\n marginMode,\n };\n};\n\n// 5x: 1x, 2x, 3x, 4x, 5x\n// 10x: 1x, 3x, 5x, 8x, 10x\n// 20x: 1x, 5x, 10x, 15x, 20x\n// 50x: 1x, 10x, 20x, 35x, 50x\n// 100x: 1x, 20x, 50x, 75x, 100x\nconst generateLeverageLeversForSelector = (max: number) => {\n if (max === 10) {\n return [1, 3, 5, 8, 10];\n } else if (max === 50) {\n return [1, 10, 20, 35, 50];\n }\n\n const min = 1;\n const parts = 5;\n const step = (max - min) / (parts - 1);\n const result: number[] = [];\n for (let i = 0; i < parts; i++) {\n result.push(Math.floor(min + step * i));\n }\n return result;\n};\n/**\n * Generate evenly distributed marks\n * @param max Maximum leverage value\n * @returns Array of evenly distributed marks\n */\nconst generateEvenlyDistributedMarks = (max: number): number[] => {\n const result: number[] = [];\n\n // Check if divisible by 5\n if (max % 5 === 0) {\n // Divisible by 5, divide from 0 to max into 5 intervals (6 marks), 1x represents 0\n const step = max / 5;\n for (let i = 0; i < 6; i++) {\n const value = step * i;\n result.push(value === 0 ? 1 : value); // 0 displays as 1x, other values display normally\n }\n } else {\n // Not divisible by 5, use 25%, 50%, 75% strategy to select nearest integers\n result.push(1); // Always include 1x\n\n // Calculate values at 25%, 50%, 75% positions\n const quarter = max * 0.25;\n const half = max * 0.5;\n const threeQuarter = max * 0.75;\n\n // Select nearest integers\n const quarterRounded = Math.round(quarter);\n const halfRounded = Math.round(half);\n const threeQuarterRounded = Math.round(threeQuarter);\n\n // Add 25% position value (if greater than 1 and not equal to 50%)\n if (quarterRounded > 1 && quarterRounded !== halfRounded) {\n result.push(quarterRounded);\n }\n\n // Add 50% position value (if greater than 1)\n if (halfRounded > 1) {\n result.push(halfRounded);\n }\n\n // Add 75% position value (if greater than 50% and less than max)\n if (threeQuarterRounded > halfRounded && threeQuarterRounded < max) {\n result.push(threeQuarterRounded);\n }\n\n // Add maximum value (if greater than 1)\n if (max > 1) {\n result.push(max);\n }\n }\n\n return result;\n};\n\n// 5x: 1, 2, 3, 4, 5\n// 10x: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n// 20x: 1, 5, 10, 15, 20\n// 50x: 1, 10, 20, 30, 40, 50\n// 100x: 1, 20, 40, 60, 80, 100\nconst generateLeverageLevers = (max: number) => {\n switch (max) {\n case 10:\n return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n case 20:\n return [1, 5, 10, 15, 20];\n case 50:\n return [1, 10, 20, 30, 40, 50];\n case 100:\n return [1, 20, 40, 60, 80, 100];\n }\n\n // Fallback strategy: evenly distribute mark distances, treat 1x as 0\n const result: number[] = [];\n // Optimization\n if (max < 10) {\n // For 10x and below, divide into n equal parts, each with length 1\n for (let i = 1; i <= max; i++) {\n result.push(i);\n }\n } else {\n // Use unified even distribution strategy\n result.push(...generateEvenlyDistributedMarks(max));\n }\n\n return result;\n};\n\nfunction useCalc(inputs: {\n symbol: string;\n leverage: number;\n maxLeverage: number;\n marginMode: MarginMode;\n}) {\n const { symbol, leverage, maxLeverage, marginMode } = inputs;\n\n const symbolsInfo = useSymbolsInfo();\n const { data: accountInfo } = useAccountInfo();\n const { data: markPrices } = useMarkPricesStream();\n const { totalCollateral } = usePortfolio();\n\n const [unPnlPriceBasis, setUnPnlPriceBasic] = useLocalStorage(\n \"unPnlPriceBasis\",\n \"markPrice\",\n );\n const [positions] = usePositionStream(\"all\", {\n calcMode: unPnlPriceBasis,\n });\n\n const position = useMemo(() => {\n if (symbol && positions?.rows?.length) {\n return positions.rows.find(\n (item) => item.symbol === symbol && item.margin_mode === marginMode,\n );\n }\n }, [positions, symbol, marginMode]);\n\n /** the highest allowable leverage. Block users from setting leverage above this limit. */\n const maxPositionLeverage = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n const notional = position?.notional;\n // when user has existing position\n if (IMRFactor && notional) {\n const maxPositionLeverage = positionsPerp.maxPositionLeverage({\n IMRFactor,\n notional,\n });\n return Math.min(maxPositionLeverage, maxLeverage);\n }\n\n // when user has no existing position\n return maxLeverage;\n }, [position, maxLeverage, symbol]);\n\n /** calculate maximum position at current leverage */\n const maxPositionNotional = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n if (leverage && IMRFactor) {\n return positionsPerp.maxPositionNotional({\n leverage,\n IMRFactor,\n });\n }\n }, [leverage, symbol]);\n\n const overMaxPositionLeverage = useMemo(() => {\n return leverage > maxPositionLeverage;\n }, [leverage, maxPositionLeverage]);\n\n // calc free collateral with new leverage\n const freeCollateral = useMemo(() => {\n if (!accountInfo || !markPrices || !symbolsInfo) {\n return zero;\n }\n\n const positionList = leverage\n ? positions?.rows.map((item) => {\n if (item.symbol === symbol && item.margin_mode === marginMode) {\n return {\n ...item,\n leverage,\n };\n }\n return item;\n })\n : positions?.rows;\n const maxLeverageBySymbol =\n positionList?.reduce<Record<string, number>>((acc, item) => {\n if (\n item.margin_mode !== MarginMode.ISOLATED &&\n item.leverage &&\n !acc[item.symbol]\n ) {\n acc[item.symbol] = item.leverage;\n }\n return acc;\n }, {}) ?? {};\n\n // TODO: Pass actual orders data for accurate initial margin calculation\n const totalInitialMarginWithOrders = accountPerp.totalInitialMarginWithQty({\n positions: positionList,\n orders: [],\n markPrices,\n IMR_Factors: accountInfo.imr_factor,\n maxLeverageBySymbol,\n symbolInfo: symbolsInfo,\n });\n\n const freeCollateral = accountPerp.freeCollateral({\n totalCollateral,\n totalInitialMarginWithOrders,\n });\n\n return freeCollateral;\n }, [\n positions,\n symbolsInfo,\n accountInfo,\n markPrices,\n totalCollateral,\n leverage,\n symbol,\n marginMode,\n ]);\n\n const overRequiredMargin = useMemo(() => {\n return freeCollateral.eq(0) || freeCollateral.isNegative();\n }, [freeCollateral]);\n\n return {\n position,\n freeCollateral,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n };\n}\n","import { useTranslation, Trans } from \"@orderly.network/i18n\";\nimport { MarginMode } from \"@orderly.network/types\";\nimport { TokenIcon, Text, Badge, Divider, Flex, cn } from \"@orderly.network/ui\";\nimport { LeverageHeader } from \"../index\";\nimport {\n LeverageInput,\n LeverageSelector,\n LeverageSlider,\n LeverageFooter,\n} from \"../leverage.ui\";\nimport { SymbolLeverageScriptReturns } from \"./symbolLeverage.script\";\n\nexport const SymbolLeverage = (props: SymbolLeverageScriptReturns) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4\">\n <div className=\"oui-flex oui-items-center oui-gap-2\">\n <TokenIcon symbol={props.symbol} className=\"oui-size-5\" />\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size={props.isMobile ? \"xs\" : \"base\"}\n weight=\"semibold\"\n intensity={98}\n >\n {props.symbol}\n </Text.formatted>\n <div\n className={cn([\"oui-ml-auto oui-flex oui-items-center oui-gap-1\"])}\n >\n <Badge color={props.isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {props.isBuy ? t(\"common.long\") : t(\"common.short\")}\n </Badge>\n <LeverageBadge\n leverage={props.currentLeverage}\n marginMode={props.marginMode}\n />\n </div>\n </div>\n <Divider />\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={props.currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <Divider className=\"oui-mb-3 oui-w-full\" />\n <div className=\"oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54\">\n {/* <div>\n <Trans\n i18nKey=\"leverage.maxPositionLeverage.tips\"\n values={{ amount: props.maxPositionNotional }}\n components={[\n // @ts-ignore\n <Text.numeral\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n dp={0}\n />,\n ]}\n />\n </div> */}\n <div>\n <Trans\n i18nKey=\"leverage.maxAvailableLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral\n dp={0}\n suffix=\"x\"\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n />,\n ]}\n />\n </div>\n <div>{t(\"leverage.actualPositionLeverage.tips\")}</div>\n </div>\n <div\n className={cn([\n \"-oui-mb-2\",\n props.overRequiredMargin || props.overMaxPositionLeverage\n ? \"oui-block oui-text-xs oui-font-normal\"\n : \"oui-hidden\",\n ])}\n >\n {props.overRequiredMargin && (\n <div>\n <Text color=\"warning\">\n {t(\"leverage.overRequiredMargin.tips\")}\n </Text>\n </div>\n )}\n {props.overMaxPositionLeverage && (\n <div>\n <Text color=\"warning\">\n <Trans\n i18nKey=\"leverage.overMaxPositionLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral dp={0} suffix=\"X\" as=\"span\" key=\"0\" />,\n ]}\n />\n </Text>\n </div>\n )}\n </div>\n <LeverageFooter {...props} />\n </Flex>\n </div>\n );\n};\n\nconst LeverageBadge = ({\n leverage,\n marginMode,\n}: {\n leverage: number;\n marginMode: MarginMode;\n}) => {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-1\",\n \"oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2\",\n \"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\",\n )}\n >\n <Text>\n {marginMode === undefined\n ? \"--\"\n : marginMode === MarginMode.ISOLATED\n ? t(\"marginMode.isolated\")\n : t(\"marginMode.cross\")}\n </Text>\n {leverage === undefined ? (\n <Text size=\"2xs\">--</Text>\n ) : (\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n )}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport {\n SymbolLeverageScriptOptions,\n useSymbolLeverageScript,\n} from \"./symbolLeverage.script\";\nimport { SymbolLeverage } from \"./symbolLeverage.ui\";\n\nexport type SymbolLeverageWidgetProps = {\n close?: () => void;\n} & SymbolLeverageScriptOptions;\n\nexport const SymbolLeverageWidget: FC<SymbolLeverageWidgetProps> = (props) => {\n const state = useSymbolLeverageScript(props);\n return <SymbolLeverage {...state} />;\n};\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { SymbolLeverageWidget } from \"./symbolLeverage.widget\";\n\nexport {\n SymbolLeverageWidget,\n type SymbolLeverageWidgetProps,\n} from \"./symbolLeverage.widget\";\n\nexport const SymbolLeverageSheetId = \"SymbolLeverageSheetId\";\nexport const SymbolLeverageDialogId = \"SymbolLeverageDialogId\";\n\n// Register sheet version for mobile\nregisterSimpleSheet(SymbolLeverageSheetId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n // content: \"oui-p-5\",\n },\n});\n\n// Register dialog version for desktop\nregisterSimpleDialog(SymbolLeverageDialogId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n content: \"oui-w-[420px]\",\n },\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { LeverageEditor } from \"./leverage.widget\";\n\nexport { LeverageEditor, type LeverageEditorProps } from \"./leverage.widget\";\nexport { Leverage, LeverageSlider, LeverageHeader } from \"./leverage.ui\";\nexport type {\n LeverageProps,\n LeverageSliderProps,\n LeverageHeaderProps,\n} from \"./leverage.ui\";\nexport {\n useLeverageScript,\n type LeverageScriptReturns,\n} from \"./leverage.script\";\nexport * from \"./symbolLeverage\";\n\nexport const LeverageWidgetWithDialogId = \"LeverageWidgetWithDialog\";\nexport const LeverageWidgetWithSheetId = \"LeverageWidgetWithSheet\";\n\nregisterSimpleDialog(LeverageWidgetWithDialogId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n size: \"md\",\n});\n\nregisterSimpleSheet(LeverageWidgetWithSheetId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n});\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { i18n, useTranslation, Trans } from '@orderly.network/i18n';
|
|
2
2
|
import { registerSimpleSheet, registerSimpleDialog, useScreen, TokenIcon, Text, cn, Badge, Divider, Flex, modal, inputFormatter, ReduceIcon, Input, PlusIcon, Box, Slider, Button, toast } from '@orderly.network/ui';
|
|
3
|
-
import React, { useState, useMemo, useCallback, useId } from 'react';
|
|
3
|
+
import React, { useState, useEffect, useMemo, useCallback, useId } from 'react';
|
|
4
4
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
5
|
import { useSymbolLeverage, useLeverage, useSymbolsInfo, useAccountInfo, useMarkPricesStream, usePortfolio, useLocalStorage, usePositionStream } from '@orderly.network/hooks';
|
|
6
6
|
import { positions, account } from '@orderly.network/perp';
|
|
7
|
-
import { OrderSide } from '@orderly.network/types';
|
|
7
|
+
import { OrderSide, MarginMode } from '@orderly.network/types';
|
|
8
8
|
import { zero } from '@orderly.network/utils';
|
|
9
9
|
|
|
10
10
|
// src/index.ts
|
|
@@ -335,7 +335,7 @@ var LeverageEditor = (props) => {
|
|
|
335
335
|
return /* @__PURE__ */ jsx(Leverage, { ...state });
|
|
336
336
|
};
|
|
337
337
|
var useSymbolLeverageScript = (options) => {
|
|
338
|
-
const { curLeverage = 1, symbol, side } = options;
|
|
338
|
+
const { curLeverage = 1, symbol, side, marginMode } = options;
|
|
339
339
|
const [showSliderTip, setShowSliderTip] = useState(false);
|
|
340
340
|
const [leverage, setLeverage] = useState(curLeverage);
|
|
341
341
|
const { t } = useTranslation();
|
|
@@ -345,6 +345,9 @@ var useSymbolLeverageScript = (options) => {
|
|
|
345
345
|
update,
|
|
346
346
|
isLoading
|
|
347
347
|
} = useSymbolLeverage(symbol);
|
|
348
|
+
useEffect(() => {
|
|
349
|
+
setLeverage(curLeverage);
|
|
350
|
+
}, [curLeverage]);
|
|
348
351
|
const maxLeverage = originalMaxLeverage;
|
|
349
352
|
const {
|
|
350
353
|
position,
|
|
@@ -352,7 +355,7 @@ var useSymbolLeverageScript = (options) => {
|
|
|
352
355
|
maxPositionLeverage,
|
|
353
356
|
overMaxPositionLeverage,
|
|
354
357
|
overRequiredMargin
|
|
355
|
-
} = useCalc({ symbol, leverage, maxLeverage });
|
|
358
|
+
} = useCalc({ symbol, leverage, maxLeverage, marginMode });
|
|
356
359
|
const formattedLeverageLevers = useMemo(() => {
|
|
357
360
|
return generateLeverageLeversForSelector(maxLeverage);
|
|
358
361
|
}, [maxLeverage]);
|
|
@@ -396,7 +399,7 @@ var useSymbolLeverageScript = (options) => {
|
|
|
396
399
|
);
|
|
397
400
|
const onConfirmSave = async () => {
|
|
398
401
|
try {
|
|
399
|
-
update?.({ leverage, symbol }).then(
|
|
402
|
+
update?.({ leverage, symbol, margin_mode: marginMode }).then(
|
|
400
403
|
(res) => {
|
|
401
404
|
if (res.success) {
|
|
402
405
|
options?.close?.();
|
|
@@ -455,7 +458,8 @@ var useSymbolLeverageScript = (options) => {
|
|
|
455
458
|
overMaxPositionLeverage,
|
|
456
459
|
overRequiredMargin,
|
|
457
460
|
isBuy,
|
|
458
|
-
isMobile
|
|
461
|
+
isMobile,
|
|
462
|
+
marginMode
|
|
459
463
|
};
|
|
460
464
|
};
|
|
461
465
|
var generateLeverageLeversForSelector = (max) => {
|
|
@@ -526,7 +530,7 @@ var generateLeverageLevers = (max) => {
|
|
|
526
530
|
return result;
|
|
527
531
|
};
|
|
528
532
|
function useCalc(inputs) {
|
|
529
|
-
const { symbol, leverage, maxLeverage } = inputs;
|
|
533
|
+
const { symbol, leverage, maxLeverage, marginMode } = inputs;
|
|
530
534
|
const symbolsInfo = useSymbolsInfo();
|
|
531
535
|
const { data: accountInfo } = useAccountInfo();
|
|
532
536
|
const { data: markPrices } = useMarkPricesStream();
|
|
@@ -540,9 +544,11 @@ function useCalc(inputs) {
|
|
|
540
544
|
});
|
|
541
545
|
const position = useMemo(() => {
|
|
542
546
|
if (symbol && positions$1?.rows?.length) {
|
|
543
|
-
return positions$1.rows.find(
|
|
547
|
+
return positions$1.rows.find(
|
|
548
|
+
(item) => item.symbol === symbol && item.margin_mode === marginMode
|
|
549
|
+
);
|
|
544
550
|
}
|
|
545
|
-
}, [positions$1, symbol]);
|
|
551
|
+
}, [positions$1, symbol, marginMode]);
|
|
546
552
|
const maxPositionLeverage = useMemo(() => {
|
|
547
553
|
const IMRFactor = accountInfo?.imr_factor?.[symbol];
|
|
548
554
|
const notional = position?.notional;
|
|
@@ -572,7 +578,7 @@ function useCalc(inputs) {
|
|
|
572
578
|
return zero;
|
|
573
579
|
}
|
|
574
580
|
const positionList = leverage ? positions$1?.rows.map((item) => {
|
|
575
|
-
if (item.symbol === symbol) {
|
|
581
|
+
if (item.symbol === symbol && item.margin_mode === marginMode) {
|
|
576
582
|
return {
|
|
577
583
|
...item,
|
|
578
584
|
leverage
|
|
@@ -580,12 +586,18 @@ function useCalc(inputs) {
|
|
|
580
586
|
}
|
|
581
587
|
return item;
|
|
582
588
|
}) : positions$1?.rows;
|
|
589
|
+
const maxLeverageBySymbol = positionList?.reduce((acc, item) => {
|
|
590
|
+
if (item.margin_mode !== MarginMode.ISOLATED && item.leverage && !acc[item.symbol]) {
|
|
591
|
+
acc[item.symbol] = item.leverage;
|
|
592
|
+
}
|
|
593
|
+
return acc;
|
|
594
|
+
}, {}) ?? {};
|
|
583
595
|
const totalInitialMarginWithOrders = account.totalInitialMarginWithQty({
|
|
584
596
|
positions: positionList,
|
|
597
|
+
orders: [],
|
|
585
598
|
markPrices,
|
|
586
599
|
IMR_Factors: accountInfo.imr_factor,
|
|
587
|
-
|
|
588
|
-
maxLeverage: accountInfo.max_leverage,
|
|
600
|
+
maxLeverageBySymbol,
|
|
589
601
|
symbolInfo: symbolsInfo
|
|
590
602
|
});
|
|
591
603
|
const freeCollateral2 = account.freeCollateral({
|
|
@@ -600,7 +612,8 @@ function useCalc(inputs) {
|
|
|
600
612
|
markPrices,
|
|
601
613
|
totalCollateral,
|
|
602
614
|
leverage,
|
|
603
|
-
symbol
|
|
615
|
+
symbol,
|
|
616
|
+
marginMode
|
|
604
617
|
]);
|
|
605
618
|
const overRequiredMargin = useMemo(() => {
|
|
606
619
|
return freeCollateral.eq(0) || freeCollateral.isNegative();
|
|
@@ -636,7 +649,13 @@ var SymbolLeverage = (props) => {
|
|
|
636
649
|
className: cn(["oui-ml-auto oui-flex oui-items-center oui-gap-1"]),
|
|
637
650
|
children: [
|
|
638
651
|
/* @__PURE__ */ jsx(Badge, { color: props.isBuy ? "success" : "danger", size: "xs", children: props.isBuy ? t("common.long") : t("common.short") }),
|
|
639
|
-
/* @__PURE__ */ jsx(
|
|
652
|
+
/* @__PURE__ */ jsx(
|
|
653
|
+
LeverageBadge,
|
|
654
|
+
{
|
|
655
|
+
leverage: props.currentLeverage,
|
|
656
|
+
marginMode: props.marginMode
|
|
657
|
+
}
|
|
658
|
+
)
|
|
640
659
|
]
|
|
641
660
|
}
|
|
642
661
|
)
|
|
@@ -698,7 +717,11 @@ var SymbolLeverage = (props) => {
|
|
|
698
717
|
] })
|
|
699
718
|
] });
|
|
700
719
|
};
|
|
701
|
-
var LeverageBadge = ({
|
|
720
|
+
var LeverageBadge = ({
|
|
721
|
+
leverage,
|
|
722
|
+
marginMode
|
|
723
|
+
}) => {
|
|
724
|
+
const { t } = useTranslation();
|
|
702
725
|
return /* @__PURE__ */ jsxs(
|
|
703
726
|
"div",
|
|
704
727
|
{
|
|
@@ -708,8 +731,8 @@ var LeverageBadge = ({ leverage }) => {
|
|
|
708
731
|
"oui-text-2xs oui-font-semibold oui-text-base-contrast-36"
|
|
709
732
|
),
|
|
710
733
|
children: [
|
|
711
|
-
/* @__PURE__ */ jsx(Text, { children: "
|
|
712
|
-
/* @__PURE__ */ jsx(Text.numeral, { dp: 0, size: "2xs", unit: "X", children: leverage })
|
|
734
|
+
/* @__PURE__ */ jsx(Text, { children: marginMode === void 0 ? "--" : marginMode === MarginMode.ISOLATED ? t("marginMode.isolated") : t("marginMode.cross") }),
|
|
735
|
+
leverage === void 0 ? /* @__PURE__ */ jsx(Text, { size: "2xs", children: "--" }) : /* @__PURE__ */ jsx(Text.numeral, { dp: 0, size: "2xs", unit: "X", children: leverage })
|
|
713
736
|
]
|
|
714
737
|
}
|
|
715
738
|
);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/leverage.ui.tsx","../src/leverage.script.ts","../src/leverage.widget.tsx","../src/symbolLeverage/symbolLeverage.script.tsx","../src/symbolLeverage/symbolLeverage.ui.tsx","../src/symbolLeverage/symbolLeverage.widget.tsx","../src/symbolLeverage/index.ts","../src/index.ts"],"names":["value","useTranslation","leverage","jsx","useState","useMemo","useCallback","toast","Text","positions","maxPositionLeverage","positionsPerp","accountPerp","freeCollateral","jsxs","cn","Flex","registerSimpleDialog","i18n","registerSimpleSheet"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { FC, useId } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Button,\n Flex,\n Input,\n Slider,\n Text,\n cn,\n PlusIcon,\n ReduceIcon,\n inputFormatter,\n InputFormatter,\n} from \"@orderly.network/ui\";\nimport { LeverageScriptReturns } from \"./leverage.script\";\n\nconst IconButton: React.FC<{\n Icon: React.ComponentType<any>;\n onClick: React.MouseEventHandler<SVGSVGElement>;\n disabled: boolean;\n}> = (props) => {\n const { Icon, onClick, disabled } = props;\n return (\n <Icon\n onClick={disabled ? undefined : onClick}\n className={cn(\n \"oui-m-2 oui-text-base-contrast oui-transition-all\",\n disabled\n ? \"oui-cursor-not-allowed oui-opacity-20\"\n : \"oui-cursor-pointer oui-opacity-100\",\n )}\n />\n );\n};\n\ntype LeverageInputProps = LeverageProps & {\n classNames?: {\n input?: string;\n unit?: string;\n };\n onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n};\n\nexport const LeverageInput: React.FC<LeverageInputProps> = (props) => {\n const formatters = React.useMemo<InputFormatter[]>(\n () => [inputFormatter.numberFormatter, inputFormatter.dpFormatter(0)],\n [],\n );\n const id = useId();\n return (\n <label\n htmlFor={id}\n className={cn(\n \"oui-w-full\",\n \"oui-rounded\",\n \"oui-bg-base-6\",\n \"oui-flex\",\n \"oui-items-center\",\n \"oui-justify-between\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-light\",\n \"oui-input-root\",\n )}\n >\n <IconButton\n Icon={ReduceIcon}\n onClick={props.onLeverageReduce}\n disabled={props.isReduceDisabled}\n />\n <Flex itemAlign=\"center\" justify=\"center\" className=\"oui-mr-4\">\n <Input\n value={props.value}\n id={id}\n autoComplete=\"off\"\n classNames={{\n input: cn(\"oui-text-right oui-text-[24px]\"),\n root: cn(\n \"oui-w-12\",\n \"oui-px-0\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-none\",\n ),\n }}\n formatters={formatters}\n onChange={props.onInputChange}\n onBlur={props.onInputBlur}\n />\n <div\n className={cn(\n \"oui-ml-1 oui-mt-1 oui-select-none\",\n \"oui-text-base oui-text-base-contrast-36\",\n )}\n >\n x\n </div>\n </Flex>\n <IconButton\n Icon={PlusIcon}\n onClick={props.onLeverageIncrease}\n disabled={props.isIncreaseDisabled}\n />\n </label>\n );\n};\n\nexport type LeverageProps = LeverageScriptReturns;\n\nexport const Leverage: FC<LeverageProps> = (props) => {\n const { currentLeverage } = props;\n const { t } = useTranslation();\n return (\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <LeverageFooter {...props} />\n </Flex>\n );\n};\n\nexport const LeverageFooter: FC<LeverageProps & { isMobile?: boolean }> = (\n props,\n) => {\n const { t } = useTranslation();\n return (\n <Flex direction={\"row\"} gap={2} width={\"100%\"} mt={0} pt={5}>\n <Button\n variant=\"contained\"\n color=\"gray\"\n fullWidth\n onClick={props.onCancel}\n data-testid=\"oui-testid-leverage-cancel-btn\"\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.cancel\")}\n </Button>\n <Button\n fullWidth\n loading={props.isLoading}\n onClick={props.onSave}\n data-testid=\"oui-testid-leverage-save-btn\"\n disabled={props.disabled}\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.save\")}\n </Button>\n </Flex>\n );\n};\n\nexport type LeverageHeaderProps = Pick<LeverageProps, \"currentLeverage\">;\n\nexport const LeverageHeader: FC<LeverageHeaderProps> = (props) => {\n const { t } = useTranslation();\n const { currentLeverage } = props;\n return (\n <Flex justify={\"center\"} width={\"100%\"} mb={2}>\n <Flex gap={1}>\n {`${t(\"common.current\")}:`}\n <Text.numeral unit=\"x\" size={\"sm\"} intensity={80} dp={0}>\n {currentLeverage ?? \"--\"}\n </Text.numeral>\n </Flex>\n </Flex>\n );\n};\n\ninterface LeverageSelectorProps {\n value: number;\n onLeverageChange: (value: number) => void;\n toggles: number[];\n}\n\nexport const LeverageSelector: React.FC<LeverageSelectorProps> = (props) => {\n const { value, onLeverageChange } = props;\n return (\n <Flex\n itemAlign=\"center\"\n justify=\"between\"\n width={\"100%\"}\n mt={4}\n className=\"oui-text-base-contrast-80\"\n >\n {props.toggles.map((option) => (\n <Flex\n key={option}\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(\n `oui-box-border oui-cursor-pointer oui-rounded-md oui-border oui-border-solid oui-bg-clip-padding oui-px-3 oui-py-2.5 oui-transition-all`,\n value === option\n ? \"oui-border-primary oui-bg-base-6\"\n : \"oui-border-line-12\",\n )}\n onClick={() => onLeverageChange?.(option)}\n >\n <Flex\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(`oui-h-3 oui-w-9 oui-select-none`)}\n >\n {option}x\n </Flex>\n </Flex>\n ))}\n </Flex>\n );\n};\n\nexport type LeverageSliderProps = {\n maxLeverage?: number;\n value: number;\n onLeverageChange: (value: number) => void;\n setShowSliderTip: (value: boolean) => void;\n showSliderTip: boolean;\n className?: string;\n onValueCommit?: (value: number[]) => void;\n leverageLevers: number[];\n marks?: { label: string; value: number }[];\n};\n\nconst getMarkPosition = (\n item: number,\n index: number,\n max: number,\n total: number,\n) => {\n // Use the same calculation logic as Slider component marks array\n const min = 1;\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const position = percentPerStep * (item - min);\n\n // Keep boundary adjustments\n if (index === 0) return Math.min(position + 2, 100);\n if (index === total - 1) return Math.max(position - 3, 0);\n return position;\n};\n\nexport const LeverageSlider: FC<LeverageSliderProps> = (props) => {\n const {\n leverageLevers,\n maxLeverage = 0,\n className,\n value,\n showSliderTip,\n marks,\n } = props;\n\n // Use the maximum value of leverageLevers array as slider maximum\n const sliderMax =\n leverageLevers.length > 0 ? Math.max(...leverageLevers) : maxLeverage;\n\n return (\n <Box pt={4} pb={7} width={\"100%\"} className={className}>\n <Slider\n step={1}\n max={maxLeverage}\n min={1}\n // markLabelVisible={true}\n marks={marks}\n // markCount={markCount}\n value={[value]}\n onValueChange={(e) => {\n props.onLeverageChange(e[0]);\n props.setShowSliderTip(true);\n }}\n color=\"primary\"\n onValueCommit={(e) => {\n props.onValueCommit?.(e);\n props.setShowSliderTip(false);\n }}\n showTip={showSliderTip}\n tipFormatter={(value) => {\n return `${value}x`;\n }}\n />\n <div className=\"oui-relative oui-w-full oui-pt-3\">\n {leverageLevers?.map((item, index) => {\n const position = getMarkPosition(\n item,\n index,\n sliderMax,\n leverageLevers.length,\n );\n\n return (\n <button\n key={item}\n onClick={() => {\n props.onLeverageChange(item);\n props.onValueCommit?.([item]);\n }}\n className={cn(\n \"oui-absolute oui-pb-3 oui-text-2xs oui-transform oui--translate-x-1/2\",\n Number(props.value) >= Number(item)\n ? \"oui-text-primary-light\"\n : \"oui-text-base-contrast-54\",\n )}\n style={{\n left: `${position}%`,\n }}\n data-testid={`oui-testid-leverage-${item}-btn`}\n >\n {`${item}x`}\n </button>\n );\n })}\n </div>\n </Box>\n );\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useLeverage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { SliderMarks, toast } from \"@orderly.network/ui\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type LeverageScriptReturns = ReturnType<typeof useLeverageScript>;\n\nexport const useLeverageScript = (options?: UseLeverageScriptOptions) => {\n const [showSliderTip, setShowSliderTip] = useState(false);\n const { t } = useTranslation();\n\n const { curLeverage, maxLeverage, isLoading, leverageLevers, update } =\n useLeverage();\n\n const marks = useMemo<SliderMarks>(() => {\n return leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n }));\n }, [leverageLevers]);\n\n const [leverage, setLeverage] = useState<number>(curLeverage ?? 0);\n\n const step = 100 / ((marks?.length || 0) - 1);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [maxLeverage],\n );\n\n const onSave = async () => {\n try {\n update({ leverage }).then(\n () => {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.log(\"update leverage error\", err);\n }\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n const disabled = !leverage || leverage < 1 || leverage > maxLeverage;\n\n const toggles = useMemo(() => {\n return [5, 10, 20, 50, 100].filter((e) => e <= maxLeverage);\n }, [maxLeverage]);\n\n return {\n leverageLevers,\n currentLeverage: curLeverage,\n value: leverage,\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading: isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles,\n };\n};\n","import { FC } from \"react\";\nimport { Leverage } from \"./leverage.ui\";\nimport { useLeverageScript } from \"./leverage.script\";\n\nexport type LeverageEditorProps = {\n close?: () => void;\n};\n\nexport const LeverageEditor: FC<LeverageEditorProps> = (props) => {\n const state = useLeverageScript({ close: props.close });\n return <Leverage {...state} />;\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n useAccountInfo,\n useLocalStorage,\n useMarkPricesStream,\n usePortfolio,\n usePositionStream,\n useSymbolLeverage,\n useSymbolsInfo,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n account as accountPerp,\n positions as positionsPerp,\n} from \"@orderly.network/perp\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport {\n modal,\n SliderMarks,\n toast,\n useScreen,\n Text,\n} from \"@orderly.network/ui\";\nimport { zero } from \"@orderly.network/utils\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type SymbolLeverageScriptOptions = {\n symbol: string;\n side?: OrderSide;\n curLeverage: number;\n};\n\nexport type SymbolLeverageScriptReturns = ReturnType<\n typeof useSymbolLeverageScript\n>;\n\nexport const useSymbolLeverageScript = (\n options: SymbolLeverageScriptOptions & UseLeverageScriptOptions,\n) => {\n const { curLeverage = 1, symbol, side } = options;\n const [showSliderTip, setShowSliderTip] = useState(false);\n // Local leverage value used by the input and slider; it tracks the in-flight user edits.\n // We seed it with curLeverage but intentionally do not sync further changes to avoid jumping while editing.\n const [leverage, setLeverage] = useState<number>(curLeverage);\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const {\n maxLeverage: originalMaxLeverage,\n update,\n isLoading,\n } = useSymbolLeverage(symbol);\n\n const maxLeverage = originalMaxLeverage;\n\n const {\n position,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n } = useCalc({ symbol: symbol!, leverage, maxLeverage });\n\n const formattedLeverageLevers = useMemo(() => {\n return generateLeverageLeversForSelector(maxLeverage);\n }, [maxLeverage]);\n\n const leverageLevers = useMemo(() => {\n return generateLeverageLevers(maxLeverage);\n }, [maxLeverage]);\n\n const marks = useMemo<SliderMarks>(() => {\n return (\n leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n })) || []\n );\n }, [leverageLevers]);\n\n const step = useMemo(() => {\n return 100 / ((marks?.length || 0) - 1);\n }, [marks]);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [],\n );\n\n const onInputBlur = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n (e) => {\n const inputValue = e.target.value.trim();\n if (inputValue === \"\") {\n setLeverage(curLeverage);\n }\n },\n [curLeverage],\n );\n\n const onConfirmSave = async () => {\n try {\n update?.({ leverage, symbol }).then(\n (res) => {\n if (res.success) {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n } else {\n toast.error(res.message);\n }\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.error(\"update leverage error\", err);\n }\n };\n\n const onSave = async () => {\n modal.confirm({\n title: t(\"leverage.confirm\"),\n content: <Text intensity={54}>{t(\"leverage.confirm.content\")}</Text>,\n onOk: onConfirmSave,\n onCancel: () => {\n return Promise.resolve();\n },\n });\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n\n const isBuy = side\n ? side === OrderSide.BUY\n : position?.position_qty && position.position_qty > 0;\n\n const disabled =\n !leverage ||\n leverage < 1 ||\n leverage > maxLeverage ||\n overRequiredMargin ||\n overMaxPositionLeverage;\n\n return {\n leverageLevers,\n currentLeverage: curLeverage, // Keep the displayed leverage fixed until the user confirms the change.\n value: leverage, // Input and slider reflect the temporary value being edited.\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n onInputBlur,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles: formattedLeverageLevers,\n symbol,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n isBuy,\n isMobile,\n };\n};\n\n// 5x: 1x, 2x, 3x, 4x, 5x\n// 10x: 1x, 3x, 5x, 8x, 10x\n// 20x: 1x, 5x, 10x, 15x, 20x\n// 50x: 1x, 10x, 20x, 35x, 50x\n// 100x: 1x, 20x, 50x, 75x, 100x\nconst generateLeverageLeversForSelector = (max: number) => {\n if (max === 10) {\n return [1, 3, 5, 8, 10];\n } else if (max === 50) {\n return [1, 10, 20, 35, 50];\n }\n\n const min = 1;\n const parts = 5;\n const step = (max - min) / (parts - 1);\n const result: number[] = [];\n for (let i = 0; i < parts; i++) {\n result.push(Math.floor(min + step * i));\n }\n return result;\n};\n/**\n * Generate evenly distributed marks\n * @param max Maximum leverage value\n * @returns Array of evenly distributed marks\n */\nconst generateEvenlyDistributedMarks = (max: number): number[] => {\n const result: number[] = [];\n\n // Check if divisible by 5\n if (max % 5 === 0) {\n // Divisible by 5, divide from 0 to max into 5 intervals (6 marks), 1x represents 0\n const step = max / 5;\n for (let i = 0; i < 6; i++) {\n const value = step * i;\n result.push(value === 0 ? 1 : value); // 0 displays as 1x, other values display normally\n }\n } else {\n // Not divisible by 5, use 25%, 50%, 75% strategy to select nearest integers\n result.push(1); // Always include 1x\n\n // Calculate values at 25%, 50%, 75% positions\n const quarter = max * 0.25;\n const half = max * 0.5;\n const threeQuarter = max * 0.75;\n\n // Select nearest integers\n const quarterRounded = Math.round(quarter);\n const halfRounded = Math.round(half);\n const threeQuarterRounded = Math.round(threeQuarter);\n\n // Add 25% position value (if greater than 1 and not equal to 50%)\n if (quarterRounded > 1 && quarterRounded !== halfRounded) {\n result.push(quarterRounded);\n }\n\n // Add 50% position value (if greater than 1)\n if (halfRounded > 1) {\n result.push(halfRounded);\n }\n\n // Add 75% position value (if greater than 50% and less than max)\n if (threeQuarterRounded > halfRounded && threeQuarterRounded < max) {\n result.push(threeQuarterRounded);\n }\n\n // Add maximum value (if greater than 1)\n if (max > 1) {\n result.push(max);\n }\n }\n\n return result;\n};\n\n// 5x: 1, 2, 3, 4, 5\n// 10x: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n// 20x: 1, 5, 10, 15, 20\n// 50x: 1, 10, 20, 30, 40, 50\n// 100x: 1, 20, 40, 60, 80, 100\nconst generateLeverageLevers = (max: number) => {\n switch (max) {\n case 10:\n return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n case 20:\n return [1, 5, 10, 15, 20];\n case 50:\n return [1, 10, 20, 30, 40, 50];\n case 100:\n return [1, 20, 40, 60, 80, 100];\n }\n\n // Fallback strategy: evenly distribute mark distances, treat 1x as 0\n const result: number[] = [];\n // Optimization\n if (max < 10) {\n // For 10x and below, divide into n equal parts, each with length 1\n for (let i = 1; i <= max; i++) {\n result.push(i);\n }\n } else {\n // Use unified even distribution strategy\n result.push(...generateEvenlyDistributedMarks(max));\n }\n\n return result;\n};\n\nfunction useCalc(inputs: {\n symbol: string;\n leverage: number;\n maxLeverage: number;\n}) {\n const { symbol, leverage, maxLeverage } = inputs;\n\n const symbolsInfo = useSymbolsInfo();\n const { data: accountInfo } = useAccountInfo();\n const { data: markPrices } = useMarkPricesStream();\n const { totalCollateral } = usePortfolio();\n\n const [unPnlPriceBasis, setUnPnlPriceBasic] = useLocalStorage(\n \"unPnlPriceBasis\",\n \"markPrice\",\n );\n const [positions] = usePositionStream(\"all\", {\n calcMode: unPnlPriceBasis,\n });\n\n const position = useMemo(() => {\n if (symbol && positions?.rows?.length) {\n return positions.rows.find((item) => item.symbol === symbol);\n }\n }, [positions, symbol]);\n\n /** the highest allowable leverage. Block users from setting leverage above this limit. */\n const maxPositionLeverage = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n const notional = position?.notional;\n // when user has existing position\n if (IMRFactor && notional) {\n const maxPositionLeverage = positionsPerp.maxPositionLeverage({\n IMRFactor,\n notional,\n });\n return Math.min(maxPositionLeverage, maxLeverage);\n }\n\n // when user has no existing position\n return maxLeverage;\n }, [position, maxLeverage, symbol]);\n\n /** calculate maximum position at current leverage */\n const maxPositionNotional = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n if (leverage && IMRFactor) {\n return positionsPerp.maxPositionNotional({\n leverage,\n IMRFactor,\n });\n }\n }, [leverage, symbol]);\n\n const overMaxPositionLeverage = useMemo(() => {\n return leverage > maxPositionLeverage;\n }, [leverage, maxPositionLeverage]);\n\n // calc free collateral with new leverage\n const freeCollateral = useMemo(() => {\n if (!accountInfo || !markPrices || !symbolsInfo) {\n return zero;\n }\n\n const positionList = leverage\n ? positions?.rows.map((item) => {\n if (item.symbol === symbol) {\n return {\n ...item,\n leverage,\n };\n }\n return item;\n })\n : positions?.rows;\n\n const totalInitialMarginWithOrders = accountPerp.totalInitialMarginWithQty({\n positions: positionList,\n markPrices,\n IMR_Factors: accountInfo.imr_factor,\n // not used\n maxLeverage: accountInfo.max_leverage,\n symbolInfo: symbolsInfo,\n });\n\n const freeCollateral = accountPerp.freeCollateral({\n totalCollateral,\n totalInitialMarginWithOrders,\n });\n\n return freeCollateral;\n }, [\n positions,\n symbolsInfo,\n accountInfo,\n markPrices,\n totalCollateral,\n leverage,\n symbol,\n ]);\n\n const overRequiredMargin = useMemo(() => {\n return freeCollateral.eq(0) || freeCollateral.isNegative();\n }, [freeCollateral]);\n\n return {\n position,\n freeCollateral,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n };\n}\n","import { useTranslation, Trans } from \"@orderly.network/i18n\";\nimport { TokenIcon, Text, Badge, Divider, Flex, cn } from \"@orderly.network/ui\";\nimport { LeverageHeader } from \"../index\";\nimport {\n LeverageInput,\n LeverageSelector,\n LeverageSlider,\n LeverageFooter,\n} from \"../leverage.ui\";\nimport { SymbolLeverageScriptReturns } from \"./symbolLeverage.script\";\n\nexport const SymbolLeverage = (props: SymbolLeverageScriptReturns) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4\">\n <div className=\"oui-flex oui-items-center oui-gap-2\">\n <TokenIcon symbol={props.symbol} className=\"oui-size-5\" />\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size={props.isMobile ? \"xs\" : \"base\"}\n weight=\"semibold\"\n intensity={98}\n >\n {props.symbol}\n </Text.formatted>\n <div\n className={cn([\"oui-ml-auto oui-flex oui-items-center oui-gap-1\"])}\n >\n <Badge color={props.isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {props.isBuy ? t(\"common.long\") : t(\"common.short\")}\n </Badge>\n <LeverageBadge leverage={props.currentLeverage} />\n </div>\n </div>\n <Divider />\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={props.currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <Divider className=\"oui-mb-3 oui-w-full\" />\n <div className=\"oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54\">\n {/* <div>\n <Trans\n i18nKey=\"leverage.maxPositionLeverage.tips\"\n values={{ amount: props.maxPositionNotional }}\n components={[\n // @ts-ignore\n <Text.numeral\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n dp={0}\n />,\n ]}\n />\n </div> */}\n <div>\n <Trans\n i18nKey=\"leverage.maxAvailableLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral\n dp={0}\n suffix=\"x\"\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n />,\n ]}\n />\n </div>\n <div>{t(\"leverage.actualPositionLeverage.tips\")}</div>\n </div>\n <div\n className={cn([\n \"-oui-mb-2\",\n props.overRequiredMargin || props.overMaxPositionLeverage\n ? \"oui-block oui-text-xs oui-font-normal\"\n : \"oui-hidden\",\n ])}\n >\n {props.overRequiredMargin && (\n <div>\n <Text color=\"warning\">\n {t(\"leverage.overRequiredMargin.tips\")}\n </Text>\n </div>\n )}\n {props.overMaxPositionLeverage && (\n <div>\n <Text color=\"warning\">\n <Trans\n i18nKey=\"leverage.overMaxPositionLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral dp={0} suffix=\"X\" as=\"span\" key=\"0\" />,\n ]}\n />\n </Text>\n </div>\n )}\n </div>\n <LeverageFooter {...props} />\n </Flex>\n </div>\n );\n};\n\nconst LeverageBadge = ({ leverage }: { leverage: number }) => {\n return (\n <div\n className={cn(\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-1\",\n \"oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2\",\n \"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\",\n )}\n >\n <Text>Cross</Text>\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n </div>\n );\n};\n","import { FC } from \"react\";\nimport {\n SymbolLeverageScriptOptions,\n useSymbolLeverageScript,\n} from \"./symbolLeverage.script\";\nimport { SymbolLeverage } from \"./symbolLeverage.ui\";\n\nexport type SymbolLeverageWidgetProps = {\n close?: () => void;\n} & SymbolLeverageScriptOptions;\n\nexport const SymbolLeverageWidget: FC<SymbolLeverageWidgetProps> = (props) => {\n const state = useSymbolLeverageScript(props);\n return <SymbolLeverage {...state} />;\n};\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { SymbolLeverageWidget } from \"./symbolLeverage.widget\";\n\nexport {\n SymbolLeverageWidget,\n type SymbolLeverageWidgetProps,\n} from \"./symbolLeverage.widget\";\n\nexport const SymbolLeverageSheetId = \"SymbolLeverageSheetId\";\nexport const SymbolLeverageDialogId = \"SymbolLeverageDialogId\";\n\n// Register sheet version for mobile\nregisterSimpleSheet(SymbolLeverageSheetId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n // content: \"oui-p-5\",\n },\n});\n\n// Register dialog version for desktop\nregisterSimpleDialog(SymbolLeverageDialogId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n content: \"oui-w-[420px]\",\n },\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { LeverageEditor } from \"./leverage.widget\";\n\nexport { LeverageEditor, type LeverageEditorProps } from \"./leverage.widget\";\nexport { Leverage, LeverageSlider, LeverageHeader } from \"./leverage.ui\";\nexport type {\n LeverageProps,\n LeverageSliderProps,\n LeverageHeaderProps,\n} from \"./leverage.ui\";\nexport {\n useLeverageScript,\n type LeverageScriptReturns,\n} from \"./leverage.script\";\nexport * from \"./symbolLeverage\";\n\nexport const LeverageWidgetWithDialogId = \"LeverageWidgetWithDialog\";\nexport const LeverageWidgetWithSheetId = \"LeverageWidgetWithSheet\";\n\nregisterSimpleDialog(LeverageWidgetWithDialogId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n size: \"md\",\n});\n\nregisterSimpleSheet(LeverageWidgetWithSheetId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/leverage.ui.tsx","../src/leverage.script.ts","../src/leverage.widget.tsx","../src/symbolLeverage/symbolLeverage.script.tsx","../src/symbolLeverage/symbolLeverage.ui.tsx","../src/symbolLeverage/symbolLeverage.widget.tsx","../src/symbolLeverage/index.ts","../src/index.ts"],"names":["value","useTranslation","leverage","jsx","useState","useMemo","useCallback","toast","Text","positions","maxPositionLeverage","positionsPerp","accountPerp","freeCollateral","jsxs","cn","Flex","MarginMode","registerSimpleDialog","i18n","registerSimpleSheet"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { FC, useId } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n Button,\n Flex,\n Input,\n Slider,\n Text,\n cn,\n PlusIcon,\n ReduceIcon,\n inputFormatter,\n InputFormatter,\n} from \"@orderly.network/ui\";\nimport { LeverageScriptReturns } from \"./leverage.script\";\n\nconst IconButton: React.FC<{\n Icon: React.ComponentType<any>;\n onClick: React.MouseEventHandler<SVGSVGElement>;\n disabled: boolean;\n}> = (props) => {\n const { Icon, onClick, disabled } = props;\n return (\n <Icon\n onClick={disabled ? undefined : onClick}\n className={cn(\n \"oui-m-2 oui-text-base-contrast oui-transition-all\",\n disabled\n ? \"oui-cursor-not-allowed oui-opacity-20\"\n : \"oui-cursor-pointer oui-opacity-100\",\n )}\n />\n );\n};\n\ntype LeverageInputProps = LeverageProps & {\n classNames?: {\n input?: string;\n unit?: string;\n };\n onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n};\n\nexport const LeverageInput: React.FC<LeverageInputProps> = (props) => {\n const formatters = React.useMemo<InputFormatter[]>(\n () => [inputFormatter.numberFormatter, inputFormatter.dpFormatter(0)],\n [],\n );\n const id = useId();\n return (\n <label\n htmlFor={id}\n className={cn(\n \"oui-w-full\",\n \"oui-rounded\",\n \"oui-bg-base-6\",\n \"oui-flex\",\n \"oui-items-center\",\n \"oui-justify-between\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-light\",\n \"oui-input-root\",\n )}\n >\n <IconButton\n Icon={ReduceIcon}\n onClick={props.onLeverageReduce}\n disabled={props.isReduceDisabled}\n />\n <Flex itemAlign=\"center\" justify=\"center\" className=\"oui-mr-4\">\n <Input\n value={props.value}\n id={id}\n autoComplete=\"off\"\n classNames={{\n input: cn(\"oui-text-right oui-text-[24px]\"),\n root: cn(\n \"oui-w-12\",\n \"oui-px-0\",\n \"oui-outline\",\n \"oui-outline-offset-0\",\n \"oui-outline-1\",\n \"oui-outline-transparent\",\n \"focus-within:oui-outline-primary-none\",\n ),\n }}\n formatters={formatters}\n onChange={props.onInputChange}\n onBlur={props.onInputBlur}\n />\n <div\n className={cn(\n \"oui-ml-1 oui-mt-1 oui-select-none\",\n \"oui-text-base oui-text-base-contrast-36\",\n )}\n >\n x\n </div>\n </Flex>\n <IconButton\n Icon={PlusIcon}\n onClick={props.onLeverageIncrease}\n disabled={props.isIncreaseDisabled}\n />\n </label>\n );\n};\n\nexport type LeverageProps = LeverageScriptReturns;\n\nexport const Leverage: FC<LeverageProps> = (props) => {\n const { currentLeverage } = props;\n const { t } = useTranslation();\n return (\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <LeverageFooter {...props} />\n </Flex>\n );\n};\n\nexport const LeverageFooter: FC<LeverageProps & { isMobile?: boolean }> = (\n props,\n) => {\n const { t } = useTranslation();\n return (\n <Flex direction={\"row\"} gap={2} width={\"100%\"} mt={0} pt={5}>\n <Button\n variant=\"contained\"\n color=\"gray\"\n fullWidth\n onClick={props.onCancel}\n data-testid=\"oui-testid-leverage-cancel-btn\"\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.cancel\")}\n </Button>\n <Button\n fullWidth\n loading={props.isLoading}\n onClick={props.onSave}\n data-testid=\"oui-testid-leverage-save-btn\"\n disabled={props.disabled}\n size={props.isMobile ? \"md\" : \"lg\"}\n >\n {t(\"common.save\")}\n </Button>\n </Flex>\n );\n};\n\nexport type LeverageHeaderProps = Pick<LeverageProps, \"currentLeverage\">;\n\nexport const LeverageHeader: FC<LeverageHeaderProps> = (props) => {\n const { t } = useTranslation();\n const { currentLeverage } = props;\n return (\n <Flex justify={\"center\"} width={\"100%\"} mb={2}>\n <Flex gap={1}>\n {`${t(\"common.current\")}:`}\n <Text.numeral unit=\"x\" size={\"sm\"} intensity={80} dp={0}>\n {currentLeverage ?? \"--\"}\n </Text.numeral>\n </Flex>\n </Flex>\n );\n};\n\ninterface LeverageSelectorProps {\n value: number;\n onLeverageChange: (value: number) => void;\n toggles: number[];\n}\n\nexport const LeverageSelector: React.FC<LeverageSelectorProps> = (props) => {\n const { value, onLeverageChange } = props;\n return (\n <Flex\n itemAlign=\"center\"\n justify=\"between\"\n width={\"100%\"}\n mt={4}\n className=\"oui-text-base-contrast-80\"\n >\n {props.toggles.map((option) => (\n <Flex\n key={option}\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(\n `oui-box-border oui-cursor-pointer oui-rounded-md oui-border oui-border-solid oui-bg-clip-padding oui-px-3 oui-py-2.5 oui-transition-all`,\n value === option\n ? \"oui-border-primary oui-bg-base-6\"\n : \"oui-border-line-12\",\n )}\n onClick={() => onLeverageChange?.(option)}\n >\n <Flex\n itemAlign=\"center\"\n justify=\"center\"\n className={cn(`oui-h-3 oui-w-9 oui-select-none`)}\n >\n {option}x\n </Flex>\n </Flex>\n ))}\n </Flex>\n );\n};\n\nexport type LeverageSliderProps = {\n maxLeverage?: number;\n value: number;\n onLeverageChange: (value: number) => void;\n setShowSliderTip: (value: boolean) => void;\n showSliderTip: boolean;\n className?: string;\n onValueCommit?: (value: number[]) => void;\n leverageLevers: number[];\n marks?: { label: string; value: number }[];\n};\n\nconst getMarkPosition = (\n item: number,\n index: number,\n max: number,\n total: number,\n) => {\n // Use the same calculation logic as Slider component marks array\n const min = 1;\n const maxSteps = max - min;\n const percentPerStep = 100 / maxSteps;\n const position = percentPerStep * (item - min);\n\n // Keep boundary adjustments\n if (index === 0) return Math.min(position + 2, 100);\n if (index === total - 1) return Math.max(position - 3, 0);\n return position;\n};\n\nexport const LeverageSlider: FC<LeverageSliderProps> = (props) => {\n const {\n leverageLevers,\n maxLeverage = 0,\n className,\n value,\n showSliderTip,\n marks,\n } = props;\n\n // Use the maximum value of leverageLevers array as slider maximum\n const sliderMax =\n leverageLevers.length > 0 ? Math.max(...leverageLevers) : maxLeverage;\n\n return (\n <Box pt={4} pb={7} width={\"100%\"} className={className}>\n <Slider\n step={1}\n max={maxLeverage}\n min={1}\n // markLabelVisible={true}\n marks={marks}\n // markCount={markCount}\n value={[value]}\n onValueChange={(e) => {\n props.onLeverageChange(e[0]);\n props.setShowSliderTip(true);\n }}\n color=\"primary\"\n onValueCommit={(e) => {\n props.onValueCommit?.(e);\n props.setShowSliderTip(false);\n }}\n showTip={showSliderTip}\n tipFormatter={(value) => {\n return `${value}x`;\n }}\n />\n <div className=\"oui-relative oui-w-full oui-pt-3\">\n {leverageLevers?.map((item, index) => {\n const position = getMarkPosition(\n item,\n index,\n sliderMax,\n leverageLevers.length,\n );\n\n return (\n <button\n key={item}\n onClick={() => {\n props.onLeverageChange(item);\n props.onValueCommit?.([item]);\n }}\n className={cn(\n \"oui-absolute oui-pb-3 oui-text-2xs oui-transform oui--translate-x-1/2\",\n Number(props.value) >= Number(item)\n ? \"oui-text-primary-light\"\n : \"oui-text-base-contrast-54\",\n )}\n style={{\n left: `${position}%`,\n }}\n data-testid={`oui-testid-leverage-${item}-btn`}\n >\n {`${item}x`}\n </button>\n );\n })}\n </div>\n </Box>\n );\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useLeverage } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { SliderMarks, toast } from \"@orderly.network/ui\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type LeverageScriptReturns = ReturnType<typeof useLeverageScript>;\n\nexport const useLeverageScript = (options?: UseLeverageScriptOptions) => {\n const [showSliderTip, setShowSliderTip] = useState(false);\n const { t } = useTranslation();\n\n const { curLeverage, maxLeverage, isLoading, leverageLevers, update } =\n useLeverage();\n\n const marks = useMemo<SliderMarks>(() => {\n return leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n }));\n }, [leverageLevers]);\n\n const [leverage, setLeverage] = useState<number>(curLeverage ?? 0);\n\n const step = 100 / ((marks?.length || 0) - 1);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [maxLeverage],\n );\n\n const onSave = async () => {\n try {\n update({ leverage }).then(\n () => {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.log(\"update leverage error\", err);\n }\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n const disabled = !leverage || leverage < 1 || leverage > maxLeverage;\n\n const toggles = useMemo(() => {\n return [5, 10, 20, 50, 100].filter((e) => e <= maxLeverage);\n }, [maxLeverage]);\n\n return {\n leverageLevers,\n currentLeverage: curLeverage,\n value: leverage,\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading: isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles,\n };\n};\n","import { FC } from \"react\";\nimport { Leverage } from \"./leverage.ui\";\nimport { useLeverageScript } from \"./leverage.script\";\n\nexport type LeverageEditorProps = {\n close?: () => void;\n};\n\nexport const LeverageEditor: FC<LeverageEditorProps> = (props) => {\n const state = useLeverageScript({ close: props.close });\n return <Leverage {...state} />;\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useAccountInfo,\n useLocalStorage,\n useMarkPricesStream,\n usePortfolio,\n usePositionStream,\n useSymbolLeverage,\n useSymbolsInfo,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n account as accountPerp,\n positions as positionsPerp,\n} from \"@orderly.network/perp\";\nimport { MarginMode, OrderSide } from \"@orderly.network/types\";\nimport {\n modal,\n SliderMarks,\n toast,\n useScreen,\n Text,\n} from \"@orderly.network/ui\";\nimport { zero } from \"@orderly.network/utils\";\n\ntype UseLeverageScriptOptions = {\n close?: () => void;\n};\n\nexport type SymbolLeverageScriptOptions = {\n symbol: string;\n side?: OrderSide;\n curLeverage: number;\n marginMode: MarginMode;\n};\n\nexport type SymbolLeverageScriptReturns = ReturnType<\n typeof useSymbolLeverageScript\n>;\n\nexport const useSymbolLeverageScript = (\n options: SymbolLeverageScriptOptions & UseLeverageScriptOptions,\n) => {\n const { curLeverage = 1, symbol, side, marginMode } = options;\n const [showSliderTip, setShowSliderTip] = useState(false);\n // Local leverage value used by the input and slider; it tracks the in-flight user edits.\n // We seed it with curLeverage but intentionally do not sync further changes to avoid jumping while editing.\n const [leverage, setLeverage] = useState<number>(curLeverage);\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const {\n maxLeverage: originalMaxLeverage,\n update,\n isLoading,\n } = useSymbolLeverage(symbol);\n\n // Sync when external current leverage changes (e.g. symbol or margin mode changed)\n useEffect(() => {\n setLeverage(curLeverage);\n }, [curLeverage]);\n\n const maxLeverage = originalMaxLeverage;\n\n const {\n position,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n } = useCalc({ symbol: symbol!, leverage, maxLeverage, marginMode });\n\n const formattedLeverageLevers = useMemo(() => {\n return generateLeverageLeversForSelector(maxLeverage);\n }, [maxLeverage]);\n\n const leverageLevers = useMemo(() => {\n return generateLeverageLevers(maxLeverage);\n }, [maxLeverage]);\n\n const marks = useMemo<SliderMarks>(() => {\n return (\n leverageLevers.map((e) => ({\n label: `${e}x`,\n value: e,\n })) || []\n );\n }, [leverageLevers]);\n\n const step = useMemo(() => {\n return 100 / ((marks?.length || 0) - 1);\n }, [marks]);\n\n const onLeverageChange = (leverage: number) => {\n setLeverage(leverage);\n };\n\n const onLeverageIncrease: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev + 1);\n };\n\n const onLeverageReduce: React.MouseEventHandler<SVGSVGElement> = () => {\n setLeverage((prev) => prev - 1);\n };\n\n const onInputChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n const parsed = Number.parseInt(e.target.value);\n const value = Number.isNaN(parsed) ? \"\" : parsed;\n setLeverage(value as number);\n },\n [],\n );\n\n const onInputBlur = useCallback<React.FocusEventHandler<HTMLInputElement>>(\n (e) => {\n const inputValue = e.target.value.trim();\n if (inputValue === \"\") {\n setLeverage(curLeverage);\n }\n },\n [curLeverage],\n );\n\n const onConfirmSave = async () => {\n try {\n update?.({ leverage, symbol, margin_mode: marginMode }).then(\n (res) => {\n if (res.success) {\n options?.close?.();\n toast.success(t(\"leverage.updated\"));\n } else {\n toast.error(res.message);\n }\n },\n (err: Error) => {\n toast.error(err.message);\n },\n );\n } catch (err) {\n console.error(\"update leverage error\", err);\n }\n };\n\n const onSave = async () => {\n modal.confirm({\n title: t(\"leverage.confirm\"),\n content: <Text intensity={54}>{t(\"leverage.confirm.content\")}</Text>,\n onOk: onConfirmSave,\n onCancel: () => {\n return Promise.resolve();\n },\n });\n };\n\n const isReduceDisabled = leverage <= 1;\n const isIncreaseDisabled = leverage >= maxLeverage;\n\n const isBuy = side\n ? side === OrderSide.BUY\n : position?.position_qty && position.position_qty > 0;\n\n const disabled =\n !leverage ||\n leverage < 1 ||\n leverage > maxLeverage ||\n overRequiredMargin ||\n overMaxPositionLeverage;\n\n return {\n leverageLevers,\n currentLeverage: curLeverage, // Keep the displayed leverage fixed until the user confirms the change.\n value: leverage, // Input and slider reflect the temporary value being edited.\n marks,\n onLeverageChange,\n onLeverageIncrease,\n onLeverageReduce,\n onInputChange,\n onInputBlur,\n isReduceDisabled,\n isIncreaseDisabled,\n disabled,\n step,\n onCancel: options?.close,\n onSave,\n isLoading,\n showSliderTip,\n setShowSliderTip,\n maxLeverage,\n toggles: formattedLeverageLevers,\n symbol,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n isBuy,\n isMobile,\n marginMode,\n };\n};\n\n// 5x: 1x, 2x, 3x, 4x, 5x\n// 10x: 1x, 3x, 5x, 8x, 10x\n// 20x: 1x, 5x, 10x, 15x, 20x\n// 50x: 1x, 10x, 20x, 35x, 50x\n// 100x: 1x, 20x, 50x, 75x, 100x\nconst generateLeverageLeversForSelector = (max: number) => {\n if (max === 10) {\n return [1, 3, 5, 8, 10];\n } else if (max === 50) {\n return [1, 10, 20, 35, 50];\n }\n\n const min = 1;\n const parts = 5;\n const step = (max - min) / (parts - 1);\n const result: number[] = [];\n for (let i = 0; i < parts; i++) {\n result.push(Math.floor(min + step * i));\n }\n return result;\n};\n/**\n * Generate evenly distributed marks\n * @param max Maximum leverage value\n * @returns Array of evenly distributed marks\n */\nconst generateEvenlyDistributedMarks = (max: number): number[] => {\n const result: number[] = [];\n\n // Check if divisible by 5\n if (max % 5 === 0) {\n // Divisible by 5, divide from 0 to max into 5 intervals (6 marks), 1x represents 0\n const step = max / 5;\n for (let i = 0; i < 6; i++) {\n const value = step * i;\n result.push(value === 0 ? 1 : value); // 0 displays as 1x, other values display normally\n }\n } else {\n // Not divisible by 5, use 25%, 50%, 75% strategy to select nearest integers\n result.push(1); // Always include 1x\n\n // Calculate values at 25%, 50%, 75% positions\n const quarter = max * 0.25;\n const half = max * 0.5;\n const threeQuarter = max * 0.75;\n\n // Select nearest integers\n const quarterRounded = Math.round(quarter);\n const halfRounded = Math.round(half);\n const threeQuarterRounded = Math.round(threeQuarter);\n\n // Add 25% position value (if greater than 1 and not equal to 50%)\n if (quarterRounded > 1 && quarterRounded !== halfRounded) {\n result.push(quarterRounded);\n }\n\n // Add 50% position value (if greater than 1)\n if (halfRounded > 1) {\n result.push(halfRounded);\n }\n\n // Add 75% position value (if greater than 50% and less than max)\n if (threeQuarterRounded > halfRounded && threeQuarterRounded < max) {\n result.push(threeQuarterRounded);\n }\n\n // Add maximum value (if greater than 1)\n if (max > 1) {\n result.push(max);\n }\n }\n\n return result;\n};\n\n// 5x: 1, 2, 3, 4, 5\n// 10x: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10\n// 20x: 1, 5, 10, 15, 20\n// 50x: 1, 10, 20, 30, 40, 50\n// 100x: 1, 20, 40, 60, 80, 100\nconst generateLeverageLevers = (max: number) => {\n switch (max) {\n case 10:\n return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n case 20:\n return [1, 5, 10, 15, 20];\n case 50:\n return [1, 10, 20, 30, 40, 50];\n case 100:\n return [1, 20, 40, 60, 80, 100];\n }\n\n // Fallback strategy: evenly distribute mark distances, treat 1x as 0\n const result: number[] = [];\n // Optimization\n if (max < 10) {\n // For 10x and below, divide into n equal parts, each with length 1\n for (let i = 1; i <= max; i++) {\n result.push(i);\n }\n } else {\n // Use unified even distribution strategy\n result.push(...generateEvenlyDistributedMarks(max));\n }\n\n return result;\n};\n\nfunction useCalc(inputs: {\n symbol: string;\n leverage: number;\n maxLeverage: number;\n marginMode: MarginMode;\n}) {\n const { symbol, leverage, maxLeverage, marginMode } = inputs;\n\n const symbolsInfo = useSymbolsInfo();\n const { data: accountInfo } = useAccountInfo();\n const { data: markPrices } = useMarkPricesStream();\n const { totalCollateral } = usePortfolio();\n\n const [unPnlPriceBasis, setUnPnlPriceBasic] = useLocalStorage(\n \"unPnlPriceBasis\",\n \"markPrice\",\n );\n const [positions] = usePositionStream(\"all\", {\n calcMode: unPnlPriceBasis,\n });\n\n const position = useMemo(() => {\n if (symbol && positions?.rows?.length) {\n return positions.rows.find(\n (item) => item.symbol === symbol && item.margin_mode === marginMode,\n );\n }\n }, [positions, symbol, marginMode]);\n\n /** the highest allowable leverage. Block users from setting leverage above this limit. */\n const maxPositionLeverage = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n const notional = position?.notional;\n // when user has existing position\n if (IMRFactor && notional) {\n const maxPositionLeverage = positionsPerp.maxPositionLeverage({\n IMRFactor,\n notional,\n });\n return Math.min(maxPositionLeverage, maxLeverage);\n }\n\n // when user has no existing position\n return maxLeverage;\n }, [position, maxLeverage, symbol]);\n\n /** calculate maximum position at current leverage */\n const maxPositionNotional = useMemo(() => {\n const IMRFactor = accountInfo?.imr_factor?.[symbol];\n if (leverage && IMRFactor) {\n return positionsPerp.maxPositionNotional({\n leverage,\n IMRFactor,\n });\n }\n }, [leverage, symbol]);\n\n const overMaxPositionLeverage = useMemo(() => {\n return leverage > maxPositionLeverage;\n }, [leverage, maxPositionLeverage]);\n\n // calc free collateral with new leverage\n const freeCollateral = useMemo(() => {\n if (!accountInfo || !markPrices || !symbolsInfo) {\n return zero;\n }\n\n const positionList = leverage\n ? positions?.rows.map((item) => {\n if (item.symbol === symbol && item.margin_mode === marginMode) {\n return {\n ...item,\n leverage,\n };\n }\n return item;\n })\n : positions?.rows;\n const maxLeverageBySymbol =\n positionList?.reduce<Record<string, number>>((acc, item) => {\n if (\n item.margin_mode !== MarginMode.ISOLATED &&\n item.leverage &&\n !acc[item.symbol]\n ) {\n acc[item.symbol] = item.leverage;\n }\n return acc;\n }, {}) ?? {};\n\n // TODO: Pass actual orders data for accurate initial margin calculation\n const totalInitialMarginWithOrders = accountPerp.totalInitialMarginWithQty({\n positions: positionList,\n orders: [],\n markPrices,\n IMR_Factors: accountInfo.imr_factor,\n maxLeverageBySymbol,\n symbolInfo: symbolsInfo,\n });\n\n const freeCollateral = accountPerp.freeCollateral({\n totalCollateral,\n totalInitialMarginWithOrders,\n });\n\n return freeCollateral;\n }, [\n positions,\n symbolsInfo,\n accountInfo,\n markPrices,\n totalCollateral,\n leverage,\n symbol,\n marginMode,\n ]);\n\n const overRequiredMargin = useMemo(() => {\n return freeCollateral.eq(0) || freeCollateral.isNegative();\n }, [freeCollateral]);\n\n return {\n position,\n freeCollateral,\n maxPositionNotional,\n maxPositionLeverage,\n overMaxPositionLeverage,\n overRequiredMargin,\n };\n}\n","import { useTranslation, Trans } from \"@orderly.network/i18n\";\nimport { MarginMode } from \"@orderly.network/types\";\nimport { TokenIcon, Text, Badge, Divider, Flex, cn } from \"@orderly.network/ui\";\nimport { LeverageHeader } from \"../index\";\nimport {\n LeverageInput,\n LeverageSelector,\n LeverageSlider,\n LeverageFooter,\n} from \"../leverage.ui\";\nimport { SymbolLeverageScriptReturns } from \"./symbolLeverage.script\";\n\nexport const SymbolLeverage = (props: SymbolLeverageScriptReturns) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4\">\n <div className=\"oui-flex oui-items-center oui-gap-2\">\n <TokenIcon symbol={props.symbol} className=\"oui-size-5\" />\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size={props.isMobile ? \"xs\" : \"base\"}\n weight=\"semibold\"\n intensity={98}\n >\n {props.symbol}\n </Text.formatted>\n <div\n className={cn([\"oui-ml-auto oui-flex oui-items-center oui-gap-1\"])}\n >\n <Badge color={props.isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {props.isBuy ? t(\"common.long\") : t(\"common.short\")}\n </Badge>\n <LeverageBadge\n leverage={props.currentLeverage}\n marginMode={props.marginMode}\n />\n </div>\n </div>\n <Divider />\n <Flex itemAlign={\"start\"} direction={\"column\"} mb={0}>\n <LeverageHeader currentLeverage={props.currentLeverage} />\n <LeverageInput {...props} />\n <LeverageSelector {...props} />\n <LeverageSlider {...props} />\n <Divider className=\"oui-mb-3 oui-w-full\" />\n <div className=\"oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54\">\n {/* <div>\n <Trans\n i18nKey=\"leverage.maxPositionLeverage.tips\"\n values={{ amount: props.maxPositionNotional }}\n components={[\n // @ts-ignore\n <Text.numeral\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n dp={0}\n />,\n ]}\n />\n </div> */}\n <div>\n <Trans\n i18nKey=\"leverage.maxAvailableLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral\n dp={0}\n suffix=\"x\"\n as=\"span\"\n key=\"0\"\n className=\"oui-text-base-contrast\"\n />,\n ]}\n />\n </div>\n <div>{t(\"leverage.actualPositionLeverage.tips\")}</div>\n </div>\n <div\n className={cn([\n \"-oui-mb-2\",\n props.overRequiredMargin || props.overMaxPositionLeverage\n ? \"oui-block oui-text-xs oui-font-normal\"\n : \"oui-hidden\",\n ])}\n >\n {props.overRequiredMargin && (\n <div>\n <Text color=\"warning\">\n {t(\"leverage.overRequiredMargin.tips\")}\n </Text>\n </div>\n )}\n {props.overMaxPositionLeverage && (\n <div>\n <Text color=\"warning\">\n <Trans\n i18nKey=\"leverage.overMaxPositionLeverage.tips\"\n values={{ leverage: props.maxPositionLeverage }}\n components={[\n // @ts-ignore\n <Text.numeral dp={0} suffix=\"X\" as=\"span\" key=\"0\" />,\n ]}\n />\n </Text>\n </div>\n )}\n </div>\n <LeverageFooter {...props} />\n </Flex>\n </div>\n );\n};\n\nconst LeverageBadge = ({\n leverage,\n marginMode,\n}: {\n leverage: number;\n marginMode: MarginMode;\n}) => {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-1\",\n \"oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2\",\n \"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\",\n )}\n >\n <Text>\n {marginMode === undefined\n ? \"--\"\n : marginMode === MarginMode.ISOLATED\n ? t(\"marginMode.isolated\")\n : t(\"marginMode.cross\")}\n </Text>\n {leverage === undefined ? (\n <Text size=\"2xs\">--</Text>\n ) : (\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n )}\n </div>\n );\n};\n","import { FC } from \"react\";\nimport {\n SymbolLeverageScriptOptions,\n useSymbolLeverageScript,\n} from \"./symbolLeverage.script\";\nimport { SymbolLeverage } from \"./symbolLeverage.ui\";\n\nexport type SymbolLeverageWidgetProps = {\n close?: () => void;\n} & SymbolLeverageScriptOptions;\n\nexport const SymbolLeverageWidget: FC<SymbolLeverageWidgetProps> = (props) => {\n const state = useSymbolLeverageScript(props);\n return <SymbolLeverage {...state} />;\n};\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { SymbolLeverageWidget } from \"./symbolLeverage.widget\";\n\nexport {\n SymbolLeverageWidget,\n type SymbolLeverageWidgetProps,\n} from \"./symbolLeverage.widget\";\n\nexport const SymbolLeverageSheetId = \"SymbolLeverageSheetId\";\nexport const SymbolLeverageDialogId = \"SymbolLeverageDialogId\";\n\n// Register sheet version for mobile\nregisterSimpleSheet(SymbolLeverageSheetId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n // content: \"oui-p-5\",\n },\n});\n\n// Register dialog version for desktop\nregisterSimpleDialog(SymbolLeverageDialogId, SymbolLeverageWidget, {\n title: () => i18n.t(\"leverage.adjustedLeverage\"),\n classNames: {\n content: \"oui-w-[420px]\",\n },\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog, registerSimpleSheet } from \"@orderly.network/ui\";\nimport { LeverageEditor } from \"./leverage.widget\";\n\nexport { LeverageEditor, type LeverageEditorProps } from \"./leverage.widget\";\nexport { Leverage, LeverageSlider, LeverageHeader } from \"./leverage.ui\";\nexport type {\n LeverageProps,\n LeverageSliderProps,\n LeverageHeaderProps,\n} from \"./leverage.ui\";\nexport {\n useLeverageScript,\n type LeverageScriptReturns,\n} from \"./leverage.script\";\nexport * from \"./symbolLeverage\";\n\nexport const LeverageWidgetWithDialogId = \"LeverageWidgetWithDialog\";\nexport const LeverageWidgetWithSheetId = \"LeverageWidgetWithSheet\";\n\nregisterSimpleDialog(LeverageWidgetWithDialogId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n size: \"md\",\n});\n\nregisterSimpleSheet(LeverageWidgetWithSheetId, LeverageEditor, {\n title: () => i18n.t(\"leverage.maxAccountLeverage\"),\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orderly.network/ui-leverage",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-beta.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"access": "public"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@orderly.network/i18n": "
|
|
19
|
-
"@orderly.network/
|
|
20
|
-
"@orderly.network/
|
|
21
|
-
"@orderly.network/
|
|
22
|
-
"@orderly.network/
|
|
23
|
-
"@orderly.network/
|
|
18
|
+
"@orderly.network/i18n": "3.0.0-beta.0",
|
|
19
|
+
"@orderly.network/hooks": "3.0.0-beta.0",
|
|
20
|
+
"@orderly.network/types": "3.0.0-beta.0",
|
|
21
|
+
"@orderly.network/ui": "3.0.0-beta.0",
|
|
22
|
+
"@orderly.network/perp": "5.0.0-beta.0",
|
|
23
|
+
"@orderly.network/utils": "3.0.0-beta.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@swc/cli": "^0.3.12",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"react-dom": "^18.2.0",
|
|
32
32
|
"tailwindcss": "^3.4.4",
|
|
33
33
|
"tsup": "^8.5.1",
|
|
34
|
-
"tsconfig": "0.
|
|
34
|
+
"tsconfig": "1.0.0-beta.0"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"react": ">=18",
|