@orderly.network/ui-tpsl 2.0.1 → 2.0.2

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 CHANGED
@@ -7,11 +7,11 @@ 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]),y=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(""),_=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:y,type:e.type,formatter:T,onModeChange:l=>{m(l);},value:i,pnl:o.PnL,onValueChange:_,quote_dp:e.quote_dp,setFocus:g}};var Z=e=>{let{mode:t,modes:o,onModeChange:n,onValueChange:m,quote:d,quote_dp:g,value:a,pnl:i}=e,[y,P]=react.useState(t),[_,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:_,align:"right",value:a,"data-testid":e.testId,autoComplete:"off",onValueChange:m,formatters:[e.formatter({dp:g,mode:t}),ui.inputFormatter.currencyFormatter],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(Z,{...m,testId:t,quote:o})};var ne=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],onValueChange:a=>{e.onQuantityChange?.(a);let i=Number(a);if(i&&i>e.maxQty){let y=t?0:e.maxQty;e.onQuantityChange?.(y),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.jsx(ui.Text,{size:"sm",intensity:80,children:"Take profit"}),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(te,{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.jsx(ui.Text,{size:"sm",intensity:80,children:"Stop loss"}),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(te,{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})]})]})]})},te=e=>{let[t,o]=react.useState("USDC");return jsxRuntime.jsx(ui.Input.tooltip,{"data-testid":`oui-testid-tpsl-popUp-${e.type.toLowerCase()}-input`,prefix:`${e.type} 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]})},B=e=>{let{symbol:t,tpPrice:o,slPrice:n,qty:m,maxQty:d,side:g,quoteDP:a,baseDP:i,isEditing:y,isPositionTPSL:P}=e,[_,T]=hooks.useLocalStorage("orderly_order_confirm",!0),l=ui.textVariants({size:"xs",intensity:54}),u=P??m>=d;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[y&&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:!_,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 ue=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:y,deleteOrder:P,setValue:_,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=>{_("quantity",p);},v=(p,S)=>{_(p,S);},w=(p,S)=>{_(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 ye=o.child_orders.find(V=>V.algo_type===types.AlgoOrderType.TAKE_PROFIT),_e=o.child_orders.find(V=>V.algo_type===types.AlgoOrderType.STOP_LOSS);ye?.trigger_price!==Number(i.tp_trigger_price)&&typeof typeof i.tp_trigger_price<"u"&&(S=2),_e?.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 Pe=()=>o?.algo_order_id&&o?.symbol?P(o?.algo_order_id,o?.symbol):Promise.reject("order id or symbol is invalid"),fe=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"||!a?y().then(()=>!0,p=>(p?.message&&ui.toast.error(p.message),Promise.reject(!1))):e.onConfirm(i,{position:t,submit:y,cancel:Pe})).then(p=>{});return {isEditing:n,symbolInfo:d[m],maxQty:C,setQuantity:L,orderQuantity:i.quantity,isPosition:$,TPSL_OrderEntity:i,setOrderValue:_,setPnL:w,setOrderPrice:v,onSubmit:fe,valid:pe,errors:l,status:{isCreateMutating:u,isUpdateMutating:s}}};var M=e=>{let{onCancel:t,onComplete:o,...n}=e,m=ue(n);return jsxRuntime.jsx(ne,{...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),[y,P]=react.useState(!0),[_]=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=>{y&&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]",y?"oui-visible":"oui-invisible"),align:"end",side:"top",children:jsxRuntime.jsx(M,{position:t,order:o,isEditing:g,onComplete:()=>{i(!1);},onCancel:()=>{i(!1);},onConfirm:(l,u)=>{if(!_)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),y=m?o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL:void 0,P=u=>{m||a({title:u});},_=()=>{d(),g();},{quote_dp:T,base_dp:l}=n;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(yt,{position:t,symbolInfo:n}),jsxRuntime.jsx(M,{...e,onTPSLTypeChange:u=>{P(u===types.AlgoOrderRootType.TP_SL?"TP/SL":"Position TP/SL");},onComplete:_,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:y,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(!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:`${e.type} 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})]})]})]})};
11
11
 
12
12
  exports.PositionTPSLConfirm = B;
13
13
  exports.PositionTPSLPopover = at;
14
14
  exports.PositionTPSLSheet = ft;
15
- exports.TPSLWidget = M;
15
+ exports.TPSLWidget = F;
16
16
  //# sourceMappingURL=out.js.map
