@kodiak-finance/orderly-ui-leverage 2.8.18 → 2.8.19
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 +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +741 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +731 -3
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +8 -8
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var orderlyI18n = require('@kodiak-finance/orderly-i18n');
|
|
4
4
|
var orderlyUi = require('@kodiak-finance/orderly-ui');
|
|
5
|
-
var
|
|
5
|
+
var React = require('react');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
var orderlyHooks = require('@kodiak-finance/orderly-hooks');
|
|
8
8
|
var orderlyPerp = require('@kodiak-finance/orderly-perp');
|
|
@@ -11,19 +11,747 @@ var orderlyUtils = require('@kodiak-finance/orderly-utils');
|
|
|
11
11
|
|
|
12
12
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
15
15
|
|
|
16
|
-
var X=e=>{let{Icon:o,onClick:t,disabled:s}=e;return jsxRuntime.jsx(o,{onClick:s?void 0:t,className:orderlyUi.cn("oui-m-2 oui-text-white oui-transition-all",s?"oui-cursor-not-allowed oui-opacity-20":"oui-cursor-pointer oui-opacity-100")})},O=e=>{let o=pe__default.default.useMemo(()=>[orderlyUi.inputFormatter.numberFormatter,orderlyUi.inputFormatter.dpFormatter(0)],[]),t=pe.useId();return jsxRuntime.jsxs("label",{htmlFor:t,className:orderlyUi.cn("oui-w-full","oui-rounded","oui-bg-base-6","oui-flex","oui-items-center","oui-justify-between","oui-outline","oui-outline-offset-0","oui-outline-1","oui-outline-transparent","focus-within:oui-outline-primary-light","oui-input-root"),children:[jsxRuntime.jsx(X,{Icon:orderlyUi.ReduceIcon,onClick:e.onLeverageReduce,disabled:e.isReduceDisabled}),jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"center",justify:"center",className:"oui-mr-4",children:[jsxRuntime.jsx(orderlyUi.Input,{value:e.value,id:t,autoComplete:"off",classNames:{input:orderlyUi.cn("oui-text-right oui-text-[24px]"),root:orderlyUi.cn("oui-w-12","oui-px-0","oui-outline","oui-outline-offset-0","oui-outline-1","oui-outline-transparent","focus-within:oui-outline-primary-none")},formatters:o,onChange:e.onInputChange}),jsxRuntime.jsx("div",{className:orderlyUi.cn("oui-ml-1 oui-mt-1 oui-select-none","oui-text-base oui-text-base-contrast-36"),children:"x"})]}),jsxRuntime.jsx(X,{Icon:orderlyUi.PlusIcon,onClick:e.onLeverageIncrease,disabled:e.isIncreaseDisabled})]})},A=e=>{let{currentLeverage:o}=e,{t}=orderlyI18n.useTranslation();return jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"start",direction:"column",mb:0,children:[jsxRuntime.jsx(T,{currentLeverage:o}),jsxRuntime.jsx(O,{...e}),jsxRuntime.jsx(z,{...e}),jsxRuntime.jsx(E,{...e}),jsxRuntime.jsx(G,{...e})]})},G=e=>{let{t:o}=orderlyI18n.useTranslation();return jsxRuntime.jsxs(orderlyUi.Flex,{direction:"row",gap:2,width:"100%",mt:0,pt:5,children:[jsxRuntime.jsx(orderlyUi.Button,{variant:"contained",color:"gray",fullWidth:true,onClick:e.onCancel,"data-testid":"oui-testid-leverage-cancel-btn",size:e.isMobile?"md":"lg",children:o("common.cancel")}),jsxRuntime.jsx(orderlyUi.Button,{fullWidth:true,loading:e.isLoading,onClick:e.onSave,"data-testid":"oui-testid-leverage-save-btn",disabled:e.disabled,size:e.isMobile?"md":"lg",children:o("common.save")})]})},T=e=>{let{t:o}=orderlyI18n.useTranslation(),{currentLeverage:t}=e;return jsxRuntime.jsx(orderlyUi.Flex,{justify:"center",width:"100%",mb:2,children:jsxRuntime.jsxs(orderlyUi.Flex,{gap:1,children:[`${o("common.current")}:`,jsxRuntime.jsx(orderlyUi.Text.numeral,{unit:"x",size:"sm",intensity:80,dp:0,children:t??"--"})]})})},z=e=>{let{value:o,onLeverageChange:t}=e;return jsxRuntime.jsx(orderlyUi.Flex,{itemAlign:"center",justify:"between",width:"100%",mt:4,className:"oui-text-base-contrast-80",children:e.toggles.map(s=>jsxRuntime.jsx(orderlyUi.Flex,{itemAlign:"center",justify:"center",className:orderlyUi.cn("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",o===s?"oui-border-primary oui-bg-base-6":"oui-border-line-12"),onClick:()=>t?.(s),children:jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"center",justify:"center",className:orderlyUi.cn("oui-h-3 oui-w-9 oui-select-none"),children:[s,"x"]})},s))})},E=e=>{let{leverageLevers:o,maxLeverage:t=0,className:s,value:v,showSliderTip:n}=e;return jsxRuntime.jsxs(orderlyUi.Box,{pt:4,width:"100%",className:s,children:[jsxRuntime.jsx(orderlyUi.Slider,{max:t,min:1,markCount:5,value:[v],onValueChange:r=>{e.onLeverageChange(r[0]),e.setShowSliderTip(true);},color:"primary",onValueCommit:r=>{e.onValueCommit?.(r),e.setShowSliderTip(false);},showTip:n,tipFormatter:r=>`${r}x`}),jsxRuntime.jsx(orderlyUi.Flex,{justify:"between",width:"100%",pt:3,children:o?.map((r,m)=>jsxRuntime.jsx("button",{onClick:()=>{e.onLeverageChange(r),e.onValueCommit?.([r]);},className:orderlyUi.cn("oui-pb-3 oui-text-2xs",m===0?"oui-pr-2":m===5?"oui-pl-0":"oui-ml-2 oui-px-0",e.value>=r&&"oui-text-primary-light"),"data-testid":`oui-testid-leverage-${r}-btn`,children:`${r}x`},r))})]})};var q=e=>{let[o,t]=pe.useState(false),{t:s}=orderlyI18n.useTranslation(),{curLeverage:v,maxLeverage:n,isLoading:r,leverageLevers:m,update:y}=orderlyHooks.useLeverage(),R=pe.useMemo(()=>m.map(u=>({label:`${u}x`,value:u})),[m]),[i,p]=pe.useState(v??0),h=100/((R?.length||0)-1),F=u=>{p(u);},w=()=>{p(u=>u+1);},x=()=>{p(u=>u-1);},N=pe.useCallback(u=>{let k=Number.parseInt(u.target.value),H=Number.isNaN(k)?"":k;p(H);},[n]),g=async()=>{try{y({leverage:i}).then(()=>{e?.close?.(),orderlyUi.toast.success(s("leverage.updated"));},u=>{orderlyUi.toast.error(u.message);});}catch{}},d=i<=1,f=i>=n,C=!i||i<1||i>n,V=pe.useMemo(()=>[5,10,20,50,100].filter(u=>u<=n),[n]);return {leverageLevers:m,currentLeverage:v,value:i,marks:R,onLeverageChange:F,onLeverageIncrease:w,onLeverageReduce:x,onInputChange:N,isReduceDisabled:d,isIncreaseDisabled:f,disabled:C,step:h,onCancel:e?.close,onSave:g,isLoading:r,showSliderTip:o,setShowSliderTip:t,maxLeverage:n,toggles:V}};var W=e=>{let o=q({close:e.close});return jsxRuntime.jsx(A,{...o})};var te=e=>{let{curLeverage:o=1,symbol:t,side:s}=e,[v,n]=pe.useState(false),[r,m]=pe.useState(o),{t:y}=orderlyI18n.useTranslation(),{isMobile:R}=orderlyUi.useScreen(),{maxLeverage:i,update:p,isLoading:h}=orderlyHooks.useSymbolLeverage(t),{position:F,maxPositionNotional:w,maxPositionLeverage:x,overMaxPositionLeverage:N,overRequiredMargin:g}=ze({symbol:t,leverage:r,maxLeverage:i}),d=pe.useMemo(()=>Ge(i),[i]),f=pe.useMemo(()=>d.map(c=>({label:`${c}x`,value:c}))||[],[d]),C=pe.useMemo(()=>100/((f?.length||0)-1),[f]),V=c=>{m(c);},u=()=>{m(c=>c+1);},k=()=>{m(c=>c-1);},H=pe.useCallback(c=>{let $=Number.parseInt(c.target.value),de=Number.isNaN($)?"":$;m(de);},[i]),le=async()=>{try{p?.({leverage:r,symbol:t}).then(c=>{c.success?(e?.close?.(),orderlyUi.toast.success(y("leverage.updated"))):orderlyUi.toast.error(c.message);},c=>{orderlyUi.toast.error(c.message);});}catch{}},ue=async()=>{orderlyUi.modal.confirm({title:y("leverage.confirm"),content:jsxRuntime.jsx(orderlyUi.Text,{intensity:54,children:y("leverage.confirm.content")}),onOk:le,onCancel:()=>Promise.resolve()});},ce=r<=1,me=r>=i,ge=s?s===orderlyTypes.OrderSide.BUY:F?.position_qty&&F.position_qty>0,ve=!r||r<1||r>i||g||N;return {leverageLevers:d,currentLeverage:o,value:r,marks:f,onLeverageChange:V,onLeverageIncrease:u,onLeverageReduce:k,onInputChange:H,isReduceDisabled:ce,isIncreaseDisabled:me,disabled:ve,step:C,onCancel:e?.close,onSave:ue,isLoading:h,showSliderTip:v,setShowSliderTip:n,maxLeverage:i,toggles:d,symbol:t,maxPositionNotional:w,maxPositionLeverage:x,overMaxPositionLeverage:N,overRequiredMargin:g,isBuy:ge,isMobile:R}},Ge=e=>{if(e===10)return [1,3,5,8,10];if(e===50)return [1,10,20,35,50];let o=1,t=5,s=(e-o)/(t-1),v=[];for(let n=0;n<t;n++)v.push(Math.floor(o+s*n));return v};function ze(e){let{symbol:o,leverage:t,maxLeverage:s}=e,v=orderlyHooks.useSymbolsInfo(),{data:n}=orderlyHooks.useAccountInfo(),{data:r}=orderlyHooks.useMarkPricesStream(),{totalCollateral:m}=orderlyHooks.usePortfolio(),[y,R]=orderlyHooks.useLocalStorage("unPnlPriceBasis","markPrice"),[i]=orderlyHooks.usePositionStream("all",{calcMode:y}),p=pe.useMemo(()=>{if(o&&i?.rows?.length)return i.rows.find(g=>g.symbol===o)},[i,o]),h=pe.useMemo(()=>{let g=n?.imr_factor?.[o],d=p?.notional;if(g&&d){let f=orderlyPerp.positions.maxPositionLeverage({IMRFactor:g,notional:d});return Math.min(f,s)}return s},[p,s,o]),F=pe.useMemo(()=>{let g=n?.imr_factor?.[o];if(t&&g)return orderlyPerp.positions.maxPositionNotional({leverage:t,IMRFactor:g})},[t,o]),w=pe.useMemo(()=>t>h,[t,h]),x=pe.useMemo(()=>{if(!n||!r||!v)return orderlyUtils.zero;let g=t?i?.rows.map(C=>C.symbol===o?{...C,leverage:t}:C):i?.rows,d=orderlyPerp.account.totalInitialMarginWithQty({positions:g,markPrices:r,IMR_Factors:n.imr_factor,maxLeverage:n.max_leverage,symbolInfo:v});return orderlyPerp.account.freeCollateral({totalCollateral:m,totalInitialMarginWithOrders:d})},[i,v,n,r,m,t,o]),N=pe.useMemo(()=>x.eq(0)||x.isNegative(),[x]);return {position:p,freeCollateral:x,maxPositionNotional:F,maxPositionLeverage:h,overMaxPositionLeverage:w,overRequiredMargin:N}}var ie=e=>{let{t:o}=orderlyI18n.useTranslation();return jsxRuntime.jsxs("div",{className:"oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4",children:[jsxRuntime.jsxs("div",{className:"oui-flex oui-items-center oui-gap-2",children:[jsxRuntime.jsx(orderlyUi.TokenIcon,{symbol:e.symbol,className:"oui-size-5"}),jsxRuntime.jsx(orderlyUi.Text.formatted,{rule:"symbol",formatString:"base-type",size:e.isMobile?"xs":"base",weight:"semibold",intensity:98,children:e.symbol}),jsxRuntime.jsxs("div",{className:orderlyUi.cn(["oui-ml-auto oui-flex oui-items-center oui-gap-1"]),children:[jsxRuntime.jsx(orderlyUi.Badge,{color:e.isBuy?"success":"danger",size:"xs",children:e.isBuy?o("common.long"):o("common.short")}),jsxRuntime.jsx(Ke,{leverage:e.currentLeverage})]})]}),jsxRuntime.jsx(orderlyUi.Divider,{}),jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"start",direction:"column",mb:0,children:[jsxRuntime.jsx(T,{currentLeverage:e.currentLeverage}),jsxRuntime.jsx(O,{...e}),jsxRuntime.jsx(z,{...e}),jsxRuntime.jsx(E,{...e}),jsxRuntime.jsx(orderlyUi.Divider,{className:"oui-mb-3 oui-w-full"}),jsxRuntime.jsxs("div",{className:"oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54",children:[jsxRuntime.jsx("div",{children:jsxRuntime.jsx(orderlyI18n.Trans,{i18nKey:"leverage.maxAvailableLeverage.tips",values:{leverage:e.maxPositionLeverage},components:[jsxRuntime.jsx(orderlyUi.Text.numeral,{dp:0,suffix:"x",as:"span",className:"oui-text-base-contrast"},"0")]})}),jsxRuntime.jsx("div",{children:o("leverage.actualPositionLeverage.tips")})]}),jsxRuntime.jsxs("div",{className:orderlyUi.cn(["-oui-mb-2",e.overRequiredMargin||e.overMaxPositionLeverage?"oui-block oui-text-xs oui-font-normal":"oui-hidden"]),children:[e.overRequiredMargin&&jsxRuntime.jsx("div",{children:jsxRuntime.jsx(orderlyUi.Text,{color:"warning",children:o("leverage.overRequiredMargin.tips")})}),e.overMaxPositionLeverage&&jsxRuntime.jsx("div",{children:jsxRuntime.jsx(orderlyUi.Text,{color:"warning",children:jsxRuntime.jsx(orderlyI18n.Trans,{i18nKey:"leverage.overMaxPositionLeverage.tips",values:{leverage:e.maxPositionLeverage},components:[jsxRuntime.jsx(orderlyUi.Text.numeral,{dp:0,suffix:"X",as:"span"},"0")]})})})]}),jsxRuntime.jsx(G,{...e})]})]})},Ke=({leverage:e})=>jsxRuntime.jsxs("div",{className:orderlyUi.cn("oui-flex oui-h-[18px] oui-items-center oui-gap-1","oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2","oui-text-2xs oui-font-semibold oui-text-base-contrast-36"),children:[jsxRuntime.jsx(orderlyUi.Text,{children:"Cross"}),jsxRuntime.jsx(orderlyUi.Text.numeral,{dp:0,size:"2xs",unit:"X",children:e})]});var B=e=>{let o=te(e);return jsxRuntime.jsx(ie,{...o})};var Je="SymbolLeverageSheetId",Ze="SymbolLeverageDialogId";orderlyUi.registerSimpleSheet(Je,B,{title:()=>orderlyI18n.i18n.t("leverage.adjustedLeverage"),classNames:{}});orderlyUi.registerSimpleDialog(Ze,B,{title:()=>orderlyI18n.i18n.t("leverage.adjustedLeverage"),classNames:{content:"oui-w-[420px]"}});var to="LeverageWidgetWithDialog",ro="LeverageWidgetWithSheet";orderlyUi.registerSimpleDialog(to,W,{title:()=>orderlyI18n.i18n.t("leverage.maxAccountLeverage"),size:"md"});orderlyUi.registerSimpleSheet(ro,W,{title:()=>orderlyI18n.i18n.t("leverage.maxAccountLeverage")});
|
|
16
|
+
// src/index.ts
|
|
17
|
+
var IconButton = (props) => {
|
|
18
|
+
const { Icon, onClick, disabled } = props;
|
|
19
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
20
|
+
Icon,
|
|
21
|
+
{
|
|
22
|
+
onClick: disabled ? void 0 : onClick,
|
|
23
|
+
className: orderlyUi.cn(
|
|
24
|
+
"oui-m-2 oui-text-white oui-transition-all",
|
|
25
|
+
disabled ? "oui-cursor-not-allowed oui-opacity-20" : "oui-cursor-pointer oui-opacity-100"
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
var LeverageInput = (props) => {
|
|
31
|
+
const formatters = React__default.default.useMemo(
|
|
32
|
+
() => [orderlyUi.inputFormatter.numberFormatter, orderlyUi.inputFormatter.dpFormatter(0)],
|
|
33
|
+
[]
|
|
34
|
+
);
|
|
35
|
+
const id = React.useId();
|
|
36
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
37
|
+
"label",
|
|
38
|
+
{
|
|
39
|
+
htmlFor: id,
|
|
40
|
+
className: orderlyUi.cn(
|
|
41
|
+
"oui-w-full",
|
|
42
|
+
"oui-rounded",
|
|
43
|
+
"oui-bg-base-6",
|
|
44
|
+
"oui-flex",
|
|
45
|
+
"oui-items-center",
|
|
46
|
+
"oui-justify-between",
|
|
47
|
+
"oui-outline",
|
|
48
|
+
"oui-outline-offset-0",
|
|
49
|
+
"oui-outline-1",
|
|
50
|
+
"oui-outline-transparent",
|
|
51
|
+
"focus-within:oui-outline-primary-light",
|
|
52
|
+
"oui-input-root"
|
|
53
|
+
),
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
56
|
+
IconButton,
|
|
57
|
+
{
|
|
58
|
+
Icon: orderlyUi.ReduceIcon,
|
|
59
|
+
onClick: props.onLeverageReduce,
|
|
60
|
+
disabled: props.isReduceDisabled
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { itemAlign: "center", justify: "center", className: "oui-mr-4", children: [
|
|
64
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
65
|
+
orderlyUi.Input,
|
|
66
|
+
{
|
|
67
|
+
value: props.value,
|
|
68
|
+
id,
|
|
69
|
+
autoComplete: "off",
|
|
70
|
+
classNames: {
|
|
71
|
+
input: orderlyUi.cn("oui-text-right oui-text-[24px]"),
|
|
72
|
+
root: orderlyUi.cn(
|
|
73
|
+
"oui-w-12",
|
|
74
|
+
"oui-px-0",
|
|
75
|
+
"oui-outline",
|
|
76
|
+
"oui-outline-offset-0",
|
|
77
|
+
"oui-outline-1",
|
|
78
|
+
"oui-outline-transparent",
|
|
79
|
+
"focus-within:oui-outline-primary-none"
|
|
80
|
+
)
|
|
81
|
+
},
|
|
82
|
+
formatters,
|
|
83
|
+
onChange: props.onInputChange
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: orderlyUi.cn(
|
|
90
|
+
"oui-ml-1 oui-mt-1 oui-select-none",
|
|
91
|
+
"oui-text-base oui-text-base-contrast-36"
|
|
92
|
+
),
|
|
93
|
+
children: "x"
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
] }),
|
|
97
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
98
|
+
IconButton,
|
|
99
|
+
{
|
|
100
|
+
Icon: orderlyUi.PlusIcon,
|
|
101
|
+
onClick: props.onLeverageIncrease,
|
|
102
|
+
disabled: props.isIncreaseDisabled
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
var Leverage = (props) => {
|
|
110
|
+
const { currentLeverage } = props;
|
|
111
|
+
const { t } = orderlyI18n.useTranslation();
|
|
112
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { itemAlign: "start", direction: "column", mb: 0, children: [
|
|
113
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageHeader, { currentLeverage }),
|
|
114
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageInput, { ...props }),
|
|
115
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageSelector, { ...props }),
|
|
116
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageSlider, { ...props }),
|
|
117
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageFooter, { ...props })
|
|
118
|
+
] });
|
|
119
|
+
};
|
|
120
|
+
var LeverageFooter = (props) => {
|
|
121
|
+
const { t } = orderlyI18n.useTranslation();
|
|
122
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { direction: "row", gap: 2, width: "100%", mt: 0, pt: 5, children: [
|
|
123
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
124
|
+
orderlyUi.Button,
|
|
125
|
+
{
|
|
126
|
+
variant: "contained",
|
|
127
|
+
color: "gray",
|
|
128
|
+
fullWidth: true,
|
|
129
|
+
onClick: props.onCancel,
|
|
130
|
+
"data-testid": "oui-testid-leverage-cancel-btn",
|
|
131
|
+
size: props.isMobile ? "md" : "lg",
|
|
132
|
+
children: t("common.cancel")
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
+
orderlyUi.Button,
|
|
137
|
+
{
|
|
138
|
+
fullWidth: true,
|
|
139
|
+
loading: props.isLoading,
|
|
140
|
+
onClick: props.onSave,
|
|
141
|
+
"data-testid": "oui-testid-leverage-save-btn",
|
|
142
|
+
disabled: props.disabled,
|
|
143
|
+
size: props.isMobile ? "md" : "lg",
|
|
144
|
+
children: t("common.save")
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
] });
|
|
148
|
+
};
|
|
149
|
+
var LeverageHeader = (props) => {
|
|
150
|
+
const { t } = orderlyI18n.useTranslation();
|
|
151
|
+
const { currentLeverage } = props;
|
|
152
|
+
return /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Flex, { justify: "center", width: "100%", mb: 2, children: /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { gap: 1, children: [
|
|
153
|
+
`${t("common.current")}:`,
|
|
154
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text.numeral, { unit: "x", size: "sm", intensity: 80, dp: 0, children: currentLeverage ?? "--" })
|
|
155
|
+
] }) });
|
|
156
|
+
};
|
|
157
|
+
var LeverageSelector = (props) => {
|
|
158
|
+
const { value, onLeverageChange } = props;
|
|
159
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
160
|
+
orderlyUi.Flex,
|
|
161
|
+
{
|
|
162
|
+
itemAlign: "center",
|
|
163
|
+
justify: "between",
|
|
164
|
+
width: "100%",
|
|
165
|
+
mt: 4,
|
|
166
|
+
className: "oui-text-base-contrast-80",
|
|
167
|
+
children: props.toggles.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
168
|
+
orderlyUi.Flex,
|
|
169
|
+
{
|
|
170
|
+
itemAlign: "center",
|
|
171
|
+
justify: "center",
|
|
172
|
+
className: orderlyUi.cn(
|
|
173
|
+
`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`,
|
|
174
|
+
value === option ? "oui-border-primary oui-bg-base-6" : "oui-border-line-12"
|
|
175
|
+
),
|
|
176
|
+
onClick: () => onLeverageChange?.(option),
|
|
177
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
178
|
+
orderlyUi.Flex,
|
|
179
|
+
{
|
|
180
|
+
itemAlign: "center",
|
|
181
|
+
justify: "center",
|
|
182
|
+
className: orderlyUi.cn(`oui-h-3 oui-w-9 oui-select-none`),
|
|
183
|
+
children: [
|
|
184
|
+
option,
|
|
185
|
+
"x"
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
},
|
|
190
|
+
option
|
|
191
|
+
))
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
};
|
|
195
|
+
var getMarkPosition = (item, index, max, total) => {
|
|
196
|
+
const min = 1;
|
|
197
|
+
const maxSteps = max - min;
|
|
198
|
+
const percentPerStep = 100 / maxSteps;
|
|
199
|
+
const position = percentPerStep * (item - min);
|
|
200
|
+
if (index === 0)
|
|
201
|
+
return Math.min(position + 2, 100);
|
|
202
|
+
if (index === total - 1)
|
|
203
|
+
return Math.max(position - 3, 0);
|
|
204
|
+
return position;
|
|
205
|
+
};
|
|
206
|
+
var LeverageSlider = (props) => {
|
|
207
|
+
const {
|
|
208
|
+
leverageLevers,
|
|
209
|
+
maxLeverage = 0,
|
|
210
|
+
className,
|
|
211
|
+
value,
|
|
212
|
+
showSliderTip,
|
|
213
|
+
marks
|
|
214
|
+
} = props;
|
|
215
|
+
const sliderMax = leverageLevers.length > 0 ? Math.max(...leverageLevers) : maxLeverage;
|
|
216
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Box, { pt: 4, width: "100%", className, children: [
|
|
217
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
218
|
+
orderlyUi.Slider,
|
|
219
|
+
{
|
|
220
|
+
max: maxLeverage,
|
|
221
|
+
min: 1,
|
|
222
|
+
marks,
|
|
223
|
+
value: [value],
|
|
224
|
+
onValueChange: (e) => {
|
|
225
|
+
props.onLeverageChange(e[0]);
|
|
226
|
+
props.setShowSliderTip(true);
|
|
227
|
+
},
|
|
228
|
+
color: "primary",
|
|
229
|
+
onValueCommit: (e) => {
|
|
230
|
+
props.onValueCommit?.(e);
|
|
231
|
+
props.setShowSliderTip(false);
|
|
232
|
+
},
|
|
233
|
+
showTip: showSliderTip,
|
|
234
|
+
tipFormatter: (value2) => {
|
|
235
|
+
return `${value2}x`;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
),
|
|
239
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Flex, { justify: "between", width: "100%", pt: 3, children: leverageLevers?.map((item, index) => {
|
|
240
|
+
const position = getMarkPosition(
|
|
241
|
+
item,
|
|
242
|
+
index,
|
|
243
|
+
sliderMax,
|
|
244
|
+
leverageLevers.length
|
|
245
|
+
);
|
|
246
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
247
|
+
"button",
|
|
248
|
+
{
|
|
249
|
+
onClick: () => {
|
|
250
|
+
props.onLeverageChange(item);
|
|
251
|
+
props.onValueCommit?.([item]);
|
|
252
|
+
},
|
|
253
|
+
className: orderlyUi.cn(
|
|
254
|
+
"oui-absolute oui-pb-3 oui-text-2xs oui-transform oui--translate-x-1/2",
|
|
255
|
+
Number(props.value) >= Number(item) ? "oui-text-primary-light" : "oui-text-base-contrast-54"
|
|
256
|
+
),
|
|
257
|
+
style: {
|
|
258
|
+
left: `${position}%`
|
|
259
|
+
},
|
|
260
|
+
"data-testid": `oui-testid-leverage-${item}-btn`,
|
|
261
|
+
children: `${item}x`
|
|
262
|
+
},
|
|
263
|
+
item
|
|
264
|
+
);
|
|
265
|
+
}) })
|
|
266
|
+
] });
|
|
267
|
+
};
|
|
268
|
+
var useLeverageScript = (options) => {
|
|
269
|
+
const [showSliderTip, setShowSliderTip] = React.useState(false);
|
|
270
|
+
const { t } = orderlyI18n.useTranslation();
|
|
271
|
+
const { curLeverage, maxLeverage, isLoading, leverageLevers, update } = orderlyHooks.useLeverage();
|
|
272
|
+
const marks = React.useMemo(() => {
|
|
273
|
+
return leverageLevers.map((e) => ({
|
|
274
|
+
label: `${e}x`,
|
|
275
|
+
value: e
|
|
276
|
+
}));
|
|
277
|
+
}, [leverageLevers]);
|
|
278
|
+
const [leverage, setLeverage] = React.useState(curLeverage ?? 0);
|
|
279
|
+
const step = 100 / ((marks?.length || 0) - 1);
|
|
280
|
+
const onLeverageChange = (leverage2) => {
|
|
281
|
+
setLeverage(leverage2);
|
|
282
|
+
};
|
|
283
|
+
const onLeverageIncrease = () => {
|
|
284
|
+
setLeverage((prev) => prev + 1);
|
|
285
|
+
};
|
|
286
|
+
const onLeverageReduce = () => {
|
|
287
|
+
setLeverage((prev) => prev - 1);
|
|
288
|
+
};
|
|
289
|
+
const onInputChange = React.useCallback(
|
|
290
|
+
(e) => {
|
|
291
|
+
const parsed = Number.parseInt(e.target.value);
|
|
292
|
+
const value = Number.isNaN(parsed) ? "" : parsed;
|
|
293
|
+
setLeverage(value);
|
|
294
|
+
},
|
|
295
|
+
[maxLeverage]
|
|
296
|
+
);
|
|
297
|
+
const onSave = async () => {
|
|
298
|
+
try {
|
|
299
|
+
update({ leverage }).then(
|
|
300
|
+
() => {
|
|
301
|
+
options?.close?.();
|
|
302
|
+
orderlyUi.toast.success(t("leverage.updated"));
|
|
303
|
+
},
|
|
304
|
+
(err) => {
|
|
305
|
+
orderlyUi.toast.error(err.message);
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
} catch (err) {
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
const isReduceDisabled = leverage <= 1;
|
|
312
|
+
const isIncreaseDisabled = leverage >= maxLeverage;
|
|
313
|
+
const disabled = !leverage || leverage < 1 || leverage > maxLeverage;
|
|
314
|
+
const toggles = React.useMemo(() => {
|
|
315
|
+
return [5, 10, 20, 50, 100].filter((e) => e <= maxLeverage);
|
|
316
|
+
}, [maxLeverage]);
|
|
317
|
+
return {
|
|
318
|
+
leverageLevers,
|
|
319
|
+
currentLeverage: curLeverage,
|
|
320
|
+
value: leverage,
|
|
321
|
+
marks,
|
|
322
|
+
onLeverageChange,
|
|
323
|
+
onLeverageIncrease,
|
|
324
|
+
onLeverageReduce,
|
|
325
|
+
onInputChange,
|
|
326
|
+
isReduceDisabled,
|
|
327
|
+
isIncreaseDisabled,
|
|
328
|
+
disabled,
|
|
329
|
+
step,
|
|
330
|
+
onCancel: options?.close,
|
|
331
|
+
onSave,
|
|
332
|
+
isLoading,
|
|
333
|
+
showSliderTip,
|
|
334
|
+
setShowSliderTip,
|
|
335
|
+
maxLeverage,
|
|
336
|
+
toggles
|
|
337
|
+
};
|
|
338
|
+
};
|
|
339
|
+
var LeverageEditor = (props) => {
|
|
340
|
+
const state = useLeverageScript({ close: props.close });
|
|
341
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Leverage, { ...state });
|
|
342
|
+
};
|
|
343
|
+
var useSymbolLeverageScript = (options) => {
|
|
344
|
+
const { curLeverage = 1, symbol, side } = options;
|
|
345
|
+
const [showSliderTip, setShowSliderTip] = React.useState(false);
|
|
346
|
+
const [leverage, setLeverage] = React.useState(curLeverage);
|
|
347
|
+
const { t } = orderlyI18n.useTranslation();
|
|
348
|
+
const { isMobile } = orderlyUi.useScreen();
|
|
349
|
+
const {
|
|
350
|
+
maxLeverage: originalMaxLeverage,
|
|
351
|
+
update,
|
|
352
|
+
isLoading
|
|
353
|
+
} = orderlyHooks.useSymbolLeverage(symbol);
|
|
354
|
+
const maxLeverage = originalMaxLeverage;
|
|
355
|
+
const {
|
|
356
|
+
position,
|
|
357
|
+
maxPositionNotional,
|
|
358
|
+
maxPositionLeverage,
|
|
359
|
+
overMaxPositionLeverage,
|
|
360
|
+
overRequiredMargin
|
|
361
|
+
} = useCalc({ symbol, leverage, maxLeverage });
|
|
362
|
+
const formattedLeverageLevers = React.useMemo(() => {
|
|
363
|
+
return generateLeverageLeversForSelector(maxLeverage);
|
|
364
|
+
}, [maxLeverage]);
|
|
365
|
+
const leverageLevers = React.useMemo(() => {
|
|
366
|
+
return generateLeverageLevers(maxLeverage);
|
|
367
|
+
}, [maxLeverage]);
|
|
368
|
+
const marks = React.useMemo(() => {
|
|
369
|
+
return leverageLevers.map((e) => ({
|
|
370
|
+
label: `${e}x`,
|
|
371
|
+
value: e
|
|
372
|
+
})) || [];
|
|
373
|
+
}, [leverageLevers]);
|
|
374
|
+
const step = React.useMemo(() => {
|
|
375
|
+
return 100 / ((marks?.length || 0) - 1);
|
|
376
|
+
}, [marks]);
|
|
377
|
+
const onLeverageChange = (leverage2) => {
|
|
378
|
+
setLeverage(leverage2);
|
|
379
|
+
};
|
|
380
|
+
const onLeverageIncrease = () => {
|
|
381
|
+
setLeverage((prev) => prev + 1);
|
|
382
|
+
};
|
|
383
|
+
const onLeverageReduce = () => {
|
|
384
|
+
setLeverage((prev) => prev - 1);
|
|
385
|
+
};
|
|
386
|
+
const onInputChange = React.useCallback(
|
|
387
|
+
(e) => {
|
|
388
|
+
const parsed = Number.parseInt(e.target.value);
|
|
389
|
+
if (!Number.isNaN(parsed)) {
|
|
390
|
+
setLeverage(parsed);
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
[]
|
|
394
|
+
);
|
|
395
|
+
const onConfirmSave = async () => {
|
|
396
|
+
try {
|
|
397
|
+
update?.({ leverage, symbol }).then(
|
|
398
|
+
(res) => {
|
|
399
|
+
if (res.success) {
|
|
400
|
+
options?.close?.();
|
|
401
|
+
orderlyUi.toast.success(t("leverage.updated"));
|
|
402
|
+
} else {
|
|
403
|
+
orderlyUi.toast.error(res.message);
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
(err) => {
|
|
407
|
+
orderlyUi.toast.error(err.message);
|
|
408
|
+
}
|
|
409
|
+
);
|
|
410
|
+
} catch (err) {
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
const onSave = async () => {
|
|
414
|
+
orderlyUi.modal.confirm({
|
|
415
|
+
title: t("leverage.confirm"),
|
|
416
|
+
content: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { intensity: 54, children: t("leverage.confirm.content") }),
|
|
417
|
+
onOk: onConfirmSave,
|
|
418
|
+
onCancel: () => {
|
|
419
|
+
return Promise.resolve();
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
};
|
|
423
|
+
const isReduceDisabled = leverage <= 1;
|
|
424
|
+
const isIncreaseDisabled = leverage >= maxLeverage;
|
|
425
|
+
const isBuy = side ? side === orderlyTypes.OrderSide.BUY : position?.position_qty && position.position_qty > 0;
|
|
426
|
+
const disabled = !leverage || leverage < 1 || leverage > maxLeverage || overRequiredMargin || overMaxPositionLeverage;
|
|
427
|
+
return {
|
|
428
|
+
leverageLevers,
|
|
429
|
+
currentLeverage: curLeverage,
|
|
430
|
+
// Keep the displayed leverage fixed until the user confirms the change.
|
|
431
|
+
value: leverage,
|
|
432
|
+
// Input and slider reflect the temporary value being edited.
|
|
433
|
+
marks,
|
|
434
|
+
onLeverageChange,
|
|
435
|
+
onLeverageIncrease,
|
|
436
|
+
onLeverageReduce,
|
|
437
|
+
onInputChange,
|
|
438
|
+
isReduceDisabled,
|
|
439
|
+
isIncreaseDisabled,
|
|
440
|
+
disabled,
|
|
441
|
+
step,
|
|
442
|
+
onCancel: options?.close,
|
|
443
|
+
onSave,
|
|
444
|
+
isLoading,
|
|
445
|
+
showSliderTip,
|
|
446
|
+
setShowSliderTip,
|
|
447
|
+
maxLeverage,
|
|
448
|
+
toggles: formattedLeverageLevers,
|
|
449
|
+
symbol,
|
|
450
|
+
maxPositionNotional,
|
|
451
|
+
maxPositionLeverage,
|
|
452
|
+
overMaxPositionLeverage,
|
|
453
|
+
overRequiredMargin,
|
|
454
|
+
isBuy,
|
|
455
|
+
isMobile
|
|
456
|
+
};
|
|
457
|
+
};
|
|
458
|
+
var generateLeverageLeversForSelector = (max) => {
|
|
459
|
+
if (max === 10) {
|
|
460
|
+
return [1, 3, 5, 8, 10];
|
|
461
|
+
} else if (max === 50) {
|
|
462
|
+
return [1, 10, 20, 35, 50];
|
|
463
|
+
}
|
|
464
|
+
const min = 1;
|
|
465
|
+
const parts = 5;
|
|
466
|
+
const step = (max - min) / (parts - 1);
|
|
467
|
+
const result = [];
|
|
468
|
+
for (let i = 0; i < parts; i++) {
|
|
469
|
+
result.push(Math.floor(min + step * i));
|
|
470
|
+
}
|
|
471
|
+
return result;
|
|
472
|
+
};
|
|
473
|
+
var generateEvenlyDistributedMarks = (max) => {
|
|
474
|
+
const result = [];
|
|
475
|
+
if (max % 5 === 0) {
|
|
476
|
+
const step = max / 5;
|
|
477
|
+
for (let i = 0; i < 6; i++) {
|
|
478
|
+
const value = step * i;
|
|
479
|
+
result.push(value === 0 ? 1 : value);
|
|
480
|
+
}
|
|
481
|
+
} else {
|
|
482
|
+
result.push(1);
|
|
483
|
+
const quarter = max * 0.25;
|
|
484
|
+
const half = max * 0.5;
|
|
485
|
+
const threeQuarter = max * 0.75;
|
|
486
|
+
const quarterRounded = Math.round(quarter);
|
|
487
|
+
const halfRounded = Math.round(half);
|
|
488
|
+
const threeQuarterRounded = Math.round(threeQuarter);
|
|
489
|
+
if (quarterRounded > 1 && quarterRounded !== halfRounded) {
|
|
490
|
+
result.push(quarterRounded);
|
|
491
|
+
}
|
|
492
|
+
if (halfRounded > 1) {
|
|
493
|
+
result.push(halfRounded);
|
|
494
|
+
}
|
|
495
|
+
if (threeQuarterRounded > halfRounded && threeQuarterRounded < max) {
|
|
496
|
+
result.push(threeQuarterRounded);
|
|
497
|
+
}
|
|
498
|
+
if (max > 1) {
|
|
499
|
+
result.push(max);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return result;
|
|
503
|
+
};
|
|
504
|
+
var generateLeverageLevers = (max) => {
|
|
505
|
+
switch (max) {
|
|
506
|
+
case 10:
|
|
507
|
+
return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
508
|
+
case 20:
|
|
509
|
+
return [1, 5, 10, 15, 20];
|
|
510
|
+
case 50:
|
|
511
|
+
return [1, 10, 20, 30, 40, 50];
|
|
512
|
+
case 100:
|
|
513
|
+
return [1, 20, 40, 60, 80, 100];
|
|
514
|
+
}
|
|
515
|
+
const result = [];
|
|
516
|
+
if (max < 10) {
|
|
517
|
+
for (let i = 1; i <= max; i++) {
|
|
518
|
+
result.push(i);
|
|
519
|
+
}
|
|
520
|
+
} else {
|
|
521
|
+
result.push(...generateEvenlyDistributedMarks(max));
|
|
522
|
+
}
|
|
523
|
+
return result;
|
|
524
|
+
};
|
|
525
|
+
function useCalc(inputs) {
|
|
526
|
+
const { symbol, leverage, maxLeverage } = inputs;
|
|
527
|
+
const symbolsInfo = orderlyHooks.useSymbolsInfo();
|
|
528
|
+
const { data: accountInfo } = orderlyHooks.useAccountInfo();
|
|
529
|
+
const { data: markPrices } = orderlyHooks.useMarkPricesStream();
|
|
530
|
+
const { totalCollateral } = orderlyHooks.usePortfolio();
|
|
531
|
+
const [unPnlPriceBasis, setUnPnlPriceBasic] = orderlyHooks.useLocalStorage(
|
|
532
|
+
"unPnlPriceBasis",
|
|
533
|
+
"markPrice"
|
|
534
|
+
);
|
|
535
|
+
const [positions] = orderlyHooks.usePositionStream("all", {
|
|
536
|
+
calcMode: unPnlPriceBasis
|
|
537
|
+
});
|
|
538
|
+
const position = React.useMemo(() => {
|
|
539
|
+
if (symbol && positions?.rows?.length) {
|
|
540
|
+
return positions.rows.find((item) => item.symbol === symbol);
|
|
541
|
+
}
|
|
542
|
+
}, [positions, symbol]);
|
|
543
|
+
const maxPositionLeverage = React.useMemo(() => {
|
|
544
|
+
const IMRFactor = accountInfo?.imr_factor?.[symbol];
|
|
545
|
+
const notional = position?.notional;
|
|
546
|
+
if (IMRFactor && notional) {
|
|
547
|
+
const maxPositionLeverage2 = orderlyPerp.positions.maxPositionLeverage({
|
|
548
|
+
IMRFactor,
|
|
549
|
+
notional
|
|
550
|
+
});
|
|
551
|
+
return Math.min(maxPositionLeverage2, maxLeverage);
|
|
552
|
+
}
|
|
553
|
+
return maxLeverage;
|
|
554
|
+
}, [position, maxLeverage, symbol]);
|
|
555
|
+
const maxPositionNotional = React.useMemo(() => {
|
|
556
|
+
const IMRFactor = accountInfo?.imr_factor?.[symbol];
|
|
557
|
+
if (leverage && IMRFactor) {
|
|
558
|
+
return orderlyPerp.positions.maxPositionNotional({
|
|
559
|
+
leverage,
|
|
560
|
+
IMRFactor
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
}, [leverage, symbol]);
|
|
564
|
+
const overMaxPositionLeverage = React.useMemo(() => {
|
|
565
|
+
return leverage > maxPositionLeverage;
|
|
566
|
+
}, [leverage, maxPositionLeverage]);
|
|
567
|
+
const freeCollateral = React.useMemo(() => {
|
|
568
|
+
if (!accountInfo || !markPrices || !symbolsInfo) {
|
|
569
|
+
return orderlyUtils.zero;
|
|
570
|
+
}
|
|
571
|
+
const positionList = leverage ? positions?.rows.map((item) => {
|
|
572
|
+
if (item.symbol === symbol) {
|
|
573
|
+
return {
|
|
574
|
+
...item,
|
|
575
|
+
leverage
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
return item;
|
|
579
|
+
}) : positions?.rows;
|
|
580
|
+
const totalInitialMarginWithOrders = orderlyPerp.account.totalInitialMarginWithQty({
|
|
581
|
+
positions: positionList,
|
|
582
|
+
markPrices,
|
|
583
|
+
IMR_Factors: accountInfo.imr_factor,
|
|
584
|
+
// not used
|
|
585
|
+
maxLeverage: accountInfo.max_leverage,
|
|
586
|
+
symbolInfo: symbolsInfo
|
|
587
|
+
});
|
|
588
|
+
const freeCollateral2 = orderlyPerp.account.freeCollateral({
|
|
589
|
+
totalCollateral,
|
|
590
|
+
totalInitialMarginWithOrders
|
|
591
|
+
});
|
|
592
|
+
return freeCollateral2;
|
|
593
|
+
}, [
|
|
594
|
+
positions,
|
|
595
|
+
symbolsInfo,
|
|
596
|
+
accountInfo,
|
|
597
|
+
markPrices,
|
|
598
|
+
totalCollateral,
|
|
599
|
+
leverage,
|
|
600
|
+
symbol
|
|
601
|
+
]);
|
|
602
|
+
const overRequiredMargin = React.useMemo(() => {
|
|
603
|
+
return freeCollateral.eq(0) || freeCollateral.isNegative();
|
|
604
|
+
}, [freeCollateral]);
|
|
605
|
+
return {
|
|
606
|
+
position,
|
|
607
|
+
freeCollateral,
|
|
608
|
+
maxPositionNotional,
|
|
609
|
+
maxPositionLeverage,
|
|
610
|
+
overMaxPositionLeverage,
|
|
611
|
+
overRequiredMargin
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
var SymbolLeverage = (props) => {
|
|
615
|
+
const { t } = orderlyI18n.useTranslation();
|
|
616
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4", children: [
|
|
617
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oui-flex oui-items-center oui-gap-2", children: [
|
|
618
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.TokenIcon, { symbol: props.symbol, className: "oui-size-5" }),
|
|
619
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
620
|
+
orderlyUi.Text.formatted,
|
|
621
|
+
{
|
|
622
|
+
rule: "symbol",
|
|
623
|
+
formatString: "base-type",
|
|
624
|
+
size: props.isMobile ? "xs" : "base",
|
|
625
|
+
weight: "semibold",
|
|
626
|
+
intensity: 98,
|
|
627
|
+
children: props.symbol
|
|
628
|
+
}
|
|
629
|
+
),
|
|
630
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
631
|
+
"div",
|
|
632
|
+
{
|
|
633
|
+
className: orderlyUi.cn(["oui-ml-auto oui-flex oui-items-center oui-gap-1"]),
|
|
634
|
+
children: [
|
|
635
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Badge, { color: props.isBuy ? "success" : "danger", size: "xs", children: props.isBuy ? t("common.long") : t("common.short") }),
|
|
636
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageBadge, { leverage: props.currentLeverage })
|
|
637
|
+
]
|
|
638
|
+
}
|
|
639
|
+
)
|
|
640
|
+
] }),
|
|
641
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Divider, {}),
|
|
642
|
+
/* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { itemAlign: "start", direction: "column", mb: 0, children: [
|
|
643
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageHeader, { currentLeverage: props.currentLeverage }),
|
|
644
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageInput, { ...props }),
|
|
645
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageSelector, { ...props }),
|
|
646
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageSlider, { ...props }),
|
|
647
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Divider, { className: "oui-mb-3 oui-w-full" }),
|
|
648
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54", children: [
|
|
649
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
650
|
+
orderlyI18n.Trans,
|
|
651
|
+
{
|
|
652
|
+
i18nKey: "leverage.maxAvailableLeverage.tips",
|
|
653
|
+
values: { leverage: props.maxPositionLeverage },
|
|
654
|
+
components: [
|
|
655
|
+
// @ts-ignore
|
|
656
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
657
|
+
orderlyUi.Text.numeral,
|
|
658
|
+
{
|
|
659
|
+
dp: 0,
|
|
660
|
+
suffix: "x",
|
|
661
|
+
as: "span",
|
|
662
|
+
className: "oui-text-base-contrast"
|
|
663
|
+
},
|
|
664
|
+
"0"
|
|
665
|
+
)
|
|
666
|
+
]
|
|
667
|
+
}
|
|
668
|
+
) }),
|
|
669
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { children: t("leverage.actualPositionLeverage.tips") })
|
|
670
|
+
] }),
|
|
671
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
672
|
+
"div",
|
|
673
|
+
{
|
|
674
|
+
className: orderlyUi.cn([
|
|
675
|
+
"-oui-mb-2",
|
|
676
|
+
props.overRequiredMargin || props.overMaxPositionLeverage ? "oui-block oui-text-xs oui-font-normal" : "oui-hidden"
|
|
677
|
+
]),
|
|
678
|
+
children: [
|
|
679
|
+
props.overRequiredMargin && /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { color: "warning", children: t("leverage.overRequiredMargin.tips") }) }),
|
|
680
|
+
props.overMaxPositionLeverage && /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { color: "warning", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
681
|
+
orderlyI18n.Trans,
|
|
682
|
+
{
|
|
683
|
+
i18nKey: "leverage.overMaxPositionLeverage.tips",
|
|
684
|
+
values: { leverage: props.maxPositionLeverage },
|
|
685
|
+
components: [
|
|
686
|
+
// @ts-ignore
|
|
687
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text.numeral, { dp: 0, suffix: "X", as: "span" }, "0")
|
|
688
|
+
]
|
|
689
|
+
}
|
|
690
|
+
) }) })
|
|
691
|
+
]
|
|
692
|
+
}
|
|
693
|
+
),
|
|
694
|
+
/* @__PURE__ */ jsxRuntime.jsx(LeverageFooter, { ...props })
|
|
695
|
+
] })
|
|
696
|
+
] });
|
|
697
|
+
};
|
|
698
|
+
var LeverageBadge = ({ leverage }) => {
|
|
699
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
700
|
+
"div",
|
|
701
|
+
{
|
|
702
|
+
className: orderlyUi.cn(
|
|
703
|
+
"oui-flex oui-h-[18px] oui-items-center oui-gap-1",
|
|
704
|
+
"oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2",
|
|
705
|
+
"oui-text-2xs oui-font-semibold oui-text-base-contrast-36"
|
|
706
|
+
),
|
|
707
|
+
children: [
|
|
708
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { children: "Cross" }),
|
|
709
|
+
/* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text.numeral, { dp: 0, size: "2xs", unit: "X", children: leverage })
|
|
710
|
+
]
|
|
711
|
+
}
|
|
712
|
+
);
|
|
713
|
+
};
|
|
714
|
+
var SymbolLeverageWidget = (props) => {
|
|
715
|
+
const state = useSymbolLeverageScript(props);
|
|
716
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SymbolLeverage, { ...state });
|
|
717
|
+
};
|
|
17
718
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
719
|
+
// src/symbolLeverage/index.ts
|
|
720
|
+
var SymbolLeverageSheetId = "SymbolLeverageSheetId";
|
|
721
|
+
var SymbolLeverageDialogId = "SymbolLeverageDialogId";
|
|
722
|
+
orderlyUi.registerSimpleSheet(SymbolLeverageSheetId, SymbolLeverageWidget, {
|
|
723
|
+
title: () => orderlyI18n.i18n.t("leverage.adjustedLeverage"),
|
|
724
|
+
classNames: {
|
|
725
|
+
// content: "oui-p-5",
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
orderlyUi.registerSimpleDialog(SymbolLeverageDialogId, SymbolLeverageWidget, {
|
|
729
|
+
title: () => orderlyI18n.i18n.t("leverage.adjustedLeverage"),
|
|
730
|
+
classNames: {
|
|
731
|
+
content: "oui-w-[420px]"
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
// src/index.ts
|
|
736
|
+
var LeverageWidgetWithDialogId = "LeverageWidgetWithDialog";
|
|
737
|
+
var LeverageWidgetWithSheetId = "LeverageWidgetWithSheet";
|
|
738
|
+
orderlyUi.registerSimpleDialog(LeverageWidgetWithDialogId, LeverageEditor, {
|
|
739
|
+
title: () => orderlyI18n.i18n.t("leverage.maxAccountLeverage"),
|
|
740
|
+
size: "md"
|
|
741
|
+
});
|
|
742
|
+
orderlyUi.registerSimpleSheet(LeverageWidgetWithSheetId, LeverageEditor, {
|
|
743
|
+
title: () => orderlyI18n.i18n.t("leverage.maxAccountLeverage")
|
|
744
|
+
});
|
|
745
|
+
|
|
746
|
+
exports.Leverage = Leverage;
|
|
747
|
+
exports.LeverageEditor = LeverageEditor;
|
|
748
|
+
exports.LeverageHeader = LeverageHeader;
|
|
749
|
+
exports.LeverageSlider = LeverageSlider;
|
|
750
|
+
exports.LeverageWidgetWithDialogId = LeverageWidgetWithDialogId;
|
|
751
|
+
exports.LeverageWidgetWithSheetId = LeverageWidgetWithSheetId;
|
|
752
|
+
exports.SymbolLeverageDialogId = SymbolLeverageDialogId;
|
|
753
|
+
exports.SymbolLeverageSheetId = SymbolLeverageSheetId;
|
|
754
|
+
exports.SymbolLeverageWidget = SymbolLeverageWidget;
|
|
755
|
+
exports.useLeverageScript = useLeverageScript;
|
|
28
756
|
//# sourceMappingURL=out.js.map
|
|
29
757
|
//# sourceMappingURL=index.js.map
|