@orderly.network/ui-tpsl 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ var utils = require('@orderly.network/utils');
|
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
8
|
var types = require('@orderly.network/types');
|
|
9
9
|
|
|
10
|
-
var X=e=>{let{type:t,values:o}=e,[n,m]=hooks.useLocalStorage("TP/SL_Mode","Offset%"),[d,g]=react.useState(!0),a=react.useMemo(()=>{switch(n){case"Offset":return `${t.toLowerCase()}_offset`;case"Offset%":return `${t.toLowerCase()}_offset_percentage`;default:return `${t.toLowerCase()}_pnl`}},[n]),i=react.useMemo(()=>o[n],[o]),_=react.useMemo(()=>[{label:"PnL",value:"PnL",testId:"PnL_menu_item"},{label:"Offset",value:"Offset",testId:"Offset_mneu_item"},{label:"Offset%",value:"Offset%",testId:"Offset%_menu_item"}],[]),P=react.useRef(""),b=l=>{e.onChange(a,l);},T=l=>{let{dp:u=2}=l;return {onRenderBefore:(s,L)=>(s=`${s}`,d&&t==="SL"&&n==="PnL"&&(s=s.startsWith("-")?s:"-"+s),s===""||s==="-"?"":n==="Offset%"?`${new utils.Decimal(s.replace(new RegExp(P.current.replace(".","\\.")+"$"),"")).mul(100).todp(2,4).toString()}${P.current}`:(n==="Offset"&&(s=utils.todpIfNeed(s,u)),`${s}`)),onSendBefore:s=>{if(/^\-?0{2,}$/.test(s))return "0";if(n==="Offset%"){if(s!==""){s=utils.todpIfNeed(s,2);let L=s.match(/\.0{0,2}$/);L?P.current=L[0]:P.current="",s=new utils.Decimal(s).div(100).toString(),s=`${s}${P.current}`;}}else n==="PnL"&&t==="SL"&&d?s=s.startsWith("-")?s:"-"+s:s=utils.todpIfNeed(s,u);return s===""||s==="-"?"":s}}};return {mode:n,modes:_,type:e.type,formatter:T,onModeChange:l=>{m(l);},value:i,pnl:o.PnL,onValueChange:b,quote_dp:e.quote_dp,setFocus:g}};var ee=e=>{let{mode:t,modes:o,onModeChange:n,onValueChange:m,quote:d,quote_dp:g,value:a,pnl:i}=e,[_,P]=react.useState(t),[b,T]=react.useState(t==="Offset%"?"%":d),l=react.useMemo(()=>{let u=Number(i);if(isNaN(u)||u===0)return "";if(u>0)return "oui-text-trade-profit";if(u<0)return "oui-text-trade-loss"},[i]);return react.useEffect(()=>{P(t),T(t==="Offset%"?"%":d);},[t]),jsxRuntime.jsx(ui.Input,{prefix:t,size:{initial:"lg",lg:"md"},placeholder:b,align:"right",value:a,"data-testid":e.testId,autoComplete:"off",onValueChange:m,formatters:[e.formatter({dp:g,mode:t}),ui.inputFormatter.currencyFormatter,ui.inputFormatter.decimalPointFormatter],classNames:{input:l,prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onFocus:()=>{T(""),e.setFocus(!0);},onBlur:()=>{T(t==="Offset%"?"%":d),e.setFocus(!1);},suffix:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[t==="Offset%"&&!!a&&jsxRuntime.jsx(ui.Text,{size:"2xs",color:"inherit",className:ui.cn("oui-ml-[2px]",l),children:"%"}),jsxRuntime.jsx(Ee,{mode:t,modes:o,onModeChange:u=>n(u.value)})]})})},Ee=e=>jsxRuntime.jsx(ui.SimpleDropdownMenu,{currentValue:e.mode,menu:e.modes,align:"end",size:"xs",className:"oui-min-w-[80px]",onSelect:t=>e.onModeChange(t),children:jsxRuntime.jsx("button",{className:"oui-p-2",children:jsxRuntime.jsx(ui.CaretDownIcon,{size:12,color:"white"})})});var W=e=>{let{testId:t,quote:o,...n}=e,m=X(n);return jsxRuntime.jsx(ee,{...m,testId:t,quote:o})};var se=e=>{let{TPSL_OrderEntity:t,symbolInfo:o,onCancel:n,onComplete:m,status:d,errors:g,isPosition:a}=e;return jsxRuntime.jsxs("div",{id:"orderly-tp_sl-order-edit-content",children:[(!e.isEditing||e.isEditing&&!e.isPosition)&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Ge,{maxQty:e.maxQty,quantity:e.orderQuantity??e.maxQty,baseTick:o("base_tick"),dp:o("base_dp"),onQuantityChange:e.setQuantity,quote:o("base"),isEditing:e.isEditing,isPosition:a,errorMsg:e.errors?.quantity?.message}),jsxRuntime.jsx(ui.Divider,{my:4,intensity:8})]}),jsxRuntime.jsx(We,{sl_pnl:t.sl_pnl,tp_pnl:t.tp_pnl,quote:o("quote"),quote_dp:o("quote_dp"),onPriceChange:e.setOrderPrice,onPnLChange:e.setPnL,errors:g,tp_values:{PnL:`${t.tp_pnl??""}`,Offset:`${t.tp_offset??""}`,"Offset%":`${t.tp_offset_percentage??""}`},sl_values:{PnL:`${t.sl_pnl??""}`,Offset:`${t.sl_offset??""}`,"Offset%":`${t.sl_offset_percentage??""}`},tp_trigger_price:t.tp_trigger_price??"",sl_trigger_price:t.sl_trigger_price??""}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:3,mt:4,children:[jsxRuntime.jsx(ui.Button,{size:"md",color:"secondary","data-testid":"tpsl-cancel",onClick:()=>{n?.();},children:"Cancel"}),jsxRuntime.jsx(ui.ThrottledButton,{size:"md","data-testid":"tpsl-confirm",disabled:!e.valid||d.isCreateMutating,loading:d.isCreateMutating||d.isUpdateMutating,onClick:()=>{e.onSubmit().then(()=>{m?.();},()=>{});},children:"Confirm"})]})]})},Ge=e=>{let{isPosition:t}=e,o=react.useRef(null),n=ui.convertValueToPercentage(e.quantity,0,e.maxQty)/100,m=()=>{e.onQuantityChange?.(0),o.current?.focus(),setTimeout(()=>{o.current?.setSelectionRange(0,1);},0);},d=a=>{if(e.baseTick>0){e.onQuantityChange?.(hooks.utils.formatNumber(a,e.baseTick)??a);}},g=(t?"":e.quantity).toString().length>0?e.errorMsg:void 0;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(ui.Flex,{gap:2,children:[jsxRuntime.jsx("div",{className:"oui-flex-1",children:jsxRuntime.jsx(ui.Input.tooltip,{"data-testid":"oui-testid-tpsl-popUp-quantity-input",ref:o,prefix:"Quantity",size:{initial:"lg",lg:"md"},align:"right",value:t?"":e.quantity,autoComplete:"off",classNames:{prefix:"oui-text-base-contrast-54",root:ui.cn("oui-bg-base-5 oui-outline-line-12",g&&"oui-outline-danger")},tooltipProps:{content:{className:"oui-bg-base-6 oui-text-base-contrast-80"},arrow:{className:"oui-fill-base-6"}},tooltip:g,color:g?"danger":void 0,formatters:[ui.inputFormatter.dpFormatter(e.dp),ui.inputFormatter.numberFormatter,ui.inputFormatter.currencyFormatter,ui.inputFormatter.decimalPointFormatter],onValueChange:a=>{e.onQuantityChange?.(a);let i=Number(a);if(i&&i>e.maxQty){let _=t?0:e.maxQty;e.onQuantityChange?.(_),o.current?.blur();}},onBlur:a=>d(a.target.value),suffix:t?jsxRuntime.jsx("button",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",onClick:()=>{m();},children:"Entire position"}):jsxRuntime.jsx("span",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",children:e.quote})})}),!e.isEditing&&jsxRuntime.jsx(ui.Button,{onClick:()=>{let a=t?0:e.maxQty;e.onQuantityChange?.(a),a===0&&m();},variant:"outlined",className:ui.cn("oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]",t?"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20":"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5"),children:"Position"})]}),jsxRuntime.jsx(ui.Flex,{mt:2,itemAlign:"center",height:"15px",children:jsxRuntime.jsx(ui.Slider.single,{markCount:5,color:"primary",max:e.maxQty,min:0,showTip:!0,step:e.baseTick,value:e.quantity,onValueCommit:a=>{d(`${a}`);},onValueChange:a=>{e.onQuantityChange?.(a);}})}),jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text.numeral,{rule:"percentages",color:"primary",size:"2xs",children:n}),jsxRuntime.jsxs(ui.Flex,{itemAlign:"center",gap:1,children:[jsxRuntime.jsx("button",{className:"oui-leading-none",style:{lineHeight:0},onClick:()=>{e.onQuantityChange?.(e.maxQty);},children:jsxRuntime.jsx(ui.Text,{color:"primary",size:"2xs",children:"Max"})}),jsxRuntime.jsx(ui.Text.numeral,{rule:"price",size:"2xs",intensity:54,tick:e.baseTick,children:e.maxQty})]})]})]})},We=e=>{let t=(o,n)=>{e.onPnLChange(o,n);};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsxs(ui.Text,{size:"2xs",intensity:80,children:["Take profit ",jsxRuntime.jsx(ui.Text,{intensity:36,children:"(market order)"})]}),jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsxRuntime.jsx(ui.Text.numeral,{size:"2xs",coloring:!0,showIdentifier:!0,className:"oui-ml-1",children:e.tp_pnl??"-"})]})]}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsxRuntime.jsx(oe,{type:"TP",value:e.tp_trigger_price,error:e.errors?.tp_trigger_price?.message,onValueChange:o=>{e.onPriceChange("tp_trigger_price",o);},quote_dp:e.quote_dp??2}),jsxRuntime.jsx(W,{type:"TP",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.tp_values})]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsxs(ui.Text,{size:"2xs",intensity:80,children:["Stop loss ",jsxRuntime.jsx(ui.Text,{intensity:36,children:"(market order)"})]}),jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsxRuntime.jsx(ui.Text.numeral,{size:"2xs",coloring:!0,showIdentifier:!0,className:"oui-ml-1",children:e.sl_pnl??"-"})]})]}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsxRuntime.jsx(oe,{type:"SL",value:e.sl_trigger_price,error:e.errors?.sl_trigger_price?.message,onValueChange:o=>{e.onPriceChange("sl_trigger_price",o);},quote_dp:e.quote_dp??2}),jsxRuntime.jsx(W,{type:"SL",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.sl_values})]})]})]})},oe=e=>{let[t,o]=react.useState("USDC");return jsxRuntime.jsx(ui.Input.tooltip,{"data-testid":`oui-testid-tpsl-popUp-${e.type.toLowerCase()}-input`,prefix:"Mark price",size:{initial:"lg",lg:"md"},tooltip:e.error,placeholder:t,align:"right",autoComplete:"off",value:e.value,color:e.error?"danger":void 0,classNames:{prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onValueChange:e.onValueChange,onFocus:()=>{o("");},onBlur:()=>{o("USDC");},formatters:[ui.inputFormatter.numberFormatter,ui.inputFormatter.dpFormatter(e.quote_dp),ui.inputFormatter.currencyFormatter,ui.inputFormatter.decimalPointFormatter]})},B=e=>{let{symbol:t,tpPrice:o,slPrice:n,qty:m,maxQty:d,side:g,quoteDP:a,baseDP:i,isEditing:_,isPositionTPSL:P}=e,[b,T]=hooks.useLocalStorage("orderly_order_confirm",!0),l=ui.textVariants({size:"xs",intensity:54}),u=P??m>=d;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[_&&jsxRuntime.jsx(ui.Text,{as:"div",size:"2xs",intensity:80,className:"oui-mb-3",children:`You agree to edit your ${utils.transSymbolformString(t)} order.`}),jsxRuntime.jsxs(ui.Flex,{pb:4,children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:jsxRuntime.jsx(ui.Text.formatted,{rule:"symbol",formatString:"base-type",size:"base",showIcon:!0,as:"div",intensity:80,children:t})}),jsxRuntime.jsxs(ui.Flex,{gap:1,children:[u&&jsxRuntime.jsx(ui.Badge,{size:"xs",color:"primary",children:"Position"}),jsxRuntime.jsx(Ue,{tpPrice:o,slPrice:n}),g===types.OrderSide.SELL?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"success",children:"Buy"}):jsxRuntime.jsx(ui.Badge,{size:"xs",color:"danger",children:"Sell"})]})]}),jsxRuntime.jsx(ui.Divider,{}),jsxRuntime.jsxs(ui.Flex,{direction:"column",itemAlign:"stretch",gapY:1,pt:4,className:ui.cn(l,"oui-pb-4 xl:oui-pb-5"),children:[jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:"Qty."}),jsxRuntime.jsx("div",{children:u?jsxRuntime.jsx("span",{className:"oui-text-base-contrast",children:"Entire position"}):jsxRuntime.jsx(ui.Text.numeral,{intensity:98,dp:i,padding:!1,children:m})})]}),typeof o=="number"&&o>0?jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:"TP Price"}),jsxRuntime.jsx(ui.Text.numeral,{as:"div",coloring:!0,unit:"USDC",size:"sm",dp:a,unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:o})]}):null,typeof n=="number"&&n>0?jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:"SL Price"}),jsxRuntime.jsx(ui.Text.numeral,{as:"div",coloring:!0,unit:"USDC",size:"sm",dp:a,className:"oui-text-trade-loss",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:n})]}):null,jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:"Price"}),jsxRuntime.jsx("div",{className:"oui-text-base-contrast",children:"Market"})]})]}),jsxRuntime.jsx(ui.Box,{pt:2,children:jsxRuntime.jsxs(ui.Flex,{gap:1,children:[jsxRuntime.jsx(ui.Checkbox,{id:"disabledConfirm",color:"white",checked:!b,onCheckedChange:s=>{T(!s);}}),jsxRuntime.jsx("label",{htmlFor:"disabledConfirm",className:ui.textVariants({size:"xs",intensity:54,className:"oui-ml-1"}),children:"Disable order confirmation"})]})})]})},Ue=e=>{let{tpPrice:t,slPrice:o}=e;return t&&o?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"TP/SL"}):t?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"TP"}):o?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"SL"}):null};var le=e=>{let{position:t,order:o,isEditing:n}=e;if(n&&!o)throw new types.SDKError("order is required when isEditing is true");let m=n?o.symbol:t.symbol,d=hooks.useSymbolsInfo(),g=react.useRef(types.AlgoOrderRootType.TP_SL),[a]=hooks.useLocalStorage("orderly_order_confirm",!0),[i,{submit:_,deleteOrder:P,setValue:b,validate:T,errors:l,isCreateMutating:u,isUpdateMutating:s}]=hooks.useTPSLOrder({symbol:m,position_qty:t.position_qty,average_open_price:t.average_open_price},{defaultOrder:o,isEditing:n}),L=p=>{b("quantity",p);},v=(p,S)=>{b(p,S);},w=(p,S)=>{b(p,S);},C=react.useMemo(()=>Math.abs(Number(t.position_qty)),[t.position_qty]),K=react.useMemo(()=>{let p=o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?C:o?.quantity,S=0;if((Number(i.quantity)!==p||!n&&i.quantity)&&(S=1),o&&n){let _e=o.child_orders.find(V=>V.algo_type===types.AlgoOrderType.TAKE_PROFIT),be=o.child_orders.find(V=>V.algo_type===types.AlgoOrderType.STOP_LOSS);_e?.trigger_price!==Number(i.tp_trigger_price)&&typeof typeof i.tp_trigger_price<"u"&&(S=2),be?.trigger_price!==Number(i.sl_trigger_price)&&typeof i.sl_trigger_price<"u"&&(S=3);}return S===1&&!i.tp_trigger_price&&!i.sl_trigger_price&&(S=-1),S},[i.tp_trigger_price,i.sl_trigger_price,i.quantity,o,n]),Pe=react.useMemo(()=>o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL&&Number(i.quantity)<C&&!i.tp_trigger_price&&!i.sl_trigger_price?!1:K>0&&!!i.quantity&&!l,[i.quantity,C,K,l]),$=react.useMemo(()=>n?o&&o.algo_type!==types.AlgoOrderRootType.POSITIONAL_TP_SL?!1:i.algo_order_id&&i.quantity==0?!0:Number(i.quantity)>=C:Number(i.quantity)>=C,[i.quantity,C,o?.algo_type,n]);react.useEffect(()=>{if(!n&&$){let p=hooks.utils.findTPSLFromOrder(o);!i.tp_trigger_price&&p.tp_trigger_price&&v("tp_trigger_price",p.tp_trigger_price),!i.sl_trigger_price&&p.sl_trigger_price&&v("sl_trigger_price",p.sl_trigger_price);}},[n,$,i]),react.useEffect(()=>{let p=Number(i.quantity)<C?types.AlgoOrderRootType.TP_SL:types.AlgoOrderRootType.POSITIONAL_TP_SL;typeof e.onTPSLTypeChange=="function"&&g.current!==p&&e.onTPSLTypeChange(p),g.current=p;},[i.quantity,C]);let fe=()=>o?.algo_order_id&&o?.symbol?P(o?.algo_order_id,o?.symbol):Promise.reject("order id or symbol is invalid"),ye=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"||!a?_().then(()=>!0,p=>(p?.message&&ui.toast.error(p.message),Promise.reject(!1))):e.onConfirm(i,{position:t,submit:_,cancel:fe})).then(p=>{});return {isEditing:n,symbolInfo:d[m],maxQty:C,setQuantity:L,orderQuantity:i.quantity,isPosition:$,TPSL_OrderEntity:i,setOrderValue:b,setPnL:w,setOrderPrice:v,onSubmit:ye,valid:Pe,errors:l,status:{isCreateMutating:u,isUpdateMutating:s}}};var F=e=>{let{onCancel:t,onComplete:o,...n}=e,m=le(n);return jsxRuntime.jsx(se,{...m,onCancel:t,onComplete:o})};var at=e=>{let{position:t,order:o,baseDP:n,quoteDP:m,buttonProps:d,isEditing:g}=e,[a,i]=react.useState(!1),[_,P]=react.useState(!0),[b]=hooks.useLocalStorage("orderly_order_confirm",!0),T=g?o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL:void 0;return jsxRuntime.jsxs(ui.PopoverRoot,{onOpenChange:l=>{_&&i(l);},open:a,children:[jsxRuntime.jsx(ui.PopoverTrigger,{asChild:!0,onClick:()=>{i(!0);},children:e.children||jsxRuntime.jsx(ui.Button,{variant:"outlined",size:"sm",color:"secondary",...d,children:e.label})}),jsxRuntime.jsx(ui.PopoverContent,{className:ui.cn("oui-w-[360px]",_?"oui-visible":"oui-invisible"),align:"end",side:"top",children:jsxRuntime.jsx(F,{position:t,order:o,isEditing:g,onComplete:()=>{i(!1);},onCancel:()=>{i(!1);},onConfirm:(l,u)=>{if(!b)return Promise.resolve(!0);P(!1);let s=Math.abs(Number(t.position_qty));if(`${l.tp_trigger_price??""}`.length===0&&`${l.sl_trigger_price??""}`.length===0)return ui.modal.confirm({title:"Cancel Order",content:"Are you sure you want to cancel this TP/SL order?",onOk:()=>u.cancel()}).then(()=>(i(!1),P(!0),!0),()=>(P(!0),Promise.reject(!1)));let L=g||!!l&&l.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL&&l.quantity===s;return ui.modal.confirm({title:L?"Edit Order":"Confirm Order",onOk:()=>u.submit(),classNames:{body:"!oui-pb-0"},content:jsxRuntime.jsx(B,{isPositionTPSL:T,isEditing:L,symbol:l.symbol,qty:Number(l.quantity),maxQty:s,tpPrice:Number(l.tp_trigger_price),slPrice:Number(l.sl_trigger_price),side:l.side,quoteDP:m??2,baseDP:n??2})}).then(()=>(i(!1),P(!0),!0),()=>(P(!0),Promise.reject(!1)))}})})]})};var ft=e=>{let{position:t,order:o,symbolInfo:n,isEditing:m}=e,{resolve:d,hide:g,updateArgs:a}=ui.useModal(),[i]=hooks.useLocalStorage("orderly_order_confirm",!0),_=m?o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL:void 0,P=u=>{m||a({title:u});},b=()=>{d(),g();},{quote_dp:T,base_dp:l}=n;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(yt,{position:t,symbolInfo:n}),jsxRuntime.jsx(F,{...e,onTPSLTypeChange:u=>{P(u===types.AlgoOrderRootType.TP_SL?"TP/SL":"Position TP/SL");},onComplete:b,onConfirm:(u,s)=>{if(!i)return Promise.resolve(!0);let L=Math.abs(Number(t.position_qty)),v=m||!!u&&u.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL&&u.quantity===L;return ui.modal.confirm({title:v?"Edit Order":"Confirm Order",bodyClassName:"oui-pb-0 lg:oui-pb-0",onOk:()=>s.submit(),content:jsxRuntime.jsx(B,{isPositionTPSL:_,isEditing:m,symbol:u.symbol,qty:Number(u.quantity),maxQty:L,tpPrice:Number(u.tp_trigger_price),slPrice:Number(u.sl_trigger_price),side:u.side,quoteDP:T??2,baseDP:l??2})}).then(()=>!0,w=>(w?.message&&ui.toast.error(w.message),Promise.reject(!1)))},onCancel:()=>{g();}})]})};var yt=e=>{let{position:t,symbolInfo:o}=e,{data:n}=hooks.useMarkPrice(t.symbol),m=ui.useModal(),d=react.useMemo(()=>m.args?.title==="Position TP/SL",[m.args?.title]);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",pb:3,itemAlign:"center",children:[jsxRuntime.jsx(ui.Text.formatted,{rule:"symbol",className:"oui-text-xs",showIcon:!0,children:t.symbol}),jsxRuntime.jsxs(ui.Flex,{gapX:1,children:[d&&jsxRuntime.jsx(ui.Badge,{size:"xs",color:"primary",children:"Position"}),jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"TP/SL"}),t.position_qty<0?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"buy",children:"Buy"}):jsxRuntime.jsx(ui.Badge,{size:"xs",color:"sell",children:"Sell"})]})]}),jsxRuntime.jsx(ui.Divider,{intensity:8}),jsxRuntime.jsxs(ui.Box,{py:3,className:"oui-space-y-1",children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text,{size:"sm",intensity:54,children:"Avg. open"}),jsxRuntime.jsx(ui.Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:t.average_open_price})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text,{size:"sm",intensity:54,children:"Mark price"}),jsxRuntime.jsx(ui.Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:n})]})]})]})};
|
|
10
|
+
var X=e=>{let{type:t,values:o}=e,[n,m]=hooks.useLocalStorage("TP/SL_Mode","Offset%"),[d,g]=react.useState(true),a=react.useMemo(()=>{switch(n){case "Offset":return `${t.toLowerCase()}_offset`;case "Offset%":return `${t.toLowerCase()}_offset_percentage`;default:return `${t.toLowerCase()}_pnl`}},[n]),i=react.useMemo(()=>o[n],[o]),_=react.useMemo(()=>[{label:"PnL",value:"PnL",testId:"PnL_menu_item"},{label:"Offset",value:"Offset",testId:"Offset_mneu_item"},{label:"Offset%",value:"Offset%",testId:"Offset%_menu_item"}],[]),P=react.useRef(""),b=l=>{e.onChange(a,l);},T=l=>{let{dp:u=2}=l;return {onRenderBefore:(s,L)=>(s=`${s}`,d&&t==="SL"&&n==="PnL"&&(s=s.startsWith("-")?s:"-"+s),s===""||s==="-"?"":n==="Offset%"?`${new utils.Decimal(s.replace(new RegExp(P.current.replace(".","\\.")+"$"),"")).mul(100).todp(2,4).toString()}${P.current}`:(n==="Offset"&&(s=utils.todpIfNeed(s,u)),`${s}`)),onSendBefore:s=>{if(/^\-?0{2,}$/.test(s))return "0";if(n==="Offset%"){if(s!==""){s=utils.todpIfNeed(s,2);let L=s.match(/\.0{0,2}$/);L?P.current=L[0]:P.current="",s=new utils.Decimal(s).div(100).toString(),s=`${s}${P.current}`;}}else n==="PnL"&&t==="SL"&&d?s=s.startsWith("-")?s:"-"+s:s=utils.todpIfNeed(s,u);return s===""||s==="-"?"":s}}};return {mode:n,modes:_,type:e.type,formatter:T,onModeChange:l=>{m(l);},value:i,pnl:o.PnL,onValueChange:b,quote_dp:e.quote_dp,setFocus:g}};var ee=e=>{let{mode:t,modes:o,onModeChange:n,onValueChange:m,quote:d,quote_dp:g,value:a,pnl:i}=e,[_,P]=react.useState(t),[b,T]=react.useState(t==="Offset%"?"%":d),l=react.useMemo(()=>{let u=Number(i);if(isNaN(u)||u===0)return "";if(u>0)return "oui-text-trade-profit";if(u<0)return "oui-text-trade-loss"},[i]);return react.useEffect(()=>{P(t),T(t==="Offset%"?"%":d);},[t]),jsxRuntime.jsx(ui.Input,{prefix:t,size:{initial:"lg",lg:"md"},placeholder:b,align:"right",value:a,"data-testid":e.testId,autoComplete:"off",onValueChange:m,formatters:[e.formatter({dp:g,mode:t}),ui.inputFormatter.currencyFormatter,ui.inputFormatter.decimalPointFormatter],classNames:{input:l,prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onFocus:()=>{T(""),e.setFocus(true);},onBlur:()=>{T(t==="Offset%"?"%":d),e.setFocus(false);},suffix:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[t==="Offset%"&&!!a&&jsxRuntime.jsx(ui.Text,{size:"2xs",color:"inherit",className:ui.cn("oui-ml-[2px]",l),children:"%"}),jsxRuntime.jsx(Ee,{mode:t,modes:o,onModeChange:u=>n(u.value)})]})})},Ee=e=>jsxRuntime.jsx(ui.SimpleDropdownMenu,{currentValue:e.mode,menu:e.modes,align:"end",size:"xs",className:"oui-min-w-[80px]",onSelect:t=>e.onModeChange(t),children:jsxRuntime.jsx("button",{className:"oui-p-2",children:jsxRuntime.jsx(ui.CaretDownIcon,{size:12,color:"white"})})});var W=e=>{let{testId:t,quote:o,...n}=e,m=X(n);return jsxRuntime.jsx(ee,{...m,testId:t,quote:o})};var se=e=>{let{TPSL_OrderEntity:t,symbolInfo:o,onCancel:n,onComplete:m,status:d,errors:g,isPosition:a}=e;return jsxRuntime.jsxs("div",{id:"orderly-tp_sl-order-edit-content",children:[(!e.isEditing||e.isEditing&&!e.isPosition)&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Ge,{maxQty:e.maxQty,quantity:e.orderQuantity??e.maxQty,baseTick:o("base_tick"),dp:o("base_dp"),onQuantityChange:e.setQuantity,quote:o("base"),isEditing:e.isEditing,isPosition:a,errorMsg:e.errors?.quantity?.message}),jsxRuntime.jsx(ui.Divider,{my:4,intensity:8})]}),jsxRuntime.jsx(We,{sl_pnl:t.sl_pnl,tp_pnl:t.tp_pnl,quote:o("quote"),quote_dp:o("quote_dp"),onPriceChange:e.setOrderPrice,onPnLChange:e.setPnL,errors:g,tp_values:{PnL:`${t.tp_pnl??""}`,Offset:`${t.tp_offset??""}`,"Offset%":`${t.tp_offset_percentage??""}`},sl_values:{PnL:`${t.sl_pnl??""}`,Offset:`${t.sl_offset??""}`,"Offset%":`${t.sl_offset_percentage??""}`},tp_trigger_price:t.tp_trigger_price??"",sl_trigger_price:t.sl_trigger_price??""}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:3,mt:4,children:[jsxRuntime.jsx(ui.Button,{size:"md",color:"secondary","data-testid":"tpsl-cancel",onClick:()=>{n?.();},children:"Cancel"}),jsxRuntime.jsx(ui.ThrottledButton,{size:"md","data-testid":"tpsl-confirm",disabled:!e.valid||d.isCreateMutating,loading:d.isCreateMutating||d.isUpdateMutating,onClick:()=>{e.onSubmit().then(()=>{m?.();},()=>{});},children:"Confirm"})]})]})},Ge=e=>{let{isPosition:t}=e,o=react.useRef(null),n=ui.convertValueToPercentage(e.quantity,0,e.maxQty)/100,m=()=>{e.onQuantityChange?.(0),o.current?.focus(),setTimeout(()=>{o.current?.setSelectionRange(0,1);},0);},d=a=>{if(e.baseTick>0){e.onQuantityChange?.(hooks.utils.formatNumber(a,e.baseTick)??a);}},g=(t?"":e.quantity).toString().length>0?e.errorMsg:void 0;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(ui.Flex,{gap:2,children:[jsxRuntime.jsx("div",{className:"oui-flex-1",children:jsxRuntime.jsx(ui.Input.tooltip,{"data-testid":"oui-testid-tpsl-popUp-quantity-input",ref:o,prefix:"Quantity",size:{initial:"lg",lg:"md"},align:"right",value:t?"":e.quantity,autoComplete:"off",classNames:{prefix:"oui-text-base-contrast-54",root:ui.cn("oui-bg-base-5 oui-outline-line-12",g&&"oui-outline-danger")},tooltipProps:{content:{className:"oui-bg-base-6 oui-text-base-contrast-80"},arrow:{className:"oui-fill-base-6"}},tooltip:g,color:g?"danger":void 0,formatters:[ui.inputFormatter.dpFormatter(e.dp),ui.inputFormatter.numberFormatter,ui.inputFormatter.currencyFormatter,ui.inputFormatter.decimalPointFormatter],onValueChange:a=>{e.onQuantityChange?.(a);let i=Number(a);if(i&&i>e.maxQty){let _=t?0:e.maxQty;e.onQuantityChange?.(_),o.current?.blur();}},onBlur:a=>d(a.target.value),suffix:t?jsxRuntime.jsx("button",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",onClick:()=>{m();},children:"Entire position"}):jsxRuntime.jsx("span",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",children:e.quote})})}),!e.isEditing&&jsxRuntime.jsx(ui.Button,{onClick:()=>{let a=t?0:e.maxQty;e.onQuantityChange?.(a),a===0&&m();},variant:"outlined",className:ui.cn("oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]",t?"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20":"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5"),children:"Position"})]}),jsxRuntime.jsx(ui.Flex,{mt:2,itemAlign:"center",height:"15px",children:jsxRuntime.jsx(ui.Slider.single,{markCount:5,color:"primary",max:e.maxQty,min:0,showTip:true,step:e.baseTick,value:e.quantity,onValueCommit:a=>{d(`${a}`);},onValueChange:a=>{e.onQuantityChange?.(a);}})}),jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text.numeral,{rule:"percentages",color:"primary",size:"2xs",children:n}),jsxRuntime.jsxs(ui.Flex,{itemAlign:"center",gap:1,children:[jsxRuntime.jsx("button",{className:"oui-leading-none",style:{lineHeight:0},onClick:()=>{e.onQuantityChange?.(e.maxQty);},children:jsxRuntime.jsx(ui.Text,{color:"primary",size:"2xs",children:"Max"})}),jsxRuntime.jsx(ui.Text.numeral,{rule:"price",size:"2xs",intensity:54,tick:e.baseTick,children:e.maxQty})]})]})]})},We=e=>{let t=(o,n)=>{e.onPnLChange(o,n);};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsxs(ui.Text,{size:"2xs",intensity:80,children:["Take profit ",jsxRuntime.jsx(ui.Text,{intensity:36,children:"(market order)"})]}),jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsxRuntime.jsx(ui.Text.numeral,{size:"2xs",coloring:true,showIdentifier:true,className:"oui-ml-1",children:e.tp_pnl??"-"})]})]}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsxRuntime.jsx(oe,{type:"TP",value:e.tp_trigger_price,error:e.errors?.tp_trigger_price?.message,onValueChange:o=>{e.onPriceChange("tp_trigger_price",o);},quote_dp:e.quote_dp??2}),jsxRuntime.jsx(W,{type:"TP",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.tp_values})]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsxs(ui.Text,{size:"2xs",intensity:80,children:["Stop loss ",jsxRuntime.jsx(ui.Text,{intensity:36,children:"(market order)"})]}),jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsxRuntime.jsx(ui.Text.numeral,{size:"2xs",coloring:true,showIdentifier:true,className:"oui-ml-1",children:e.sl_pnl??"-"})]})]}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsxRuntime.jsx(oe,{type:"SL",value:e.sl_trigger_price,error:e.errors?.sl_trigger_price?.message,onValueChange:o=>{e.onPriceChange("sl_trigger_price",o);},quote_dp:e.quote_dp??2}),jsxRuntime.jsx(W,{type:"SL",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.sl_values})]})]})]})},oe=e=>{let[t,o]=react.useState("USDC");return jsxRuntime.jsx(ui.Input.tooltip,{"data-testid":`oui-testid-tpsl-popUp-${e.type.toLowerCase()}-input`,prefix:"Mark price",size:{initial:"lg",lg:"md"},tooltip:e.error,placeholder:t,align:"right",autoComplete:"off",value:e.value,color:e.error?"danger":void 0,classNames:{prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onValueChange:e.onValueChange,onFocus:()=>{o("");},onBlur:()=>{o("USDC");},formatters:[ui.inputFormatter.numberFormatter,ui.inputFormatter.dpFormatter(e.quote_dp),ui.inputFormatter.currencyFormatter,ui.inputFormatter.decimalPointFormatter]})},B=e=>{let{symbol:t,tpPrice:o,slPrice:n,qty:m,maxQty:d,side:g,quoteDP:a,baseDP:i,isEditing:_,isPositionTPSL:P}=e,[b,T]=hooks.useLocalStorage("orderly_order_confirm",true),l=ui.textVariants({size:"xs",intensity:54}),u=P??m>=d;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[_&&jsxRuntime.jsx(ui.Text,{as:"div",size:"2xs",intensity:80,className:"oui-mb-3",children:`You agree to edit your ${utils.transSymbolformString(t)} order.`}),jsxRuntime.jsxs(ui.Flex,{pb:4,children:[jsxRuntime.jsx(ui.Box,{grow:true,children:jsxRuntime.jsx(ui.Text.formatted,{rule:"symbol",formatString:"base-type",size:"base",showIcon:true,as:"div",intensity:80,children:t})}),jsxRuntime.jsxs(ui.Flex,{gap:1,children:[u&&jsxRuntime.jsx(ui.Badge,{size:"xs",color:"primary",children:"Position"}),jsxRuntime.jsx(Ue,{tpPrice:o,slPrice:n}),g===types.OrderSide.SELL?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"success",children:"Buy"}):jsxRuntime.jsx(ui.Badge,{size:"xs",color:"danger",children:"Sell"})]})]}),jsxRuntime.jsx(ui.Divider,{}),jsxRuntime.jsxs(ui.Flex,{direction:"column",itemAlign:"stretch",gapY:1,pt:4,className:ui.cn(l,"oui-pb-4 xl:oui-pb-5"),children:[jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:true,children:"Qty."}),jsxRuntime.jsx("div",{children:u?jsxRuntime.jsx("span",{className:"oui-text-base-contrast",children:"Entire position"}):jsxRuntime.jsx(ui.Text.numeral,{intensity:98,dp:i,padding:false,children:m})})]}),typeof o=="number"&&o>0?jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:true,children:"TP Price"}),jsxRuntime.jsx(ui.Text.numeral,{as:"div",coloring:true,unit:"USDC",size:"sm",dp:a,unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:o})]}):null,typeof n=="number"&&n>0?jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:true,children:"SL Price"}),jsxRuntime.jsx(ui.Text.numeral,{as:"div",coloring:true,unit:"USDC",size:"sm",dp:a,className:"oui-text-trade-loss",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:n})]}):null,jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:true,children:"Price"}),jsxRuntime.jsx("div",{className:"oui-text-base-contrast",children:"Market"})]})]}),jsxRuntime.jsx(ui.Box,{pt:2,children:jsxRuntime.jsxs(ui.Flex,{gap:1,children:[jsxRuntime.jsx(ui.Checkbox,{id:"disabledConfirm",color:"white",checked:!b,onCheckedChange:s=>{T(!s);}}),jsxRuntime.jsx("label",{htmlFor:"disabledConfirm",className:ui.textVariants({size:"xs",intensity:54,className:"oui-ml-1"}),children:"Disable order confirmation"})]})})]})},Ue=e=>{let{tpPrice:t,slPrice:o}=e;return t&&o?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"TP/SL"}):t?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"TP"}):o?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"SL"}):null};var le=e=>{let{position:t,order:o,isEditing:n}=e;if(n&&!o)throw new types.SDKError("order is required when isEditing is true");let m=n?o.symbol:t.symbol,d=hooks.useSymbolsInfo(),g=react.useRef(types.AlgoOrderRootType.TP_SL),[a]=hooks.useLocalStorage("orderly_order_confirm",true),[i,{submit:_,deleteOrder:P,setValue:b,validate:T,errors:l,isCreateMutating:u,isUpdateMutating:s}]=hooks.useTPSLOrder({symbol:m,position_qty:t.position_qty,average_open_price:t.average_open_price},{defaultOrder:o,isEditing:n}),L=p=>{b("quantity",p);},v=(p,S)=>{b(p,S);},w=(p,S)=>{b(p,S);},C=react.useMemo(()=>Math.abs(Number(t.position_qty)),[t.position_qty]),K=react.useMemo(()=>{let p=o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?C:o?.quantity,S=0;if((Number(i.quantity)!==p||!n&&i.quantity)&&(S=1),o&&n){let _e=o.child_orders.find(V=>V.algo_type===types.AlgoOrderType.TAKE_PROFIT),be=o.child_orders.find(V=>V.algo_type===types.AlgoOrderType.STOP_LOSS);_e?.trigger_price!==Number(i.tp_trigger_price)&&typeof typeof i.tp_trigger_price<"u"&&(S=2),be?.trigger_price!==Number(i.sl_trigger_price)&&typeof i.sl_trigger_price<"u"&&(S=3);}return S===1&&!i.tp_trigger_price&&!i.sl_trigger_price&&(S=-1),S},[i.tp_trigger_price,i.sl_trigger_price,i.quantity,o,n]),Pe=react.useMemo(()=>o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL&&Number(i.quantity)<C&&!i.tp_trigger_price&&!i.sl_trigger_price?false:K>0&&!!i.quantity&&!l,[i.quantity,C,K,l]),$=react.useMemo(()=>n?o&&o.algo_type!==types.AlgoOrderRootType.POSITIONAL_TP_SL?false:i.algo_order_id&&i.quantity==0?true:Number(i.quantity)>=C:Number(i.quantity)>=C,[i.quantity,C,o?.algo_type,n]);react.useEffect(()=>{if(!n&&$){let p=hooks.utils.findTPSLFromOrder(o);!i.tp_trigger_price&&p.tp_trigger_price&&v("tp_trigger_price",p.tp_trigger_price),!i.sl_trigger_price&&p.sl_trigger_price&&v("sl_trigger_price",p.sl_trigger_price);}},[n,$,i]),react.useEffect(()=>{let p=Number(i.quantity)<C?types.AlgoOrderRootType.TP_SL:types.AlgoOrderRootType.POSITIONAL_TP_SL;typeof e.onTPSLTypeChange=="function"&&g.current!==p&&e.onTPSLTypeChange(p),g.current=p;},[i.quantity,C]);let fe=()=>o?.algo_order_id&&o?.symbol?P(o?.algo_order_id,o?.symbol):Promise.reject("order id or symbol is invalid"),ye=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"||!a?_().then(()=>true,p=>(p?.message&&ui.toast.error(p.message),Promise.reject(false))):e.onConfirm(i,{position:t,submit:_,cancel:fe})).then(p=>{});return {isEditing:n,symbolInfo:d[m],maxQty:C,setQuantity:L,orderQuantity:i.quantity,isPosition:$,TPSL_OrderEntity:i,setOrderValue:b,setPnL:w,setOrderPrice:v,onSubmit:ye,valid:Pe,errors:l,status:{isCreateMutating:u,isUpdateMutating:s}}};var F=e=>{let{onCancel:t,onComplete:o,...n}=e,m=le(n);return jsxRuntime.jsx(se,{...m,onCancel:t,onComplete:o})};var at=e=>{let{position:t,order:o,baseDP:n,quoteDP:m,buttonProps:d,isEditing:g}=e,[a,i]=react.useState(false),[_,P]=react.useState(true),[b]=hooks.useLocalStorage("orderly_order_confirm",true),T=g?o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL:void 0;return jsxRuntime.jsxs(ui.PopoverRoot,{onOpenChange:l=>{_&&i(l);},open:a,children:[jsxRuntime.jsx(ui.PopoverTrigger,{asChild:true,onClick:()=>{i(true);},children:e.children||jsxRuntime.jsx(ui.Button,{variant:"outlined",size:"sm",color:"secondary",...d,children:e.label})}),jsxRuntime.jsx(ui.PopoverContent,{className:ui.cn("oui-w-[360px]",_?"oui-visible":"oui-invisible"),align:"end",side:"top",children:jsxRuntime.jsx(F,{position:t,order:o,isEditing:g,onComplete:()=>{i(false);},onCancel:()=>{i(false);},onConfirm:(l,u)=>{if(!b)return Promise.resolve(true);P(false);let s=Math.abs(Number(t.position_qty));if(`${l.tp_trigger_price??""}`.length===0&&`${l.sl_trigger_price??""}`.length===0)return ui.modal.confirm({title:"Cancel Order",content:"Are you sure you want to cancel this TP/SL order?",onOk:()=>u.cancel()}).then(()=>(i(false),P(true),true),()=>(P(true),Promise.reject(false)));let L=g||!!l&&l.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL&&l.quantity===s;return ui.modal.confirm({title:L?"Edit Order":"Confirm Order",onOk:()=>u.submit(),classNames:{body:"!oui-pb-0"},content:jsxRuntime.jsx(B,{isPositionTPSL:T,isEditing:L,symbol:l.symbol,qty:Number(l.quantity),maxQty:s,tpPrice:Number(l.tp_trigger_price),slPrice:Number(l.sl_trigger_price),side:l.side,quoteDP:m??2,baseDP:n??2})}).then(()=>(i(false),P(true),true),()=>(P(true),Promise.reject(false)))}})})]})};var ft=e=>{let{position:t,order:o,symbolInfo:n,isEditing:m}=e,{resolve:d,hide:g,updateArgs:a}=ui.useModal(),[i]=hooks.useLocalStorage("orderly_order_confirm",true),_=m?o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL:void 0,P=u=>{m||a({title:u});},b=()=>{d(),g();},{quote_dp:T,base_dp:l}=n;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(yt,{position:t,symbolInfo:n}),jsxRuntime.jsx(F,{...e,onTPSLTypeChange:u=>{P(u===types.AlgoOrderRootType.TP_SL?"TP/SL":"Position TP/SL");},onComplete:b,onConfirm:(u,s)=>{if(!i)return Promise.resolve(true);let L=Math.abs(Number(t.position_qty)),v=m||!!u&&u.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL&&u.quantity===L;return ui.modal.confirm({title:v?"Edit Order":"Confirm Order",bodyClassName:"oui-pb-0 lg:oui-pb-0",onOk:()=>s.submit(),content:jsxRuntime.jsx(B,{isPositionTPSL:_,isEditing:m,symbol:u.symbol,qty:Number(u.quantity),maxQty:L,tpPrice:Number(u.tp_trigger_price),slPrice:Number(u.sl_trigger_price),side:u.side,quoteDP:T??2,baseDP:l??2})}).then(()=>true,w=>(w?.message&&ui.toast.error(w.message),Promise.reject(false)))},onCancel:()=>{g();}})]})};var yt=e=>{let{position:t,symbolInfo:o}=e,{data:n}=hooks.useMarkPrice(t.symbol),m=ui.useModal(),d=react.useMemo(()=>m.args?.title==="Position TP/SL",[m.args?.title]);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",pb:3,itemAlign:"center",children:[jsxRuntime.jsx(ui.Text.formatted,{rule:"symbol",className:"oui-text-xs",showIcon:true,children:t.symbol}),jsxRuntime.jsxs(ui.Flex,{gapX:1,children:[d&&jsxRuntime.jsx(ui.Badge,{size:"xs",color:"primary",children:"Position"}),jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutral",children:"TP/SL"}),t.position_qty<0?jsxRuntime.jsx(ui.Badge,{size:"xs",color:"buy",children:"Buy"}):jsxRuntime.jsx(ui.Badge,{size:"xs",color:"sell",children:"Sell"})]})]}),jsxRuntime.jsx(ui.Divider,{intensity:8}),jsxRuntime.jsxs(ui.Box,{py:3,className:"oui-space-y-1",children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text,{size:"sm",intensity:54,children:"Avg. open"}),jsxRuntime.jsx(ui.Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:t.average_open_price})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text,{size:"sm",intensity:54,children:"Mark price"}),jsxRuntime.jsx(ui.Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:n})]})]})]})};
|
|
11
11
|
|
|
12
12
|
exports.PositionTPSLConfirm = B;
|
|
13
13
|
exports.PositionTPSLPopover = at;
|
package/dist/index.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import { transSymbolformString, Decimal, todpIfNeed } from '@orderly.network/uti
|
|
|
5
5
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
6
6
|
import { OrderSide, AlgoOrderRootType, SDKError, AlgoOrderType } from '@orderly.network/types';
|
|
7
7
|
|
|
8
|
-
var X=e=>{let{type:t,values:o}=e,[n,m]=useLocalStorage("TP/SL_Mode","Offset%"),[d,g]=useState(!0),a=useMemo(()=>{switch(n){case"Offset":return `${t.toLowerCase()}_offset`;case"Offset%":return `${t.toLowerCase()}_offset_percentage`;default:return `${t.toLowerCase()}_pnl`}},[n]),i=useMemo(()=>o[n],[o]),_=useMemo(()=>[{label:"PnL",value:"PnL",testId:"PnL_menu_item"},{label:"Offset",value:"Offset",testId:"Offset_mneu_item"},{label:"Offset%",value:"Offset%",testId:"Offset%_menu_item"}],[]),P=useRef(""),b=l=>{e.onChange(a,l);},T=l=>{let{dp:u=2}=l;return {onRenderBefore:(s,L)=>(s=`${s}`,d&&t==="SL"&&n==="PnL"&&(s=s.startsWith("-")?s:"-"+s),s===""||s==="-"?"":n==="Offset%"?`${new Decimal(s.replace(new RegExp(P.current.replace(".","\\.")+"$"),"")).mul(100).todp(2,4).toString()}${P.current}`:(n==="Offset"&&(s=todpIfNeed(s,u)),`${s}`)),onSendBefore:s=>{if(/^\-?0{2,}$/.test(s))return "0";if(n==="Offset%"){if(s!==""){s=todpIfNeed(s,2);let L=s.match(/\.0{0,2}$/);L?P.current=L[0]:P.current="",s=new Decimal(s).div(100).toString(),s=`${s}${P.current}`;}}else n==="PnL"&&t==="SL"&&d?s=s.startsWith("-")?s:"-"+s:s=todpIfNeed(s,u);return s===""||s==="-"?"":s}}};return {mode:n,modes:_,type:e.type,formatter:T,onModeChange:l=>{m(l);},value:i,pnl:o.PnL,onValueChange:b,quote_dp:e.quote_dp,setFocus:g}};var ee=e=>{let{mode:t,modes:o,onModeChange:n,onValueChange:m,quote:d,quote_dp:g,value:a,pnl:i}=e,[_,P]=useState(t),[b,T]=useState(t==="Offset%"?"%":d),l=useMemo(()=>{let u=Number(i);if(isNaN(u)||u===0)return "";if(u>0)return "oui-text-trade-profit";if(u<0)return "oui-text-trade-loss"},[i]);return useEffect(()=>{P(t),T(t==="Offset%"?"%":d);},[t]),jsx(Input,{prefix:t,size:{initial:"lg",lg:"md"},placeholder:b,align:"right",value:a,"data-testid":e.testId,autoComplete:"off",onValueChange:m,formatters:[e.formatter({dp:g,mode:t}),inputFormatter.currencyFormatter,inputFormatter.decimalPointFormatter],classNames:{input:l,prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onFocus:()=>{T(""),e.setFocus(!0);},onBlur:()=>{T(t==="Offset%"?"%":d),e.setFocus(!1);},suffix:jsxs(Fragment,{children:[t==="Offset%"&&!!a&&jsx(Text,{size:"2xs",color:"inherit",className:cn("oui-ml-[2px]",l),children:"%"}),jsx(Ee,{mode:t,modes:o,onModeChange:u=>n(u.value)})]})})},Ee=e=>jsx(SimpleDropdownMenu,{currentValue:e.mode,menu:e.modes,align:"end",size:"xs",className:"oui-min-w-[80px]",onSelect:t=>e.onModeChange(t),children:jsx("button",{className:"oui-p-2",children:jsx(CaretDownIcon,{size:12,color:"white"})})});var W=e=>{let{testId:t,quote:o,...n}=e,m=X(n);return jsx(ee,{...m,testId:t,quote:o})};var se=e=>{let{TPSL_OrderEntity:t,symbolInfo:o,onCancel:n,onComplete:m,status:d,errors:g,isPosition:a}=e;return jsxs("div",{id:"orderly-tp_sl-order-edit-content",children:[(!e.isEditing||e.isEditing&&!e.isPosition)&&jsxs(Fragment,{children:[jsx(Ge,{maxQty:e.maxQty,quantity:e.orderQuantity??e.maxQty,baseTick:o("base_tick"),dp:o("base_dp"),onQuantityChange:e.setQuantity,quote:o("base"),isEditing:e.isEditing,isPosition:a,errorMsg:e.errors?.quantity?.message}),jsx(Divider,{my:4,intensity:8})]}),jsx(We,{sl_pnl:t.sl_pnl,tp_pnl:t.tp_pnl,quote:o("quote"),quote_dp:o("quote_dp"),onPriceChange:e.setOrderPrice,onPnLChange:e.setPnL,errors:g,tp_values:{PnL:`${t.tp_pnl??""}`,Offset:`${t.tp_offset??""}`,"Offset%":`${t.tp_offset_percentage??""}`},sl_values:{PnL:`${t.sl_pnl??""}`,Offset:`${t.sl_offset??""}`,"Offset%":`${t.sl_offset_percentage??""}`},tp_trigger_price:t.tp_trigger_price??"",sl_trigger_price:t.sl_trigger_price??""}),jsxs(Grid,{cols:2,gap:3,mt:4,children:[jsx(Button,{size:"md",color:"secondary","data-testid":"tpsl-cancel",onClick:()=>{n?.();},children:"Cancel"}),jsx(ThrottledButton,{size:"md","data-testid":"tpsl-confirm",disabled:!e.valid||d.isCreateMutating,loading:d.isCreateMutating||d.isUpdateMutating,onClick:()=>{e.onSubmit().then(()=>{m?.();},()=>{});},children:"Confirm"})]})]})},Ge=e=>{let{isPosition:t}=e,o=useRef(null),n=convertValueToPercentage(e.quantity,0,e.maxQty)/100,m=()=>{e.onQuantityChange?.(0),o.current?.focus(),setTimeout(()=>{o.current?.setSelectionRange(0,1);},0);},d=a=>{if(e.baseTick>0){e.onQuantityChange?.(utils.formatNumber(a,e.baseTick)??a);}},g=(t?"":e.quantity).toString().length>0?e.errorMsg:void 0;return jsxs(Fragment,{children:[jsxs(Flex,{gap:2,children:[jsx("div",{className:"oui-flex-1",children:jsx(Input.tooltip,{"data-testid":"oui-testid-tpsl-popUp-quantity-input",ref:o,prefix:"Quantity",size:{initial:"lg",lg:"md"},align:"right",value:t?"":e.quantity,autoComplete:"off",classNames:{prefix:"oui-text-base-contrast-54",root:cn("oui-bg-base-5 oui-outline-line-12",g&&"oui-outline-danger")},tooltipProps:{content:{className:"oui-bg-base-6 oui-text-base-contrast-80"},arrow:{className:"oui-fill-base-6"}},tooltip:g,color:g?"danger":void 0,formatters:[inputFormatter.dpFormatter(e.dp),inputFormatter.numberFormatter,inputFormatter.currencyFormatter,inputFormatter.decimalPointFormatter],onValueChange:a=>{e.onQuantityChange?.(a);let i=Number(a);if(i&&i>e.maxQty){let _=t?0:e.maxQty;e.onQuantityChange?.(_),o.current?.blur();}},onBlur:a=>d(a.target.value),suffix:t?jsx("button",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",onClick:()=>{m();},children:"Entire position"}):jsx("span",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",children:e.quote})})}),!e.isEditing&&jsx(Button,{onClick:()=>{let a=t?0:e.maxQty;e.onQuantityChange?.(a),a===0&&m();},variant:"outlined",className:cn("oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]",t?"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20":"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5"),children:"Position"})]}),jsx(Flex,{mt:2,itemAlign:"center",height:"15px",children:jsx(Slider.single,{markCount:5,color:"primary",max:e.maxQty,min:0,showTip:!0,step:e.baseTick,value:e.quantity,onValueCommit:a=>{d(`${a}`);},onValueChange:a=>{e.onQuantityChange?.(a);}})}),jsxs(Flex,{justify:"between",children:[jsx(Text.numeral,{rule:"percentages",color:"primary",size:"2xs",children:n}),jsxs(Flex,{itemAlign:"center",gap:1,children:[jsx("button",{className:"oui-leading-none",style:{lineHeight:0},onClick:()=>{e.onQuantityChange?.(e.maxQty);},children:jsx(Text,{color:"primary",size:"2xs",children:"Max"})}),jsx(Text.numeral,{rule:"price",size:"2xs",intensity:54,tick:e.baseTick,children:e.maxQty})]})]})]})},We=e=>{let t=(o,n)=>{e.onPnLChange(o,n);};return jsxs(Fragment,{children:[jsxs("div",{children:[jsxs(Flex,{justify:"between",children:[jsxs(Text,{size:"2xs",intensity:80,children:["Take profit ",jsx(Text,{intensity:36,children:"(market order)"})]}),jsxs(Flex,{children:[jsx(Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsx(Text.numeral,{size:"2xs",coloring:!0,showIdentifier:!0,className:"oui-ml-1",children:e.tp_pnl??"-"})]})]}),jsxs(Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsx(oe,{type:"TP",value:e.tp_trigger_price,error:e.errors?.tp_trigger_price?.message,onValueChange:o=>{e.onPriceChange("tp_trigger_price",o);},quote_dp:e.quote_dp??2}),jsx(W,{type:"TP",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.tp_values})]})]}),jsxs("div",{children:[jsxs(Flex,{justify:"between",children:[jsxs(Text,{size:"2xs",intensity:80,children:["Stop loss ",jsx(Text,{intensity:36,children:"(market order)"})]}),jsxs(Flex,{children:[jsx(Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsx(Text.numeral,{size:"2xs",coloring:!0,showIdentifier:!0,className:"oui-ml-1",children:e.sl_pnl??"-"})]})]}),jsxs(Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsx(oe,{type:"SL",value:e.sl_trigger_price,error:e.errors?.sl_trigger_price?.message,onValueChange:o=>{e.onPriceChange("sl_trigger_price",o);},quote_dp:e.quote_dp??2}),jsx(W,{type:"SL",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.sl_values})]})]})]})},oe=e=>{let[t,o]=useState("USDC");return jsx(Input.tooltip,{"data-testid":`oui-testid-tpsl-popUp-${e.type.toLowerCase()}-input`,prefix:"Mark price",size:{initial:"lg",lg:"md"},tooltip:e.error,placeholder:t,align:"right",autoComplete:"off",value:e.value,color:e.error?"danger":void 0,classNames:{prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onValueChange:e.onValueChange,onFocus:()=>{o("");},onBlur:()=>{o("USDC");},formatters:[inputFormatter.numberFormatter,inputFormatter.dpFormatter(e.quote_dp),inputFormatter.currencyFormatter,inputFormatter.decimalPointFormatter]})},B=e=>{let{symbol:t,tpPrice:o,slPrice:n,qty:m,maxQty:d,side:g,quoteDP:a,baseDP:i,isEditing:_,isPositionTPSL:P}=e,[b,T]=useLocalStorage("orderly_order_confirm",!0),l=textVariants({size:"xs",intensity:54}),u=P??m>=d;return jsxs(Fragment,{children:[_&&jsx(Text,{as:"div",size:"2xs",intensity:80,className:"oui-mb-3",children:`You agree to edit your ${transSymbolformString(t)} order.`}),jsxs(Flex,{pb:4,children:[jsx(Box,{grow:!0,children:jsx(Text.formatted,{rule:"symbol",formatString:"base-type",size:"base",showIcon:!0,as:"div",intensity:80,children:t})}),jsxs(Flex,{gap:1,children:[u&&jsx(Badge,{size:"xs",color:"primary",children:"Position"}),jsx(Ue,{tpPrice:o,slPrice:n}),g===OrderSide.SELL?jsx(Badge,{size:"xs",color:"success",children:"Buy"}):jsx(Badge,{size:"xs",color:"danger",children:"Sell"})]})]}),jsx(Divider,{}),jsxs(Flex,{direction:"column",itemAlign:"stretch",gapY:1,pt:4,className:cn(l,"oui-pb-4 xl:oui-pb-5"),children:[jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"Qty."}),jsx("div",{children:u?jsx("span",{className:"oui-text-base-contrast",children:"Entire position"}):jsx(Text.numeral,{intensity:98,dp:i,padding:!1,children:m})})]}),typeof o=="number"&&o>0?jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"TP Price"}),jsx(Text.numeral,{as:"div",coloring:!0,unit:"USDC",size:"sm",dp:a,unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:o})]}):null,typeof n=="number"&&n>0?jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"SL Price"}),jsx(Text.numeral,{as:"div",coloring:!0,unit:"USDC",size:"sm",dp:a,className:"oui-text-trade-loss",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:n})]}):null,jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"Price"}),jsx("div",{className:"oui-text-base-contrast",children:"Market"})]})]}),jsx(Box,{pt:2,children:jsxs(Flex,{gap:1,children:[jsx(Checkbox,{id:"disabledConfirm",color:"white",checked:!b,onCheckedChange:s=>{T(!s);}}),jsx("label",{htmlFor:"disabledConfirm",className:textVariants({size:"xs",intensity:54,className:"oui-ml-1"}),children:"Disable order confirmation"})]})})]})},Ue=e=>{let{tpPrice:t,slPrice:o}=e;return t&&o?jsx(Badge,{size:"xs",color:"neutral",children:"TP/SL"}):t?jsx(Badge,{size:"xs",color:"neutral",children:"TP"}):o?jsx(Badge,{size:"xs",color:"neutral",children:"SL"}):null};var le=e=>{let{position:t,order:o,isEditing:n}=e;if(n&&!o)throw new SDKError("order is required when isEditing is true");let m=n?o.symbol:t.symbol,d=useSymbolsInfo(),g=useRef(AlgoOrderRootType.TP_SL),[a]=useLocalStorage("orderly_order_confirm",!0),[i,{submit:_,deleteOrder:P,setValue:b,validate:T,errors:l,isCreateMutating:u,isUpdateMutating:s}]=useTPSLOrder({symbol:m,position_qty:t.position_qty,average_open_price:t.average_open_price},{defaultOrder:o,isEditing:n}),L=p=>{b("quantity",p);},v=(p,S)=>{b(p,S);},w=(p,S)=>{b(p,S);},C=useMemo(()=>Math.abs(Number(t.position_qty)),[t.position_qty]),K=useMemo(()=>{let p=o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?C:o?.quantity,S=0;if((Number(i.quantity)!==p||!n&&i.quantity)&&(S=1),o&&n){let _e=o.child_orders.find(V=>V.algo_type===AlgoOrderType.TAKE_PROFIT),be=o.child_orders.find(V=>V.algo_type===AlgoOrderType.STOP_LOSS);_e?.trigger_price!==Number(i.tp_trigger_price)&&typeof typeof i.tp_trigger_price<"u"&&(S=2),be?.trigger_price!==Number(i.sl_trigger_price)&&typeof i.sl_trigger_price<"u"&&(S=3);}return S===1&&!i.tp_trigger_price&&!i.sl_trigger_price&&(S=-1),S},[i.tp_trigger_price,i.sl_trigger_price,i.quantity,o,n]),Pe=useMemo(()=>o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL&&Number(i.quantity)<C&&!i.tp_trigger_price&&!i.sl_trigger_price?!1:K>0&&!!i.quantity&&!l,[i.quantity,C,K,l]),$=useMemo(()=>n?o&&o.algo_type!==AlgoOrderRootType.POSITIONAL_TP_SL?!1:i.algo_order_id&&i.quantity==0?!0:Number(i.quantity)>=C:Number(i.quantity)>=C,[i.quantity,C,o?.algo_type,n]);useEffect(()=>{if(!n&&$){let p=utils.findTPSLFromOrder(o);!i.tp_trigger_price&&p.tp_trigger_price&&v("tp_trigger_price",p.tp_trigger_price),!i.sl_trigger_price&&p.sl_trigger_price&&v("sl_trigger_price",p.sl_trigger_price);}},[n,$,i]),useEffect(()=>{let p=Number(i.quantity)<C?AlgoOrderRootType.TP_SL:AlgoOrderRootType.POSITIONAL_TP_SL;typeof e.onTPSLTypeChange=="function"&&g.current!==p&&e.onTPSLTypeChange(p),g.current=p;},[i.quantity,C]);let fe=()=>o?.algo_order_id&&o?.symbol?P(o?.algo_order_id,o?.symbol):Promise.reject("order id or symbol is invalid"),ye=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"||!a?_().then(()=>!0,p=>(p?.message&&toast.error(p.message),Promise.reject(!1))):e.onConfirm(i,{position:t,submit:_,cancel:fe})).then(p=>{});return {isEditing:n,symbolInfo:d[m],maxQty:C,setQuantity:L,orderQuantity:i.quantity,isPosition:$,TPSL_OrderEntity:i,setOrderValue:b,setPnL:w,setOrderPrice:v,onSubmit:ye,valid:Pe,errors:l,status:{isCreateMutating:u,isUpdateMutating:s}}};var F=e=>{let{onCancel:t,onComplete:o,...n}=e,m=le(n);return jsx(se,{...m,onCancel:t,onComplete:o})};var at=e=>{let{position:t,order:o,baseDP:n,quoteDP:m,buttonProps:d,isEditing:g}=e,[a,i]=useState(!1),[_,P]=useState(!0),[b]=useLocalStorage("orderly_order_confirm",!0),T=g?o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL:void 0;return jsxs(PopoverRoot,{onOpenChange:l=>{_&&i(l);},open:a,children:[jsx(PopoverTrigger,{asChild:!0,onClick:()=>{i(!0);},children:e.children||jsx(Button,{variant:"outlined",size:"sm",color:"secondary",...d,children:e.label})}),jsx(PopoverContent,{className:cn("oui-w-[360px]",_?"oui-visible":"oui-invisible"),align:"end",side:"top",children:jsx(F,{position:t,order:o,isEditing:g,onComplete:()=>{i(!1);},onCancel:()=>{i(!1);},onConfirm:(l,u)=>{if(!b)return Promise.resolve(!0);P(!1);let s=Math.abs(Number(t.position_qty));if(`${l.tp_trigger_price??""}`.length===0&&`${l.sl_trigger_price??""}`.length===0)return modal.confirm({title:"Cancel Order",content:"Are you sure you want to cancel this TP/SL order?",onOk:()=>u.cancel()}).then(()=>(i(!1),P(!0),!0),()=>(P(!0),Promise.reject(!1)));let L=g||!!l&&l.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL&&l.quantity===s;return modal.confirm({title:L?"Edit Order":"Confirm Order",onOk:()=>u.submit(),classNames:{body:"!oui-pb-0"},content:jsx(B,{isPositionTPSL:T,isEditing:L,symbol:l.symbol,qty:Number(l.quantity),maxQty:s,tpPrice:Number(l.tp_trigger_price),slPrice:Number(l.sl_trigger_price),side:l.side,quoteDP:m??2,baseDP:n??2})}).then(()=>(i(!1),P(!0),!0),()=>(P(!0),Promise.reject(!1)))}})})]})};var ft=e=>{let{position:t,order:o,symbolInfo:n,isEditing:m}=e,{resolve:d,hide:g,updateArgs:a}=useModal(),[i]=useLocalStorage("orderly_order_confirm",!0),_=m?o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL:void 0,P=u=>{m||a({title:u});},b=()=>{d(),g();},{quote_dp:T,base_dp:l}=n;return jsxs(Fragment,{children:[jsx(yt,{position:t,symbolInfo:n}),jsx(F,{...e,onTPSLTypeChange:u=>{P(u===AlgoOrderRootType.TP_SL?"TP/SL":"Position TP/SL");},onComplete:b,onConfirm:(u,s)=>{if(!i)return Promise.resolve(!0);let L=Math.abs(Number(t.position_qty)),v=m||!!u&&u.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL&&u.quantity===L;return modal.confirm({title:v?"Edit Order":"Confirm Order",bodyClassName:"oui-pb-0 lg:oui-pb-0",onOk:()=>s.submit(),content:jsx(B,{isPositionTPSL:_,isEditing:m,symbol:u.symbol,qty:Number(u.quantity),maxQty:L,tpPrice:Number(u.tp_trigger_price),slPrice:Number(u.sl_trigger_price),side:u.side,quoteDP:T??2,baseDP:l??2})}).then(()=>!0,w=>(w?.message&&toast.error(w.message),Promise.reject(!1)))},onCancel:()=>{g();}})]})};var yt=e=>{let{position:t,symbolInfo:o}=e,{data:n}=useMarkPrice(t.symbol),m=useModal(),d=useMemo(()=>m.args?.title==="Position TP/SL",[m.args?.title]);return jsxs(Fragment,{children:[jsxs(Flex,{justify:"between",pb:3,itemAlign:"center",children:[jsx(Text.formatted,{rule:"symbol",className:"oui-text-xs",showIcon:!0,children:t.symbol}),jsxs(Flex,{gapX:1,children:[d&&jsx(Badge,{size:"xs",color:"primary",children:"Position"}),jsx(Badge,{size:"xs",color:"neutral",children:"TP/SL"}),t.position_qty<0?jsx(Badge,{size:"xs",color:"buy",children:"Buy"}):jsx(Badge,{size:"xs",color:"sell",children:"Sell"})]})]}),jsx(Divider,{intensity:8}),jsxs(Box,{py:3,className:"oui-space-y-1",children:[jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"sm",intensity:54,children:"Avg. open"}),jsx(Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:t.average_open_price})]}),jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"sm",intensity:54,children:"Mark price"}),jsx(Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:n})]})]})]})};
|
|
8
|
+
var X=e=>{let{type:t,values:o}=e,[n,m]=useLocalStorage("TP/SL_Mode","Offset%"),[d,g]=useState(true),a=useMemo(()=>{switch(n){case "Offset":return `${t.toLowerCase()}_offset`;case "Offset%":return `${t.toLowerCase()}_offset_percentage`;default:return `${t.toLowerCase()}_pnl`}},[n]),i=useMemo(()=>o[n],[o]),_=useMemo(()=>[{label:"PnL",value:"PnL",testId:"PnL_menu_item"},{label:"Offset",value:"Offset",testId:"Offset_mneu_item"},{label:"Offset%",value:"Offset%",testId:"Offset%_menu_item"}],[]),P=useRef(""),b=l=>{e.onChange(a,l);},T=l=>{let{dp:u=2}=l;return {onRenderBefore:(s,L)=>(s=`${s}`,d&&t==="SL"&&n==="PnL"&&(s=s.startsWith("-")?s:"-"+s),s===""||s==="-"?"":n==="Offset%"?`${new Decimal(s.replace(new RegExp(P.current.replace(".","\\.")+"$"),"")).mul(100).todp(2,4).toString()}${P.current}`:(n==="Offset"&&(s=todpIfNeed(s,u)),`${s}`)),onSendBefore:s=>{if(/^\-?0{2,}$/.test(s))return "0";if(n==="Offset%"){if(s!==""){s=todpIfNeed(s,2);let L=s.match(/\.0{0,2}$/);L?P.current=L[0]:P.current="",s=new Decimal(s).div(100).toString(),s=`${s}${P.current}`;}}else n==="PnL"&&t==="SL"&&d?s=s.startsWith("-")?s:"-"+s:s=todpIfNeed(s,u);return s===""||s==="-"?"":s}}};return {mode:n,modes:_,type:e.type,formatter:T,onModeChange:l=>{m(l);},value:i,pnl:o.PnL,onValueChange:b,quote_dp:e.quote_dp,setFocus:g}};var ee=e=>{let{mode:t,modes:o,onModeChange:n,onValueChange:m,quote:d,quote_dp:g,value:a,pnl:i}=e,[_,P]=useState(t),[b,T]=useState(t==="Offset%"?"%":d),l=useMemo(()=>{let u=Number(i);if(isNaN(u)||u===0)return "";if(u>0)return "oui-text-trade-profit";if(u<0)return "oui-text-trade-loss"},[i]);return useEffect(()=>{P(t),T(t==="Offset%"?"%":d);},[t]),jsx(Input,{prefix:t,size:{initial:"lg",lg:"md"},placeholder:b,align:"right",value:a,"data-testid":e.testId,autoComplete:"off",onValueChange:m,formatters:[e.formatter({dp:g,mode:t}),inputFormatter.currencyFormatter,inputFormatter.decimalPointFormatter],classNames:{input:l,prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onFocus:()=>{T(""),e.setFocus(true);},onBlur:()=>{T(t==="Offset%"?"%":d),e.setFocus(false);},suffix:jsxs(Fragment,{children:[t==="Offset%"&&!!a&&jsx(Text,{size:"2xs",color:"inherit",className:cn("oui-ml-[2px]",l),children:"%"}),jsx(Ee,{mode:t,modes:o,onModeChange:u=>n(u.value)})]})})},Ee=e=>jsx(SimpleDropdownMenu,{currentValue:e.mode,menu:e.modes,align:"end",size:"xs",className:"oui-min-w-[80px]",onSelect:t=>e.onModeChange(t),children:jsx("button",{className:"oui-p-2",children:jsx(CaretDownIcon,{size:12,color:"white"})})});var W=e=>{let{testId:t,quote:o,...n}=e,m=X(n);return jsx(ee,{...m,testId:t,quote:o})};var se=e=>{let{TPSL_OrderEntity:t,symbolInfo:o,onCancel:n,onComplete:m,status:d,errors:g,isPosition:a}=e;return jsxs("div",{id:"orderly-tp_sl-order-edit-content",children:[(!e.isEditing||e.isEditing&&!e.isPosition)&&jsxs(Fragment,{children:[jsx(Ge,{maxQty:e.maxQty,quantity:e.orderQuantity??e.maxQty,baseTick:o("base_tick"),dp:o("base_dp"),onQuantityChange:e.setQuantity,quote:o("base"),isEditing:e.isEditing,isPosition:a,errorMsg:e.errors?.quantity?.message}),jsx(Divider,{my:4,intensity:8})]}),jsx(We,{sl_pnl:t.sl_pnl,tp_pnl:t.tp_pnl,quote:o("quote"),quote_dp:o("quote_dp"),onPriceChange:e.setOrderPrice,onPnLChange:e.setPnL,errors:g,tp_values:{PnL:`${t.tp_pnl??""}`,Offset:`${t.tp_offset??""}`,"Offset%":`${t.tp_offset_percentage??""}`},sl_values:{PnL:`${t.sl_pnl??""}`,Offset:`${t.sl_offset??""}`,"Offset%":`${t.sl_offset_percentage??""}`},tp_trigger_price:t.tp_trigger_price??"",sl_trigger_price:t.sl_trigger_price??""}),jsxs(Grid,{cols:2,gap:3,mt:4,children:[jsx(Button,{size:"md",color:"secondary","data-testid":"tpsl-cancel",onClick:()=>{n?.();},children:"Cancel"}),jsx(ThrottledButton,{size:"md","data-testid":"tpsl-confirm",disabled:!e.valid||d.isCreateMutating,loading:d.isCreateMutating||d.isUpdateMutating,onClick:()=>{e.onSubmit().then(()=>{m?.();},()=>{});},children:"Confirm"})]})]})},Ge=e=>{let{isPosition:t}=e,o=useRef(null),n=convertValueToPercentage(e.quantity,0,e.maxQty)/100,m=()=>{e.onQuantityChange?.(0),o.current?.focus(),setTimeout(()=>{o.current?.setSelectionRange(0,1);},0);},d=a=>{if(e.baseTick>0){e.onQuantityChange?.(utils.formatNumber(a,e.baseTick)??a);}},g=(t?"":e.quantity).toString().length>0?e.errorMsg:void 0;return jsxs(Fragment,{children:[jsxs(Flex,{gap:2,children:[jsx("div",{className:"oui-flex-1",children:jsx(Input.tooltip,{"data-testid":"oui-testid-tpsl-popUp-quantity-input",ref:o,prefix:"Quantity",size:{initial:"lg",lg:"md"},align:"right",value:t?"":e.quantity,autoComplete:"off",classNames:{prefix:"oui-text-base-contrast-54",root:cn("oui-bg-base-5 oui-outline-line-12",g&&"oui-outline-danger")},tooltipProps:{content:{className:"oui-bg-base-6 oui-text-base-contrast-80"},arrow:{className:"oui-fill-base-6"}},tooltip:g,color:g?"danger":void 0,formatters:[inputFormatter.dpFormatter(e.dp),inputFormatter.numberFormatter,inputFormatter.currencyFormatter,inputFormatter.decimalPointFormatter],onValueChange:a=>{e.onQuantityChange?.(a);let i=Number(a);if(i&&i>e.maxQty){let _=t?0:e.maxQty;e.onQuantityChange?.(_),o.current?.blur();}},onBlur:a=>d(a.target.value),suffix:t?jsx("button",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",onClick:()=>{m();},children:"Entire position"}):jsx("span",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",children:e.quote})})}),!e.isEditing&&jsx(Button,{onClick:()=>{let a=t?0:e.maxQty;e.onQuantityChange?.(a),a===0&&m();},variant:"outlined",className:cn("oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]",t?"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20":"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5"),children:"Position"})]}),jsx(Flex,{mt:2,itemAlign:"center",height:"15px",children:jsx(Slider.single,{markCount:5,color:"primary",max:e.maxQty,min:0,showTip:true,step:e.baseTick,value:e.quantity,onValueCommit:a=>{d(`${a}`);},onValueChange:a=>{e.onQuantityChange?.(a);}})}),jsxs(Flex,{justify:"between",children:[jsx(Text.numeral,{rule:"percentages",color:"primary",size:"2xs",children:n}),jsxs(Flex,{itemAlign:"center",gap:1,children:[jsx("button",{className:"oui-leading-none",style:{lineHeight:0},onClick:()=>{e.onQuantityChange?.(e.maxQty);},children:jsx(Text,{color:"primary",size:"2xs",children:"Max"})}),jsx(Text.numeral,{rule:"price",size:"2xs",intensity:54,tick:e.baseTick,children:e.maxQty})]})]})]})},We=e=>{let t=(o,n)=>{e.onPnLChange(o,n);};return jsxs(Fragment,{children:[jsxs("div",{children:[jsxs(Flex,{justify:"between",children:[jsxs(Text,{size:"2xs",intensity:80,children:["Take profit ",jsx(Text,{intensity:36,children:"(market order)"})]}),jsxs(Flex,{children:[jsx(Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsx(Text.numeral,{size:"2xs",coloring:true,showIdentifier:true,className:"oui-ml-1",children:e.tp_pnl??"-"})]})]}),jsxs(Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsx(oe,{type:"TP",value:e.tp_trigger_price,error:e.errors?.tp_trigger_price?.message,onValueChange:o=>{e.onPriceChange("tp_trigger_price",o);},quote_dp:e.quote_dp??2}),jsx(W,{type:"TP",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.tp_values})]})]}),jsxs("div",{children:[jsxs(Flex,{justify:"between",children:[jsxs(Text,{size:"2xs",intensity:80,children:["Stop loss ",jsx(Text,{intensity:36,children:"(market order)"})]}),jsxs(Flex,{children:[jsx(Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsx(Text.numeral,{size:"2xs",coloring:true,showIdentifier:true,className:"oui-ml-1",children:e.sl_pnl??"-"})]})]}),jsxs(Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsx(oe,{type:"SL",value:e.sl_trigger_price,error:e.errors?.sl_trigger_price?.message,onValueChange:o=>{e.onPriceChange("sl_trigger_price",o);},quote_dp:e.quote_dp??2}),jsx(W,{type:"SL",onChange:t,quote:e.quote,quote_dp:e.quote_dp,values:e.sl_values})]})]})]})},oe=e=>{let[t,o]=useState("USDC");return jsx(Input.tooltip,{"data-testid":`oui-testid-tpsl-popUp-${e.type.toLowerCase()}-input`,prefix:"Mark price",size:{initial:"lg",lg:"md"},tooltip:e.error,placeholder:t,align:"right",autoComplete:"off",value:e.value,color:e.error?"danger":void 0,classNames:{prefix:"oui-text-base-contrast-54",root:"oui-outline-line-12 focus-within:oui-outline-primary-light"},onValueChange:e.onValueChange,onFocus:()=>{o("");},onBlur:()=>{o("USDC");},formatters:[inputFormatter.numberFormatter,inputFormatter.dpFormatter(e.quote_dp),inputFormatter.currencyFormatter,inputFormatter.decimalPointFormatter]})},B=e=>{let{symbol:t,tpPrice:o,slPrice:n,qty:m,maxQty:d,side:g,quoteDP:a,baseDP:i,isEditing:_,isPositionTPSL:P}=e,[b,T]=useLocalStorage("orderly_order_confirm",true),l=textVariants({size:"xs",intensity:54}),u=P??m>=d;return jsxs(Fragment,{children:[_&&jsx(Text,{as:"div",size:"2xs",intensity:80,className:"oui-mb-3",children:`You agree to edit your ${transSymbolformString(t)} order.`}),jsxs(Flex,{pb:4,children:[jsx(Box,{grow:true,children:jsx(Text.formatted,{rule:"symbol",formatString:"base-type",size:"base",showIcon:true,as:"div",intensity:80,children:t})}),jsxs(Flex,{gap:1,children:[u&&jsx(Badge,{size:"xs",color:"primary",children:"Position"}),jsx(Ue,{tpPrice:o,slPrice:n}),g===OrderSide.SELL?jsx(Badge,{size:"xs",color:"success",children:"Buy"}):jsx(Badge,{size:"xs",color:"danger",children:"Sell"})]})]}),jsx(Divider,{}),jsxs(Flex,{direction:"column",itemAlign:"stretch",gapY:1,pt:4,className:cn(l,"oui-pb-4 xl:oui-pb-5"),children:[jsxs(Flex,{children:[jsx(Box,{grow:true,children:"Qty."}),jsx("div",{children:u?jsx("span",{className:"oui-text-base-contrast",children:"Entire position"}):jsx(Text.numeral,{intensity:98,dp:i,padding:false,children:m})})]}),typeof o=="number"&&o>0?jsxs(Flex,{children:[jsx(Box,{grow:true,children:"TP Price"}),jsx(Text.numeral,{as:"div",coloring:true,unit:"USDC",size:"sm",dp:a,unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:o})]}):null,typeof n=="number"&&n>0?jsxs(Flex,{children:[jsx(Box,{grow:true,children:"SL Price"}),jsx(Text.numeral,{as:"div",coloring:true,unit:"USDC",size:"sm",dp:a,className:"oui-text-trade-loss",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:n})]}):null,jsxs(Flex,{children:[jsx(Box,{grow:true,children:"Price"}),jsx("div",{className:"oui-text-base-contrast",children:"Market"})]})]}),jsx(Box,{pt:2,children:jsxs(Flex,{gap:1,children:[jsx(Checkbox,{id:"disabledConfirm",color:"white",checked:!b,onCheckedChange:s=>{T(!s);}}),jsx("label",{htmlFor:"disabledConfirm",className:textVariants({size:"xs",intensity:54,className:"oui-ml-1"}),children:"Disable order confirmation"})]})})]})},Ue=e=>{let{tpPrice:t,slPrice:o}=e;return t&&o?jsx(Badge,{size:"xs",color:"neutral",children:"TP/SL"}):t?jsx(Badge,{size:"xs",color:"neutral",children:"TP"}):o?jsx(Badge,{size:"xs",color:"neutral",children:"SL"}):null};var le=e=>{let{position:t,order:o,isEditing:n}=e;if(n&&!o)throw new SDKError("order is required when isEditing is true");let m=n?o.symbol:t.symbol,d=useSymbolsInfo(),g=useRef(AlgoOrderRootType.TP_SL),[a]=useLocalStorage("orderly_order_confirm",true),[i,{submit:_,deleteOrder:P,setValue:b,validate:T,errors:l,isCreateMutating:u,isUpdateMutating:s}]=useTPSLOrder({symbol:m,position_qty:t.position_qty,average_open_price:t.average_open_price},{defaultOrder:o,isEditing:n}),L=p=>{b("quantity",p);},v=(p,S)=>{b(p,S);},w=(p,S)=>{b(p,S);},C=useMemo(()=>Math.abs(Number(t.position_qty)),[t.position_qty]),K=useMemo(()=>{let p=o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?C:o?.quantity,S=0;if((Number(i.quantity)!==p||!n&&i.quantity)&&(S=1),o&&n){let _e=o.child_orders.find(V=>V.algo_type===AlgoOrderType.TAKE_PROFIT),be=o.child_orders.find(V=>V.algo_type===AlgoOrderType.STOP_LOSS);_e?.trigger_price!==Number(i.tp_trigger_price)&&typeof typeof i.tp_trigger_price<"u"&&(S=2),be?.trigger_price!==Number(i.sl_trigger_price)&&typeof i.sl_trigger_price<"u"&&(S=3);}return S===1&&!i.tp_trigger_price&&!i.sl_trigger_price&&(S=-1),S},[i.tp_trigger_price,i.sl_trigger_price,i.quantity,o,n]),Pe=useMemo(()=>o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL&&Number(i.quantity)<C&&!i.tp_trigger_price&&!i.sl_trigger_price?false:K>0&&!!i.quantity&&!l,[i.quantity,C,K,l]),$=useMemo(()=>n?o&&o.algo_type!==AlgoOrderRootType.POSITIONAL_TP_SL?false:i.algo_order_id&&i.quantity==0?true:Number(i.quantity)>=C:Number(i.quantity)>=C,[i.quantity,C,o?.algo_type,n]);useEffect(()=>{if(!n&&$){let p=utils.findTPSLFromOrder(o);!i.tp_trigger_price&&p.tp_trigger_price&&v("tp_trigger_price",p.tp_trigger_price),!i.sl_trigger_price&&p.sl_trigger_price&&v("sl_trigger_price",p.sl_trigger_price);}},[n,$,i]),useEffect(()=>{let p=Number(i.quantity)<C?AlgoOrderRootType.TP_SL:AlgoOrderRootType.POSITIONAL_TP_SL;typeof e.onTPSLTypeChange=="function"&&g.current!==p&&e.onTPSLTypeChange(p),g.current=p;},[i.quantity,C]);let fe=()=>o?.algo_order_id&&o?.symbol?P(o?.algo_order_id,o?.symbol):Promise.reject("order id or symbol is invalid"),ye=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"||!a?_().then(()=>true,p=>(p?.message&&toast.error(p.message),Promise.reject(false))):e.onConfirm(i,{position:t,submit:_,cancel:fe})).then(p=>{});return {isEditing:n,symbolInfo:d[m],maxQty:C,setQuantity:L,orderQuantity:i.quantity,isPosition:$,TPSL_OrderEntity:i,setOrderValue:b,setPnL:w,setOrderPrice:v,onSubmit:ye,valid:Pe,errors:l,status:{isCreateMutating:u,isUpdateMutating:s}}};var F=e=>{let{onCancel:t,onComplete:o,...n}=e,m=le(n);return jsx(se,{...m,onCancel:t,onComplete:o})};var at=e=>{let{position:t,order:o,baseDP:n,quoteDP:m,buttonProps:d,isEditing:g}=e,[a,i]=useState(false),[_,P]=useState(true),[b]=useLocalStorage("orderly_order_confirm",true),T=g?o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL:void 0;return jsxs(PopoverRoot,{onOpenChange:l=>{_&&i(l);},open:a,children:[jsx(PopoverTrigger,{asChild:true,onClick:()=>{i(true);},children:e.children||jsx(Button,{variant:"outlined",size:"sm",color:"secondary",...d,children:e.label})}),jsx(PopoverContent,{className:cn("oui-w-[360px]",_?"oui-visible":"oui-invisible"),align:"end",side:"top",children:jsx(F,{position:t,order:o,isEditing:g,onComplete:()=>{i(false);},onCancel:()=>{i(false);},onConfirm:(l,u)=>{if(!b)return Promise.resolve(true);P(false);let s=Math.abs(Number(t.position_qty));if(`${l.tp_trigger_price??""}`.length===0&&`${l.sl_trigger_price??""}`.length===0)return modal.confirm({title:"Cancel Order",content:"Are you sure you want to cancel this TP/SL order?",onOk:()=>u.cancel()}).then(()=>(i(false),P(true),true),()=>(P(true),Promise.reject(false)));let L=g||!!l&&l.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL&&l.quantity===s;return modal.confirm({title:L?"Edit Order":"Confirm Order",onOk:()=>u.submit(),classNames:{body:"!oui-pb-0"},content:jsx(B,{isPositionTPSL:T,isEditing:L,symbol:l.symbol,qty:Number(l.quantity),maxQty:s,tpPrice:Number(l.tp_trigger_price),slPrice:Number(l.sl_trigger_price),side:l.side,quoteDP:m??2,baseDP:n??2})}).then(()=>(i(false),P(true),true),()=>(P(true),Promise.reject(false)))}})})]})};var ft=e=>{let{position:t,order:o,symbolInfo:n,isEditing:m}=e,{resolve:d,hide:g,updateArgs:a}=useModal(),[i]=useLocalStorage("orderly_order_confirm",true),_=m?o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL:void 0,P=u=>{m||a({title:u});},b=()=>{d(),g();},{quote_dp:T,base_dp:l}=n;return jsxs(Fragment,{children:[jsx(yt,{position:t,symbolInfo:n}),jsx(F,{...e,onTPSLTypeChange:u=>{P(u===AlgoOrderRootType.TP_SL?"TP/SL":"Position TP/SL");},onComplete:b,onConfirm:(u,s)=>{if(!i)return Promise.resolve(true);let L=Math.abs(Number(t.position_qty)),v=m||!!u&&u.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL&&u.quantity===L;return modal.confirm({title:v?"Edit Order":"Confirm Order",bodyClassName:"oui-pb-0 lg:oui-pb-0",onOk:()=>s.submit(),content:jsx(B,{isPositionTPSL:_,isEditing:m,symbol:u.symbol,qty:Number(u.quantity),maxQty:L,tpPrice:Number(u.tp_trigger_price),slPrice:Number(u.sl_trigger_price),side:u.side,quoteDP:T??2,baseDP:l??2})}).then(()=>true,w=>(w?.message&&toast.error(w.message),Promise.reject(false)))},onCancel:()=>{g();}})]})};var yt=e=>{let{position:t,symbolInfo:o}=e,{data:n}=useMarkPrice(t.symbol),m=useModal(),d=useMemo(()=>m.args?.title==="Position TP/SL",[m.args?.title]);return jsxs(Fragment,{children:[jsxs(Flex,{justify:"between",pb:3,itemAlign:"center",children:[jsx(Text.formatted,{rule:"symbol",className:"oui-text-xs",showIcon:true,children:t.symbol}),jsxs(Flex,{gapX:1,children:[d&&jsx(Badge,{size:"xs",color:"primary",children:"Position"}),jsx(Badge,{size:"xs",color:"neutral",children:"TP/SL"}),t.position_qty<0?jsx(Badge,{size:"xs",color:"buy",children:"Buy"}):jsx(Badge,{size:"xs",color:"sell",children:"Sell"})]})]}),jsx(Divider,{intensity:8}),jsxs(Box,{py:3,className:"oui-space-y-1",children:[jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"sm",intensity:54,children:"Avg. open"}),jsx(Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:t.average_open_price})]}),jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"sm",intensity:54,children:"Mark price"}),jsx(Text.numeral,{className:"oui-text-xs",unit:o.quote,dp:o.quote_dp,unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:n})]})]})]})};
|
|
9
9
|
|
|
10
10
|
export { B as PositionTPSLConfirm, at as PositionTPSLPopover, ft as PositionTPSLSheet, F as TPSLWidget };
|
|
11
11
|
//# sourceMappingURL=out.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orderly.network/ui-tpsl",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
"access": "public"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@orderly.network/utils": "2.0.
|
|
21
|
-
"@orderly.network/types": "2.0.
|
|
22
|
-
"@orderly.network/
|
|
23
|
-
"@orderly.network/
|
|
20
|
+
"@orderly.network/utils": "2.0.4",
|
|
21
|
+
"@orderly.network/types": "2.0.4",
|
|
22
|
+
"@orderly.network/hooks": "2.0.4",
|
|
23
|
+
"@orderly.network/ui": "2.0.4"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/react": "^18.3.2",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"tailwindcss": "^3.4.4",
|
|
31
31
|
"tsup": "^7.1.0",
|
|
32
32
|
"typescript": "^5.1.6",
|
|
33
|
-
"tsconfig": "0.3.
|
|
33
|
+
"tsconfig": "0.3.20"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsup && pnpm run build:css",
|