17
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tpsl.ui.tsx","../src/pnlInput/pnlInput.ui.tsx","../src/pnlInput/useBuilder.script.ts","../src/pnlInput/pnlInput.widget.tsx","../src/useTPSL.script.ts","../src/tpsl.widget.tsx","../src/editorPopover.tsx","../src/editorSheet.tsx"],"names":["useRef","useState","Badge","Box","Button","Divider","Flex","Grid","Input","Slider","Text","textVariants","cn","inputFormatter","Checkbox","convertValueToPercentage","ThrottledButton","CaretDownIcon","SimpleDropdownMenu","useMemo","useLocalStorage","Decimal","todpIfNeed","usePNLInputBuilder","props","type","values","mode","setMode","focus","setFocus","key","value","modes","percentageSuffix","onValueChange","formatter","options","dp","endStr","useEffect","Fragment","jsx","jsxs","PNLInput","onModeChange","quote","quote_dp","pnl","prefix","setPrefix","placeholder","setPlaceholder","color","num","PNLMenus","item","PnlInputWidget","testId","rest","state","utils","OrderSide","transSymbolformString","TPSL","TPSL_OrderEntity","symbolInfo","onCancel","onComplete","status","errors","isPosition","TPSLQuantity","TPSLPrice","inputRef","currentQtyPercentage","setTPSL","formatQuantity","qty","quantity","errorMsg","e","onPnLChange","PriceInput","PositionTPSLConfirm","symbol","tpPrice","slPrice","maxQty","side","quoteDP","baseDP","isEditing","_isPositionTPSL","needConfirm","setNeedConfirm","textClassName","isPositionTPSL","TPSLOrderType","check","useSymbolsInfo","useTPSLOrder","SDKError","AlgoOrderRootType","AlgoOrderType","toast","useTPSLBuilder","position","order","prevTPSLType","tpslOrder","submit","deleteOrder","setValue","validate","isCreateMutating","isUpdateMutating","setQuantity","setOrderPrice","name","setPnL","dirty","diff","tp","o","sl","valid","trigger_prices","cancel","onSubmit","reject","isSuccess","TPSLWidget","modal","PopoverContent","PopoverRoot","PopoverTrigger","PositionTPSLPopover","buttonProps","open","setOpen","visible","setVisible","isOpen","finalIsEditing","useModal","useMarkPrice","PositionTPSLSheet","resolve","hide","updateArgs","updateSheetTitle","title","onCompleted","base_dp","PositionInfo","markPrice"],"mappings":"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","sourcesContent":["import { useRef, useState } from \"react\";\nimport {\n Badge,\n Box,\n Button,\n Divider,\n Flex,\n Grid,\n Input,\n Slider,\n Text,\n textVariants,\n cn,\n inputFormatter,\n Checkbox,\n convertValueToPercentage,\n ThrottledButton,\n} from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { TPSLBuilderState } from \"./useTPSL.script\";\n\nimport type { PNL_Values } from \"./pnlInput/useBuilder.script\";\nimport { useLocalStorage, utils } from \"@orderly.network/hooks\";\nimport { API, OrderSide } from \"@orderly.network/types\";\nimport { transSymbolformString } from \"@orderly.network/utils\";\n\nexport type TPSLProps = {\n onCancel?: () => void;\n onComplete?: () => void;\n};\n\n//------------- TPSL form start ---------------\nexport const TPSL = (props: TPSLBuilderState & TPSLProps) => {\n const {\n TPSL_OrderEntity,\n symbolInfo,\n onCancel,\n onComplete,\n status,\n errors,\n isPosition,\n } = props;\n\n\n return (\n <div id=\"orderly-tp_sl-order-edit-content\">\n {(!props.isEditing || (props.isEditing && !props.isPosition)) && (\n <>\n <TPSLQuantity\n maxQty={props.maxQty}\n quantity={(props.orderQuantity ?? props.maxQty) as number}\n baseTick={symbolInfo(\"base_tick\")}\n dp={symbolInfo(\"base_dp\")}\n onQuantityChange={props.setQuantity}\n quote={symbolInfo(\"base\")}\n isEditing={props.isEditing}\n isPosition={isPosition}\n errorMsg={props.errors?.quantity?.message}\n />\n <Divider my={4} intensity={8} />\n </>\n )}\n\n <TPSLPrice\n sl_pnl={TPSL_OrderEntity.sl_pnl}\n tp_pnl={TPSL_OrderEntity.tp_pnl}\n quote={symbolInfo(\"quote\")}\n quote_dp={symbolInfo(\"quote_dp\")}\n onPriceChange={props.setOrderPrice}\n onPnLChange={props.setPnL}\n errors={errors}\n tp_values={{\n PnL: `${TPSL_OrderEntity.tp_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.tp_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.tp_offset_percentage ?? \"\"}`,\n }}\n sl_values={{\n PnL: `${TPSL_OrderEntity.sl_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.sl_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.sl_offset_percentage ?? \"\"}`,\n }}\n tp_trigger_price={TPSL_OrderEntity.tp_trigger_price ?? \"\"}\n sl_trigger_price={TPSL_OrderEntity.sl_trigger_price ?? \"\"}\n />\n <Grid cols={2} gap={3} mt={4}>\n <Button\n size={\"md\"}\n color={\"secondary\"}\n data-testid={\"tpsl-cancel\"}\n onClick={() => {\n onCancel?.();\n }}\n >\n Cancel\n </Button>\n <ThrottledButton\n size={\"md\"}\n data-testid={\"tpsl-confirm\"}\n disabled={!props.valid || status.isCreateMutating}\n loading={status.isCreateMutating || status.isUpdateMutating}\n onClick={() => {\n props.onSubmit().then(\n () => {\n onComplete?.();\n },\n () => {\n console.log(\"--->>>cancel order\");\n }\n );\n }}\n >\n Confirm\n </ThrottledButton>\n </Grid>\n </div>\n );\n};\n\n//----------\n\n// ------------- Quantity input start------------\nconst TPSLQuantity = (props: {\n maxQty: number;\n baseTick: number;\n dp: number;\n quote: string;\n onQuantityChange?: (value: number | string) => void;\n quantity: number;\n isEditing?: boolean;\n isPosition?: boolean;\n setOrderValue?: (key: string, value: number | string) => void;\n errorMsg?: string;\n}) => {\n // const isPosition = props.quantity === props.maxQty;\n const { isPosition } = props;\n const inputRef = useRef<HTMLInputElement>(null);\n const currentQtyPercentage =\n convertValueToPercentage(props.quantity, 0, props.maxQty) / 100;\n\n const setTPSL = () => {\n props.onQuantityChange?.(0);\n inputRef.current?.focus();\n\n setTimeout(() => {\n inputRef.current?.setSelectionRange(0, 1);\n }, 0);\n };\n\n const formatQuantity = (qty: string) => {\n if (props.baseTick > 0) {\n const quantity = Number(qty);\n // if (quantity) {\n // props.onQuantityChange?.(Math.min(props.maxQty, quantity));\n // } else {\n props.onQuantityChange?.(utils.formatNumber(qty, props.baseTick) ?? qty);\n // }\n }\n };\n\n const errorMsg = (isPosition ? \"\" : props.quantity).toString().length > 0 ? props.errorMsg : undefined;\n\n return (\n <>\n <Flex gap={2}>\n <div className={\"oui-flex-1\"}>\n <Input.tooltip\n data-testid=\"oui-testid-tpsl-popUp-quantity-input\"\n ref={inputRef}\n prefix={\"Quantity\"}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n align=\"right\"\n value={isPosition ? \"\" : props.quantity}\n autoComplete=\"off\"\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: cn(\"oui-bg-base-5 oui-outline-line-12\", errorMsg && \"oui-outline-danger\"),\n }}\n tooltipProps={{\n content: {\n className: \"oui-bg-base-6 oui-text-base-contrast-80\",\n },\n arrow: {\n className: \"oui-fill-base-6\",\n },\n }}\n tooltip={errorMsg}\n color={errorMsg ? 'danger' : undefined}\n formatters={[\n inputFormatter.dpFormatter(props.dp),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n const qty = Number(value);\n if (qty && qty > props.maxQty) {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n inputRef.current?.blur();\n }\n }}\n onBlur={(e) => formatQuantity(e.target.value)}\n suffix={\n isPosition ? (\n <button\n className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\"\n onClick={() => {\n setTPSL();\n }}\n >\n Entire position\n </button>\n ) : (\n <span className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\">\n {props.quote}\n </span>\n )\n }\n />\n </div>\n {!props.isEditing && (\n <Button\n onClick={() => {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n if (qty === 0) {\n setTPSL();\n }\n }}\n variant={\"outlined\"}\n // size={{\n // lg: \"md\",\n // md: \"lg\",\n // }}\n className={cn(\n \"oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]\",\n isPosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5\"\n )}\n >\n Position\n </Button>\n )}\n </Flex>\n <Flex mt={2} itemAlign={\"center\"} height={\"15px\"}>\n <Slider.single\n markCount={5}\n color=\"primary\"\n max={props.maxQty}\n min={0}\n showTip\n step={props.baseTick}\n value={props.quantity}\n onValueCommit={(value) => {\n formatQuantity(`${value}`);\n }}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\n />\n </Flex>\n <Flex justify={\"between\"}>\n <Text.numeral rule={\"percentages\"} color={\"primary\"} size={\"2xs\"}>\n {currentQtyPercentage}\n </Text.numeral>\n <Flex itemAlign={\"center\"} gap={1}>\n <button\n className={\"oui-leading-none\"}\n style={{ lineHeight: 0 }}\n onClick={() => {\n props.onQuantityChange?.(props.maxQty);\n }}\n >\n <Text color={\"primary\"} size={\"2xs\"}>\n Max\n </Text>\n </button>\n <Text.numeral\n rule={\"price\"}\n size={\"2xs\"}\n intensity={54}\n tick={props.baseTick}\n >\n {props.maxQty}\n </Text.numeral>\n </Flex>\n </Flex>\n </>\n );\n};\n// ------------- Quantity input end------------\n\n// ------------ TP/SL Price and PNL input start------------\nconst TPSLPrice = (props: {\n tp_pnl?: number;\n sl_pnl?: number;\n quote: string;\n quote_dp?: number;\n onPriceChange: TPSLBuilderState[\"setOrderPrice\"];\n onPnLChange: TPSLBuilderState[\"setPnL\"];\n tp_values: PNL_Values;\n sl_values: PNL_Values;\n tp_trigger_price?: number | string;\n sl_trigger_price?: number | string;\n errors: Record<string, { message: string }> | null;\n}) => {\n const onPnLChange = (key: string, value: number | string) => {\n // console.log(key, value);\n props.onPnLChange(key, value);\n };\n return (\n <>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"sm\"} intensity={80}>\n Take profit\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.tp_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"TP\"}\n value={props.tp_trigger_price}\n error={props.errors?.tp_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"tp_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"TP\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.tp_values}\n />\n </Grid>\n </div>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"sm\"} intensity={80}>\n Stop loss\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.sl_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"SL\"}\n value={props.sl_trigger_price}\n error={props.errors?.sl_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"sl_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"SL\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.sl_values}\n />\n </Grid>\n </div>\n </>\n );\n};\n// ------------ TP/SL Price and PNL input end------------\n// ------------ TP/SL Price input start------------\nconst PriceInput = (props: {\n type: string;\n value?: string | number;\n error?: string;\n onValueChange: (value: string) => void;\n quote_dp: number;\n}) => {\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n return (\n <Input.tooltip\n data-testid={`oui-testid-tpsl-popUp-${props.type.toLowerCase()}-input`}\n prefix={`${props.type} price`}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n tooltip={props.error}\n placeholder={placeholder}\n align={\"right\"}\n autoComplete={\"off\"}\n value={props.value}\n color={props.error ? \"danger\" : undefined}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onValueChange={props.onValueChange}\n onFocus={() => {\n setPlaceholder(\"\");\n }}\n onBlur={() => {\n setPlaceholder(\"USDC\");\n }}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\nexport type PositionTPSLConfirmProps = {\n symbol: string;\n // isPosition: boolean;\n qty: number;\n tpPrice?: number;\n slPrice?: number;\n maxQty: number;\n side: OrderSide;\n // symbolConfig:API.SymbolExt\n baseDP: number;\n quoteDP: number;\n isEditing?: boolean;\n isPositionTPSL?: boolean;\n};\n\n// ------------ Position TP/SL Confirm dialog start------------\nexport const PositionTPSLConfirm = (props: PositionTPSLConfirmProps) => {\n const {\n symbol,\n tpPrice,\n slPrice,\n qty,\n maxQty,\n side,\n quoteDP,\n baseDP,\n isEditing,\n isPositionTPSL: _isPositionTPSL,\n } = props;\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n const textClassName = textVariants({\n size: \"xs\",\n intensity: 54,\n });\n\n // console.log(\"PositionTPSLConfirm\", qty, maxQty, quoteDP);\n\n const isPositionTPSL = _isPositionTPSL ?? qty >= maxQty;\n\n return (\n <>\n {isEditing && (\n <Text\n as=\"div\"\n size=\"2xs\"\n intensity={80}\n className=\"oui-mb-3\"\n >{`You agree to edit your ${transSymbolformString(\n symbol\n )} order.`}</Text>\n )}\n\n <Flex pb={4}>\n <Box grow>\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n as=\"div\"\n intensity={80}\n >\n {symbol}\n </Text.formatted>\n </Box>\n <Flex gap={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color={\"primary\"}>\n Position\n </Badge>\n )}\n\n {/* <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge> */}\n <TPSLOrderType tpPrice={tpPrice} slPrice={slPrice} />\n {side === OrderSide.SELL ? (\n <Badge size=\"xs\" color=\"success\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"danger\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider />\n <Flex\n direction={\"column\"}\n itemAlign={\"stretch\"}\n gapY={1}\n pt={4}\n // pb={5}\n className={cn(textClassName, \"oui-pb-4 xl:oui-pb-5\")}\n >\n <Flex>\n <Box grow>Qty.</Box>\n\n <div>\n {isPositionTPSL ? (\n <span className=\"oui-text-base-contrast\">Entire position</span>\n ) : (\n <Text.numeral intensity={98} dp={baseDP} padding={false}>\n {qty}\n </Text.numeral>\n )}\n </div>\n </Flex>\n {typeof tpPrice === \"number\" && tpPrice > 0 ? (\n <Flex>\n <Box grow>TP Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {tpPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n {typeof slPrice === \"number\" && slPrice > 0 ? (\n <Flex>\n <Box grow>SL Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {slPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n\n <Flex>\n <Box grow>Price</Box>\n <div className=\"oui-text-base-contrast\">Market</div>\n </Flex>\n </Flex>\n <Box pt={2}>\n <Flex gap={1}>\n <Checkbox\n id=\"disabledConfirm\"\n color=\"white\"\n checked={!needConfirm}\n onCheckedChange={(check) => {\n setNeedConfirm(!check);\n }}\n />\n <label\n htmlFor=\"disabledConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n className: \"oui-ml-1\",\n })}\n >\n Disable order confirmation\n </label>\n </Flex>\n </Box>\n </>\n );\n};\n\n//------------- Position TP/SL Confirm dialog end------------\n\nconst TPSLOrderType = (props: { tpPrice?: number; slPrice?: number }) => {\n const { tpPrice, slPrice } = props;\n if (!!tpPrice && !!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n );\n }\n\n if (!!tpPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP\n </Badge>\n );\n }\n\n if (!!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n SL\n </Badge>\n );\n }\n\n return null;\n};\n","import {\n CaretDownIcon,\n cn,\n Input,\n MenuItem,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter, Text } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & { testId?: string; quote: string };\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n pnl,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n const color = useMemo(() => {\n const num = Number(pnl);\n\n if (isNaN(num) || num === 0) return \"\";\n\n if (num > 0) return \"oui-text-trade-profit\";\n if (num < 0) return \"oui-text-trade-loss\";\n }, [pnl]);\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n \n\n return (\n <Input\n prefix={mode}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n placeholder={placeholder}\n align={\"right\"}\n value={value}\n data-testid={props.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n // inputFormatter.numberFormatter,\n props.formatter({ dp: quote_dp, mode }),\n inputFormatter.currencyFormatter,\n ]}\n // className={color}\n classNames={{\n input: color,\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onFocus={() => {\n setPlaceholder(\"\");\n props.setFocus(true);\n }}\n onBlur={() => {\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n props.setFocus(false);\n }}\n // value={props.value}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className={cn(\"oui-ml-[2px]\", color)}>\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n};\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: string, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n\n const [focus, setFocus] = useState(true);\n const key = useMemo(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset`;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage`;\n default:\n return `${type.toLowerCase()}_pnl`;\n }\n }, [mode]);\n\n const value = useMemo(() => {\n return values[mode as keyof PNL_Values];\n }, [values]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n console.log(\"onValueChange\", value);\n props.onChange(key, value);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions\n ) => {\n value = `${value}`; // convert to string\n\n if (focus) {\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\"\n )\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n if (mode === PnLMode.PERCENTAGE) {\n // console.log(\"value\", value);\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else if (mode === PnLMode.PnL && type === \"SL\" && focus) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n // return {\n // onRenderBefore: (\n // value: string | number,\n // options: InputFormatterOptions\n // ) => {\n // // console.log(\"???\", options);\n // const { isFocused } = options;\n // value = `${value}`;\n // if (value === \"\" || value === \"-\") return \"\";\n\n // // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (isFocused) {\n // // value = value.startsWith(\"-\") ? value : \"-\" + value;\n // // }\n // // }\n\n // if (mode === PnLMode.PERCENTAGE) {\n // return `${todpIfNeed(new Decimal(value).mul(100).toString(), 2)}${\n // percentageSuffix.current\n // }`;\n // // return (Number(value) * 100).toFixed(2);\n // } else if (mode === PnLMode.OFFSET) {\n // value = todpIfNeed(value, 2);\n // } else {\n // // value = new Decimal(value).todp(2).toString();\n // }\n\n // return value;\n // },\n // onSendBefore: (value: string, options: InputFormatterOptions) => {\n // const { isFocused } = options;\n\n // if (mode === PnLMode.PERCENTAGE) {\n // if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n // value = new Decimal(value).div(100).toString();\n // value = todpIfNeed(value, 4);\n // }\n // } else {\n // // value = todpIfNeed(value, quote_dp);\n // if (isFocused) {\n // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (\n // // typeof values[PnLMode.PnL] !== \"undefined\" &&\n // // values[PnLMode.PnL] !== \"\"\n // // )\n // // return value;\n // const num = Number(value);\n // if (!isNaN(num) && num !== 0) {\n // value = (Math.abs(num) * -1).toString();\n // } else {\n // value = \"\";\n // }\n // }\n // }\n // }\n\n // return value;\n // },\n // };\n };\n\n return {\n mode,\n modes,\n type: props.type,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n value,\n pnl: values[PnLMode.PnL],\n onValueChange,\n quote_dp: props.quote_dp,\n setFocus,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testId?: string;\n quote: string;\n }\n) => {\n const { testId, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return <PNLInput {...state} testId={testId} quote={quote} />;\n};\n","import {\n type ComputedAlgoOrder,\n useLocalStorage,\n useSymbolsInfo,\n useTPSLOrder,\n utils,\n} from \"@orderly.network/hooks\";\nimport { SDKError } from \"@orderly.network/types\";\nimport { AlgoOrderRootType, AlgoOrderType, API } from \"@orderly.network/types\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nexport type TPSLBuilderOptions = {\n position: API.Position;\n order?: API.AlgoOrder;\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n isEditing?: boolean;\n /**\n * either show the confirm dialog or not,\n * if the Promise reject or return false, cancel the submit action\n */\n onConfirm?: (\n order: ComputedAlgoOrder,\n options: {\n position: API.Position;\n submit: () => Promise<any>;\n cancel: () => Promise<any>;\n }\n ) => Promise<boolean>;\n};\n\nexport const useTPSLBuilder = (options: TPSLBuilderOptions) => {\n const { position, order, isEditing } = options;\n // const isEditing = !!order;\n if (isEditing && !order) {\n throw new SDKError(\"order is required when isEditing is true\");\n }\n const symbol = isEditing ? order!.symbol : position.symbol;\n const symbolInfo = useSymbolsInfo();\n const prevTPSLType = useRef<AlgoOrderRootType>(AlgoOrderRootType.TP_SL);\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const [\n tpslOrder,\n {\n submit,\n deleteOrder,\n setValue,\n validate,\n errors,\n isCreateMutating,\n isUpdateMutating,\n },\n ] = useTPSLOrder(\n {\n symbol,\n position_qty: position.position_qty,\n average_open_price: position.average_open_price,\n },\n {\n defaultOrder: order,\n isEditing,\n }\n );\n\n const setQuantity = (value: number | string) => {\n setValue(\"quantity\", value);\n };\n\n const setOrderPrice = (\n name: \"tp_trigger_price\" | \"sl_trigger_price\",\n value: number | string\n ) => {\n setValue(name, value);\n };\n\n const setPnL = (type: string, value: number | string) => {\n setValue(type, value);\n };\n\n const maxQty = useMemo(\n () => Math.abs(Number(position.position_qty)),\n [position.position_qty]\n );\n\n const dirty = useMemo(() => {\n const quantity =\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? maxQty\n : order?.quantity;\n\n let diff: number = 0;\n\n if (Number(tpslOrder.quantity) !== quantity) {\n diff = 1;\n } else if (!isEditing && !!tpslOrder.quantity) {\n diff = 1;\n }\n\n if (order && isEditing) {\n const tp = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.TAKE_PROFIT\n );\n const sl = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.STOP_LOSS\n );\n\n if (\n tp?.trigger_price !== Number(tpslOrder.tp_trigger_price) &&\n typeof typeof tpslOrder.tp_trigger_price !== \"undefined\"\n ) {\n // return true;\n diff = 2;\n }\n\n if (\n sl?.trigger_price !== Number(tpslOrder.sl_trigger_price) &&\n typeof tpslOrder.sl_trigger_price !== \"undefined\"\n ) {\n diff = 3;\n }\n }\n\n if (\n diff === 1 &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n diff = -1;\n }\n\n return diff;\n }, [\n tpslOrder.tp_trigger_price,\n tpslOrder.sl_trigger_price,\n tpslOrder.quantity,\n order,\n isEditing,\n ]);\n\n const valid = useMemo(() => {\n /**\n * if the order is a POSITIONAL_TP_SL and the quantity is less than the maxQty,\n * and the tp/sl trigger price is not set, then the order is not valid\n */\n if (\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n Number(tpslOrder.quantity) < maxQty &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n return false;\n }\n\n return dirty > 0 && !!tpslOrder.quantity && !errors;\n }, [tpslOrder.quantity, maxQty, dirty, errors]);\n\n const isPositionTPSL = useMemo(() => {\n if (!isEditing) return Number(tpslOrder.quantity) >= maxQty;\n /**\n * if current order is not a POSITIONAL_TP_SL, then it's always a general TP/SL\n */\n if (!!order && order.algo_type !== AlgoOrderRootType.POSITIONAL_TP_SL) {\n return false;\n }\n if (tpslOrder.algo_order_id && tpslOrder.quantity == 0) return true;\n return Number(tpslOrder.quantity) >= maxQty;\n }, [tpslOrder.quantity, maxQty, order?.algo_type, isEditing]);\n\n useEffect(() => {\n if (!isEditing && isPositionTPSL) {\n const trigger_prices = utils.findTPSLFromOrder(order!);\n if (!tpslOrder.tp_trigger_price && trigger_prices.tp_trigger_price) {\n setOrderPrice(\"tp_trigger_price\", trigger_prices.tp_trigger_price);\n }\n if (!tpslOrder.sl_trigger_price && trigger_prices.sl_trigger_price) {\n setOrderPrice(\"sl_trigger_price\", trigger_prices.sl_trigger_price);\n }\n }\n }, [isEditing, isPositionTPSL, tpslOrder]);\n\n useEffect(() => {\n const type =\n Number(tpslOrder.quantity) < maxQty\n ? AlgoOrderRootType.TP_SL\n : AlgoOrderRootType.POSITIONAL_TP_SL;\n if (\n typeof options.onTPSLTypeChange === \"function\" &&\n prevTPSLType.current !== type\n ) {\n options.onTPSLTypeChange(type);\n }\n\n prevTPSLType.current = type;\n }, [tpslOrder.quantity, maxQty]);\n\n const cancel = (): Promise<void> => {\n if (order?.algo_order_id && order?.symbol) {\n return deleteOrder(order?.algo_order_id, order?.symbol);\n }\n return Promise.reject(\"order id or symbol is invalid\");\n };\n\n const onSubmit = async () => {\n return Promise.resolve()\n .then(() => {\n if (typeof options.onConfirm !== \"function\" || !needConfirm) {\n return submit().then(\n () => true,\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n return Promise.reject(false);\n }\n );\n }\n return options.onConfirm(tpslOrder, {\n position,\n submit,\n cancel,\n });\n })\n .then((isSuccess) => {\n console.log(\"result\", isSuccess);\n });\n };\n\n return {\n isEditing,\n symbolInfo: symbolInfo[symbol],\n maxQty,\n setQuantity,\n orderQuantity: tpslOrder.quantity,\n isPosition: isPositionTPSL,\n\n TPSL_OrderEntity: tpslOrder,\n setOrderValue: setValue,\n setPnL,\n setOrderPrice,\n // needConfirm,\n onSubmit,\n valid,\n errors,\n status: {\n isCreateMutating,\n isUpdateMutating,\n },\n } as const;\n};\n\nexport type TPSLBuilderState = ReturnType<typeof useTPSLBuilder>;\n","import { type AlgoOrderRootType } from \"@orderly.network/types\";\nimport { TPSL, TPSLProps } from \"./tpsl.ui\";\nimport { TPSLBuilderOptions, useTPSLBuilder } from \"./useTPSL.script\";\n\nexport type TPSLWidgetProps = {\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n} & TPSLBuilderOptions &\n TPSLProps;\n\nexport const TPSLWidget = (props: TPSLWidgetProps) => {\n const { onCancel, onComplete, ...rest } = props;\n const state = useTPSLBuilder(rest);\n\n return <TPSL {...state} onCancel={onCancel} onComplete={onComplete} />;\n};\n","import { useLocalStorage } from \"@orderly.network/hooks\";\nimport {\n Button,\n cn,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n} from \"@orderly.network/ui\";\nimport { ReactNode, useState } from \"react\";\nimport { TPSLWidget } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport { ButtonProps } from \"@orderly.network/ui\";\n\nexport const PositionTPSLPopover = (props: {\n position: API.Position;\n order?: API.AlgoOrder;\n label?: string;\n baseDP?: number;\n quoteDP?: number;\n /**\n * Button props\n */\n buttonProps?: ButtonProps;\n isEditing?: boolean;\n children?: ReactNode;\n}) => {\n const { position, order, baseDP, quoteDP, buttonProps, isEditing } = props;\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(true);\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n return (\n <PopoverRoot\n onOpenChange={(isOpen) => {\n // console.log(\"isOpen\", isOpen);\n if (visible) {\n setOpen(isOpen);\n }\n }}\n open={open}\n >\n <PopoverTrigger\n asChild\n onClick={() => {\n setOpen(true);\n }}\n >\n {props.children || (\n <Button\n variant=\"outlined\"\n size=\"sm\"\n color=\"secondary\"\n {...buttonProps}\n // onClick={() => {\n // setOpen(true);\n // }}\n >\n {props.label}\n </Button>\n )}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"oui-w-[360px]\",\n visible ? \"oui-visible\" : \"oui-invisible\"\n )}\n align=\"end\"\n side={\"top\"}\n >\n <TPSLWidget\n position={position}\n order={order}\n isEditing={isEditing}\n onComplete={() => {\n // console.log(\"tpsl order completed\");\n setOpen(false);\n }}\n onCancel={() => {\n setOpen(false);\n }}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n setVisible(false);\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n // console.log(\n // \"order\",\n // order,\n // isEditing ||\n // (!!order &&\n // order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n // order.quantity === maxQty)\n // );\n\n if (\n `${order.tp_trigger_price ?? \"\"}`.length === 0 &&\n `${order.sl_trigger_price ?? \"\"}`.length === 0\n ) {\n return modal\n .confirm({\n title: \"Cancel Order\",\n content: \"Are you sure you want to cancel this TP/SL order?\",\n onOk: () => {\n return options.cancel();\n },\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n // bodyClassName: \"lg:oui-py-0\",\n onOk: () => {\n return options.submit();\n },\n classNames: {\n body: \"!oui-pb-0\",\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={finalIsEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quoteDP ?? 2}\n baseDP={baseDP ?? 2}\n />\n ),\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n />\n </PopoverContent>\n </PopoverRoot>\n );\n};\n","import { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n modal,\n useModal,\n Text,\n Box,\n Badge,\n Divider,\n toast,\n} from \"@orderly.network/ui\";\nimport { TPSLWidget, TPSLWidgetProps } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useLocalStorage, useMarkPrice } from \"@orderly.network/hooks\";\n\ntype TPSLSheetProps = {\n position: API.Position;\n order?: API.AlgoOrder;\n // label: string;\n // baseDP?: number;\n // quoteDP?: number;\n symbolInfo: API.SymbolExt;\n isEditing?: boolean;\n};\n\nexport const PositionTPSLSheet = (props: TPSLWidgetProps & TPSLSheetProps) => {\n const { position, order, symbolInfo, isEditing } = props;\n const { resolve, hide, updateArgs } = useModal();\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n const updateSheetTitle = (title: string) => {\n if (isEditing) return;\n updateArgs({ title });\n };\n\n const onCompleted = () => {\n resolve();\n hide();\n };\n\n const { quote_dp, base_dp } = symbolInfo;\n\n return (\n <>\n <PositionInfo position={position} symbolInfo={symbolInfo} />\n\n <TPSLWidget\n {...props}\n onTPSLTypeChange={(type) => {\n updateSheetTitle(\n type === AlgoOrderRootType.TP_SL ? \"TP/SL\" : \"Position TP/SL\"\n );\n }}\n onComplete={onCompleted}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n bodyClassName: \"oui-pb-0 lg:oui-pb-0\",\n onOk: () => {\n return options.submit();\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={isEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quote_dp ?? 2}\n baseDP={base_dp ?? 2}\n />\n ),\n })\n .then(\n () => {\n // setOpen(false);\n // setVisible(true);\n return true;\n },\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n\n // setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n onCancel={() => {\n hide();\n }}\n />\n </>\n );\n};\n\nexport const TPSLSheetTitle = () => {\n const modal = useModal();\n\n const title = useMemo<string>(() => {\n return (modal.args?.title || \"TP/SL\") as string;\n }, [modal.args?.title]);\n\n return <span>{title}</span>;\n};\n\nexport const PositionInfo = (props: {\n position: API.Position;\n symbolInfo: API.SymbolExt;\n}) => {\n const { position, symbolInfo } = props;\n const { data: markPrice } = useMarkPrice(position.symbol);\n const modal = useModal();\n const isPositionTPSL = useMemo(() => {\n return modal.args?.title === \"Position TP/SL\";\n }, [modal.args?.title]);\n return (\n <>\n <Flex justify={\"between\"} pb={3} itemAlign={\"center\"}>\n <Text.formatted rule=\"symbol\" className=\"oui-text-xs\" showIcon>\n {position.symbol}\n </Text.formatted>\n <Flex gapX={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color=\"primary\">\n Position\n </Badge>\n )}\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n {position.position_qty < 0 ? (\n <Badge size=\"xs\" color=\"buy\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"sell\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider intensity={8} />\n <Box py={3} className=\"oui-space-y-1\">\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Avg. open\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {position.average_open_price}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Mark price\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {markPrice}\n </Text.numeral>\n </Flex>\n </Box>\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/tpsl.ui.tsx","../src/pnlInput/pnlInput.ui.tsx","../src/pnlInput/useBuilder.script.ts","../src/pnlInput/pnlInput.widget.tsx","../src/useTPSL.script.ts","../src/tpsl.widget.tsx","../src/editorPopover.tsx","../src/editorSheet.tsx"],"names":["useRef","useState","Badge","Box","Button","Divider","Flex","Grid","Input","Slider","Text","textVariants","cn","inputFormatter","Checkbox","convertValueToPercentage","ThrottledButton","CaretDownIcon","SimpleDropdownMenu","useMemo","useLocalStorage","Decimal","todpIfNeed","usePNLInputBuilder","props","type","values","mode","setMode","focus","setFocus","key","value","modes","percentageSuffix","onValueChange","formatter","options","dp","endStr","useEffect","Fragment","jsx","jsxs","PNLInput","onModeChange","quote","quote_dp","pnl","prefix","setPrefix","placeholder","setPlaceholder","color","num","PNLMenus","item","PnlInputWidget","testId","rest","state","utils","OrderSide","transSymbolformString","TPSL","TPSL_OrderEntity","symbolInfo","onCancel","onComplete","status","errors","isPosition","TPSLQuantity","TPSLPrice","inputRef","currentQtyPercentage","setTPSL","formatQuantity","qty","quantity","errorMsg","e","onPnLChange","PriceInput","PositionTPSLConfirm","symbol","tpPrice","slPrice","maxQty","side","quoteDP","baseDP","isEditing","_isPositionTPSL","needConfirm","setNeedConfirm","textClassName","isPositionTPSL","TPSLOrderType","check","useSymbolsInfo","useTPSLOrder","SDKError","AlgoOrderRootType","AlgoOrderType","toast","useTPSLBuilder","position","order","prevTPSLType","tpslOrder","submit","deleteOrder","setValue","validate","isCreateMutating","isUpdateMutating","setQuantity","setOrderPrice","name","setPnL","dirty","diff","tp","o","sl","valid","trigger_prices","cancel","onSubmit","reject","isSuccess","TPSLWidget","modal","PopoverContent","PopoverRoot","PopoverTrigger","PositionTPSLPopover","buttonProps","open","setOpen","visible","setVisible","isOpen","finalIsEditing","useModal","useMarkPrice","PositionTPSLSheet","resolve","hide","updateArgs","updateSheetTitle","title","onCompleted","base_dp","PositionInfo","markPrice"],"mappings":"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","sourcesContent":["import { useRef, useState } from \"react\";\nimport {\n Badge,\n Box,\n Button,\n Divider,\n Flex,\n Grid,\n Input,\n Slider,\n Text,\n textVariants,\n cn,\n inputFormatter,\n Checkbox,\n convertValueToPercentage,\n ThrottledButton,\n} from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { TPSLBuilderState } from \"./useTPSL.script\";\n\nimport type { PNL_Values } from \"./pnlInput/useBuilder.script\";\nimport { useLocalStorage, utils } from \"@orderly.network/hooks\";\nimport { API, OrderSide } from \"@orderly.network/types\";\nimport { transSymbolformString } from \"@orderly.network/utils\";\n\nexport type TPSLProps = {\n onCancel?: () => void;\n onComplete?: () => void;\n};\n\n//------------- TPSL form start ---------------\nexport const TPSL = (props: TPSLBuilderState & TPSLProps) => {\n const {\n TPSL_OrderEntity,\n symbolInfo,\n onCancel,\n onComplete,\n status,\n errors,\n isPosition,\n } = props;\n\n return (\n <div id=\"orderly-tp_sl-order-edit-content\">\n {(!props.isEditing || (props.isEditing && !props.isPosition)) && (\n <>\n <TPSLQuantity\n maxQty={props.maxQty}\n quantity={(props.orderQuantity ?? props.maxQty) as number}\n baseTick={symbolInfo(\"base_tick\")}\n dp={symbolInfo(\"base_dp\")}\n onQuantityChange={props.setQuantity}\n quote={symbolInfo(\"base\")}\n isEditing={props.isEditing}\n isPosition={isPosition}\n errorMsg={props.errors?.quantity?.message}\n />\n <Divider my={4} intensity={8} />\n </>\n )}\n\n <TPSLPrice\n sl_pnl={TPSL_OrderEntity.sl_pnl}\n tp_pnl={TPSL_OrderEntity.tp_pnl}\n quote={symbolInfo(\"quote\")}\n quote_dp={symbolInfo(\"quote_dp\")}\n onPriceChange={props.setOrderPrice}\n onPnLChange={props.setPnL}\n errors={errors}\n tp_values={{\n PnL: `${TPSL_OrderEntity.tp_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.tp_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.tp_offset_percentage ?? \"\"}`,\n }}\n sl_values={{\n PnL: `${TPSL_OrderEntity.sl_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.sl_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.sl_offset_percentage ?? \"\"}`,\n }}\n tp_trigger_price={TPSL_OrderEntity.tp_trigger_price ?? \"\"}\n sl_trigger_price={TPSL_OrderEntity.sl_trigger_price ?? \"\"}\n />\n <Grid cols={2} gap={3} mt={4}>\n <Button\n size={\"md\"}\n color={\"secondary\"}\n data-testid={\"tpsl-cancel\"}\n onClick={() => {\n onCancel?.();\n }}\n >\n Cancel\n </Button>\n <ThrottledButton\n size={\"md\"}\n data-testid={\"tpsl-confirm\"}\n disabled={!props.valid || status.isCreateMutating}\n loading={status.isCreateMutating || status.isUpdateMutating}\n onClick={() => {\n props.onSubmit().then(\n () => {\n onComplete?.();\n },\n () => {\n console.log(\"--->>>cancel order\");\n }\n );\n }}\n >\n Confirm\n </ThrottledButton>\n </Grid>\n </div>\n );\n};\n\n//----------\n\n// ------------- Quantity input start------------\nconst TPSLQuantity = (props: {\n maxQty: number;\n baseTick: number;\n dp: number;\n quote: string;\n onQuantityChange?: (value: number | string) => void;\n quantity: number;\n isEditing?: boolean;\n isPosition?: boolean;\n setOrderValue?: (key: string, value: number | string) => void;\n errorMsg?: string;\n}) => {\n // const isPosition = props.quantity === props.maxQty;\n const { isPosition } = props;\n const inputRef = useRef<HTMLInputElement>(null);\n const currentQtyPercentage =\n convertValueToPercentage(props.quantity, 0, props.maxQty) / 100;\n\n const setTPSL = () => {\n props.onQuantityChange?.(0);\n inputRef.current?.focus();\n\n setTimeout(() => {\n inputRef.current?.setSelectionRange(0, 1);\n }, 0);\n };\n\n const formatQuantity = (qty: string) => {\n if (props.baseTick > 0) {\n const quantity = Number(qty);\n // if (quantity) {\n // props.onQuantityChange?.(Math.min(props.maxQty, quantity));\n // } else {\n props.onQuantityChange?.(utils.formatNumber(qty, props.baseTick) ?? qty);\n // }\n }\n };\n\n const errorMsg =\n (isPosition ? \"\" : props.quantity).toString().length > 0\n ? props.errorMsg\n : undefined;\n\n return (\n <>\n <Flex gap={2}>\n <div className={\"oui-flex-1\"}>\n <Input.tooltip\n data-testid=\"oui-testid-tpsl-popUp-quantity-input\"\n ref={inputRef}\n prefix={\"Quantity\"}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n align=\"right\"\n value={isPosition ? \"\" : props.quantity}\n autoComplete=\"off\"\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-bg-base-5 oui-outline-line-12\",\n errorMsg && \"oui-outline-danger\"\n ),\n }}\n tooltipProps={{\n content: {\n className: \"oui-bg-base-6 oui-text-base-contrast-80\",\n },\n arrow: {\n className: \"oui-fill-base-6\",\n },\n }}\n tooltip={errorMsg}\n color={errorMsg ? \"danger\" : undefined}\n formatters={[\n inputFormatter.dpFormatter(props.dp),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n const qty = Number(value);\n if (qty && qty > props.maxQty) {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n inputRef.current?.blur();\n }\n }}\n onBlur={(e) => formatQuantity(e.target.value)}\n suffix={\n isPosition ? (\n <button\n className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\"\n onClick={() => {\n setTPSL();\n }}\n >\n Entire position\n </button>\n ) : (\n <span className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\">\n {props.quote}\n </span>\n )\n }\n />\n </div>\n {!props.isEditing && (\n <Button\n onClick={() => {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n if (qty === 0) {\n setTPSL();\n }\n }}\n variant={\"outlined\"}\n // size={{\n // lg: \"md\",\n // md: \"lg\",\n // }}\n className={cn(\n \"oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]\",\n isPosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5\"\n )}\n >\n Position\n </Button>\n )}\n </Flex>\n <Flex mt={2} itemAlign={\"center\"} height={\"15px\"}>\n <Slider.single\n markCount={5}\n color=\"primary\"\n max={props.maxQty}\n min={0}\n showTip\n step={props.baseTick}\n value={props.quantity}\n onValueCommit={(value) => {\n formatQuantity(`${value}`);\n }}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\n />\n </Flex>\n <Flex justify={\"between\"}>\n <Text.numeral rule={\"percentages\"} color={\"primary\"} size={\"2xs\"}>\n {currentQtyPercentage}\n </Text.numeral>\n <Flex itemAlign={\"center\"} gap={1}>\n <button\n className={\"oui-leading-none\"}\n style={{ lineHeight: 0 }}\n onClick={() => {\n props.onQuantityChange?.(props.maxQty);\n }}\n >\n <Text color={\"primary\"} size={\"2xs\"}>\n Max\n </Text>\n </button>\n <Text.numeral\n rule={\"price\"}\n size={\"2xs\"}\n intensity={54}\n tick={props.baseTick}\n >\n {props.maxQty}\n </Text.numeral>\n </Flex>\n </Flex>\n </>\n );\n};\n// ------------- Quantity input end------------\n\n// ------------ TP/SL Price and PNL input start------------\nconst TPSLPrice = (props: {\n tp_pnl?: number;\n sl_pnl?: number;\n quote: string;\n quote_dp?: number;\n onPriceChange: TPSLBuilderState[\"setOrderPrice\"];\n onPnLChange: TPSLBuilderState[\"setPnL\"];\n tp_values: PNL_Values;\n sl_values: PNL_Values;\n tp_trigger_price?: number | string;\n sl_trigger_price?: number | string;\n errors: Record<string, { message: string }> | null;\n}) => {\n const onPnLChange = (key: string, value: number | string) => {\n // console.log(key, value);\n props.onPnLChange(key, value);\n };\n return (\n <>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"} intensity={80}>\n Take profit <Text intensity={36}>(market order)</Text>\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.tp_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"TP\"}\n value={props.tp_trigger_price}\n error={props.errors?.tp_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"tp_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"TP\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.tp_values}\n />\n </Grid>\n </div>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"} intensity={80}>\n Stop loss <Text intensity={36}>(market order)</Text>\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.sl_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"SL\"}\n value={props.sl_trigger_price}\n error={props.errors?.sl_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"sl_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"SL\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.sl_values}\n />\n </Grid>\n </div>\n </>\n );\n};\n// ------------ TP/SL Price and PNL input end------------\n// ------------ TP/SL Price input start------------\nconst PriceInput = (props: {\n type: string;\n value?: string | number;\n error?: string;\n onValueChange: (value: string) => void;\n quote_dp: number;\n}) => {\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n return (\n <Input.tooltip\n data-testid={`oui-testid-tpsl-popUp-${props.type.toLowerCase()}-input`}\n prefix={`${props.type} price`}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n tooltip={props.error}\n placeholder={placeholder}\n align={\"right\"}\n autoComplete={\"off\"}\n value={props.value}\n color={props.error ? \"danger\" : undefined}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onValueChange={props.onValueChange}\n onFocus={() => {\n setPlaceholder(\"\");\n }}\n onBlur={() => {\n setPlaceholder(\"USDC\");\n }}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp),\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n />\n );\n};\n\nexport type PositionTPSLConfirmProps = {\n symbol: string;\n // isPosition: boolean;\n qty: number;\n tpPrice?: number;\n slPrice?: number;\n maxQty: number;\n side: OrderSide;\n // symbolConfig:API.SymbolExt\n baseDP: number;\n quoteDP: number;\n isEditing?: boolean;\n isPositionTPSL?: boolean;\n};\n\n// ------------ Position TP/SL Confirm dialog start------------\nexport const PositionTPSLConfirm = (props: PositionTPSLConfirmProps) => {\n const {\n symbol,\n tpPrice,\n slPrice,\n qty,\n maxQty,\n side,\n quoteDP,\n baseDP,\n isEditing,\n isPositionTPSL: _isPositionTPSL,\n } = props;\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n const textClassName = textVariants({\n size: \"xs\",\n intensity: 54,\n });\n\n // console.log(\"PositionTPSLConfirm\", qty, maxQty, quoteDP);\n\n const isPositionTPSL = _isPositionTPSL ?? qty >= maxQty;\n\n return (\n <>\n {isEditing && (\n <Text\n as=\"div\"\n size=\"2xs\"\n intensity={80}\n className=\"oui-mb-3\"\n >{`You agree to edit your ${transSymbolformString(\n symbol\n )} order.`}</Text>\n )}\n\n <Flex pb={4}>\n <Box grow>\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n as=\"div\"\n intensity={80}\n >\n {symbol}\n </Text.formatted>\n </Box>\n <Flex gap={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color={\"primary\"}>\n Position\n </Badge>\n )}\n\n {/* <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge> */}\n <TPSLOrderType tpPrice={tpPrice} slPrice={slPrice} />\n {side === OrderSide.SELL ? (\n <Badge size=\"xs\" color=\"success\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"danger\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider />\n <Flex\n direction={\"column\"}\n itemAlign={\"stretch\"}\n gapY={1}\n pt={4}\n // pb={5}\n className={cn(textClassName, \"oui-pb-4 xl:oui-pb-5\")}\n >\n <Flex>\n <Box grow>Qty.</Box>\n\n <div>\n {isPositionTPSL ? (\n <span className=\"oui-text-base-contrast\">Entire position</span>\n ) : (\n <Text.numeral intensity={98} dp={baseDP} padding={false}>\n {qty}\n </Text.numeral>\n )}\n </div>\n </Flex>\n {typeof tpPrice === \"number\" && tpPrice > 0 ? (\n <Flex>\n <Box grow>TP Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {tpPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n {typeof slPrice === \"number\" && slPrice > 0 ? (\n <Flex>\n <Box grow>SL Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {slPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n\n <Flex>\n <Box grow>Price</Box>\n <div className=\"oui-text-base-contrast\">Market</div>\n </Flex>\n </Flex>\n <Box pt={2}>\n <Flex gap={1}>\n <Checkbox\n id=\"disabledConfirm\"\n color=\"white\"\n checked={!needConfirm}\n onCheckedChange={(check) => {\n setNeedConfirm(!check);\n }}\n />\n <label\n htmlFor=\"disabledConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n className: \"oui-ml-1\",\n })}\n >\n Disable order confirmation\n </label>\n </Flex>\n </Box>\n </>\n );\n};\n\n//------------- Position TP/SL Confirm dialog end------------\n\nconst TPSLOrderType = (props: { tpPrice?: number; slPrice?: number }) => {\n const { tpPrice, slPrice } = props;\n if (!!tpPrice && !!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n );\n }\n\n if (!!tpPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP\n </Badge>\n );\n }\n\n if (!!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n SL\n </Badge>\n );\n }\n\n return null;\n};\n","import {\n CaretDownIcon,\n cn,\n Input,\n MenuItem,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter, Text } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & { testId?: string; quote: string };\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n pnl,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n const color = useMemo(() => {\n const num = Number(pnl);\n\n if (isNaN(num) || num === 0) return \"\";\n\n if (num > 0) return \"oui-text-trade-profit\";\n if (num < 0) return \"oui-text-trade-loss\";\n }, [pnl]);\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n \n\n return (\n <Input\n prefix={mode}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n placeholder={placeholder}\n align={\"right\"}\n value={value}\n data-testid={props.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n // inputFormatter.numberFormatter,\n props.formatter({ dp: quote_dp, mode }),\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n // className={color}\n classNames={{\n input: color,\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onFocus={() => {\n setPlaceholder(\"\");\n props.setFocus(true);\n }}\n onBlur={() => {\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n props.setFocus(false);\n }}\n // value={props.value}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className={cn(\"oui-ml-[2px]\", color)}>\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n};\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: string, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n\n const [focus, setFocus] = useState(true);\n const key = useMemo(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset`;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage`;\n default:\n return `${type.toLowerCase()}_pnl`;\n }\n }, [mode]);\n\n const value = useMemo(() => {\n return values[mode as keyof PNL_Values];\n }, [values]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n console.log(\"onValueChange\", value);\n props.onChange(key, value);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions\n ) => {\n value = `${value}`; // convert to string\n\n if (focus) {\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\"\n )\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n if (mode === PnLMode.PERCENTAGE) {\n // console.log(\"value\", value);\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else if (mode === PnLMode.PnL && type === \"SL\" && focus) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n // return {\n // onRenderBefore: (\n // value: string | number,\n // options: InputFormatterOptions\n // ) => {\n // // console.log(\"???\", options);\n // const { isFocused } = options;\n // value = `${value}`;\n // if (value === \"\" || value === \"-\") return \"\";\n\n // // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (isFocused) {\n // // value = value.startsWith(\"-\") ? value : \"-\" + value;\n // // }\n // // }\n\n // if (mode === PnLMode.PERCENTAGE) {\n // return `${todpIfNeed(new Decimal(value).mul(100).toString(), 2)}${\n // percentageSuffix.current\n // }`;\n // // return (Number(value) * 100).toFixed(2);\n // } else if (mode === PnLMode.OFFSET) {\n // value = todpIfNeed(value, 2);\n // } else {\n // // value = new Decimal(value).todp(2).toString();\n // }\n\n // return value;\n // },\n // onSendBefore: (value: string, options: InputFormatterOptions) => {\n // const { isFocused } = options;\n\n // if (mode === PnLMode.PERCENTAGE) {\n // if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n // value = new Decimal(value).div(100).toString();\n // value = todpIfNeed(value, 4);\n // }\n // } else {\n // // value = todpIfNeed(value, quote_dp);\n // if (isFocused) {\n // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (\n // // typeof values[PnLMode.PnL] !== \"undefined\" &&\n // // values[PnLMode.PnL] !== \"\"\n // // )\n // // return value;\n // const num = Number(value);\n // if (!isNaN(num) && num !== 0) {\n // value = (Math.abs(num) * -1).toString();\n // } else {\n // value = \"\";\n // }\n // }\n // }\n // }\n\n // return value;\n // },\n // };\n };\n\n return {\n mode,\n modes,\n type: props.type,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n value,\n pnl: values[PnLMode.PnL],\n onValueChange,\n quote_dp: props.quote_dp,\n setFocus,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testId?: string;\n quote: string;\n }\n) => {\n const { testId, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return <PNLInput {...state} testId={testId} quote={quote} />;\n};\n","import {\n type ComputedAlgoOrder,\n useLocalStorage,\n useSymbolsInfo,\n useTPSLOrder,\n utils,\n} from \"@orderly.network/hooks\";\nimport { SDKError } from \"@orderly.network/types\";\nimport { AlgoOrderRootType, AlgoOrderType, API } from \"@orderly.network/types\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nexport type TPSLBuilderOptions = {\n position: API.Position;\n order?: API.AlgoOrder;\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n isEditing?: boolean;\n /**\n * either show the confirm dialog or not,\n * if the Promise reject or return false, cancel the submit action\n */\n onConfirm?: (\n order: ComputedAlgoOrder,\n options: {\n position: API.Position;\n submit: () => Promise<any>;\n cancel: () => Promise<any>;\n }\n ) => Promise<boolean>;\n};\n\nexport const useTPSLBuilder = (options: TPSLBuilderOptions) => {\n const { position, order, isEditing } = options;\n // const isEditing = !!order;\n if (isEditing && !order) {\n throw new SDKError(\"order is required when isEditing is true\");\n }\n const symbol = isEditing ? order!.symbol : position.symbol;\n const symbolInfo = useSymbolsInfo();\n const prevTPSLType = useRef<AlgoOrderRootType>(AlgoOrderRootType.TP_SL);\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const [\n tpslOrder,\n {\n submit,\n deleteOrder,\n setValue,\n validate,\n errors,\n isCreateMutating,\n isUpdateMutating,\n },\n ] = useTPSLOrder(\n {\n symbol,\n position_qty: position.position_qty,\n average_open_price: position.average_open_price,\n },\n {\n defaultOrder: order,\n isEditing,\n }\n );\n\n const setQuantity = (value: number | string) => {\n setValue(\"quantity\", value);\n };\n\n const setOrderPrice = (\n name: \"tp_trigger_price\" | \"sl_trigger_price\",\n value: number | string\n ) => {\n setValue(name, value);\n };\n\n const setPnL = (type: string, value: number | string) => {\n setValue(type, value);\n };\n\n const maxQty = useMemo(\n () => Math.abs(Number(position.position_qty)),\n [position.position_qty]\n );\n\n const dirty = useMemo(() => {\n const quantity =\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? maxQty\n : order?.quantity;\n\n let diff: number = 0;\n\n if (Number(tpslOrder.quantity) !== quantity) {\n diff = 1;\n } else if (!isEditing && !!tpslOrder.quantity) {\n diff = 1;\n }\n\n if (order && isEditing) {\n const tp = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.TAKE_PROFIT\n );\n const sl = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.STOP_LOSS\n );\n\n if (\n tp?.trigger_price !== Number(tpslOrder.tp_trigger_price) &&\n typeof typeof tpslOrder.tp_trigger_price !== \"undefined\"\n ) {\n // return true;\n diff = 2;\n }\n\n if (\n sl?.trigger_price !== Number(tpslOrder.sl_trigger_price) &&\n typeof tpslOrder.sl_trigger_price !== \"undefined\"\n ) {\n diff = 3;\n }\n }\n\n if (\n diff === 1 &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n diff = -1;\n }\n\n return diff;\n }, [\n tpslOrder.tp_trigger_price,\n tpslOrder.sl_trigger_price,\n tpslOrder.quantity,\n order,\n isEditing,\n ]);\n\n const valid = useMemo(() => {\n /**\n * if the order is a POSITIONAL_TP_SL and the quantity is less than the maxQty,\n * and the tp/sl trigger price is not set, then the order is not valid\n */\n if (\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n Number(tpslOrder.quantity) < maxQty &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n return false;\n }\n\n return dirty > 0 && !!tpslOrder.quantity && !errors;\n }, [tpslOrder.quantity, maxQty, dirty, errors]);\n\n const isPositionTPSL = useMemo(() => {\n if (!isEditing) return Number(tpslOrder.quantity) >= maxQty;\n /**\n * if current order is not a POSITIONAL_TP_SL, then it's always a general TP/SL\n */\n if (!!order && order.algo_type !== AlgoOrderRootType.POSITIONAL_TP_SL) {\n return false;\n }\n if (tpslOrder.algo_order_id && tpslOrder.quantity == 0) return true;\n return Number(tpslOrder.quantity) >= maxQty;\n }, [tpslOrder.quantity, maxQty, order?.algo_type, isEditing]);\n\n useEffect(() => {\n if (!isEditing && isPositionTPSL) {\n const trigger_prices = utils.findTPSLFromOrder(order!);\n if (!tpslOrder.tp_trigger_price && trigger_prices.tp_trigger_price) {\n setOrderPrice(\"tp_trigger_price\", trigger_prices.tp_trigger_price);\n }\n if (!tpslOrder.sl_trigger_price && trigger_prices.sl_trigger_price) {\n setOrderPrice(\"sl_trigger_price\", trigger_prices.sl_trigger_price);\n }\n }\n }, [isEditing, isPositionTPSL, tpslOrder]);\n\n useEffect(() => {\n const type =\n Number(tpslOrder.quantity) < maxQty\n ? AlgoOrderRootType.TP_SL\n : AlgoOrderRootType.POSITIONAL_TP_SL;\n if (\n typeof options.onTPSLTypeChange === \"function\" &&\n prevTPSLType.current !== type\n ) {\n options.onTPSLTypeChange(type);\n }\n\n prevTPSLType.current = type;\n }, [tpslOrder.quantity, maxQty]);\n\n const cancel = (): Promise<void> => {\n if (order?.algo_order_id && order?.symbol) {\n return deleteOrder(order?.algo_order_id, order?.symbol);\n }\n return Promise.reject(\"order id or symbol is invalid\");\n };\n\n const onSubmit = async () => {\n return Promise.resolve()\n .then(() => {\n if (typeof options.onConfirm !== \"function\" || !needConfirm) {\n return submit().then(\n () => true,\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n return Promise.reject(false);\n }\n );\n }\n return options.onConfirm(tpslOrder, {\n position,\n submit,\n cancel,\n });\n })\n .then((isSuccess) => {\n console.log(\"result\", isSuccess);\n });\n };\n\n return {\n isEditing,\n symbolInfo: symbolInfo[symbol],\n maxQty,\n setQuantity,\n orderQuantity: tpslOrder.quantity,\n isPosition: isPositionTPSL,\n\n TPSL_OrderEntity: tpslOrder,\n setOrderValue: setValue,\n setPnL,\n setOrderPrice,\n // needConfirm,\n onSubmit,\n valid,\n errors,\n status: {\n isCreateMutating,\n isUpdateMutating,\n },\n } as const;\n};\n\nexport type TPSLBuilderState = ReturnType<typeof useTPSLBuilder>;\n","import { type AlgoOrderRootType } from \"@orderly.network/types\";\nimport { TPSL, TPSLProps } from \"./tpsl.ui\";\nimport { TPSLBuilderOptions, useTPSLBuilder } from \"./useTPSL.script\";\n\nexport type TPSLWidgetProps = {\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n} & TPSLBuilderOptions &\n TPSLProps;\n\nexport const TPSLWidget = (props: TPSLWidgetProps) => {\n const { onCancel, onComplete, ...rest } = props;\n const state = useTPSLBuilder(rest);\n\n return <TPSL {...state} onCancel={onCancel} onComplete={onComplete} />;\n};\n","import { useLocalStorage } from \"@orderly.network/hooks\";\nimport {\n Button,\n cn,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n} from \"@orderly.network/ui\";\nimport { ReactNode, useState } from \"react\";\nimport { TPSLWidget } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport { ButtonProps } from \"@orderly.network/ui\";\n\nexport const PositionTPSLPopover = (props: {\n position: API.Position;\n order?: API.AlgoOrder;\n label?: string;\n baseDP?: number;\n quoteDP?: number;\n /**\n * Button props\n */\n buttonProps?: ButtonProps;\n isEditing?: boolean;\n children?: ReactNode;\n}) => {\n const { position, order, baseDP, quoteDP, buttonProps, isEditing } = props;\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(true);\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n return (\n <PopoverRoot\n onOpenChange={(isOpen) => {\n // console.log(\"isOpen\", isOpen);\n if (visible) {\n setOpen(isOpen);\n }\n }}\n open={open}\n >\n <PopoverTrigger\n asChild\n onClick={() => {\n setOpen(true);\n }}\n >\n {props.children || (\n <Button\n variant=\"outlined\"\n size=\"sm\"\n color=\"secondary\"\n {...buttonProps}\n // onClick={() => {\n // setOpen(true);\n // }}\n >\n {props.label}\n </Button>\n )}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"oui-w-[360px]\",\n visible ? \"oui-visible\" : \"oui-invisible\"\n )}\n align=\"end\"\n side={\"top\"}\n >\n <TPSLWidget\n position={position}\n order={order}\n isEditing={isEditing}\n onComplete={() => {\n // console.log(\"tpsl order completed\");\n setOpen(false);\n }}\n onCancel={() => {\n setOpen(false);\n }}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n setVisible(false);\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n // console.log(\n // \"order\",\n // order,\n // isEditing ||\n // (!!order &&\n // order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n // order.quantity === maxQty)\n // );\n\n if (\n `${order.tp_trigger_price ?? \"\"}`.length === 0 &&\n `${order.sl_trigger_price ?? \"\"}`.length === 0\n ) {\n return modal\n .confirm({\n title: \"Cancel Order\",\n content: \"Are you sure you want to cancel this TP/SL order?\",\n onOk: () => {\n return options.cancel();\n },\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n // bodyClassName: \"lg:oui-py-0\",\n onOk: () => {\n return options.submit();\n },\n classNames: {\n body: \"!oui-pb-0\",\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={finalIsEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quoteDP ?? 2}\n baseDP={baseDP ?? 2}\n />\n ),\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n />\n </PopoverContent>\n </PopoverRoot>\n );\n};\n","import { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n modal,\n useModal,\n Text,\n Box,\n Badge,\n Divider,\n toast,\n} from \"@orderly.network/ui\";\nimport { TPSLWidget, TPSLWidgetProps } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useLocalStorage, useMarkPrice } from \"@orderly.network/hooks\";\n\ntype TPSLSheetProps = {\n position: API.Position;\n order?: API.AlgoOrder;\n // label: string;\n // baseDP?: number;\n // quoteDP?: number;\n symbolInfo: API.SymbolExt;\n isEditing?: boolean;\n};\n\nexport const PositionTPSLSheet = (props: TPSLWidgetProps & TPSLSheetProps) => {\n const { position, order, symbolInfo, isEditing } = props;\n const { resolve, hide, updateArgs } = useModal();\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n const updateSheetTitle = (title: string) => {\n if (isEditing) return;\n updateArgs({ title });\n };\n\n const onCompleted = () => {\n resolve();\n hide();\n };\n\n const { quote_dp, base_dp } = symbolInfo;\n\n return (\n <>\n <PositionInfo position={position} symbolInfo={symbolInfo} />\n\n <TPSLWidget\n {...props}\n onTPSLTypeChange={(type) => {\n updateSheetTitle(\n type === AlgoOrderRootType.TP_SL ? \"TP/SL\" : \"Position TP/SL\"\n );\n }}\n onComplete={onCompleted}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n bodyClassName: \"oui-pb-0 lg:oui-pb-0\",\n onOk: () => {\n return options.submit();\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={isEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quote_dp ?? 2}\n baseDP={base_dp ?? 2}\n />\n ),\n })\n .then(\n () => {\n // setOpen(false);\n // setVisible(true);\n return true;\n },\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n\n // setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n onCancel={() => {\n hide();\n }}\n />\n </>\n );\n};\n\nexport const TPSLSheetTitle = () => {\n const modal = useModal();\n\n const title = useMemo<string>(() => {\n return (modal.args?.title || \"TP/SL\") as string;\n }, [modal.args?.title]);\n\n return <span>{title}</span>;\n};\n\nexport const PositionInfo = (props: {\n position: API.Position;\n symbolInfo: API.SymbolExt;\n}) => {\n const { position, symbolInfo } = props;\n const { data: markPrice } = useMarkPrice(position.symbol);\n const modal = useModal();\n const isPositionTPSL = useMemo(() => {\n return modal.args?.title === \"Position TP/SL\";\n }, [modal.args?.title]);\n return (\n <>\n <Flex justify={\"between\"} pb={3} itemAlign={\"center\"}>\n <Text.formatted rule=\"symbol\" className=\"oui-text-xs\" showIcon>\n {position.symbol}\n </Text.formatted>\n <Flex gapX={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color=\"primary\">\n Position\n </Badge>\n )}\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n {position.position_qty < 0 ? (\n <Badge size=\"xs\" color=\"buy\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"sell\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider intensity={8} />\n <Box py={3} className=\"oui-space-y-1\">\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Avg. open\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {position.average_open_price}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Mark price\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {markPrice}\n </Text.numeral>\n </Flex>\n </Box>\n </>\n );\n};\n"]}
package/dist/index.mjs CHANGED
@@ -5,8 +5,8 @@ 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]),y=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(""),_=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:y,type:e.type,formatter:T,onModeChange:l=>{m(l);},value:i,pnl:o.PnL,onValueChange:_,quote_dp:e.quote_dp,setFocus:g}};var Z=e=>{let{mode:t,modes:o,onModeChange:n,onValueChange:m,quote:d,quote_dp:g,value:a,pnl:i}=e,[y,P]=useState(t),[_,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:_,align:"right",value:a,"data-testid":e.testId,autoComplete:"off",onValueChange:m,formatters:[e.formatter({dp:g,mode:t}),inputFormatter.currencyFormatter],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(Z,{...m,testId:t,quote:o})};var ne=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],onValueChange:a=>{e.onQuantityChange?.(a);let i=Number(a);if(i&&i>e.maxQty){let y=t?0:e.maxQty;e.onQuantityChange?.(y),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:[jsx(Text,{size:"sm",intensity:80,children:"Take profit"}),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(te,{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:[jsx(Text,{size:"sm",intensity:80,children:"Stop loss"}),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(te,{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})]})]})]})},te=e=>{let[t,o]=useState("USDC");return jsx(Input.tooltip,{"data-testid":`oui-testid-tpsl-popUp-${e.type.toLowerCase()}-input`,prefix:`${e.type} 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]})},B=e=>{let{symbol:t,tpPrice:o,slPrice:n,qty:m,maxQty:d,side:g,quoteDP:a,baseDP:i,isEditing:y,isPositionTPSL:P}=e,[_,T]=useLocalStorage("orderly_order_confirm",!0),l=textVariants({size:"xs",intensity:54}),u=P??m>=d;return jsxs(Fragment,{children:[y&&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:!_,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 ue=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:y,deleteOrder:P,setValue:_,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=>{_("quantity",p);},v=(p,S)=>{_(p,S);},w=(p,S)=>{_(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 ye=o.child_orders.find(V=>V.algo_type===AlgoOrderType.TAKE_PROFIT),_e=o.child_orders.find(V=>V.algo_type===AlgoOrderType.STOP_LOSS);ye?.trigger_price!==Number(i.tp_trigger_price)&&typeof typeof i.tp_trigger_price<"u"&&(S=2),_e?.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 Pe=()=>o?.algo_order_id&&o?.symbol?P(o?.algo_order_id,o?.symbol):Promise.reject("order id or symbol is invalid"),fe=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"||!a?y().then(()=>!0,p=>(p?.message&&toast.error(p.message),Promise.reject(!1))):e.onConfirm(i,{position:t,submit:y,cancel:Pe})).then(p=>{});return {isEditing:n,symbolInfo:d[m],maxQty:C,setQuantity:L,orderQuantity:i.quantity,isPosition:$,TPSL_OrderEntity:i,setOrderValue:_,setPnL:w,setOrderPrice:v,onSubmit:fe,valid:pe,errors:l,status:{isCreateMutating:u,isUpdateMutating:s}}};var M=e=>{let{onCancel:t,onComplete:o,...n}=e,m=ue(n);return jsx(ne,{...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),[y,P]=useState(!0),[_]=useLocalStorage("orderly_order_confirm",!0),T=g?o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL:void 0;return jsxs(PopoverRoot,{onOpenChange:l=>{y&&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]",y?"oui-visible":"oui-invisible"),align:"end",side:"top",children:jsx(M,{position:t,order:o,isEditing:g,onComplete:()=>{i(!1);},onCancel:()=>{i(!1);},onConfirm:(l,u)=>{if(!_)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),y=m?o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL:void 0,P=u=>{m||a({title:u});},_=()=>{d(),g();},{quote_dp:T,base_dp:l}=n;return jsxs(Fragment,{children:[jsx(yt,{position:t,symbolInfo:n}),jsx(M,{...e,onTPSLTypeChange:u=>{P(u===AlgoOrderRootType.TP_SL?"TP/SL":"Position TP/SL");},onComplete:_,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:y,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(!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:`${e.type} 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})]})]})]})};
9
9
 
10
- export { B as PositionTPSLConfirm, at as PositionTPSLPopover, ft as PositionTPSLSheet, M as TPSLWidget };
10
+ export { B as PositionTPSLConfirm, at as PositionTPSLPopover, ft as PositionTPSLSheet, F as TPSLWidget };
11
11
  //# sourceMappingURL=out.js.map
12
12
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tpsl.ui.tsx","../src/pnlInput/pnlInput.ui.tsx","../src/pnlInput/useBuilder.script.ts","../src/pnlInput/pnlInput.widget.tsx","../src/useTPSL.script.ts","../src/tpsl.widget.tsx","../src/editorPopover.tsx","../src/editorSheet.tsx"],"names":["useRef","useState","Badge","Box","Button","Divider","Flex","Grid","Input","Slider","Text","textVariants","cn","inputFormatter","Checkbox","convertValueToPercentage","ThrottledButton","CaretDownIcon","SimpleDropdownMenu","useMemo","useLocalStorage","Decimal","todpIfNeed","usePNLInputBuilder","props","type","values","mode","setMode","focus","setFocus","key","value","modes","percentageSuffix","onValueChange","formatter","options","dp","endStr","useEffect","Fragment","jsx","jsxs","PNLInput","onModeChange","quote","quote_dp","pnl","prefix","setPrefix","placeholder","setPlaceholder","color","num","PNLMenus","item","PnlInputWidget","testId","rest","state","utils","OrderSide","transSymbolformString","TPSL","TPSL_OrderEntity","symbolInfo","onCancel","onComplete","status","errors","isPosition","TPSLQuantity","TPSLPrice","inputRef","currentQtyPercentage","setTPSL","formatQuantity","qty","quantity","errorMsg","e","onPnLChange","PriceInput","PositionTPSLConfirm","symbol","tpPrice","slPrice","maxQty","side","quoteDP","baseDP","isEditing","_isPositionTPSL","needConfirm","setNeedConfirm","textClassName","isPositionTPSL","TPSLOrderType","check","useSymbolsInfo","useTPSLOrder","SDKError","AlgoOrderRootType","AlgoOrderType","toast","useTPSLBuilder","position","order","prevTPSLType","tpslOrder","submit","deleteOrder","setValue","validate","isCreateMutating","isUpdateMutating","setQuantity","setOrderPrice","name","setPnL","dirty","diff","tp","o","sl","valid","trigger_prices","cancel","onSubmit","reject","isSuccess","TPSLWidget","modal","PopoverContent","PopoverRoot","PopoverTrigger","PositionTPSLPopover","buttonProps","open","setOpen","visible","setVisible","isOpen","finalIsEditing","useModal","useMarkPrice","PositionTPSLSheet","resolve","hide","updateArgs","updateSheetTitle","title","onCompleted","base_dp","PositionInfo","markPrice"],"mappings":"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","sourcesContent":["import { useRef, useState } from \"react\";\nimport {\n Badge,\n Box,\n Button,\n Divider,\n Flex,\n Grid,\n Input,\n Slider,\n Text,\n textVariants,\n cn,\n inputFormatter,\n Checkbox,\n convertValueToPercentage,\n ThrottledButton,\n} from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { TPSLBuilderState } from \"./useTPSL.script\";\n\nimport type { PNL_Values } from \"./pnlInput/useBuilder.script\";\nimport { useLocalStorage, utils } from \"@orderly.network/hooks\";\nimport { API, OrderSide } from \"@orderly.network/types\";\nimport { transSymbolformString } from \"@orderly.network/utils\";\n\nexport type TPSLProps = {\n onCancel?: () => void;\n onComplete?: () => void;\n};\n\n//------------- TPSL form start ---------------\nexport const TPSL = (props: TPSLBuilderState & TPSLProps) => {\n const {\n TPSL_OrderEntity,\n symbolInfo,\n onCancel,\n onComplete,\n status,\n errors,\n isPosition,\n } = props;\n\n\n return (\n <div id=\"orderly-tp_sl-order-edit-content\">\n {(!props.isEditing || (props.isEditing && !props.isPosition)) && (\n <>\n <TPSLQuantity\n maxQty={props.maxQty}\n quantity={(props.orderQuantity ?? props.maxQty) as number}\n baseTick={symbolInfo(\"base_tick\")}\n dp={symbolInfo(\"base_dp\")}\n onQuantityChange={props.setQuantity}\n quote={symbolInfo(\"base\")}\n isEditing={props.isEditing}\n isPosition={isPosition}\n errorMsg={props.errors?.quantity?.message}\n />\n <Divider my={4} intensity={8} />\n </>\n )}\n\n <TPSLPrice\n sl_pnl={TPSL_OrderEntity.sl_pnl}\n tp_pnl={TPSL_OrderEntity.tp_pnl}\n quote={symbolInfo(\"quote\")}\n quote_dp={symbolInfo(\"quote_dp\")}\n onPriceChange={props.setOrderPrice}\n onPnLChange={props.setPnL}\n errors={errors}\n tp_values={{\n PnL: `${TPSL_OrderEntity.tp_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.tp_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.tp_offset_percentage ?? \"\"}`,\n }}\n sl_values={{\n PnL: `${TPSL_OrderEntity.sl_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.sl_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.sl_offset_percentage ?? \"\"}`,\n }}\n tp_trigger_price={TPSL_OrderEntity.tp_trigger_price ?? \"\"}\n sl_trigger_price={TPSL_OrderEntity.sl_trigger_price ?? \"\"}\n />\n <Grid cols={2} gap={3} mt={4}>\n <Button\n size={\"md\"}\n color={\"secondary\"}\n data-testid={\"tpsl-cancel\"}\n onClick={() => {\n onCancel?.();\n }}\n >\n Cancel\n </Button>\n <ThrottledButton\n size={\"md\"}\n data-testid={\"tpsl-confirm\"}\n disabled={!props.valid || status.isCreateMutating}\n loading={status.isCreateMutating || status.isUpdateMutating}\n onClick={() => {\n props.onSubmit().then(\n () => {\n onComplete?.();\n },\n () => {\n console.log(\"--->>>cancel order\");\n }\n );\n }}\n >\n Confirm\n </ThrottledButton>\n </Grid>\n </div>\n );\n};\n\n//----------\n\n// ------------- Quantity input start------------\nconst TPSLQuantity = (props: {\n maxQty: number;\n baseTick: number;\n dp: number;\n quote: string;\n onQuantityChange?: (value: number | string) => void;\n quantity: number;\n isEditing?: boolean;\n isPosition?: boolean;\n setOrderValue?: (key: string, value: number | string) => void;\n errorMsg?: string;\n}) => {\n // const isPosition = props.quantity === props.maxQty;\n const { isPosition } = props;\n const inputRef = useRef<HTMLInputElement>(null);\n const currentQtyPercentage =\n convertValueToPercentage(props.quantity, 0, props.maxQty) / 100;\n\n const setTPSL = () => {\n props.onQuantityChange?.(0);\n inputRef.current?.focus();\n\n setTimeout(() => {\n inputRef.current?.setSelectionRange(0, 1);\n }, 0);\n };\n\n const formatQuantity = (qty: string) => {\n if (props.baseTick > 0) {\n const quantity = Number(qty);\n // if (quantity) {\n // props.onQuantityChange?.(Math.min(props.maxQty, quantity));\n // } else {\n props.onQuantityChange?.(utils.formatNumber(qty, props.baseTick) ?? qty);\n // }\n }\n };\n\n const errorMsg = (isPosition ? \"\" : props.quantity).toString().length > 0 ? props.errorMsg : undefined;\n\n return (\n <>\n <Flex gap={2}>\n <div className={\"oui-flex-1\"}>\n <Input.tooltip\n data-testid=\"oui-testid-tpsl-popUp-quantity-input\"\n ref={inputRef}\n prefix={\"Quantity\"}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n align=\"right\"\n value={isPosition ? \"\" : props.quantity}\n autoComplete=\"off\"\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: cn(\"oui-bg-base-5 oui-outline-line-12\", errorMsg && \"oui-outline-danger\"),\n }}\n tooltipProps={{\n content: {\n className: \"oui-bg-base-6 oui-text-base-contrast-80\",\n },\n arrow: {\n className: \"oui-fill-base-6\",\n },\n }}\n tooltip={errorMsg}\n color={errorMsg ? 'danger' : undefined}\n formatters={[\n inputFormatter.dpFormatter(props.dp),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n const qty = Number(value);\n if (qty && qty > props.maxQty) {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n inputRef.current?.blur();\n }\n }}\n onBlur={(e) => formatQuantity(e.target.value)}\n suffix={\n isPosition ? (\n <button\n className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\"\n onClick={() => {\n setTPSL();\n }}\n >\n Entire position\n </button>\n ) : (\n <span className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\">\n {props.quote}\n </span>\n )\n }\n />\n </div>\n {!props.isEditing && (\n <Button\n onClick={() => {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n if (qty === 0) {\n setTPSL();\n }\n }}\n variant={\"outlined\"}\n // size={{\n // lg: \"md\",\n // md: \"lg\",\n // }}\n className={cn(\n \"oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]\",\n isPosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5\"\n )}\n >\n Position\n </Button>\n )}\n </Flex>\n <Flex mt={2} itemAlign={\"center\"} height={\"15px\"}>\n <Slider.single\n markCount={5}\n color=\"primary\"\n max={props.maxQty}\n min={0}\n showTip\n step={props.baseTick}\n value={props.quantity}\n onValueCommit={(value) => {\n formatQuantity(`${value}`);\n }}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\n />\n </Flex>\n <Flex justify={\"between\"}>\n <Text.numeral rule={\"percentages\"} color={\"primary\"} size={\"2xs\"}>\n {currentQtyPercentage}\n </Text.numeral>\n <Flex itemAlign={\"center\"} gap={1}>\n <button\n className={\"oui-leading-none\"}\n style={{ lineHeight: 0 }}\n onClick={() => {\n props.onQuantityChange?.(props.maxQty);\n }}\n >\n <Text color={\"primary\"} size={\"2xs\"}>\n Max\n </Text>\n </button>\n <Text.numeral\n rule={\"price\"}\n size={\"2xs\"}\n intensity={54}\n tick={props.baseTick}\n >\n {props.maxQty}\n </Text.numeral>\n </Flex>\n </Flex>\n </>\n );\n};\n// ------------- Quantity input end------------\n\n// ------------ TP/SL Price and PNL input start------------\nconst TPSLPrice = (props: {\n tp_pnl?: number;\n sl_pnl?: number;\n quote: string;\n quote_dp?: number;\n onPriceChange: TPSLBuilderState[\"setOrderPrice\"];\n onPnLChange: TPSLBuilderState[\"setPnL\"];\n tp_values: PNL_Values;\n sl_values: PNL_Values;\n tp_trigger_price?: number | string;\n sl_trigger_price?: number | string;\n errors: Record<string, { message: string }> | null;\n}) => {\n const onPnLChange = (key: string, value: number | string) => {\n // console.log(key, value);\n props.onPnLChange(key, value);\n };\n return (\n <>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"sm\"} intensity={80}>\n Take profit\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.tp_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"TP\"}\n value={props.tp_trigger_price}\n error={props.errors?.tp_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"tp_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"TP\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.tp_values}\n />\n </Grid>\n </div>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"sm\"} intensity={80}>\n Stop loss\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.sl_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"SL\"}\n value={props.sl_trigger_price}\n error={props.errors?.sl_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"sl_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"SL\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.sl_values}\n />\n </Grid>\n </div>\n </>\n );\n};\n// ------------ TP/SL Price and PNL input end------------\n// ------------ TP/SL Price input start------------\nconst PriceInput = (props: {\n type: string;\n value?: string | number;\n error?: string;\n onValueChange: (value: string) => void;\n quote_dp: number;\n}) => {\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n return (\n <Input.tooltip\n data-testid={`oui-testid-tpsl-popUp-${props.type.toLowerCase()}-input`}\n prefix={`${props.type} price`}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n tooltip={props.error}\n placeholder={placeholder}\n align={\"right\"}\n autoComplete={\"off\"}\n value={props.value}\n color={props.error ? \"danger\" : undefined}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onValueChange={props.onValueChange}\n onFocus={() => {\n setPlaceholder(\"\");\n }}\n onBlur={() => {\n setPlaceholder(\"USDC\");\n }}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\nexport type PositionTPSLConfirmProps = {\n symbol: string;\n // isPosition: boolean;\n qty: number;\n tpPrice?: number;\n slPrice?: number;\n maxQty: number;\n side: OrderSide;\n // symbolConfig:API.SymbolExt\n baseDP: number;\n quoteDP: number;\n isEditing?: boolean;\n isPositionTPSL?: boolean;\n};\n\n// ------------ Position TP/SL Confirm dialog start------------\nexport const PositionTPSLConfirm = (props: PositionTPSLConfirmProps) => {\n const {\n symbol,\n tpPrice,\n slPrice,\n qty,\n maxQty,\n side,\n quoteDP,\n baseDP,\n isEditing,\n isPositionTPSL: _isPositionTPSL,\n } = props;\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n const textClassName = textVariants({\n size: \"xs\",\n intensity: 54,\n });\n\n // console.log(\"PositionTPSLConfirm\", qty, maxQty, quoteDP);\n\n const isPositionTPSL = _isPositionTPSL ?? qty >= maxQty;\n\n return (\n <>\n {isEditing && (\n <Text\n as=\"div\"\n size=\"2xs\"\n intensity={80}\n className=\"oui-mb-3\"\n >{`You agree to edit your ${transSymbolformString(\n symbol\n )} order.`}</Text>\n )}\n\n <Flex pb={4}>\n <Box grow>\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n as=\"div\"\n intensity={80}\n >\n {symbol}\n </Text.formatted>\n </Box>\n <Flex gap={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color={\"primary\"}>\n Position\n </Badge>\n )}\n\n {/* <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge> */}\n <TPSLOrderType tpPrice={tpPrice} slPrice={slPrice} />\n {side === OrderSide.SELL ? (\n <Badge size=\"xs\" color=\"success\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"danger\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider />\n <Flex\n direction={\"column\"}\n itemAlign={\"stretch\"}\n gapY={1}\n pt={4}\n // pb={5}\n className={cn(textClassName, \"oui-pb-4 xl:oui-pb-5\")}\n >\n <Flex>\n <Box grow>Qty.</Box>\n\n <div>\n {isPositionTPSL ? (\n <span className=\"oui-text-base-contrast\">Entire position</span>\n ) : (\n <Text.numeral intensity={98} dp={baseDP} padding={false}>\n {qty}\n </Text.numeral>\n )}\n </div>\n </Flex>\n {typeof tpPrice === \"number\" && tpPrice > 0 ? (\n <Flex>\n <Box grow>TP Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {tpPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n {typeof slPrice === \"number\" && slPrice > 0 ? (\n <Flex>\n <Box grow>SL Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {slPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n\n <Flex>\n <Box grow>Price</Box>\n <div className=\"oui-text-base-contrast\">Market</div>\n </Flex>\n </Flex>\n <Box pt={2}>\n <Flex gap={1}>\n <Checkbox\n id=\"disabledConfirm\"\n color=\"white\"\n checked={!needConfirm}\n onCheckedChange={(check) => {\n setNeedConfirm(!check);\n }}\n />\n <label\n htmlFor=\"disabledConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n className: \"oui-ml-1\",\n })}\n >\n Disable order confirmation\n </label>\n </Flex>\n </Box>\n </>\n );\n};\n\n//------------- Position TP/SL Confirm dialog end------------\n\nconst TPSLOrderType = (props: { tpPrice?: number; slPrice?: number }) => {\n const { tpPrice, slPrice } = props;\n if (!!tpPrice && !!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n );\n }\n\n if (!!tpPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP\n </Badge>\n );\n }\n\n if (!!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n SL\n </Badge>\n );\n }\n\n return null;\n};\n","import {\n CaretDownIcon,\n cn,\n Input,\n MenuItem,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter, Text } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & { testId?: string; quote: string };\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n pnl,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n const color = useMemo(() => {\n const num = Number(pnl);\n\n if (isNaN(num) || num === 0) return \"\";\n\n if (num > 0) return \"oui-text-trade-profit\";\n if (num < 0) return \"oui-text-trade-loss\";\n }, [pnl]);\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n \n\n return (\n <Input\n prefix={mode}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n placeholder={placeholder}\n align={\"right\"}\n value={value}\n data-testid={props.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n // inputFormatter.numberFormatter,\n props.formatter({ dp: quote_dp, mode }),\n inputFormatter.currencyFormatter,\n ]}\n // className={color}\n classNames={{\n input: color,\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onFocus={() => {\n setPlaceholder(\"\");\n props.setFocus(true);\n }}\n onBlur={() => {\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n props.setFocus(false);\n }}\n // value={props.value}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className={cn(\"oui-ml-[2px]\", color)}>\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n};\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: string, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n\n const [focus, setFocus] = useState(true);\n const key = useMemo(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset`;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage`;\n default:\n return `${type.toLowerCase()}_pnl`;\n }\n }, [mode]);\n\n const value = useMemo(() => {\n return values[mode as keyof PNL_Values];\n }, [values]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n console.log(\"onValueChange\", value);\n props.onChange(key, value);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions\n ) => {\n value = `${value}`; // convert to string\n\n if (focus) {\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\"\n )\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n if (mode === PnLMode.PERCENTAGE) {\n // console.log(\"value\", value);\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else if (mode === PnLMode.PnL && type === \"SL\" && focus) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n // return {\n // onRenderBefore: (\n // value: string | number,\n // options: InputFormatterOptions\n // ) => {\n // // console.log(\"???\", options);\n // const { isFocused } = options;\n // value = `${value}`;\n // if (value === \"\" || value === \"-\") return \"\";\n\n // // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (isFocused) {\n // // value = value.startsWith(\"-\") ? value : \"-\" + value;\n // // }\n // // }\n\n // if (mode === PnLMode.PERCENTAGE) {\n // return `${todpIfNeed(new Decimal(value).mul(100).toString(), 2)}${\n // percentageSuffix.current\n // }`;\n // // return (Number(value) * 100).toFixed(2);\n // } else if (mode === PnLMode.OFFSET) {\n // value = todpIfNeed(value, 2);\n // } else {\n // // value = new Decimal(value).todp(2).toString();\n // }\n\n // return value;\n // },\n // onSendBefore: (value: string, options: InputFormatterOptions) => {\n // const { isFocused } = options;\n\n // if (mode === PnLMode.PERCENTAGE) {\n // if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n // value = new Decimal(value).div(100).toString();\n // value = todpIfNeed(value, 4);\n // }\n // } else {\n // // value = todpIfNeed(value, quote_dp);\n // if (isFocused) {\n // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (\n // // typeof values[PnLMode.PnL] !== \"undefined\" &&\n // // values[PnLMode.PnL] !== \"\"\n // // )\n // // return value;\n // const num = Number(value);\n // if (!isNaN(num) && num !== 0) {\n // value = (Math.abs(num) * -1).toString();\n // } else {\n // value = \"\";\n // }\n // }\n // }\n // }\n\n // return value;\n // },\n // };\n };\n\n return {\n mode,\n modes,\n type: props.type,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n value,\n pnl: values[PnLMode.PnL],\n onValueChange,\n quote_dp: props.quote_dp,\n setFocus,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testId?: string;\n quote: string;\n }\n) => {\n const { testId, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return <PNLInput {...state} testId={testId} quote={quote} />;\n};\n","import {\n type ComputedAlgoOrder,\n useLocalStorage,\n useSymbolsInfo,\n useTPSLOrder,\n utils,\n} from \"@orderly.network/hooks\";\nimport { SDKError } from \"@orderly.network/types\";\nimport { AlgoOrderRootType, AlgoOrderType, API } from \"@orderly.network/types\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nexport type TPSLBuilderOptions = {\n position: API.Position;\n order?: API.AlgoOrder;\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n isEditing?: boolean;\n /**\n * either show the confirm dialog or not,\n * if the Promise reject or return false, cancel the submit action\n */\n onConfirm?: (\n order: ComputedAlgoOrder,\n options: {\n position: API.Position;\n submit: () => Promise<any>;\n cancel: () => Promise<any>;\n }\n ) => Promise<boolean>;\n};\n\nexport const useTPSLBuilder = (options: TPSLBuilderOptions) => {\n const { position, order, isEditing } = options;\n // const isEditing = !!order;\n if (isEditing && !order) {\n throw new SDKError(\"order is required when isEditing is true\");\n }\n const symbol = isEditing ? order!.symbol : position.symbol;\n const symbolInfo = useSymbolsInfo();\n const prevTPSLType = useRef<AlgoOrderRootType>(AlgoOrderRootType.TP_SL);\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const [\n tpslOrder,\n {\n submit,\n deleteOrder,\n setValue,\n validate,\n errors,\n isCreateMutating,\n isUpdateMutating,\n },\n ] = useTPSLOrder(\n {\n symbol,\n position_qty: position.position_qty,\n average_open_price: position.average_open_price,\n },\n {\n defaultOrder: order,\n isEditing,\n }\n );\n\n const setQuantity = (value: number | string) => {\n setValue(\"quantity\", value);\n };\n\n const setOrderPrice = (\n name: \"tp_trigger_price\" | \"sl_trigger_price\",\n value: number | string\n ) => {\n setValue(name, value);\n };\n\n const setPnL = (type: string, value: number | string) => {\n setValue(type, value);\n };\n\n const maxQty = useMemo(\n () => Math.abs(Number(position.position_qty)),\n [position.position_qty]\n );\n\n const dirty = useMemo(() => {\n const quantity =\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? maxQty\n : order?.quantity;\n\n let diff: number = 0;\n\n if (Number(tpslOrder.quantity) !== quantity) {\n diff = 1;\n } else if (!isEditing && !!tpslOrder.quantity) {\n diff = 1;\n }\n\n if (order && isEditing) {\n const tp = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.TAKE_PROFIT\n );\n const sl = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.STOP_LOSS\n );\n\n if (\n tp?.trigger_price !== Number(tpslOrder.tp_trigger_price) &&\n typeof typeof tpslOrder.tp_trigger_price !== \"undefined\"\n ) {\n // return true;\n diff = 2;\n }\n\n if (\n sl?.trigger_price !== Number(tpslOrder.sl_trigger_price) &&\n typeof tpslOrder.sl_trigger_price !== \"undefined\"\n ) {\n diff = 3;\n }\n }\n\n if (\n diff === 1 &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n diff = -1;\n }\n\n return diff;\n }, [\n tpslOrder.tp_trigger_price,\n tpslOrder.sl_trigger_price,\n tpslOrder.quantity,\n order,\n isEditing,\n ]);\n\n const valid = useMemo(() => {\n /**\n * if the order is a POSITIONAL_TP_SL and the quantity is less than the maxQty,\n * and the tp/sl trigger price is not set, then the order is not valid\n */\n if (\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n Number(tpslOrder.quantity) < maxQty &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n return false;\n }\n\n return dirty > 0 && !!tpslOrder.quantity && !errors;\n }, [tpslOrder.quantity, maxQty, dirty, errors]);\n\n const isPositionTPSL = useMemo(() => {\n if (!isEditing) return Number(tpslOrder.quantity) >= maxQty;\n /**\n * if current order is not a POSITIONAL_TP_SL, then it's always a general TP/SL\n */\n if (!!order && order.algo_type !== AlgoOrderRootType.POSITIONAL_TP_SL) {\n return false;\n }\n if (tpslOrder.algo_order_id && tpslOrder.quantity == 0) return true;\n return Number(tpslOrder.quantity) >= maxQty;\n }, [tpslOrder.quantity, maxQty, order?.algo_type, isEditing]);\n\n useEffect(() => {\n if (!isEditing && isPositionTPSL) {\n const trigger_prices = utils.findTPSLFromOrder(order!);\n if (!tpslOrder.tp_trigger_price && trigger_prices.tp_trigger_price) {\n setOrderPrice(\"tp_trigger_price\", trigger_prices.tp_trigger_price);\n }\n if (!tpslOrder.sl_trigger_price && trigger_prices.sl_trigger_price) {\n setOrderPrice(\"sl_trigger_price\", trigger_prices.sl_trigger_price);\n }\n }\n }, [isEditing, isPositionTPSL, tpslOrder]);\n\n useEffect(() => {\n const type =\n Number(tpslOrder.quantity) < maxQty\n ? AlgoOrderRootType.TP_SL\n : AlgoOrderRootType.POSITIONAL_TP_SL;\n if (\n typeof options.onTPSLTypeChange === \"function\" &&\n prevTPSLType.current !== type\n ) {\n options.onTPSLTypeChange(type);\n }\n\n prevTPSLType.current = type;\n }, [tpslOrder.quantity, maxQty]);\n\n const cancel = (): Promise<void> => {\n if (order?.algo_order_id && order?.symbol) {\n return deleteOrder(order?.algo_order_id, order?.symbol);\n }\n return Promise.reject(\"order id or symbol is invalid\");\n };\n\n const onSubmit = async () => {\n return Promise.resolve()\n .then(() => {\n if (typeof options.onConfirm !== \"function\" || !needConfirm) {\n return submit().then(\n () => true,\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n return Promise.reject(false);\n }\n );\n }\n return options.onConfirm(tpslOrder, {\n position,\n submit,\n cancel,\n });\n })\n .then((isSuccess) => {\n console.log(\"result\", isSuccess);\n });\n };\n\n return {\n isEditing,\n symbolInfo: symbolInfo[symbol],\n maxQty,\n setQuantity,\n orderQuantity: tpslOrder.quantity,\n isPosition: isPositionTPSL,\n\n TPSL_OrderEntity: tpslOrder,\n setOrderValue: setValue,\n setPnL,\n setOrderPrice,\n // needConfirm,\n onSubmit,\n valid,\n errors,\n status: {\n isCreateMutating,\n isUpdateMutating,\n },\n } as const;\n};\n\nexport type TPSLBuilderState = ReturnType<typeof useTPSLBuilder>;\n","import { type AlgoOrderRootType } from \"@orderly.network/types\";\nimport { TPSL, TPSLProps } from \"./tpsl.ui\";\nimport { TPSLBuilderOptions, useTPSLBuilder } from \"./useTPSL.script\";\n\nexport type TPSLWidgetProps = {\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n} & TPSLBuilderOptions &\n TPSLProps;\n\nexport const TPSLWidget = (props: TPSLWidgetProps) => {\n const { onCancel, onComplete, ...rest } = props;\n const state = useTPSLBuilder(rest);\n\n return <TPSL {...state} onCancel={onCancel} onComplete={onComplete} />;\n};\n","import { useLocalStorage } from \"@orderly.network/hooks\";\nimport {\n Button,\n cn,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n} from \"@orderly.network/ui\";\nimport { ReactNode, useState } from \"react\";\nimport { TPSLWidget } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport { ButtonProps } from \"@orderly.network/ui\";\n\nexport const PositionTPSLPopover = (props: {\n position: API.Position;\n order?: API.AlgoOrder;\n label?: string;\n baseDP?: number;\n quoteDP?: number;\n /**\n * Button props\n */\n buttonProps?: ButtonProps;\n isEditing?: boolean;\n children?: ReactNode;\n}) => {\n const { position, order, baseDP, quoteDP, buttonProps, isEditing } = props;\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(true);\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n return (\n <PopoverRoot\n onOpenChange={(isOpen) => {\n // console.log(\"isOpen\", isOpen);\n if (visible) {\n setOpen(isOpen);\n }\n }}\n open={open}\n >\n <PopoverTrigger\n asChild\n onClick={() => {\n setOpen(true);\n }}\n >\n {props.children || (\n <Button\n variant=\"outlined\"\n size=\"sm\"\n color=\"secondary\"\n {...buttonProps}\n // onClick={() => {\n // setOpen(true);\n // }}\n >\n {props.label}\n </Button>\n )}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"oui-w-[360px]\",\n visible ? \"oui-visible\" : \"oui-invisible\"\n )}\n align=\"end\"\n side={\"top\"}\n >\n <TPSLWidget\n position={position}\n order={order}\n isEditing={isEditing}\n onComplete={() => {\n // console.log(\"tpsl order completed\");\n setOpen(false);\n }}\n onCancel={() => {\n setOpen(false);\n }}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n setVisible(false);\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n // console.log(\n // \"order\",\n // order,\n // isEditing ||\n // (!!order &&\n // order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n // order.quantity === maxQty)\n // );\n\n if (\n `${order.tp_trigger_price ?? \"\"}`.length === 0 &&\n `${order.sl_trigger_price ?? \"\"}`.length === 0\n ) {\n return modal\n .confirm({\n title: \"Cancel Order\",\n content: \"Are you sure you want to cancel this TP/SL order?\",\n onOk: () => {\n return options.cancel();\n },\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n // bodyClassName: \"lg:oui-py-0\",\n onOk: () => {\n return options.submit();\n },\n classNames: {\n body: \"!oui-pb-0\",\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={finalIsEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quoteDP ?? 2}\n baseDP={baseDP ?? 2}\n />\n ),\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n />\n </PopoverContent>\n </PopoverRoot>\n );\n};\n","import { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n modal,\n useModal,\n Text,\n Box,\n Badge,\n Divider,\n toast,\n} from \"@orderly.network/ui\";\nimport { TPSLWidget, TPSLWidgetProps } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useLocalStorage, useMarkPrice } from \"@orderly.network/hooks\";\n\ntype TPSLSheetProps = {\n position: API.Position;\n order?: API.AlgoOrder;\n // label: string;\n // baseDP?: number;\n // quoteDP?: number;\n symbolInfo: API.SymbolExt;\n isEditing?: boolean;\n};\n\nexport const PositionTPSLSheet = (props: TPSLWidgetProps & TPSLSheetProps) => {\n const { position, order, symbolInfo, isEditing } = props;\n const { resolve, hide, updateArgs } = useModal();\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n const updateSheetTitle = (title: string) => {\n if (isEditing) return;\n updateArgs({ title });\n };\n\n const onCompleted = () => {\n resolve();\n hide();\n };\n\n const { quote_dp, base_dp } = symbolInfo;\n\n return (\n <>\n <PositionInfo position={position} symbolInfo={symbolInfo} />\n\n <TPSLWidget\n {...props}\n onTPSLTypeChange={(type) => {\n updateSheetTitle(\n type === AlgoOrderRootType.TP_SL ? \"TP/SL\" : \"Position TP/SL\"\n );\n }}\n onComplete={onCompleted}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n bodyClassName: \"oui-pb-0 lg:oui-pb-0\",\n onOk: () => {\n return options.submit();\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={isEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quote_dp ?? 2}\n baseDP={base_dp ?? 2}\n />\n ),\n })\n .then(\n () => {\n // setOpen(false);\n // setVisible(true);\n return true;\n },\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n\n // setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n onCancel={() => {\n hide();\n }}\n />\n </>\n );\n};\n\nexport const TPSLSheetTitle = () => {\n const modal = useModal();\n\n const title = useMemo<string>(() => {\n return (modal.args?.title || \"TP/SL\") as string;\n }, [modal.args?.title]);\n\n return <span>{title}</span>;\n};\n\nexport const PositionInfo = (props: {\n position: API.Position;\n symbolInfo: API.SymbolExt;\n}) => {\n const { position, symbolInfo } = props;\n const { data: markPrice } = useMarkPrice(position.symbol);\n const modal = useModal();\n const isPositionTPSL = useMemo(() => {\n return modal.args?.title === \"Position TP/SL\";\n }, [modal.args?.title]);\n return (\n <>\n <Flex justify={\"between\"} pb={3} itemAlign={\"center\"}>\n <Text.formatted rule=\"symbol\" className=\"oui-text-xs\" showIcon>\n {position.symbol}\n </Text.formatted>\n <Flex gapX={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color=\"primary\">\n Position\n </Badge>\n )}\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n {position.position_qty < 0 ? (\n <Badge size=\"xs\" color=\"buy\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"sell\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider intensity={8} />\n <Box py={3} className=\"oui-space-y-1\">\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Avg. open\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {position.average_open_price}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Mark price\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {markPrice}\n </Text.numeral>\n </Flex>\n </Box>\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/tpsl.ui.tsx","../src/pnlInput/pnlInput.ui.tsx","../src/pnlInput/useBuilder.script.ts","../src/pnlInput/pnlInput.widget.tsx","../src/useTPSL.script.ts","../src/tpsl.widget.tsx","../src/editorPopover.tsx","../src/editorSheet.tsx"],"names":["useRef","useState","Badge","Box","Button","Divider","Flex","Grid","Input","Slider","Text","textVariants","cn","inputFormatter","Checkbox","convertValueToPercentage","ThrottledButton","CaretDownIcon","SimpleDropdownMenu","useMemo","useLocalStorage","Decimal","todpIfNeed","usePNLInputBuilder","props","type","values","mode","setMode","focus","setFocus","key","value","modes","percentageSuffix","onValueChange","formatter","options","dp","endStr","useEffect","Fragment","jsx","jsxs","PNLInput","onModeChange","quote","quote_dp","pnl","prefix","setPrefix","placeholder","setPlaceholder","color","num","PNLMenus","item","PnlInputWidget","testId","rest","state","utils","OrderSide","transSymbolformString","TPSL","TPSL_OrderEntity","symbolInfo","onCancel","onComplete","status","errors","isPosition","TPSLQuantity","TPSLPrice","inputRef","currentQtyPercentage","setTPSL","formatQuantity","qty","quantity","errorMsg","e","onPnLChange","PriceInput","PositionTPSLConfirm","symbol","tpPrice","slPrice","maxQty","side","quoteDP","baseDP","isEditing","_isPositionTPSL","needConfirm","setNeedConfirm","textClassName","isPositionTPSL","TPSLOrderType","check","useSymbolsInfo","useTPSLOrder","SDKError","AlgoOrderRootType","AlgoOrderType","toast","useTPSLBuilder","position","order","prevTPSLType","tpslOrder","submit","deleteOrder","setValue","validate","isCreateMutating","isUpdateMutating","setQuantity","setOrderPrice","name","setPnL","dirty","diff","tp","o","sl","valid","trigger_prices","cancel","onSubmit","reject","isSuccess","TPSLWidget","modal","PopoverContent","PopoverRoot","PopoverTrigger","PositionTPSLPopover","buttonProps","open","setOpen","visible","setVisible","isOpen","finalIsEditing","useModal","useMarkPrice","PositionTPSLSheet","resolve","hide","updateArgs","updateSheetTitle","title","onCompleted","base_dp","PositionInfo","markPrice"],"mappings":"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","sourcesContent":["import { useRef, useState } from \"react\";\nimport {\n Badge,\n Box,\n Button,\n Divider,\n Flex,\n Grid,\n Input,\n Slider,\n Text,\n textVariants,\n cn,\n inputFormatter,\n Checkbox,\n convertValueToPercentage,\n ThrottledButton,\n} from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { TPSLBuilderState } from \"./useTPSL.script\";\n\nimport type { PNL_Values } from \"./pnlInput/useBuilder.script\";\nimport { useLocalStorage, utils } from \"@orderly.network/hooks\";\nimport { API, OrderSide } from \"@orderly.network/types\";\nimport { transSymbolformString } from \"@orderly.network/utils\";\n\nexport type TPSLProps = {\n onCancel?: () => void;\n onComplete?: () => void;\n};\n\n//------------- TPSL form start ---------------\nexport const TPSL = (props: TPSLBuilderState & TPSLProps) => {\n const {\n TPSL_OrderEntity,\n symbolInfo,\n onCancel,\n onComplete,\n status,\n errors,\n isPosition,\n } = props;\n\n return (\n <div id=\"orderly-tp_sl-order-edit-content\">\n {(!props.isEditing || (props.isEditing && !props.isPosition)) && (\n <>\n <TPSLQuantity\n maxQty={props.maxQty}\n quantity={(props.orderQuantity ?? props.maxQty) as number}\n baseTick={symbolInfo(\"base_tick\")}\n dp={symbolInfo(\"base_dp\")}\n onQuantityChange={props.setQuantity}\n quote={symbolInfo(\"base\")}\n isEditing={props.isEditing}\n isPosition={isPosition}\n errorMsg={props.errors?.quantity?.message}\n />\n <Divider my={4} intensity={8} />\n </>\n )}\n\n <TPSLPrice\n sl_pnl={TPSL_OrderEntity.sl_pnl}\n tp_pnl={TPSL_OrderEntity.tp_pnl}\n quote={symbolInfo(\"quote\")}\n quote_dp={symbolInfo(\"quote_dp\")}\n onPriceChange={props.setOrderPrice}\n onPnLChange={props.setPnL}\n errors={errors}\n tp_values={{\n PnL: `${TPSL_OrderEntity.tp_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.tp_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.tp_offset_percentage ?? \"\"}`,\n }}\n sl_values={{\n PnL: `${TPSL_OrderEntity.sl_pnl ?? \"\"}`,\n Offset: `${TPSL_OrderEntity.sl_offset ?? \"\"}`,\n \"Offset%\": `${TPSL_OrderEntity.sl_offset_percentage ?? \"\"}`,\n }}\n tp_trigger_price={TPSL_OrderEntity.tp_trigger_price ?? \"\"}\n sl_trigger_price={TPSL_OrderEntity.sl_trigger_price ?? \"\"}\n />\n <Grid cols={2} gap={3} mt={4}>\n <Button\n size={\"md\"}\n color={\"secondary\"}\n data-testid={\"tpsl-cancel\"}\n onClick={() => {\n onCancel?.();\n }}\n >\n Cancel\n </Button>\n <ThrottledButton\n size={\"md\"}\n data-testid={\"tpsl-confirm\"}\n disabled={!props.valid || status.isCreateMutating}\n loading={status.isCreateMutating || status.isUpdateMutating}\n onClick={() => {\n props.onSubmit().then(\n () => {\n onComplete?.();\n },\n () => {\n console.log(\"--->>>cancel order\");\n }\n );\n }}\n >\n Confirm\n </ThrottledButton>\n </Grid>\n </div>\n );\n};\n\n//----------\n\n// ------------- Quantity input start------------\nconst TPSLQuantity = (props: {\n maxQty: number;\n baseTick: number;\n dp: number;\n quote: string;\n onQuantityChange?: (value: number | string) => void;\n quantity: number;\n isEditing?: boolean;\n isPosition?: boolean;\n setOrderValue?: (key: string, value: number | string) => void;\n errorMsg?: string;\n}) => {\n // const isPosition = props.quantity === props.maxQty;\n const { isPosition } = props;\n const inputRef = useRef<HTMLInputElement>(null);\n const currentQtyPercentage =\n convertValueToPercentage(props.quantity, 0, props.maxQty) / 100;\n\n const setTPSL = () => {\n props.onQuantityChange?.(0);\n inputRef.current?.focus();\n\n setTimeout(() => {\n inputRef.current?.setSelectionRange(0, 1);\n }, 0);\n };\n\n const formatQuantity = (qty: string) => {\n if (props.baseTick > 0) {\n const quantity = Number(qty);\n // if (quantity) {\n // props.onQuantityChange?.(Math.min(props.maxQty, quantity));\n // } else {\n props.onQuantityChange?.(utils.formatNumber(qty, props.baseTick) ?? qty);\n // }\n }\n };\n\n const errorMsg =\n (isPosition ? \"\" : props.quantity).toString().length > 0\n ? props.errorMsg\n : undefined;\n\n return (\n <>\n <Flex gap={2}>\n <div className={\"oui-flex-1\"}>\n <Input.tooltip\n data-testid=\"oui-testid-tpsl-popUp-quantity-input\"\n ref={inputRef}\n prefix={\"Quantity\"}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n align=\"right\"\n value={isPosition ? \"\" : props.quantity}\n autoComplete=\"off\"\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-bg-base-5 oui-outline-line-12\",\n errorMsg && \"oui-outline-danger\"\n ),\n }}\n tooltipProps={{\n content: {\n className: \"oui-bg-base-6 oui-text-base-contrast-80\",\n },\n arrow: {\n className: \"oui-fill-base-6\",\n },\n }}\n tooltip={errorMsg}\n color={errorMsg ? \"danger\" : undefined}\n formatters={[\n inputFormatter.dpFormatter(props.dp),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n const qty = Number(value);\n if (qty && qty > props.maxQty) {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n inputRef.current?.blur();\n }\n }}\n onBlur={(e) => formatQuantity(e.target.value)}\n suffix={\n isPosition ? (\n <button\n className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\"\n onClick={() => {\n setTPSL();\n }}\n >\n Entire position\n </button>\n ) : (\n <span className=\"oui-text-2xs oui-text-base-contrast-54 oui-px-3\">\n {props.quote}\n </span>\n )\n }\n />\n </div>\n {!props.isEditing && (\n <Button\n onClick={() => {\n const qty = isPosition ? 0 : props.maxQty;\n props.onQuantityChange?.(qty);\n if (qty === 0) {\n setTPSL();\n }\n }}\n variant={\"outlined\"}\n // size={{\n // lg: \"md\",\n // md: \"lg\",\n // }}\n className={cn(\n \"oui-text-2xs oui-w-[68px] oui-h-[40px] xl:oui-h-[32px]\",\n isPosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-bg-base-6 oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5\"\n )}\n >\n Position\n </Button>\n )}\n </Flex>\n <Flex mt={2} itemAlign={\"center\"} height={\"15px\"}>\n <Slider.single\n markCount={5}\n color=\"primary\"\n max={props.maxQty}\n min={0}\n showTip\n step={props.baseTick}\n value={props.quantity}\n onValueCommit={(value) => {\n formatQuantity(`${value}`);\n }}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\n />\n </Flex>\n <Flex justify={\"between\"}>\n <Text.numeral rule={\"percentages\"} color={\"primary\"} size={\"2xs\"}>\n {currentQtyPercentage}\n </Text.numeral>\n <Flex itemAlign={\"center\"} gap={1}>\n <button\n className={\"oui-leading-none\"}\n style={{ lineHeight: 0 }}\n onClick={() => {\n props.onQuantityChange?.(props.maxQty);\n }}\n >\n <Text color={\"primary\"} size={\"2xs\"}>\n Max\n </Text>\n </button>\n <Text.numeral\n rule={\"price\"}\n size={\"2xs\"}\n intensity={54}\n tick={props.baseTick}\n >\n {props.maxQty}\n </Text.numeral>\n </Flex>\n </Flex>\n </>\n );\n};\n// ------------- Quantity input end------------\n\n// ------------ TP/SL Price and PNL input start------------\nconst TPSLPrice = (props: {\n tp_pnl?: number;\n sl_pnl?: number;\n quote: string;\n quote_dp?: number;\n onPriceChange: TPSLBuilderState[\"setOrderPrice\"];\n onPnLChange: TPSLBuilderState[\"setPnL\"];\n tp_values: PNL_Values;\n sl_values: PNL_Values;\n tp_trigger_price?: number | string;\n sl_trigger_price?: number | string;\n errors: Record<string, { message: string }> | null;\n}) => {\n const onPnLChange = (key: string, value: number | string) => {\n // console.log(key, value);\n props.onPnLChange(key, value);\n };\n return (\n <>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"} intensity={80}>\n Take profit <Text intensity={36}>(market order)</Text>\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.tp_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"TP\"}\n value={props.tp_trigger_price}\n error={props.errors?.tp_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"tp_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"TP\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.tp_values}\n />\n </Grid>\n </div>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"} intensity={80}>\n Stop loss <Text intensity={36}>(market order)</Text>\n </Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral\n size={\"2xs\"}\n coloring\n showIdentifier\n className=\"oui-ml-1\"\n >\n {props.sl_pnl ?? \"-\"}\n </Text.numeral>\n </Flex>\n </Flex>\n <Grid cols={2} gap={2} pt={2} pb={4}>\n <PriceInput\n type={\"SL\"}\n value={props.sl_trigger_price}\n error={props.errors?.sl_trigger_price?.message}\n onValueChange={(value) => {\n props.onPriceChange(\"sl_trigger_price\", value);\n }}\n quote_dp={props.quote_dp ?? 2}\n />\n <PnlInputWidget\n type={\"SL\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_dp}\n values={props.sl_values}\n />\n </Grid>\n </div>\n </>\n );\n};\n// ------------ TP/SL Price and PNL input end------------\n// ------------ TP/SL Price input start------------\nconst PriceInput = (props: {\n type: string;\n value?: string | number;\n error?: string;\n onValueChange: (value: string) => void;\n quote_dp: number;\n}) => {\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n return (\n <Input.tooltip\n data-testid={`oui-testid-tpsl-popUp-${props.type.toLowerCase()}-input`}\n prefix={`${props.type} price`}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n tooltip={props.error}\n placeholder={placeholder}\n align={\"right\"}\n autoComplete={\"off\"}\n value={props.value}\n color={props.error ? \"danger\" : undefined}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onValueChange={props.onValueChange}\n onFocus={() => {\n setPlaceholder(\"\");\n }}\n onBlur={() => {\n setPlaceholder(\"USDC\");\n }}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp),\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n />\n );\n};\n\nexport type PositionTPSLConfirmProps = {\n symbol: string;\n // isPosition: boolean;\n qty: number;\n tpPrice?: number;\n slPrice?: number;\n maxQty: number;\n side: OrderSide;\n // symbolConfig:API.SymbolExt\n baseDP: number;\n quoteDP: number;\n isEditing?: boolean;\n isPositionTPSL?: boolean;\n};\n\n// ------------ Position TP/SL Confirm dialog start------------\nexport const PositionTPSLConfirm = (props: PositionTPSLConfirmProps) => {\n const {\n symbol,\n tpPrice,\n slPrice,\n qty,\n maxQty,\n side,\n quoteDP,\n baseDP,\n isEditing,\n isPositionTPSL: _isPositionTPSL,\n } = props;\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n const textClassName = textVariants({\n size: \"xs\",\n intensity: 54,\n });\n\n // console.log(\"PositionTPSLConfirm\", qty, maxQty, quoteDP);\n\n const isPositionTPSL = _isPositionTPSL ?? qty >= maxQty;\n\n return (\n <>\n {isEditing && (\n <Text\n as=\"div\"\n size=\"2xs\"\n intensity={80}\n className=\"oui-mb-3\"\n >{`You agree to edit your ${transSymbolformString(\n symbol\n )} order.`}</Text>\n )}\n\n <Flex pb={4}>\n <Box grow>\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n as=\"div\"\n intensity={80}\n >\n {symbol}\n </Text.formatted>\n </Box>\n <Flex gap={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color={\"primary\"}>\n Position\n </Badge>\n )}\n\n {/* <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge> */}\n <TPSLOrderType tpPrice={tpPrice} slPrice={slPrice} />\n {side === OrderSide.SELL ? (\n <Badge size=\"xs\" color=\"success\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"danger\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider />\n <Flex\n direction={\"column\"}\n itemAlign={\"stretch\"}\n gapY={1}\n pt={4}\n // pb={5}\n className={cn(textClassName, \"oui-pb-4 xl:oui-pb-5\")}\n >\n <Flex>\n <Box grow>Qty.</Box>\n\n <div>\n {isPositionTPSL ? (\n <span className=\"oui-text-base-contrast\">Entire position</span>\n ) : (\n <Text.numeral intensity={98} dp={baseDP} padding={false}>\n {qty}\n </Text.numeral>\n )}\n </div>\n </Flex>\n {typeof tpPrice === \"number\" && tpPrice > 0 ? (\n <Flex>\n <Box grow>TP Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {tpPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n {typeof slPrice === \"number\" && slPrice > 0 ? (\n <Flex>\n <Box grow>SL Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n dp={quoteDP}\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n {slPrice}\n </Text.numeral>\n </Flex>\n ) : null}\n\n <Flex>\n <Box grow>Price</Box>\n <div className=\"oui-text-base-contrast\">Market</div>\n </Flex>\n </Flex>\n <Box pt={2}>\n <Flex gap={1}>\n <Checkbox\n id=\"disabledConfirm\"\n color=\"white\"\n checked={!needConfirm}\n onCheckedChange={(check) => {\n setNeedConfirm(!check);\n }}\n />\n <label\n htmlFor=\"disabledConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n className: \"oui-ml-1\",\n })}\n >\n Disable order confirmation\n </label>\n </Flex>\n </Box>\n </>\n );\n};\n\n//------------- Position TP/SL Confirm dialog end------------\n\nconst TPSLOrderType = (props: { tpPrice?: number; slPrice?: number }) => {\n const { tpPrice, slPrice } = props;\n if (!!tpPrice && !!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n );\n }\n\n if (!!tpPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n TP\n </Badge>\n );\n }\n\n if (!!slPrice) {\n return (\n <Badge size=\"xs\" color=\"neutral\">\n SL\n </Badge>\n );\n }\n\n return null;\n};\n","import {\n CaretDownIcon,\n cn,\n Input,\n MenuItem,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter, Text } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & { testId?: string; quote: string };\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n pnl,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n const color = useMemo(() => {\n const num = Number(pnl);\n\n if (isNaN(num) || num === 0) return \"\";\n\n if (num > 0) return \"oui-text-trade-profit\";\n if (num < 0) return \"oui-text-trade-loss\";\n }, [pnl]);\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n \n\n return (\n <Input\n prefix={mode}\n size={{\n initial: \"lg\",\n lg: \"md\",\n }}\n placeholder={placeholder}\n align={\"right\"}\n value={value}\n data-testid={props.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n // inputFormatter.numberFormatter,\n props.formatter({ dp: quote_dp, mode }),\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n // className={color}\n classNames={{\n input: color,\n prefix: \"oui-text-base-contrast-54\",\n root: \"oui-outline-line-12 focus-within:oui-outline-primary-light\",\n }}\n onFocus={() => {\n setPlaceholder(\"\");\n props.setFocus(true);\n }}\n onBlur={() => {\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n props.setFocus(false);\n }}\n // value={props.value}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className={cn(\"oui-ml-[2px]\", color)}>\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n};\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: string, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n\n const [focus, setFocus] = useState(true);\n const key = useMemo(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset`;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage`;\n default:\n return `${type.toLowerCase()}_pnl`;\n }\n }, [mode]);\n\n const value = useMemo(() => {\n return values[mode as keyof PNL_Values];\n }, [values]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n console.log(\"onValueChange\", value);\n props.onChange(key, value);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions\n ) => {\n value = `${value}`; // convert to string\n\n if (focus) {\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\"\n )\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n if (mode === PnLMode.PERCENTAGE) {\n // console.log(\"value\", value);\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else if (mode === PnLMode.PnL && type === \"SL\" && focus) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n // return {\n // onRenderBefore: (\n // value: string | number,\n // options: InputFormatterOptions\n // ) => {\n // // console.log(\"???\", options);\n // const { isFocused } = options;\n // value = `${value}`;\n // if (value === \"\" || value === \"-\") return \"\";\n\n // // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (isFocused) {\n // // value = value.startsWith(\"-\") ? value : \"-\" + value;\n // // }\n // // }\n\n // if (mode === PnLMode.PERCENTAGE) {\n // return `${todpIfNeed(new Decimal(value).mul(100).toString(), 2)}${\n // percentageSuffix.current\n // }`;\n // // return (Number(value) * 100).toFixed(2);\n // } else if (mode === PnLMode.OFFSET) {\n // value = todpIfNeed(value, 2);\n // } else {\n // // value = new Decimal(value).todp(2).toString();\n // }\n\n // return value;\n // },\n // onSendBefore: (value: string, options: InputFormatterOptions) => {\n // const { isFocused } = options;\n\n // if (mode === PnLMode.PERCENTAGE) {\n // if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n // value = new Decimal(value).div(100).toString();\n // value = todpIfNeed(value, 4);\n // }\n // } else {\n // // value = todpIfNeed(value, quote_dp);\n // if (isFocused) {\n // if (type === \"SL\" && mode === PnLMode.PnL) {\n // // if (\n // // typeof values[PnLMode.PnL] !== \"undefined\" &&\n // // values[PnLMode.PnL] !== \"\"\n // // )\n // // return value;\n // const num = Number(value);\n // if (!isNaN(num) && num !== 0) {\n // value = (Math.abs(num) * -1).toString();\n // } else {\n // value = \"\";\n // }\n // }\n // }\n // }\n\n // return value;\n // },\n // };\n };\n\n return {\n mode,\n modes,\n type: props.type,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n value,\n pnl: values[PnLMode.PnL],\n onValueChange,\n quote_dp: props.quote_dp,\n setFocus,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testId?: string;\n quote: string;\n }\n) => {\n const { testId, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return <PNLInput {...state} testId={testId} quote={quote} />;\n};\n","import {\n type ComputedAlgoOrder,\n useLocalStorage,\n useSymbolsInfo,\n useTPSLOrder,\n utils,\n} from \"@orderly.network/hooks\";\nimport { SDKError } from \"@orderly.network/types\";\nimport { AlgoOrderRootType, AlgoOrderType, API } from \"@orderly.network/types\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nexport type TPSLBuilderOptions = {\n position: API.Position;\n order?: API.AlgoOrder;\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n isEditing?: boolean;\n /**\n * either show the confirm dialog or not,\n * if the Promise reject or return false, cancel the submit action\n */\n onConfirm?: (\n order: ComputedAlgoOrder,\n options: {\n position: API.Position;\n submit: () => Promise<any>;\n cancel: () => Promise<any>;\n }\n ) => Promise<boolean>;\n};\n\nexport const useTPSLBuilder = (options: TPSLBuilderOptions) => {\n const { position, order, isEditing } = options;\n // const isEditing = !!order;\n if (isEditing && !order) {\n throw new SDKError(\"order is required when isEditing is true\");\n }\n const symbol = isEditing ? order!.symbol : position.symbol;\n const symbolInfo = useSymbolsInfo();\n const prevTPSLType = useRef<AlgoOrderRootType>(AlgoOrderRootType.TP_SL);\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const [\n tpslOrder,\n {\n submit,\n deleteOrder,\n setValue,\n validate,\n errors,\n isCreateMutating,\n isUpdateMutating,\n },\n ] = useTPSLOrder(\n {\n symbol,\n position_qty: position.position_qty,\n average_open_price: position.average_open_price,\n },\n {\n defaultOrder: order,\n isEditing,\n }\n );\n\n const setQuantity = (value: number | string) => {\n setValue(\"quantity\", value);\n };\n\n const setOrderPrice = (\n name: \"tp_trigger_price\" | \"sl_trigger_price\",\n value: number | string\n ) => {\n setValue(name, value);\n };\n\n const setPnL = (type: string, value: number | string) => {\n setValue(type, value);\n };\n\n const maxQty = useMemo(\n () => Math.abs(Number(position.position_qty)),\n [position.position_qty]\n );\n\n const dirty = useMemo(() => {\n const quantity =\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? maxQty\n : order?.quantity;\n\n let diff: number = 0;\n\n if (Number(tpslOrder.quantity) !== quantity) {\n diff = 1;\n } else if (!isEditing && !!tpslOrder.quantity) {\n diff = 1;\n }\n\n if (order && isEditing) {\n const tp = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.TAKE_PROFIT\n );\n const sl = order.child_orders.find(\n (o) => o.algo_type === AlgoOrderType.STOP_LOSS\n );\n\n if (\n tp?.trigger_price !== Number(tpslOrder.tp_trigger_price) &&\n typeof typeof tpslOrder.tp_trigger_price !== \"undefined\"\n ) {\n // return true;\n diff = 2;\n }\n\n if (\n sl?.trigger_price !== Number(tpslOrder.sl_trigger_price) &&\n typeof tpslOrder.sl_trigger_price !== \"undefined\"\n ) {\n diff = 3;\n }\n }\n\n if (\n diff === 1 &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n diff = -1;\n }\n\n return diff;\n }, [\n tpslOrder.tp_trigger_price,\n tpslOrder.sl_trigger_price,\n tpslOrder.quantity,\n order,\n isEditing,\n ]);\n\n const valid = useMemo(() => {\n /**\n * if the order is a POSITIONAL_TP_SL and the quantity is less than the maxQty,\n * and the tp/sl trigger price is not set, then the order is not valid\n */\n if (\n order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n Number(tpslOrder.quantity) < maxQty &&\n !tpslOrder.tp_trigger_price &&\n !tpslOrder.sl_trigger_price\n ) {\n return false;\n }\n\n return dirty > 0 && !!tpslOrder.quantity && !errors;\n }, [tpslOrder.quantity, maxQty, dirty, errors]);\n\n const isPositionTPSL = useMemo(() => {\n if (!isEditing) return Number(tpslOrder.quantity) >= maxQty;\n /**\n * if current order is not a POSITIONAL_TP_SL, then it's always a general TP/SL\n */\n if (!!order && order.algo_type !== AlgoOrderRootType.POSITIONAL_TP_SL) {\n return false;\n }\n if (tpslOrder.algo_order_id && tpslOrder.quantity == 0) return true;\n return Number(tpslOrder.quantity) >= maxQty;\n }, [tpslOrder.quantity, maxQty, order?.algo_type, isEditing]);\n\n useEffect(() => {\n if (!isEditing && isPositionTPSL) {\n const trigger_prices = utils.findTPSLFromOrder(order!);\n if (!tpslOrder.tp_trigger_price && trigger_prices.tp_trigger_price) {\n setOrderPrice(\"tp_trigger_price\", trigger_prices.tp_trigger_price);\n }\n if (!tpslOrder.sl_trigger_price && trigger_prices.sl_trigger_price) {\n setOrderPrice(\"sl_trigger_price\", trigger_prices.sl_trigger_price);\n }\n }\n }, [isEditing, isPositionTPSL, tpslOrder]);\n\n useEffect(() => {\n const type =\n Number(tpslOrder.quantity) < maxQty\n ? AlgoOrderRootType.TP_SL\n : AlgoOrderRootType.POSITIONAL_TP_SL;\n if (\n typeof options.onTPSLTypeChange === \"function\" &&\n prevTPSLType.current !== type\n ) {\n options.onTPSLTypeChange(type);\n }\n\n prevTPSLType.current = type;\n }, [tpslOrder.quantity, maxQty]);\n\n const cancel = (): Promise<void> => {\n if (order?.algo_order_id && order?.symbol) {\n return deleteOrder(order?.algo_order_id, order?.symbol);\n }\n return Promise.reject(\"order id or symbol is invalid\");\n };\n\n const onSubmit = async () => {\n return Promise.resolve()\n .then(() => {\n if (typeof options.onConfirm !== \"function\" || !needConfirm) {\n return submit().then(\n () => true,\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n return Promise.reject(false);\n }\n );\n }\n return options.onConfirm(tpslOrder, {\n position,\n submit,\n cancel,\n });\n })\n .then((isSuccess) => {\n console.log(\"result\", isSuccess);\n });\n };\n\n return {\n isEditing,\n symbolInfo: symbolInfo[symbol],\n maxQty,\n setQuantity,\n orderQuantity: tpslOrder.quantity,\n isPosition: isPositionTPSL,\n\n TPSL_OrderEntity: tpslOrder,\n setOrderValue: setValue,\n setPnL,\n setOrderPrice,\n // needConfirm,\n onSubmit,\n valid,\n errors,\n status: {\n isCreateMutating,\n isUpdateMutating,\n },\n } as const;\n};\n\nexport type TPSLBuilderState = ReturnType<typeof useTPSLBuilder>;\n","import { type AlgoOrderRootType } from \"@orderly.network/types\";\nimport { TPSL, TPSLProps } from \"./tpsl.ui\";\nimport { TPSLBuilderOptions, useTPSLBuilder } from \"./useTPSL.script\";\n\nexport type TPSLWidgetProps = {\n onTPSLTypeChange?: (type: AlgoOrderRootType) => void;\n} & TPSLBuilderOptions &\n TPSLProps;\n\nexport const TPSLWidget = (props: TPSLWidgetProps) => {\n const { onCancel, onComplete, ...rest } = props;\n const state = useTPSLBuilder(rest);\n\n return <TPSL {...state} onCancel={onCancel} onComplete={onComplete} />;\n};\n","import { useLocalStorage } from \"@orderly.network/hooks\";\nimport {\n Button,\n cn,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n} from \"@orderly.network/ui\";\nimport { ReactNode, useState } from \"react\";\nimport { TPSLWidget } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport { ButtonProps } from \"@orderly.network/ui\";\n\nexport const PositionTPSLPopover = (props: {\n position: API.Position;\n order?: API.AlgoOrder;\n label?: string;\n baseDP?: number;\n quoteDP?: number;\n /**\n * Button props\n */\n buttonProps?: ButtonProps;\n isEditing?: boolean;\n children?: ReactNode;\n}) => {\n const { position, order, baseDP, quoteDP, buttonProps, isEditing } = props;\n const [open, setOpen] = useState(false);\n const [visible, setVisible] = useState(true);\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n return (\n <PopoverRoot\n onOpenChange={(isOpen) => {\n // console.log(\"isOpen\", isOpen);\n if (visible) {\n setOpen(isOpen);\n }\n }}\n open={open}\n >\n <PopoverTrigger\n asChild\n onClick={() => {\n setOpen(true);\n }}\n >\n {props.children || (\n <Button\n variant=\"outlined\"\n size=\"sm\"\n color=\"secondary\"\n {...buttonProps}\n // onClick={() => {\n // setOpen(true);\n // }}\n >\n {props.label}\n </Button>\n )}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"oui-w-[360px]\",\n visible ? \"oui-visible\" : \"oui-invisible\"\n )}\n align=\"end\"\n side={\"top\"}\n >\n <TPSLWidget\n position={position}\n order={order}\n isEditing={isEditing}\n onComplete={() => {\n // console.log(\"tpsl order completed\");\n setOpen(false);\n }}\n onCancel={() => {\n setOpen(false);\n }}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n setVisible(false);\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n // console.log(\n // \"order\",\n // order,\n // isEditing ||\n // (!!order &&\n // order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n // order.quantity === maxQty)\n // );\n\n if (\n `${order.tp_trigger_price ?? \"\"}`.length === 0 &&\n `${order.sl_trigger_price ?? \"\"}`.length === 0\n ) {\n return modal\n .confirm({\n title: \"Cancel Order\",\n content: \"Are you sure you want to cancel this TP/SL order?\",\n onOk: () => {\n return options.cancel();\n },\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n // bodyClassName: \"lg:oui-py-0\",\n onOk: () => {\n return options.submit();\n },\n classNames: {\n body: \"!oui-pb-0\",\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={finalIsEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quoteDP ?? 2}\n baseDP={baseDP ?? 2}\n />\n ),\n })\n .then(\n () => {\n setOpen(false);\n setVisible(true);\n return true;\n },\n () => {\n setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n />\n </PopoverContent>\n </PopoverRoot>\n );\n};\n","import { AlgoOrderRootType, API } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n modal,\n useModal,\n Text,\n Box,\n Badge,\n Divider,\n toast,\n} from \"@orderly.network/ui\";\nimport { TPSLWidget, TPSLWidgetProps } from \"./tpsl.widget\";\nimport { PositionTPSLConfirm } from \"./tpsl.ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useLocalStorage, useMarkPrice } from \"@orderly.network/hooks\";\n\ntype TPSLSheetProps = {\n position: API.Position;\n order?: API.AlgoOrder;\n // label: string;\n // baseDP?: number;\n // quoteDP?: number;\n symbolInfo: API.SymbolExt;\n isEditing?: boolean;\n};\n\nexport const PositionTPSLSheet = (props: TPSLWidgetProps & TPSLSheetProps) => {\n const { position, order, symbolInfo, isEditing } = props;\n const { resolve, hide, updateArgs } = useModal();\n\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const isPositionTPSL = isEditing\n ? order?.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n : undefined;\n\n const updateSheetTitle = (title: string) => {\n if (isEditing) return;\n updateArgs({ title });\n };\n\n const onCompleted = () => {\n resolve();\n hide();\n };\n\n const { quote_dp, base_dp } = symbolInfo;\n\n return (\n <>\n <PositionInfo position={position} symbolInfo={symbolInfo} />\n\n <TPSLWidget\n {...props}\n onTPSLTypeChange={(type) => {\n updateSheetTitle(\n type === AlgoOrderRootType.TP_SL ? \"TP/SL\" : \"Position TP/SL\"\n );\n }}\n onComplete={onCompleted}\n onConfirm={(order, options) => {\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n const maxQty = Math.abs(Number(position.position_qty));\n\n const finalIsEditing =\n isEditing ||\n (!!order &&\n order.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL &&\n order.quantity === maxQty);\n\n return modal\n .confirm({\n title: finalIsEditing ? \"Edit Order\" : \"Confirm Order\",\n bodyClassName: \"oui-pb-0 lg:oui-pb-0\",\n onOk: () => {\n return options.submit();\n },\n content: (\n <PositionTPSLConfirm\n isPositionTPSL={isPositionTPSL}\n isEditing={isEditing}\n symbol={order.symbol!}\n qty={Number(order.quantity)}\n maxQty={maxQty}\n tpPrice={Number(order.tp_trigger_price)}\n slPrice={Number(order.sl_trigger_price)}\n side={order.side!}\n quoteDP={quote_dp ?? 2}\n baseDP={base_dp ?? 2}\n />\n ),\n })\n .then(\n () => {\n // setOpen(false);\n // setVisible(true);\n return true;\n },\n (reject) => {\n if (reject?.message) {\n toast.error(reject.message);\n }\n\n // setVisible(true);\n return Promise.reject(false);\n }\n );\n }}\n onCancel={() => {\n hide();\n }}\n />\n </>\n );\n};\n\nexport const TPSLSheetTitle = () => {\n const modal = useModal();\n\n const title = useMemo<string>(() => {\n return (modal.args?.title || \"TP/SL\") as string;\n }, [modal.args?.title]);\n\n return <span>{title}</span>;\n};\n\nexport const PositionInfo = (props: {\n position: API.Position;\n symbolInfo: API.SymbolExt;\n}) => {\n const { position, symbolInfo } = props;\n const { data: markPrice } = useMarkPrice(position.symbol);\n const modal = useModal();\n const isPositionTPSL = useMemo(() => {\n return modal.args?.title === \"Position TP/SL\";\n }, [modal.args?.title]);\n return (\n <>\n <Flex justify={\"between\"} pb={3} itemAlign={\"center\"}>\n <Text.formatted rule=\"symbol\" className=\"oui-text-xs\" showIcon>\n {position.symbol}\n </Text.formatted>\n <Flex gapX={1}>\n {isPositionTPSL && (\n <Badge size=\"xs\" color=\"primary\">\n Position\n </Badge>\n )}\n <Badge size=\"xs\" color=\"neutral\">\n TP/SL\n </Badge>\n {position.position_qty < 0 ? (\n <Badge size=\"xs\" color=\"buy\">\n Buy\n </Badge>\n ) : (\n <Badge size=\"xs\" color=\"sell\">\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider intensity={8} />\n <Box py={3} className=\"oui-space-y-1\">\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Avg. open\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {position.average_open_price}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size=\"sm\" intensity={54}>\n Mark price\n </Text>\n <Text.numeral\n className=\"oui-text-xs\"\n unit={symbolInfo.quote}\n dp={symbolInfo.quote_dp}\n unitClassName=\"oui-ml-1 oui-text-base-contrast-36\"\n >\n {markPrice}\n </Text.numeral>\n </Flex>\n </Box>\n </>\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/ui-tpsl",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
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/ui": "2.0.1",
21
- "@orderly.network/types": "2.0.1",
22
- "@orderly.network/hooks": "2.0.1",
23
- "@orderly.network/utils": "2.0.1"
20
+ "@orderly.network/ui": "2.0.2",
21
+ "@orderly.network/types": "2.0.2",
22
+ "@orderly.network/utils": "2.0.2",
23
+ "@orderly.network/hooks": "2.0.2"
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.17"
33
+ "tsconfig": "0.3.18"
34
34
  },
35
35
  "scripts": {
36
36
  "build": "tsup && pnpm run build:css",