@orderly.network/ui-positions 2.0.0-alpha.1

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.
@@ -0,0 +1,42 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { SharePnLConfig, SharePnLParams } from '@orderly.network/ui-share';
3
+ import { API } from '@orderly.network/types';
4
+
5
+ type PositionsProps = {
6
+ pnlNotionalDecimalPrecision?: number;
7
+ sharePnLConfig?: SharePnLConfig & Partial<Omit<SharePnLParams, "position" | "refCode" | "leverage">>;
8
+ };
9
+
10
+ declare const PositionsWidget: (props: PositionsProps) => react_jsx_runtime.JSX.Element;
11
+
12
+ type TPSLBuilderOptions = {
13
+ position: API.Position;
14
+ order?: API.AlgoOrder;
15
+ /**
16
+ * either show the confirm dialog or not,
17
+ * if the Promise reject or return false, cancel the sumbit action
18
+ */
19
+ onConfirm?: () => Promise<boolean>;
20
+ };
21
+
22
+ type TPSLProps = {
23
+ onCancel?: () => void;
24
+ onComplete?: () => void;
25
+ };
26
+ type PositionTPSLConfirmProps = {
27
+ symbol: string;
28
+ isPosition: boolean;
29
+ qty: number;
30
+ tpPrice?: number;
31
+ slPrice?: number;
32
+ };
33
+ declare const PositionTPSLConfirm: (props: PositionTPSLConfirmProps) => react_jsx_runtime.JSX.Element;
34
+
35
+ type TPSLWidgetProps = {} & TPSLBuilderOptions & TPSLProps;
36
+ declare const TPSLWidget: (props: TPSLWidgetProps) => react_jsx_runtime.JSX.Element;
37
+
38
+ declare const TPSLEditorWidget: (props: TPSLWidgetProps) => react_jsx_runtime.JSX.Element;
39
+
40
+ declare const MarketCloseConfirmID = "MarketCloseConfirmID";
41
+
42
+ export { MarketCloseConfirmID, PositionTPSLConfirm, type PositionsProps, PositionsWidget, TPSLEditorWidget, TPSLWidget };
@@ -0,0 +1,42 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { SharePnLConfig, SharePnLParams } from '@orderly.network/ui-share';
3
+ import { API } from '@orderly.network/types';
4
+
5
+ type PositionsProps = {
6
+ pnlNotionalDecimalPrecision?: number;
7
+ sharePnLConfig?: SharePnLConfig & Partial<Omit<SharePnLParams, "position" | "refCode" | "leverage">>;
8
+ };
9
+
10
+ declare const PositionsWidget: (props: PositionsProps) => react_jsx_runtime.JSX.Element;
11
+
12
+ type TPSLBuilderOptions = {
13
+ position: API.Position;
14
+ order?: API.AlgoOrder;
15
+ /**
16
+ * either show the confirm dialog or not,
17
+ * if the Promise reject or return false, cancel the sumbit action
18
+ */
19
+ onConfirm?: () => Promise<boolean>;
20
+ };
21
+
22
+ type TPSLProps = {
23
+ onCancel?: () => void;
24
+ onComplete?: () => void;
25
+ };
26
+ type PositionTPSLConfirmProps = {
27
+ symbol: string;
28
+ isPosition: boolean;
29
+ qty: number;
30
+ tpPrice?: number;
31
+ slPrice?: number;
32
+ };
33
+ declare const PositionTPSLConfirm: (props: PositionTPSLConfirmProps) => react_jsx_runtime.JSX.Element;
34
+
35
+ type TPSLWidgetProps = {} & TPSLBuilderOptions & TPSLProps;
36
+ declare const TPSLWidget: (props: TPSLWidgetProps) => react_jsx_runtime.JSX.Element;
37
+
38
+ declare const TPSLEditorWidget: (props: TPSLWidgetProps) => react_jsx_runtime.JSX.Element;
39
+
40
+ declare const MarketCloseConfirmID = "MarketCloseConfirmID";
41
+
42
+ export { MarketCloseConfirmID, PositionTPSLConfirm, type PositionsProps, PositionsWidget, TPSLEditorWidget, TPSLWidget };
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var ui = require('@orderly.network/ui');
4
+ var types = require('@orderly.network/types');
5
+ var react = require('react');
6
+ var hooks = require('@orderly.network/hooks');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var utils = require('@orderly.network/utils');
9
+ var uiShare = require('@orderly.network/ui-share');
10
+
11
+ var fe=react.createContext({}),O=()=>react.useContext(fe),Pe=e=>{let[t,o]=react.useState(Math.abs(e.position.position_qty).toString());react.useEffect(()=>{o(Math.abs(e.position.position_qty).toString());},[e.position.position_qty]);let[i,r]=react.useState(""),[s,a]=react.useState(e.position.position_qty>0?types.OrderSide.SELL:types.OrderSide.BUY),[u,l]=react.useState(types.OrderType.MARKET),x=hooks.useSymbolsInfo(),F=e.position.symbol,m=x?.[F],y=m("quote_dp"),p=m("base_dp"),{helper:g,onSubmit:k,submitting:$}=hooks.useOrderEntry(e.position?.symbol,s,!0),U=(S,I)=>{if(l(S),S===types.OrderType.LIMIT){if(!I)throw new Error("price is required");r(I);}else r("");},b=react.useMemo(()=>{let{position:S}=e;if(!S)return null;let I={order_quantity:t,symbol:e.position.symbol,order_type:u,side:s,reduce_only:!0};return u===types.OrderType.LIMIT&&(I.order_price=i),I},[e.position,i,u,t]),C=S=>{let I=g.calculate({},"order_quantity",S);o(I.order_quantity);},G=S=>{let I=g.calculate({},"order_price",S);r(I.order_price);},K=()=>k(b);return jsxRuntime.jsx(fe.Provider,{value:{quantity:t,price:i,type:u,side:s,position:e.position,updatePriceChange:G,updateQuantity:C,updateOrderType:U,tpslOrder:e.position.algo_order,onSubmit:K,submitting:$,closeOrderData:b,quoteDp:y,baseDp:p},children:e.children})};var ge=react.createContext({}),ye=()=>react.useContext(ge),xe=e=>{let t=hooks.useSymbolsInfo()[e.symbol];return jsxRuntime.jsx(ge.Provider,{value:{base_dp:t("base_dp"),quote_dp:t("quote_dp"),base_tick:t("base_tick"),base:t("base"),quote:t("quote"),symbol:e.symbol},children:e.children})};var Te=()=>{let[e,t]=react.useState(!1),{onSubmit:o,price:i,quantity:r,closeOrderData:s,type:a,submitting:u,quoteDp:l}=O(),{base:x,quote:F}=ye(),m=()=>o().then(g=>{t(!1);},g=>{typeof g=="string"?ui.toast.error(g):ui.toast.error(g.message);}),y=()=>{t(!1);},p=react.useMemo(()=>a===types.OrderType.MARKET?!r:!i||!r,[i,r,a]);return jsxRuntime.jsx(ui.Popover,{open:e,onOpenChange:t,contentProps:{className:"oui-w-[360px] oui-px-5 oui-rounded-xl"},content:a===types.OrderType.MARKET?jsxRuntime.jsx(X,{base:x,quantity:r,onClose:y,onConfirm:m,submitting:u}):jsxRuntime.jsx(Lt,{base:x,quantity:r,price:i,onClose:y,onConfirm:m,submitting:u,quoteDp:l,order:s}),children:jsxRuntime.jsx(ui.Button,{variant:"outlined",size:"sm",color:"secondary",disabled:p,onClick:g=>{g.stopPropagation();},children:"Close"})})},Le=e=>jsxRuntime.jsxs("div",{className:"oui-pb-3 oui-border-b oui-border-line-4 oui-relative oui-w-full",children:[jsxRuntime.jsx(ui.Text,{size:"base",children:e.title}),jsxRuntime.jsx("button",{onClick:e.onClose,className:"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-54 hover:oui-text-base-contrast-80 oui-p-2",children:jsxRuntime.jsx(ui.CloseIcon,{size:18,color:"white"})})]}),he=({onCancel:e,onConfirm:t,submitting:o})=>jsxRuntime.jsxs(ui.Flex,{id:"oui-positions-confirm-footer",gap:2,width:"100%",className:"oui-mt-3 oui-pb-1",children:[jsxRuntime.jsx(ui.Button,{id:"oui-positions-confirm-footer-cancel-button",color:"secondary",fullWidth:!0,onClick:e,size:"md",children:"Cancel"}),jsxRuntime.jsx(ui.Button,{id:"oui-positions-confirm-footer-confirm-button",onClick:t,fullWidth:!0,loading:o,size:"md",children:"Confirm"})]}),Tt=e=>{let{quantity:t,price:o,quoteDp:i,side:r}=e;return jsxRuntime.jsxs(ui.Flex,{direction:"column",gap:1,width:"100%",className:"oui-text-sm oui-text-base-contrast-54",py:5,children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",width:"100%",gap:1,children:[jsxRuntime.jsx(ui.Text,{children:"Qty."}),jsxRuntime.jsx(ui.Text,{color:r===types.OrderSide.BUY?"success":"danger",children:t})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",width:"100%",gap:1,children:[jsxRuntime.jsx(ui.Text,{children:"Price"}),jsxRuntime.jsx(ui.Text.formatted,{intensity:98,suffix:jsxRuntime.jsx(ui.Text,{intensity:54,children:"USDC"}),children:o})]}),jsxRuntime.jsxs(ui.Flex,{justify:"between",width:"100%",gap:1,children:[jsxRuntime.jsx(ui.Text,{children:"Total"}),jsxRuntime.jsx(ui.Text.formatted,{intensity:98,suffix:jsxRuntime.jsx(ui.Text,{intensity:54,children:"USDC"}),children:new utils.Decimal(o).mul(t).toFixed(i,utils.Decimal.ROUND_DOWN)})]})]})},X=e=>{let t=()=>{(e?.onClose??e.close)?.();};return jsxRuntime.jsxs(ui.Flex,{direction:"column",children:[jsxRuntime.jsx(Le,{onClose:t,title:"Market Close"}),jsxRuntime.jsx(ui.Text,{intensity:54,size:"sm",className:"oui-my-5",children:`You agree closing ${utils.commifyOptional(e.quantity)} ${e.base} position at market price.`}),jsxRuntime.jsx(he,{onCancel:t,onConfirm:async()=>{await e.onConfirm?.(),t();},submitting:e.submitting})]})},Lt=e=>{let{order:t,quoteDp:o,quantity:i,price:r,submitting:s}=e,{side:a}=t,u=()=>{e.onClose();};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(Le,{onClose:u,title:"Limit close"}),jsxRuntime.jsx(ui.Text,{intensity:54,size:"sm",className:"oui-mt-5",children:`You agree closing ${utils.commify(e.quantity)} ${e.base} position at limit price.`}),jsxRuntime.jsxs(ui.Flex,{gap:2,mb:4,mt:5,justify:"between",children:[jsxRuntime.jsx(ui.Text.formatted,{rule:"symbol",formatString:"base-type",size:"base",showIcon:!0,children:t.symbol}),jsxRuntime.jsxs(ui.Flex,{gap:1,children:[jsxRuntime.jsx(ui.Badge,{color:"neutural",size:"xs",children:"Limit"}),jsxRuntime.jsx(ui.Badge,{color:a===types.OrderSide.BUY?"success":"danger",size:"xs",children:a===types.OrderSide.BUY?"Buy":"Sell"})]})]}),jsxRuntime.jsx(ui.Divider,{className:"oui-w-full"}),jsxRuntime.jsx(Tt,{className:"oui-text-sm",price:r,quantity:i,side:t.side,quoteDp:o??2}),jsxRuntime.jsx(he,{onCancel:u,onConfirm:e.onConfirm,submitting:e.submitting})]})};var Ie=e=>{let{type:t,values:o}=e,[i,r]=hooks.useLocalStorage("TP/SL_Mode","Offset%"),s=react.useMemo(()=>{switch(i){case"Offset":return `${t.toLowerCase()}_offset`;case"Offset%":return `${t.toLowerCase()}_offset_percentage`;default:return `${t.toLowerCase()}_pnl`}},[i]),a=react.useMemo(()=>o[i],[o]),u=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"}],[]),l=react.useRef("");return {mode:i,modes:u,formatter:m=>{return {onRenderBefore:(p,g)=>p===""?p:i==="PnL"||i==="Offset"?utils.commify(p):i==="Offset%"?`${new utils.Decimal(p).mul(100).todp(2,4).toString()}${l.current}`:`${p}`,onSendBefore:p=>(i==="Offset%"&&p!==""&&(l.current=p.endsWith(".")?".":"",p=new utils.Decimal(p).div(100).todp(4,4).toString()),p)}},onModeChange:m=>{r(m);},value:a,onValueChange:m=>{e.onChange(s,m);},quote_db:e.quote_dp}};var Oe=e=>{let{mode:t,modes:o,onModeChange:i,onValueChange:r,quote:s,quote_db:a,value:u}=e;return jsxRuntime.jsx(ui.Input,{prefix:t,size:"md",placeholder:t==="Offset%"?"%":s,align:"right",value:u,"data-testid":e.testId,autoComplete:"off",onValueChange:r,formatters:[e.formatter({dp:a,mode:t})],suffix:jsxRuntime.jsx(Ft,{modes:o,onModeChange:l=>i(l.value)})})},Ft=e=>jsxRuntime.jsx(ui.SimpleDropdownMenu,{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 j=e=>{let{testId:t,quote:o,...i}=e,r=Ie(i);return jsxRuntime.jsx(Oe,{...r,testId:t,quote:o})};var Ee=e=>{let{TPSL_OrderEntity:t,symbolInfo:o,onCancel:i,onComplete:r}=e;return jsxRuntime.jsxs("div",{id:"orderly-tp_sl-order-edit-content",children:[!e.isEditing&&jsxRuntime.jsx(Rt,{maxQty:e.maxQty,quantity:e.orderQuantity??e.maxQty,tick:o("base_tick"),onQuantityChange:e.setQuantity,quote:"BTC"}),jsxRuntime.jsx(ui.Divider,{my:4,intensity:8}),jsxRuntime.jsx(At,{sl_pnl:t.sl_pnl,tp_pnl:t.tp_pnl,quote:o("quote"),quote_db:o("quote_dp"),onPriceChange:e.setOrderPrice,onPnLChange:e.setPnL,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:()=>{i?.();},children:"Cancel"}),jsxRuntime.jsx(ui.Button,{size:"md","data-testid":"tpsl-confirm",disabled:!e.valid,onClick:()=>{e.onSubmit();},children:"Confirm"})]})]})},Rt=e=>{let t=e.quantity===e.maxQty,o=react.useRef(null),i=()=>{e.onQuantityChange?.(0),o.current?.focus(),setTimeout(()=>{o.current?.setSelectionRange(0,1);},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,{ref:o,prefix:"Quantity",size:"md",align:"right",value:t?"":e.quantity,autoComplete:"off",formatters:[ui.inputFormatter.numberFormatter,ui.inputFormatter.currencyFormatter],onValueChange:r=>{e.onQuantityChange?.(r);},suffix:t?jsxRuntime.jsx("button",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",onClick:()=>{i();},children:"Entire position"}):jsxRuntime.jsx("span",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",children:e.quote})})}),jsxRuntime.jsx(ui.Button,{onClick:()=>{let r=t?0:e.maxQty;e.onQuantityChange?.(r),r===0&&i();},variant:"outlined",size:"md",className:ui.cn(t?"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20":"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.signle,{markCount:5,color:"primaryLight",max:e.maxQty,min:0,step:e.tick,value:e.quantity,onValueChange:r=>{e.onQuantityChange?.(r);}})}),jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text.numeral,{rule:"percentages",color:"primaryLight",size:"2xs",children:"0"}),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:"primaryLight",size:"2xs",children:"Max"})}),jsxRuntime.jsx(ui.Text.numeral,{rule:"price",size:"2xs",intensity:54,tick:e.tick,children:e.maxQty})]})]})]})},At=e=>{let t=(o,i)=>{e.onPnLChange(o,i);};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text,{size:"sm",children:"Task 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,children:e.tp_pnl??"-"})]})]}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsxRuntime.jsx(we,{type:"TP",value:e.tp_trigger_price,onValueChange:o=>{e.onPriceChange("tp_trigger_price",o);}}),jsxRuntime.jsx(j,{type:"TP",onChange:t,quote:e.quote,quote_dp:e.quote_db,values:e.tp_values})]})]}),jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs(ui.Flex,{justify:"between",children:[jsxRuntime.jsx(ui.Text,{size:"sm",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,children:e.sl_pnl??"-"})]})]}),jsxRuntime.jsxs(ui.Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsxRuntime.jsx(we,{type:"SL",value:e.sl_trigger_price,onValueChange:o=>{e.onPriceChange("sl_trigger_price",o);}}),jsxRuntime.jsx(j,{type:"SL",onChange:t,quote:e.quote,quote_dp:e.quote_db,values:e.sl_values})]})]})]})},we=e=>jsxRuntime.jsx(ui.Input,{prefix:`${e.type} price`,size:"md",placeholder:"USDC",align:"right",autoComplete:"off",value:e.value,onValueChange:e.onValueChange,formatters:[ui.inputFormatter.numberFormatter,ui.inputFormatter.currencyFormatter]}),De=()=>jsxRuntime.jsx(ui.Button,{variant:"outlined",size:"sm",color:"secondary",children:"TP/SL"}),te=e=>{let{symbol:t,tpPrice:o,slPrice:i,qty:r}=e,s=ui.textVariants({size:"xs",intensity:54});return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs(ui.Flex,{pt:5,pb:4,children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:jsxRuntime.jsx(ui.Text.formatted,{rule:"symbol",size:"base",showIcon:!0,as:"div",children:t})}),jsxRuntime.jsxs(ui.Flex,{gap:1,children:[jsxRuntime.jsx(ui.Badge,{size:"xs",color:"primaryLight",children:"Position"}),jsxRuntime.jsx(ui.Badge,{size:"xs",color:"neutural",children:"TP/SL"})]})]}),jsxRuntime.jsx(ui.Divider,{}),jsxRuntime.jsxs(ui.Flex,{direction:"column",itemAlign:"stretch",gapY:1,pt:4,pb:5,className:s,children:[jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:"Qty."}),jsxRuntime.jsx("div",{children:"Entire position"})]}),typeof o=="number"?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",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:"52.32"})]}):null,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",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:"52.32"})]}),jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Box,{grow:!0,children:"Price"}),jsxRuntime.jsx("div",{children:"Market"})]})]}),jsxRuntime.jsx(ui.Box,{py:2,children:jsxRuntime.jsxs(ui.Flex,{gap:1,children:[jsxRuntime.jsx(ui.Checkbox,{id:"disabledConfirm"}),jsxRuntime.jsx("label",{htmlFor:"disabledConfirm",className:ui.textVariants({size:"xs",intensity:54,className:"oui-ml-1"}),children:"Disable order confirmation"})]})})]})};var ke=()=>{let{type:e,quoteDp:t,price:o,updatePriceChange:i,updateOrderType:r,position:s}=O();return jsxRuntime.jsxs(ui.DropdownMenuRoot,{children:[jsxRuntime.jsx(ui.Input,{size:"sm",value:e===types.OrderType.LIMIT?o:"Market",onValueChange:a=>i(a),formatters:[ui.inputFormatter.numberFormatter,...t?[ui.inputFormatter.dpFormatter(t)]:[]],onFocus:a=>{e===types.OrderType.MARKET&&r(types.OrderType.LIMIT,`${s.mark_price}`);},suffix:jsxRuntime.jsx(ui.DropdownMenuTrigger,{asChild:!0,children:jsxRuntime.jsx("button",{className:"oui-px-1 oui-h-full",children:jsxRuntime.jsx(ui.CaretDownIcon,{size:12,color:"white"})})})}),jsxRuntime.jsx(ui.DropdownMenuContent,{align:"end",className:"oui-w-[96px] oui-min-w-[96px]",children:jsxRuntime.jsx(ui.DropdownMenuGroup,{children:jsxRuntime.jsx(ui.DropdownMenuItem,{size:"xs",onSelect:a=>{r(types.OrderType.MARKET);},children:jsxRuntime.jsx("span",{children:"Market"})})})})]})};var Qe=e=>{let[t,o]=react.useState(!1),[i,r]=react.useState(100),{baseDp:s,quoteDp:a,updateQuantity:u,quantity:l,type:x}=O();react.useEffect(()=>{let m=y=>{y.target.closest("[data-popover-root]")||o(!1);};return document.addEventListener("click",m),()=>{document.removeEventListener("click",m);}},[]);let F=m=>{u(`${e.value*(m/100)}`);};return jsxRuntime.jsxs(ui.PopoverRoot,{children:[jsxRuntime.jsx(ui.PopoverTrigger,{children:jsxRuntime.jsx(ui.Input,{size:"sm",onFocus:()=>{o(!0);},formatters:[ui.inputFormatter.numberFormatter,...s?[ui.inputFormatter.dpFormatter(s)]:[]],value:l,onValueChange:m=>{if(u(m),x===types.OrderType.LIMIT){let y=new utils.Decimal(m).div(e.value).mul(100).abs().toFixed(0,utils.Decimal.ROUND_DOWN);r(Math.min(100,Number(y)));}}})}),jsxRuntime.jsx(ui.PopoverContent,{className:"oui-w-[360px] oui-rounded-xl",align:"start",side:"bottom",onOpenAutoFocus:m=>{m.preventDefault();},children:jsxRuntime.jsxs(ui.Flex,{p:1,gap:2,width:"100%",itemAlign:"start",children:[jsxRuntime.jsx(ui.Text,{size:"xs",intensity:98,className:"oui-min-w-[30px]",children:`${i}%`}),jsxRuntime.jsxs(ui.Flex,{direction:"column",width:"100%",gap:2,children:[jsxRuntime.jsx(ui.Slider,{markCount:4,value:[i],onValueChange:m=>{let y=Array.from(m.values());r(y[0]),F(y[0]);}}),jsxRuntime.jsx(ro,{onClick:m=>{r(m*100),F(m*100);}})]})]})})]})},ro=e=>jsxRuntime.jsx(ui.Flex,{gap:2,width:"100%",children:[{label:"0%",value:0},{label:"25%",value:.25},{label:"50%",value:.5},{label:"75%",value:.75},{label:"Max",value:1}].map((o,i)=>jsxRuntime.jsx(ui.Button,{variant:"outlined",color:"secondary",size:"xs",onClick:r=>{r.stopPropagation(),e.onClick(o.value);},className:"oui-w-1/5",children:o.label},i))});var We=(e,t)=>jsxRuntime.jsx(ui.Text.numeral,{dp:t?.symbolInfo?.("base_dp"),rm:utils.Decimal.ROUND_DOWN,padding:!1,coloring:!0,children:e}),Ve=(e,t)=>jsxRuntime.jsx(Qe,{value:t.position_qty}),$e=e=>jsxRuntime.jsx(ke,{});var se=e=>jsxRuntime.jsx("button",{type:"button",onClick:t=>{t.stopPropagation(),ui.modal.show(uiShare.SharePnLDialogId,{pnl:{position:e.position,refCode:e.refCode,leverage:e.leverage,...e.sharePnLConfig}});},children:jsxRuntime.jsx(ui.ShareIcon,{color:"white",size:16})});var Ge=e=>{let{sharePnLConfig:t,position:o}=e,{getFirstRefCode:i}=hooks.useReferralInfo(),r=react.useMemo(()=>i()?.code,[i]),s=hooks.useSymbolLeverage(e.position.symbol);return {position:o,refCode:r,leverage:s,sharePnLConfig:t}};var ae=e=>{let t=Ge(e);return jsxRuntime.jsx(se,{...t})};var He=e=>{let{stopLossPrice:t,takeProfitPrice:o}=e,{tpslOrder:i,position:r}=O();return jsxRuntime.jsx(xo,{stopLossPrice:t,takeProfitPrice:o,direction:"column",order:i,position:r,tooltip:!0})},Ye=e=>{let{qty:t,price:o,entryPrice:i,orderSide:r,orderType:s,symbolInfo:a}=e,u=hooks.utils.priceToPnl({qty:t,price:o,entryPrice:i,orderSide:r,orderType:s},{symbol:a}),l=s===types.AlgoOrderType.TAKE_PROFIT?"TP":"SL";return jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Text,{intensity:54,className:"oui-mr-1",children:`${l} PnL:`}),jsxRuntime.jsx(ui.Text.formatted,{rule:"price",className:u===0?"oui-text-base-contrast-36":u>0?"oui-text-trade-profit oui-gap-0":"oui-text-trade-loss oui-gap-0",prefix:jsxRuntime.jsx(ui.Text,{children:u===0?"":u>0?"+":"-"}),suffix:jsxRuntime.jsx(ui.Text,{intensity:36,className:"oui-ml-1",children:"USDC"}),children:`${Math.abs(u)}`})]})},xo=e=>{let{direction:t="row",order:o,position:i}=e,r=hooks.useSymbolsInfo(),s=react.useMemo(()=>{let l=[];if(!e.tooltip||!o||!i)return;let x=o.quantity;return x===0&&o.child_orders[0].type==="CLOSE_POSITION"&&(x=i.position_qty),e.takeProfitPrice&&l.push(jsxRuntime.jsx(Ye,{qty:x,price:e.takeProfitPrice,entryPrice:i.average_open_price,orderSide:o.side,orderType:types.AlgoOrderType.TAKE_PROFIT,symbolInfo:r[o.symbol]()},"tp")),e.stopLossPrice&&l.push(jsxRuntime.jsx(Ye,{qty:x,price:e.stopLossPrice,entryPrice:i.average_open_price,orderSide:o.side,orderType:types.AlgoOrderType.STOP_LOSS,symbolInfo:r[o.symbol]()},"sl")),jsxRuntime.jsx("div",{children:l})},[e.takeProfitPrice,e.stopLossPrice,i?.average_open_price,o?.side,o?.quantity,o?.algo_type]),a=react.useMemo(()=>{let l=[];return o?.symbol?(e.takeProfitPrice&&l.push(jsxRuntime.jsx(ui.Text.formatted,{className:ui.cn("oui-text-trade-profit oui-gap-0 oui-decoration-white/20"),rule:"price",precision:r[o.symbol]("quote_dp",2),children:e.takeProfitPrice,prefix:!e.stopLossPrice||t==="column"?jsxRuntime.jsx(ui.Text,{intensity:54,children:"TP\xA0-\xA0"}):""},"tp")),e.stopLossPrice&&l.push(jsxRuntime.jsx(ui.Text.formatted,{className:ui.cn("oui-text-trade-loss oui-gap-0 oui-decoration-white/20 "),rule:"price",precision:r[o.symbol]("quote_dp",2),children:e.stopLossPrice,prefix:!e.takeProfitPrice||t==="column"?jsxRuntime.jsx(ui.Text,{intensity:54,children:"SL\xA0-\xA0"}):""},"sl")),l.length===0?jsxRuntime.jsx(ui.Text,{children:"-"}):(l.length===2&&t==="row"&&l.splice(1,0,jsxRuntime.jsx(ui.Text,{children:"/"},"split")),l)):jsxRuntime.jsx("span",{children:"-"})},[e.takeProfitPrice,e.stopLossPrice,o?.symbol]),u=jsxRuntime.jsx("div",{className:ui.cn("oui-inline-flex oui-text-base-contrast-36",e.direction==="column"?"oui-flex-col":"oui-flex-row oui-gap-1",e.className),children:a});return e.tooltip?jsxRuntime.jsx(ui.Tooltip,{content:s,children:u}):u};var Xe=e=>{let{pnlNotionalDecimalPrecision:t,sharePnLConfig:o}=e;return react.useMemo(()=>[{title:"Instrument",dataIndex:"symbol",fixed:"left",width:120,onSort:(r,s,a)=>a==="asc"?r.symbol.localeCompare(s.symbol):s.symbol.localeCompare(r.symbol),render:r=>jsxRuntime.jsx(ui.Text.formatted,{rule:"symbol",onClick:s=>{},children:r})},{title:"Quantity",dataIndex:"position_qty",onSort:!0,width:100,render:We},{title:"Avg. open",className:"orderly-h-[48px]",width:120,onSort:!0,dataIndex:"average_open_price",render:(r,s)=>jsxRuntime.jsx(ui.Text.numeral,{dp:s?.symbolInfo?.("quote_dp"),rm:utils.Decimal.ROUND_DOWN,children:r})},{title:"Mark price",dataIndex:"mark_price",width:120,onSort:!0,className:"orderly-h-[48px]",render:(r,s)=>jsxRuntime.jsx(ui.Text.numeral,{dp:s?.symbolInfo?.("quote_dp"),rm:utils.Decimal.ROUND_DOWN,children:r})},{title:"Liq. price",width:100,onSort:!0,hint:"Estimated price at which your position will be liquidated. Prices are estimated and depend on multiple factors across all positions.",dataIndex:"est_liq_price",render:(r,s)=>Number(r)===0?"--":jsxRuntime.jsx(ui.Text.numeral,{dp:s?.symbolInfo?.("quote_dp"),rm:utils.Decimal.ROUND_DOWN,children:r})},{title:"Unreal. PnL",dataIndex:"unrealized_pnl",width:150,onSort:!0,rule:"price",numeralProps:{coloring:!0},render:(r,s)=>jsxRuntime.jsxs(ui.Flex,{gap:2,children:[jsxRuntime.jsxs(ui.Flex,{children:[jsxRuntime.jsx(ui.Text.numeral,{dp:e.pnlNotionalDecimalPrecision,rm:utils.Decimal.ROUND_DOWN,coloring:!0,className:"orderly-font-semibold",children:r}),jsxRuntime.jsx(ui.Text.numeral,{rule:"percentages",dp:e.pnlNotionalDecimalPrecision,rm:utils.Decimal.ROUND_DOWN,coloring:!0,className:"orderly-font-semibold",prefix:"(",suffix:")",children:s.unrealized_pnl_ROI})]}),jsxRuntime.jsx(ae,{position:s,sharePnLConfig:e.sharePnLConfig})]})},{title:"TP/SL",dataIndex:"__",width:150,render:(r,s)=>jsxRuntime.jsx(He,{stopLossPrice:s.sl_trigger_price,takeProfitPrice:s.tp_trigger_price})},{title:"Est. total",dataIndex:"notional",className:"orderly-h-[48px]",width:100,onSort:!0},{title:"Margin",dataIndex:"mm",onSort:!0,width:100,rule:"price"},{title:"Qty.",dataIndex:"close_qty",width:100,fixed:"right",render:Ve},{title:"Price",dataIndex:"close_price",width:100,fixed:"right",render:$e},{title:"",dataIndex:"close_position",align:"right",width:160,fixed:"right",render:r=>jsxRuntime.jsxs("div",{className:"oui-flex oui-space-x-2",children:[jsxRuntime.jsx(Te,{}),jsxRuntime.jsx(De,{})]})}],[t,o])};var Ze=e=>{let{pnlNotionalDecimalPrecision:t,sharePnLConfig:o}=e,i=Xe({pnlNotionalDecimalPrecision:t,sharePnLConfig:o});return jsxRuntime.jsx("div",{children:jsxRuntime.jsx(ui.DataTable,{loading:e.isLoading,id:"oui-desktop-positions-content",classNames:{header:"oui-text-base-contrast-36",body:"oui-text-base-contrast-80"},columns:i,bordered:!0,dataSource:e.dataSource,generatedRowKey:r=>r.symbol,renderRowContainer:(r,s,a)=>jsxRuntime.jsx(xe,{symbol:r.symbol,children:jsxRuntime.jsx(Pe,{position:r,children:a})})})})};var je=()=>{let[e,t,{isLoading:o}]=hooks.usePositionStream();return {dataSource:e?.rows,isLoading:o}};var To=e=>{let t=je();return jsxRuntime.jsx(Ze,{...t,pnlNotionalDecimalPrecision:e.pnlNotionalDecimalPrecision,sharePnLConfig:e.sharePnLConfig})};var ot=e=>{let{position:t,order:o}=e,i=!!o,r=i?o.symbol:t.symbol,s=hooks.useSymbolsInfo(),[a,{submit:u,setValue:l,validate:x,errors:F}]=hooks.useTPSLOrder({symbol:r,position_qty:t.position_qty,average_open_price:t.average_open_price},{defaultOrder:o}),m=b=>{l("quantity",b);},y=(b,C)=>{l(b,C);},p=(b,C)=>{l(b,C);},g=react.useMemo(()=>t.position_qty,[t.position_qty]),k=react.useMemo(()=>{let b=o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?g:o?.quantity,C=0;if(Number(a.quantity)!==b&&(C=1),o){let G=o.child_orders.find(S=>S.algo_type===types.AlgoOrderType.TAKE_PROFIT),K=o.child_orders.find(S=>S.algo_type===types.AlgoOrderType.STOP_LOSS);G?.trigger_price!==Number(a.tp_trigger_price)&&typeof typeof a.tp_trigger_price<"u"&&(C=2),K?.trigger_price!==Number(a.sl_trigger_price)&&typeof a.sl_trigger_price<"u"&&(C=3);}return C===1&&!a.tp_trigger_price&&!a.sl_trigger_price&&(C=-1),C},[a.tp_trigger_price,a.sl_trigger_price,a.quantity,o]),$=react.useMemo(()=>o?.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL&&Number(a.quantity)<g&&!a.tp_trigger_price&&!a.sl_trigger_price?!1:k>0&&!!a.quantity,[a.quantity,g,k]),U=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"?!0:e.onConfirm()).then(b=>{if(b)return u()});return {isEditing:i,symbolInfo:s[r],maxQty:g,setQuantity:m,orderQuantity:a.quantity,isPosition:a.quantity===t.position_qty,TPSL_OrderEntity:a,setOrderValue:l,setPnL:p,setOrderPrice:y,onSubmit:U,valid:$}};var ce=e=>{let{onCancel:t,...o}=e,i=ot(o);return jsxRuntime.jsx(Ee,{...i,onCancel:t})};var rt=e=>{let{open:t,needConfirm:o,...i}=e;return jsxRuntime.jsx(jsxRuntime.Fragment,{children:jsxRuntime.jsx(ui.SimpleDialog,{open:t,children:jsxRuntime.jsx(ce,{...i,onConfirm:()=>o?ui.modal.confirm({content:jsxRuntime.jsx(te,{symbol:"PERP_ETH_USDC",isPosition:!1,qty:0})}):Promise.resolve(!0)})})})};var it=e=>{let[t,o]=hooks.useLocalStorage("orderly_order_confirm",!0),[i,r]=react.useState(!1);return {open:i,needConfirm:t}};var Bo=e=>{let t=it();return jsxRuntime.jsx(rt,{...e,...t})};var Mo="MarketCloseConfirmID";ui.registerSimpleDialog(Mo,X,{size:"md",closable:!1});
12
+
13
+ exports.MarketCloseConfirmID = Mo;
14
+ exports.PositionTPSLConfirm = te;
15
+ exports.PositionsWidget = To;
16
+ exports.TPSLEditorWidget = Bo;
17
+ exports.TPSLWidget = ce;
18
+ //# sourceMappingURL=out.js.map
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/closeButton.tsx","../src/components/positionRowContext.tsx","../src/providers/symbolProvider.tsx","../src/components/positions.ui.tsx","../src/components/useColumn.tsx","../src/components/tpsl/tpsl.ui.tsx","../src/components/tpsl/pnlInput/pnlInput.ui.tsx","../src/components/tpsl/pnlInput/useBuilder.script.ts","../src/components/tpsl/pnlInput/pnlInput.widget.tsx","../src/components/listElement.tsx","../src/components/priceInput.tsx","../src/components/quantityInput.tsx","../src/components/shareButton/shareButton.ui.tsx","../src/components/shareButton/shareButton.script.tsx","../src/components/shareButton/shareButton.widget.tsx","../src/components/triggerPrice.tsx","../src/components/usePositionsBuilder.script.ts","../src/components/positions.widget.tsx","../src/components/tpsl/useTPSL.script.ts","../src/components/tpsl/tpsl.widget.tsx","../src/components/tpsl/dialog/tpslDialog.ui.tsx","../src/components/tpsl/dialog/tpslDialog.script.ts","../src/components/tpsl/dialog/tpslDialog.widget.tsx"],"names":["registerSimpleDialog","Button","Popover","toast","Text","CloseIcon","Flex","Divider","Badge","OrderSide","OrderType","createContext","useContext","useEffect","useMemo","useState","useOrderEntry","useSymbolsInfo","jsx","PositionsRowContext","usePositionsRowContext","PositionsRowProvider","props","quantity","setQuantity","price","setPrice","side","setSide","type","setType","config","symbol","curSymbolInfo","quoteDp","baseDp","helper","onSubmit","submitting","updateOrderType","closeOrderData","position","data","onUpdateQuantity","value","newValues","onUpdatePrice","postOrder","SymbolContext","useSymbolContext","SymbolProvider","symbolInfo","commify","commifyOptional","Decimal","Fragment","jsxs","CloseButton","open","setOpen","base","quote","onConfirm","res","error","onClose","disabled","MarketCloseConfirm","LimitConfirmDialog","e","ConfirmHeader","ConfirmFooter","onCancel","OrderDetail","order","DataTable","useRef","Box","Grid","Input","Slider","textVariants","cn","inputFormatter","Checkbox","CaretDownIcon","SimpleDropdownMenu","useLocalStorage","usePNLInputBuilder","values","mode","setMode","key","modes","percentageSuffix","options","dp","PNLInput","onModeChange","onValueChange","quote_db","PNLMenus","item","PnlInputWidget","testId","rest","state","TPSL","TPSL_OrderEntity","onComplete","TPSLQuantity","TPSLPrice","isPosition","inputRef","setTPSL","qty","onPnLChange","PriceInput","TPSLButton","PositionTPSLConfirm","tpPrice","slPrice","textClassName","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuRoot","DropdownMenuTrigger","updatePriceChange","vent","PopoverRoot","PopoverContent","PopoverTrigger","QuantityInput","sliderValue","setSliderValue","handleClick","event","resetQuantity","percent","Buttons","index","renderQuantity","record","renderQuantityInput","renderPriceInput","modal","ShareIcon","SharePnLDialogId","ShareButton","useReferralInfo","useSymbolLeverage","useShareButtonScript","sharePnLConfig","getFirstRefCode","refCode","leverage","ShareButtonWidget","AlgoOrderType","utils","Tooltip","TriggerPrice","stopLossPrice","takeProfitPrice","tpslOrder","TPSLTriggerPrice","TriggerPriceItem","entryPrice","orderSide","orderType","pnl","direction","msgs","child","children","content","useColumn","pnlNotionalDecimalPrecision","r1","r2","sortOrder","_","Positions","column","usePositionStream","usePositionsBuilder","info","isLoading","PositionsWidget","useTPSLOrder","AlgoOrderRootType","useTPSLBuilder","isEditing","submit","setValue","validate","errors","setOrderPrice","name","setPnL","maxQty","dirty","diff","tp","o","sl","valid","isConfirm","TPSLWidget","SimpleDialog","TPSLDialog","needConfirm","useTPSLEditorBuilder","setNeedConfirm","TPSLEditorWidget","MarketCloseConfirmID"],"mappings":"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","sourcesContent":["import { registerSimpleDialog } from \"@orderly.network/ui\";\nimport { MarketCloseConfirm } from \"./components/closeButton\";\n\nexport { PositionsWidget } from \"./components/positions.widget\";\nexport { TPSLWidget } from \"./components/tpsl/tpsl.widget\";\nexport { TPSLEditorWidget } from \"./components/tpsl/dialog/tpslDialog.widget\";\nexport { PositionTPSLConfirm } from \"./components/tpsl/tpsl.ui\";\nexport type { PositionsProps } from \"./types/types\";\n\nexport const MarketCloseConfirmID = \"MarketCloseConfirmID\";\nregisterSimpleDialog(MarketCloseConfirmID, MarketCloseConfirm, {\n size: \"md\",\n closable: false,\n});\n","import {\n Button,\n Popover,\n toast,\n Text,\n CloseIcon,\n Flex,\n Box,\n Divider,\n cn,\n NumeralProps,\n Badge,\n} from \"@orderly.network/ui\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { useSymbolContext } from \"../providers/symbolProvider\";\nimport { FC, useMemo, useState } from \"react\";\nimport { OrderEntity, OrderSide, OrderType } from \"@orderly.network/types\";\nimport { commify, commifyOptional, Decimal } from \"@orderly.network/utils\";\nimport { TokenIcon } from \"@orderly.network/ui\";\n\nexport const CloseButton = () => {\n const [open, setOpen] = useState(false);\n const { onSubmit, price, quantity, closeOrderData, type, submitting, quoteDp } =\n usePositionsRowContext();\n\n const { base, quote } = useSymbolContext();\n\n const onConfirm = () => {\n return onSubmit().then(\n (res) => {\n setOpen(false);\n },\n (error: any) => {\n if (typeof error === \"string\") {\n toast.error(error);\n } else {\n toast.error(error.message);\n }\n }\n );\n };\n\n const onClose = () => {\n setOpen(false);\n };\n\n const disabled = useMemo(() => {\n if (type === OrderType.MARKET) {\n if (!quantity) {\n return true;\n }\n return false;\n }\n\n return !price || !quantity;\n }, [price, quantity, type]);\n return (\n <Popover\n open={open}\n onOpenChange={setOpen}\n contentProps={{\n className: \"oui-w-[360px] oui-px-5 oui-rounded-xl\",\n }}\n content={\n type === OrderType.MARKET ? (\n <MarketCloseConfirm\n base={base}\n quantity={quantity}\n onClose={onClose}\n onConfirm={onConfirm}\n submitting={submitting}\n />\n ) : (\n <LimitConfirmDialog\n base={base}\n quantity={quantity}\n price={price}\n onClose={onClose}\n onConfirm={onConfirm}\n submitting={submitting}\n quoteDp={quoteDp}\n order={closeOrderData}\n />\n )\n }\n >\n <Button\n variant=\"outlined\"\n size=\"sm\"\n color=\"secondary\"\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n Close\n </Button>\n </Popover>\n );\n};\n\nexport const ConfirmHeader: FC<{\n onClose: () => void;\n title: string;\n}> = (props) => {\n return (\n <div className=\"oui-pb-3 oui-border-b oui-border-line-4 oui-relative oui-w-full\">\n <Text size={\"base\"}>{props.title}</Text>\n <button\n onClick={props.onClose}\n className=\"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-54 hover:oui-text-base-contrast-80 oui-p-2\"\n >\n <CloseIcon size={18} color=\"white\" />\n </button>\n </div>\n );\n};\n\nexport const ConfirmFooter: FC<{\n onConfirm?: () => Promise<any>;\n onCancel?: () => void;\n submitting?: boolean;\n}> = ({ onCancel, onConfirm, submitting }) => {\n return (\n <Flex\n id=\"oui-positions-confirm-footer\"\n gap={2}\n width={\"100%\"}\n className=\"oui-mt-3 oui-pb-1\"\n >\n <Button\n id=\"oui-positions-confirm-footer-cancel-button\"\n color={\"secondary\"}\n fullWidth\n onClick={onCancel}\n size=\"md\"\n >\n Cancel\n </Button>\n <Button\n id=\"oui-positions-confirm-footer-confirm-button\"\n onClick={onConfirm}\n fullWidth\n loading={submitting}\n size=\"md\"\n >\n Confirm\n </Button>\n </Flex>\n );\n};\n\nexport const OrderDetail = (props: {\n quantity: any;\n price: any;\n side: OrderSide;\n quoteDp: number;\n className?: string;\n}) => {\n const { quantity, price, quoteDp, side } = props;\n \n\n return (\n <Flex\n direction={\"column\"}\n gap={1}\n width={\"100%\"}\n className=\"oui-text-sm oui-text-base-contrast-54\"\n py={5}\n >\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>Qty.</Text>\n <Text color={side === OrderSide.BUY ? \"success\" : \"danger\"}>\n {quantity}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>Price</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {price}\n </Text.formatted>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>Total</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {new Decimal(price).mul(quantity).toFixed(quoteDp, Decimal.ROUND_DOWN)}\n </Text.formatted>\n </Flex>\n </Flex>\n );\n};\n\nexport const MarketCloseConfirm: FC<{\n base?: string;\n quantity?: string;\n onClose?: () => void;\n close?: () => void;\n onConfirm?: () => Promise<any>;\n submitting?: boolean;\n}> = (props) => {\n console.log(\"props\", props);\n \n const onCancel = () => {\n const func = props?.onClose ?? props.close;\n console.log(\"xxxxxxxxxxx func is\", func);\n func?.();\n };\n return (\n <Flex direction={\"column\"}>\n <ConfirmHeader onClose={onCancel} title=\"Market Close\" />\n <Text intensity={54} size=\"sm\" className=\"oui-my-5\">\n {`You agree closing ${commifyOptional(props.quantity)} ${\n props.base\n } position at market price.`}\n </Text>\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={async () => {\n await props.onConfirm?.();\n onCancel();\n }}\n submitting={props.submitting}\n />\n </Flex>\n );\n};\n\nexport const LimitConfirmDialog: FC<{\n base: string;\n quantity: string;\n price: string;\n onClose: () => void;\n onConfirm: () => Promise<any>;\n order: OrderEntity;\n submitting: boolean;\n quoteDp?: number;\n}> = (props) => {\n const { order, quoteDp, quantity, price, submitting } = props;\n\n const { side } = order;\n const onCancel = () => {\n props.onClose();\n };\n return (\n <>\n <ConfirmHeader onClose={onCancel} title=\"Limit close\" />\n <Text intensity={54} size=\"sm\" className=\"oui-mt-5\">\n {`You agree closing ${commify(props.quantity)} ${\n props.base\n } position at limit price.`}\n </Text>\n\n <Flex gap={2} mb={4} mt={5} justify={\"between\"}>\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n >\n {order.symbol}\n </Text.formatted>\n <Flex gap={1}>\n <Badge color=\"neutural\" size=\"xs\">\n Limit\n </Badge>\n <Badge\n color={side === OrderSide.BUY ? \"success\" : \"danger\"}\n size=\"xs\"\n >\n {side === OrderSide.BUY ? \"Buy\" : \"Sell\"}\n </Badge>\n </Flex>\n </Flex>\n\n <Divider className=\"oui-w-full\" />\n\n <OrderDetail\n className=\"oui-text-sm\"\n price={price}\n quantity={quantity}\n side={order.side}\n quoteDp={quoteDp ?? 2}\n />\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={props.onConfirm}\n submitting={props.submitting}\n />\n </>\n );\n};\n\n","import { API, OrderEntity, OrderSide, OrderType } from \"@orderly.network/types\";\nimport {\n FC,\n PropsWithChildren,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { useOrderEntry, useSymbolsInfo } from \"@orderly.network/hooks\";\n\nexport interface PositionsRowContextState {\n quantity: string;\n price: string;\n type: OrderType;\n side: OrderSide;\n position: API.PositionExt | API.PositionTPSLExt;\n updateQuantity: (value: string) => void;\n updatePriceChange: (value: string) => void;\n\n updateOrderType: (value: OrderType, price?: string) => void;\n\n closeOrderData: any;\n\n onSubmit: () => Promise<any>;\n submitting: boolean;\n tpslOrder?: API.AlgoOrder;\n quoteDp?: number;\n baseDp?: number;\n}\n\nexport const PositionsRowContext = createContext(\n {} as PositionsRowContextState\n);\n\nexport const usePositionsRowContext = () => {\n return useContext(PositionsRowContext);\n};\n\nexport const PositionsRowProvider: FC<\n PropsWithChildren<{ position: API.PositionExt | API.PositionTPSLExt }>\n> = (props) => {\n const [quantity, setQuantity] = useState<string>(\n Math.abs(props.position.position_qty).toString()\n );\n\n useEffect(() => {\n setQuantity(Math.abs(props.position.position_qty).toString());\n }, [props.position.position_qty]);\n\n const [price, setPrice] = useState<string>(\"\");\n const [side, setSide] = useState<OrderSide>(\n props.position.position_qty > 0 ? OrderSide.SELL : OrderSide.BUY\n );\n\n const [type, setType] = useState<OrderType>(OrderType.MARKET);\n\n const config = useSymbolsInfo();\n const symbol = props.position.symbol;\n const curSymbolInfo = config?.[symbol];\n const quoteDp = curSymbolInfo(\"quote_dp\");\n const baseDp = curSymbolInfo(\"base_dp\");\n \n\n const { helper, onSubmit, submitting } = useOrderEntry(\n props.position?.symbol!,\n side,\n true\n );\n\n const updateOrderType = (type: OrderType, price?: string) => {\n setType(type);\n if (type === OrderType.LIMIT) {\n if (!price) {\n throw new Error(\"price is required\");\n }\n setPrice(price);\n } else {\n setPrice(\"\");\n }\n };\n\n const closeOrderData = useMemo(() => {\n const { position } = props;\n\n if (!position) return null;\n\n const data: any = {\n // order_price: undefined,\n order_quantity: quantity,\n symbol: props.position.symbol,\n order_type: type,\n side,\n reduce_only: true,\n };\n\n if (type === OrderType.LIMIT) {\n data.order_price = price;\n }\n\n return data;\n }, [props.position, price, type, quantity]);\n\n const onUpdateQuantity = (value: string) => {\n const newValues = helper.calculate(\n {},\n \"order_quantity\",\n value\n ) as OrderEntity;\n setQuantity(newValues[\"order_quantity\"] as string);\n };\n\n const onUpdatePrice = (value: string) => {\n const newValues = helper.calculate({}, \"order_price\", value) as OrderEntity;\n setPrice(newValues[\"order_price\"] as string);\n };\n\n const postOrder = () => {\n return onSubmit(closeOrderData);\n };\n\n return (\n <PositionsRowContext.Provider\n value={{\n quantity,\n price,\n type,\n side,\n position: props.position,\n updatePriceChange: onUpdatePrice,\n updateQuantity: onUpdateQuantity,\n updateOrderType,\n tpslOrder: (props.position as unknown as API.PositionTPSLExt)\n .algo_order,\n onSubmit: postOrder,\n submitting,\n closeOrderData,\n quoteDp,\n baseDp,\n }}\n >\n {props.children}\n </PositionsRowContext.Provider>\n );\n};\n","import { FC, PropsWithChildren, createContext, useContext } from \"react\";\nimport { useSymbolsInfo } from \"@orderly.network/hooks\";\n\ninterface SymbolContextState {\n base_dp: number;\n quote_dp: number;\n base_tick: number;\n base: string;\n quote: string;\n symbol: string;\n}\n\nexport const SymbolContext = createContext({} as SymbolContextState);\n\nexport const useSymbolContext = () => {\n return useContext(SymbolContext);\n};\n\ninterface FormatterProviderProps {\n symbol: string;\n}\n\nexport const SymbolProvider: FC<PropsWithChildren<FormatterProviderProps>> = (\n props\n) => {\n const symbolInfo = useSymbolsInfo()[props.symbol];\n\n return (\n <SymbolContext.Provider\n value={{\n base_dp: symbolInfo(\"base_dp\"),\n quote_dp: symbolInfo(\"quote_dp\"),\n base_tick: symbolInfo(\"base_tick\"),\n base: symbolInfo(\"base\"),\n quote: symbolInfo(\"quote\"),\n symbol: props.symbol,\n }}\n >\n {props.children}\n </SymbolContext.Provider>\n );\n};\n","import { DataTable } from \"@orderly.network/ui\";\nimport { useColumn } from \"./useColumn\";\nimport { API } from \"@orderly.network/types\";\nimport { PositionsBuilderState } from \"./usePositionsBuilder.script\";\nimport { PositionsRowProvider } from \"./positionRowContext\";\nimport { SymbolProvider } from \"../providers/symbolProvider\";\nimport { PositionsProps } from \"../types/types\";\n\nexport const Positions = (\n props: PositionsBuilderState & PositionsProps\n) => {\n const { pnlNotionalDecimalPrecision, sharePnLConfig } = props;\n const column = useColumn({\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n });\n return (\n <div>\n <DataTable<API.PositionTPSLExt>\n loading={props.isLoading}\n id=\"oui-desktop-positions-content\"\n classNames={{\n header: \"oui-text-base-contrast-36\",\n body: \"oui-text-base-contrast-80\",\n }}\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record) => record.symbol}\n renderRowContainer={(record, index, children) => {\n return (\n <SymbolProvider symbol={record.symbol}>\n <PositionsRowProvider position={record}>\n {children}\n </PositionsRowProvider>\n </SymbolProvider>\n );\n }}\n />\n </div>\n );\n};\n","import { Column, Flex, Text } from \"@orderly.network/ui\";\nimport { useMemo } from \"react\";\nimport { TPSLButton } from \"./tpsl/tpsl.ui\";\nimport {\n renderPriceInput,\n renderQuantity,\n renderQuantityInput,\n} from \"./listElement\";\nimport { CloseButton } from \"./closeButton\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { SharePnLConfig } from \"@orderly.network/ui-share\";\nimport { ShareButtonWidget } from \"./shareButton\";\nimport { API } from \"@orderly.network/types\";\nimport { TriggerPrice } from \"./triggerPrice\";\n\nexport const useColumn = (props: {\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const { pnlNotionalDecimalPrecision, sharePnLConfig } = props;\n const column = useMemo<Column<API.PositionTPSLExt>[]>(\n () => [\n {\n title: \"Instrument\",\n dataIndex: \"symbol\",\n fixed: \"left\",\n width: 120,\n onSort: (r1, r2, sortOrder) => {\n if (sortOrder === \"asc\") {\n return r1.symbol.localeCompare(r2.symbol);\n }\n return r2.symbol.localeCompare(r1.symbol);\n },\n render: (value: string) => (\n <Text.formatted\n rule={\"symbol\"}\n onClick={(e) => {\n // props.onSymbolChange?.({ symbol: value } as API.Symbol);\n // e.stopPropagation();\n // e.preventDefault();\n }}\n >\n {value}\n </Text.formatted>\n ),\n },\n {\n title: \"Quantity\",\n dataIndex: \"position_qty\",\n onSort: true,\n width: 100,\n // rule: \"price\",\n // numeralProps: {\n // coloring: true,\n // // tick: \"base_dp\",\n // },\n render: renderQuantity,\n // render: (value: string) => (\n // <NumeralWithCtx\n // coloring\n // className=\"orderly-font-semibold\"\n // tick=\"base_dp\"\n // >\n // {value}\n // </NumeralWithCtx>\n // ),\n },\n {\n title: \"Avg. open\",\n className: \"orderly-h-[48px]\",\n width: 120,\n onSort: true,\n dataIndex: \"average_open_price\",\n render: (value: string, record: any) => {\n return (\n <Text.numeral dp={record?.symbolInfo?.(\"quote_dp\")} rm={Decimal.ROUND_DOWN}>\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: \"Mark price\",\n dataIndex: \"mark_price\",\n width: 120,\n onSort: true,\n className: \"orderly-h-[48px]\",\n\n render: (value: string, record: any) => {\n return (\n <Text.numeral dp={record?.symbolInfo?.(\"quote_dp\")} rm={Decimal.ROUND_DOWN}>\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: \"Liq. price\",\n width: 100,\n onSort: true,\n hint: \"Estimated price at which your position will be liquidated. Prices are estimated and depend on multiple factors across all positions.\",\n dataIndex: \"est_liq_price\",\n render: (value: string, record: any) => {\n return Number(value) === 0 ? (\n \"--\"\n ) : (\n <Text.numeral dp={record?.symbolInfo?.(\"quote_dp\")} rm={Decimal.ROUND_DOWN}>\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: \"Unreal. PnL\",\n dataIndex: \"unrealized_pnl\",\n width: 150,\n onSort: true,\n rule: \"price\",\n numeralProps: {\n coloring: true,\n // tick: \"base_dp\",\n },\n // hint: (\n // <UnrealizedPnLPopoverCard\n // unPnlPriceBasis={props.unPnlPriceBasis}\n // setUnPnlPriceBasic={props.setUnPnlPriceBasic}\n // />\n // ),\n render: (value: string, record: any) => {\n return (\n <Flex gap={2}>\n <Flex>\n <Text.numeral\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"orderly-font-semibold\"\n >\n {value}\n </Text.numeral>\n <Text.numeral\n rule=\"percentages\"\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"orderly-font-semibold\"\n prefix=\"(\"\n suffix=\")\"\n >\n {record.unrealized_pnl_ROI}\n </Text.numeral>\n </Flex>\n <ShareButtonWidget\n position={record}\n sharePnLConfig={props.sharePnLConfig}\n />\n </Flex>\n );\n },\n },\n {\n title: \"TP/SL\",\n dataIndex: \"__\",\n width: 150,\n render: (_: string, record) => (\n <TriggerPrice\n stopLossPrice={record.sl_trigger_price}\n takeProfitPrice={record.tp_trigger_price}\n />\n ),\n },\n\n {\n title: \"Est. total\",\n dataIndex: \"notional\",\n className: \"orderly-h-[48px]\",\n width: 100,\n onSort: true,\n // render: (value: string) => (\n // <Numeral\n // precision={pnlNotionalDecimalPrecision}\n // className=\"orderly-font-semibold\"\n // >\n // {value}\n // </Numeral>\n // ),\n },\n {\n title: \"Margin\",\n dataIndex: \"mm\",\n onSort: true,\n width: 100,\n rule: \"price\",\n // render: (value: string) => (\n // <Numeral className=\"orderly-font-semibold\">{value}</Numeral>\n // ),\n // hint: (\n // <div>\n // <span>The minimum equity to keep your position. </span>\n // <Divider className=\"orderly-py-2 orderly-border-white/10\" />\n // <span>Margin = Position size * Mark price * MMR</span>\n // </div>\n // ),\n // hintClassName: \"orderly-p-2\",\n },\n {\n title: \"Qty.\",\n dataIndex: \"close_qty\",\n width: 100,\n fixed: \"right\",\n render: renderQuantityInput,\n },\n {\n title: \"Price\",\n dataIndex: \"close_price\",\n width: 100,\n fixed: \"right\",\n render: renderPriceInput,\n // render: (value: string) => <PriceInput />,\n },\n {\n title: \"\",\n dataIndex: \"close_position\",\n align: \"right\",\n width: 160,\n fixed: \"right\",\n render: (value: string) => {\n return (\n <div className=\"oui-flex oui-space-x-2\">\n <CloseButton />\n <TPSLButton />\n </div>\n );\n },\n },\n ],\n [pnlNotionalDecimalPrecision, sharePnLConfig]\n );\n\n return column;\n};\n","import { useRef } 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} from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { TPSLBuilderState } from \"./useTPSL.script\";\n\nimport { PNL_Values } from \"./pnlInput/useBuilder.script\";\n\nexport type TPSLProps = {\n onCancel?: () => void;\n onComplete?: () => void;\n};\n\nexport const TPSL = (props: TPSLBuilderState & TPSLProps) => {\n const { TPSL_OrderEntity, symbolInfo, onCancel, onComplete } = props;\n return (\n <div id=\"orderly-tp_sl-order-edit-content\">\n {!props.isEditing && (\n <TPSLQuantity\n maxQty={props.maxQty}\n quantity={(props.orderQuantity ?? props.maxQty) as number}\n tick={symbolInfo(\"base_tick\")}\n onQuantityChange={props.setQuantity}\n quote=\"BTC\"\n />\n )}\n\n <Divider my={4} intensity={8} />\n <TPSLPrice\n sl_pnl={TPSL_OrderEntity.sl_pnl}\n tp_pnl={TPSL_OrderEntity.tp_pnl}\n quote={symbolInfo(\"quote\")}\n quote_db={symbolInfo(\"quote_dp\")}\n onPriceChange={props.setOrderPrice}\n onPnLChange={props.setPnL}\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 <Button\n size={\"md\"}\n data-testid={\"tpsl-confirm\"}\n disabled={!props.valid}\n onClick={() => {\n // if (props.needConfirm) {\n // //show confirm dialog\n // } else {\n props.onSubmit();\n // }\n }}\n >\n Confirm\n </Button>\n </Grid>\n </div>\n );\n};\n\n// ------------- Quantity input start------------\nconst TPSLQuantity = (props: {\n maxQty: number;\n tick: number;\n quote: string;\n onQuantityChange?: (value: number | string) => void;\n quantity: number;\n setOrderValue?: (key: string, value: number | string) => void;\n}) => {\n const isPosition = props.quantity === props.maxQty;\n const inputRef = useRef<HTMLInputElement>(null);\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 return (\n <>\n <Flex gap={2}>\n <div className={\"oui-flex-1\"}>\n <Input\n ref={inputRef}\n prefix={\"Quantity\"}\n size={\"md\"}\n align=\"right\"\n value={isPosition ? \"\" : props.quantity}\n autoComplete=\"off\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\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 <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={\"md\"}\n className={cn(\n isPosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5\"\n )}\n >\n Position\n </Button>\n </Flex>\n <Flex mt={2} itemAlign={\"center\"} height={\"15px\"}>\n <Slider.signle\n markCount={5}\n color=\"primaryLight\"\n max={props.maxQty}\n min={0}\n step={props.tick}\n value={props.quantity}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\n />\n </Flex>\n <Flex justify={\"between\"}>\n <Text.numeral rule={\"percentages\"} color={\"primaryLight\"} size={\"2xs\"}>\n 0\n </Text.numeral>\n <Flex itemAlign={\"center\"} gap={1}>\n <button\n className={\"oui-leading-none\"}\n style={{ lineHeight: 0 }}\n onClick={() => {\n console.log(\"maxQty\", props.maxQty);\n props.onQuantityChange?.(props.maxQty);\n }}\n >\n <Text color={\"primaryLight\"} size={\"2xs\"}>\n Max\n </Text>\n </button>\n <Text.numeral\n rule={\"price\"}\n size={\"2xs\"}\n intensity={54}\n tick={props.tick}\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_db?: 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}) => {\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\"}>Task profit</Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral size={\"2xs\"} coloring showIdentifier>\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 onValueChange={(value) => {\n props.onPriceChange(\"tp_trigger_price\", value);\n }}\n />\n <PnlInputWidget\n type={\"TP\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_db}\n values={props.tp_values}\n />\n </Grid>\n </div>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"sm\"}>Stop loss</Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral size={\"2xs\"} coloring showIdentifier>\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 onValueChange={(value) => {\n props.onPriceChange(\"sl_trigger_price\", value);\n }}\n />\n <PnlInputWidget\n type={\"SL\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_db}\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 onValueChange: (value: string) => void;\n}) => {\n return (\n <Input\n prefix={`${props.type} price`}\n size={\"md\"}\n placeholder={\"USDC\"}\n align={\"right\"}\n autoComplete={\"off\"}\n value={props.value}\n onValueChange={props.onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n// ------------ TP/SL Price input end------------\n\nexport const TPSLButton = () => {\n return (\n <Button variant=\"outlined\" size=\"sm\" color=\"secondary\">\n TP/SL\n </Button>\n );\n};\n\nexport type PositionTPSLConfirmProps = {\n symbol: string;\n isPosition: boolean;\n qty: number;\n tpPrice?: number;\n slPrice?: number;\n // type\n};\n\n// ------------ Position TP/SL Confirm dialog start------------\nexport const PositionTPSLConfirm = (props: PositionTPSLConfirmProps) => {\n const { symbol, tpPrice, slPrice, qty } = props;\n const textClassName = textVariants({\n size: \"xs\",\n intensity: 54,\n });\n return (\n <>\n <Flex pt={5} pb={4}>\n <Box grow>\n <Text.formatted rule={\"symbol\"} size=\"base\" showIcon as=\"div\">\n {symbol}\n </Text.formatted>\n </Box>\n <Flex gap={1}>\n <Badge size=\"xs\" color={\"primaryLight\"}>\n Position\n </Badge>\n <Badge size=\"xs\" color=\"neutural\">\n TP/SL\n </Badge>\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={textClassName}\n >\n <Flex>\n <Box grow>Qty.</Box>\n\n <div>Entire position</div>\n </Flex>\n {typeof tpPrice === \"number\" ? (\n <Flex>\n <Box grow>TP Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n 52.32\n </Text.numeral>\n </Flex>\n ) : null}\n\n <Flex>\n <Box grow>SL Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n 52.32\n </Text.numeral>\n </Flex>\n <Flex>\n <Box grow>Price</Box>\n <div>Market</div>\n </Flex>\n </Flex>\n <Box py={2}>\n <Flex gap={1}>\n <Checkbox id=\"disabledConfirm\" />\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","import {\n CaretDownIcon,\n Input,\n MenuItem,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\n\nexport type PNLInputProps = PNLInputState & { testId?: string; quote: string };\n\nexport const PNLInput = (props: PNLInputProps) => {\n const { mode, modes, onModeChange, onValueChange, quote, quote_db, value } =\n props;\n return (\n <Input\n prefix={mode}\n size={\"md\"}\n placeholder={mode === PnLMode.PERCENTAGE ? \"%\" : quote}\n align={\"right\"}\n value={value}\n data-testid={props.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[props.formatter({ dp: quote_db, mode })]}\n // value={props.value}\n suffix={\n <PNLMenus\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\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 } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { commify, Decimal } 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 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 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 if (value === \"\") return value;\n\n if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n return commify(value);\n }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(value).mul(100).todp(2, 4).toString()}${\n percentageSuffix.current\n }`;\n // return (Number(value) * 100).toFixed(2);\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = new Decimal(value).div(100).todp(4, 4).toString();\n }\n } else {\n // value = todpIfNeed(value, quote_dp);\n }\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n value,\n onValueChange,\n quote_db: props.quote_dp,\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 { Button, Text } from \"@orderly.network/ui\";\nimport { NumeralWithCtx } from \"./numeralWithCtx\";\nimport { PriceInput } from \"./priceInput\";\nimport { QuantityInput } from \"./quantityInput\";\nimport { Decimal } from \"@orderly.network/utils\";\n\nexport const renderQuantity = (value: number, record: any) => {\n return (\n <Text.numeral dp={record?.symbolInfo?.(\"base_dp\")} rm={Decimal.ROUND_DOWN} padding={false} coloring>\n {value}\n </Text.numeral>\n );\n};\n\nexport const renderQuantityInput = (value: number, record: any) => {\n return <QuantityInput value={record[\"position_qty\"]} />;\n};\n\nexport const renderPriceInput = (value: number) => {\n return <PriceInput />;\n};\n","import {\n CaretDownIcon,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Input,\n inputFormatter,\n} from \"@orderly.network/ui\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { useState } from \"react\";\nimport { OrderType } from \"@orderly.network/types\";\n\nexport const PriceInput = () => {\n const { type, quoteDp, price, updatePriceChange, updateOrderType, position } =\n usePositionsRowContext();\n\n return (\n <DropdownMenuRoot>\n <Input\n size=\"sm\"\n value={type === OrderType.LIMIT ? price : \"Market\"}\n onValueChange={(e) => updatePriceChange(e)}\n formatters={[\n inputFormatter.numberFormatter,\n ...(quoteDp ? [inputFormatter.dpFormatter(quoteDp)] : []),\n ]}\n onFocus={(e) => {\n if (type === OrderType.MARKET) {\n updateOrderType(OrderType.LIMIT, `${position.mark_price}`);\n }\n }}\n suffix={\n <DropdownMenuTrigger asChild>\n <button className=\"oui-px-1 oui-h-full\">\n <CaretDownIcon size={12} color=\"white\" />\n </button>\n </DropdownMenuTrigger>\n }\n />\n <DropdownMenuContent\n align=\"end\"\n className=\"oui-w-[96px] oui-min-w-[96px]\"\n >\n <DropdownMenuGroup>\n <DropdownMenuItem\n size=\"xs\"\n onSelect={(vent) => {\n updateOrderType(OrderType.MARKET);\n }}\n >\n <span>Market</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenuRoot>\n );\n};\n","import {\n PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n Flex,\n Text,\n Slider,\n Button,\n inputFormatter,\n} from \"@orderly.network/ui\";\nimport { Input } from \"@orderly.network/ui\";\nimport { useEffect, useState } from \"react\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { OrderType } from \"@orderly.network/types\";\n\nexport const QuantityInput = (props: { value: number }) => {\n // const [quantity, setQuantity] = useState(`${props.value}`);\n const [open, setOpen] = useState(false);\n const [sliderValue, setSliderValue] = useState<number>(100);\n const {\n baseDp,\n quoteDp,\n updateQuantity: setQuantity,\n quantity,\n type,\n } = usePositionsRowContext();\n\n useEffect(() => {\n // when click the outside of the popover, close the popover\n const handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (!target.closest(\"[data-popover-root]\")) {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"click\", handleClick);\n\n return () => {\n document.removeEventListener(\"click\", handleClick);\n };\n }, []);\n\n const resetQuantity = (percent: number) => {\n setQuantity(`${props.value * (percent / 100)}`);\n };\n\n return (\n <PopoverRoot>\n <PopoverTrigger>\n <Input\n size=\"sm\"\n onFocus={() => {\n setOpen(true);\n }}\n formatters={[\n inputFormatter.numberFormatter,\n ...(baseDp ? [inputFormatter.dpFormatter(baseDp)] : []),\n ]}\n value={quantity}\n onValueChange={(e) => {\n setQuantity(e);\n if (type === OrderType.LIMIT) {\n const value = new Decimal(e)\n .div(props.value)\n .mul(100)\n .abs()\n .toFixed(0, Decimal.ROUND_DOWN);\n console.log(\"xxxxxx value\", value);\n \n setSliderValue(Math.min(100, Number(value)));\n }\n }}\n />\n </PopoverTrigger>\n <PopoverContent\n className=\"oui-w-[360px] oui-rounded-xl\"\n align=\"start\"\n side=\"bottom\"\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n <Flex p={1} gap={2} width={\"100%\"} itemAlign={\"start\"}>\n <Text size=\"xs\" intensity={98} className=\"oui-min-w-[30px]\">\n {`${sliderValue}%`}\n </Text>\n <Flex direction={\"column\"} width={\"100%\"} gap={2}>\n <Slider\n markCount={4}\n value={[sliderValue]}\n onValueChange={(e) => {\n const values = Array.from(e.values());\n setSliderValue(values[0]);\n resetQuantity(values[0]);\n }}\n />\n <Buttons\n onClick={(value) => {\n setSliderValue(value * 100);\n resetQuantity(value * 100);\n }}\n />\n </Flex>\n </Flex>\n </PopoverContent>\n </PopoverRoot>\n );\n};\n\nconst Buttons = (props: { onClick: (value: number) => void }) => {\n const list = [\n {\n label: \"0%\",\n value: 0,\n },\n {\n label: \"25%\",\n value: 0.25,\n },\n {\n label: \"50%\",\n value: 0.5,\n },\n {\n label: \"75%\",\n value: 0.75,\n },\n {\n label: \"Max\",\n value: 1,\n },\n ];\n\n return (\n <Flex gap={2} width={\"100%\"}>\n {list.map((item, index) => {\n return (\n <Button\n key={index}\n variant=\"outlined\"\n color=\"secondary\"\n size=\"xs\"\n onClick={(e) => {\n e.stopPropagation();\n props.onClick(item.value);\n }}\n className=\"oui-w-1/5\"\n >\n {item.label}\n </Button>\n );\n })}\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { Flex, modal, Text, ShareIcon } from \"@orderly.network/ui\";\nimport { SharePnLDialogId } from \"@orderly.network/ui-share\";\nimport { ShareButtonState } from \"./shareButton.script\";\nimport React from \"react\";\n\nexport const ShareButton: FC<ShareButtonState> = (props) => {\n return (\n <button\n type=\"button\"\n onClick={(e: any) => {\n e.stopPropagation();\n modal.show(SharePnLDialogId, {\n pnl: {\n position: props.position,\n refCode: props.refCode,\n leverage: props.leverage,\n ...props.sharePnLConfig\n\n },\n });\n }}\n >\n <ShareIcon color=\"white\" size={16} />\n </button>\n );\n};\n","import { useReferralInfo, useSymbolLeverage } from \"@orderly.network/hooks\";\nimport { SharePnLConfig, SharePnLParams } from \"@orderly.network/ui-share\";\nimport { useMemo } from \"react\";\n\nexport const useShareButtonScript = (props: {\n position: any;\n sharePnLConfig?: SharePnLConfig &\n Partial<Omit<SharePnLParams, \"position\" | \"refCode\" | \"leverage\">>;\n}) => {\n const { sharePnLConfig, position } = props;\n const { getFirstRefCode } = useReferralInfo();\n const refCode = useMemo(() => {\n return getFirstRefCode()?.code;\n }, [getFirstRefCode]);\n const leverage = useSymbolLeverage(props.position.symbol);\n return {\n position,\n refCode,\n leverage,\n sharePnLConfig,\n };\n};\n\nexport type ShareButtonState = ReturnType<typeof useShareButtonScript>;\n","import { PositionsProps } from \"../../types/types\";\nimport { useShareButtonScript } from \"./shareButton.script\";\nimport { ShareButton } from \"./shareButton.ui\";\nimport { SharePnLConfig, SharePnLParams } from \"@orderly.network/ui-share\";\n\nexport const ShareButtonWidget = (props: {\n position: any;\n sharePnLConfig?: SharePnLConfig & Partial<Omit<PositionsProps, 'position' | 'refCode' | 'leverage'>>;\n}) => {\n const state = useShareButtonScript(props);\n return (<ShareButton {...state} />);\n};\n","import { FC, useMemo } from \"react\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { AlgoOrderType, API, OrderSide } from \"@orderly.network/types\";\nimport { useSymbolsInfo, utils } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text, Tooltip } from \"@orderly.network/ui\";\n\nexport const TriggerPrice: FC<{\n stopLossPrice?: number;\n takeProfitPrice?: number;\n}> = (props) => {\n const { stopLossPrice, takeProfitPrice } = props;\n const { tpslOrder, position } = usePositionsRowContext();\n\n return (\n <TPSLTriggerPrice\n stopLossPrice={stopLossPrice}\n takeProfitPrice={takeProfitPrice}\n direction={\"column\"}\n order={tpslOrder}\n position={position}\n tooltip\n />\n );\n};\n\n\nexport const TriggerPriceItem: FC<{\n qty: number;\n price: number;\n entryPrice: number;\n orderSide: OrderSide;\n orderType: AlgoOrderType;\n symbolInfo: API.SymbolExt;\n}> = (props) => {\n const { qty, price, entryPrice, orderSide, orderType, symbolInfo } = props;\n const pnl = utils.priceToPnl(\n {\n qty,\n price,\n entryPrice,\n orderSide,\n orderType,\n },\n {\n symbol: symbolInfo,\n }\n );\n\n const type = orderType === AlgoOrderType.TAKE_PROFIT ? \"TP\" : \"SL\";\n\n return (\n <Flex >\n <Text intensity={54} className=\"oui-mr-1\">{`${type} PnL:`}</Text>\n <Text.formatted\n rule=\"price\"\n className={\n pnl === 0\n ? \"oui-text-base-contrast-36\"\n : pnl > 0\n ? \"oui-text-trade-profit oui-gap-0\"\n : \"oui-text-trade-loss oui-gap-0\"\n }\n prefix={\n (<Text>{pnl === 0 ? \"\" : pnl > 0 ? \"+\" : \"-\"}</Text>)\n }\n suffix={\n <Text intensity={36} className=\"oui-ml-1\">\n USDC\n </Text>\n }\n >{`${Math.abs(pnl)}`}</Text.formatted>\n </Flex>\n );\n};\n\n\nexport const TPSLTriggerPrice: FC<{\n takeProfitPrice: number | undefined;\n stopLossPrice: number | undefined;\n className?: string;\n direction?: \"row\" | \"column\";\n tooltip?: boolean;\n order?: API.AlgoOrder;\n position?: API.PositionTPSLExt;\n}> = (props) => {\n const { direction = \"row\", order, position } = props;\n // const symbolInfo = useSymbolsInfo()[position?.symbol ?? \"\"]();\n const symbolInfo = useSymbolsInfo();\n\n const pnl = useMemo(() => {\n const msgs = [];\n\n if (!props.tooltip || !order || !position) return;\n\n let quantity = order.quantity;\n\n if (quantity === 0) {\n if (order.child_orders[0].type === \"CLOSE_POSITION\") {\n quantity = position.position_qty;\n }\n }\n\n if (!!props.takeProfitPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"tp\"}\n qty={quantity}\n price={props.takeProfitPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.TAKE_PROFIT}\n symbolInfo={symbolInfo[order.symbol]()}\n />\n );\n }\n\n if (!!props.stopLossPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"sl\"}\n qty={quantity}\n price={props.stopLossPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.STOP_LOSS}\n symbolInfo={symbolInfo[order.symbol]()}\n />\n );\n }\n\n return <div>{msgs}</div>;\n }, [\n props.takeProfitPrice,\n props.stopLossPrice,\n position?.average_open_price,\n order?.side,\n order?.quantity,\n order?.algo_type,\n ]);\n\n const child = useMemo(() => {\n const children = [];\n\n if (!order?.symbol) return <span>-</span>;\n if (props.takeProfitPrice) {\n children.push(\n <Text.formatted\n className={cn(\n \"oui-text-trade-profit oui-gap-0 oui-decoration-white/20\"\n )}\n key={\"tp\"}\n rule=\"price\"\n precision={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.takeProfitPrice}\n prefix={\n !props.stopLossPrice || direction === \"column\" ? (\n <Text intensity={54}>\n TP&nbsp;-&nbsp;\n </Text>\n ) : (\n \"\"\n )\n }\n />\n );\n }\n if (props.stopLossPrice) {\n children.push(\n <Text.formatted\n key={\"sl\"}\n className={cn(\n \"oui-text-trade-loss oui-gap-0 oui-decoration-white/20 \"\n )}\n rule={\"price\"}\n precision={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.stopLossPrice}\n prefix={\n !props.takeProfitPrice || direction === \"column\" ? (\n <Text intensity={54} >\n SL&nbsp;-&nbsp;\n </Text>\n ) : (\n \"\"\n )\n }\n />\n );\n }\n\n if (children.length === 0) return <Text>-</Text>;\n\n if (children.length === 2 && direction === \"row\") {\n children.splice(1, 0, <Text key={\"split\"}>/</Text>);\n }\n\n return children;\n }, [props.takeProfitPrice, props.stopLossPrice, order?.symbol]);\n\n const content = (\n <div\n className={cn(\n \"oui-inline-flex oui-text-base-contrast-36\",\n props.direction === \"column\"\n ? \"oui-flex-col\"\n : \"oui-flex-row oui-gap-1\",\n props.className\n )}\n >\n {child}\n </div>\n );\n\n if (props.tooltip) {\n return <Tooltip content={pnl}>{content}</Tooltip>;\n }\n\n return content;\n};","import { usePositionStream } from \"@orderly.network/hooks\";\n\nexport const usePositionsBuilder = () => {\n const [data, info, { isLoading }] = usePositionStream();\n return {\n dataSource: data?.rows,\n isLoading,\n };\n};\n\nexport type PositionsBuilderState = ReturnType<typeof usePositionsBuilder>;\n","import { PositionsProps } from \"../types/types\";\nimport { Positions } from \"./positions.ui\";\nimport { usePositionsBuilder } from \"./usePositionsBuilder.script\";\n\nexport const PositionsWidget = (props: PositionsProps) => {\n const state = usePositionsBuilder();\n return (\n <Positions\n {...state}\n pnlNotionalDecimalPrecision={props.pnlNotionalDecimalPrecision}\n sharePnLConfig={props.sharePnLConfig}\n />\n );\n};\n","import {\n useLocalStorage,\n useSymbolsInfo,\n useTPSLOrder,\n} from \"@orderly.network/hooks\";\nimport { AlgoOrderRootType, AlgoOrderType, API } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\n\nexport type TPSLBuilderOptions = {\n position: API.Position;\n order?: API.AlgoOrder;\n\n /**\n * either show the confirm dialog or not,\n * if the Promise reject or return false, cancel the sumbit action\n */\n onConfirm?: () => Promise<boolean>;\n};\n\nexport const useTPSLBuilder = (options: TPSLBuilderOptions) => {\n const { position, order } = options;\n const isEditing = !!order;\n const symbol = isEditing ? order.symbol : position.symbol;\n const symbolInfo = useSymbolsInfo();\n\n const [tpslOrder, { submit, setValue, validate, errors }] = useTPSLOrder(\n {\n symbol,\n position_qty: position.position_qty,\n average_open_price: position.average_open_price,\n },\n {\n defaultOrder: order,\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(() => position.position_qty, [position.position_qty]);\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 }\n\n if (order) {\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 ]);\n\n const valid = useMemo(() => {\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;\n }, [tpslOrder.quantity, maxQty, dirty]);\n\n const onSubmit = async () => {\n console.log(\"submitting\", typeof options.onConfirm);\n\n return Promise.resolve()\n .then(() => {\n if (typeof options.onConfirm !== \"function\") {\n return true;\n }\n return options.onConfirm();\n })\n .then((isConfirm) => {\n if (isConfirm) {\n return submit();\n }\n // return;\n });\n };\n\n return {\n isEditing,\n symbolInfo: symbolInfo[symbol],\n maxQty,\n setQuantity,\n orderQuantity: tpslOrder.quantity,\n isPosition: tpslOrder.quantity === position.position_qty,\n\n TPSL_OrderEntity: tpslOrder,\n setOrderValue: setValue,\n setPnL,\n setOrderPrice,\n // needConfirm,\n onSubmit,\n valid,\n } as const;\n};\n\nexport type TPSLBuilderState = ReturnType<typeof useTPSLBuilder>;\n","import { TPSL, TPSLProps } from \"./tpsl.ui\";\nimport { TPSLBuilderOptions, useTPSLBuilder } from \"./useTPSL.script\";\n\nexport type TPSLWidgetProps = {} & TPSLBuilderOptions & TPSLProps;\n\nexport const TPSLWidget = (props: TPSLWidgetProps) => {\n const { onCancel, ...rest } = props;\n const state = useTPSLBuilder(rest);\n return <TPSL {...state} onCancel={onCancel} />;\n};\n","import { modal, SimpleDialog } from \"@orderly.network/ui\";\nimport { TPSLWidget, TPSLWidgetProps } from \"../tpsl.widget\";\nimport { TPSLEditorBuilderState } from \"./tpslDialog.script\";\nimport { PositionTPSLConfirm } from \"../tpsl.ui\";\n\ntype Props = {\n // onConfirm: () => Promise<boolean>;\n} & TPSLWidgetProps &\n TPSLEditorBuilderState;\n\nexport const TPSLDialog = (props: Props) => {\n const { open, needConfirm, ...rest } = props;\n // const\n return (\n <>\n <SimpleDialog open={open}>\n <TPSLWidget\n {...rest}\n onConfirm={() => {\n console.log(\"onConfirm ********\", needConfirm);\n\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n return modal.confirm({\n content: (\n <PositionTPSLConfirm\n symbol={\"PERP_ETH_USDC\"}\n isPosition={false}\n qty={0}\n />\n ),\n });\n }}\n />\n </SimpleDialog>\n {/* <SimpleDialog>\n <PositionTPSLConfirm\n symbol={\"PERP_ETH_USDC\"}\n isPosition={false}\n qty={0}\n />\n </SimpleDialog> */}\n </>\n );\n};\n","import { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useState } from \"react\";\n\nexport const useTPSLEditorBuilder = (props?: {\n // confirmContent:\n}) => {\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n\n const [open, setOpen] = useState(false);\n\n return {\n open,\n needConfirm,\n };\n};\n\nexport type TPSLEditorBuilderState = ReturnType<typeof useTPSLEditorBuilder>;\n","import { TPSLDialog } from \"./tpslDialog.ui\";\nimport { useTPSLEditorBuilder } from \"./tpslDialog.script\";\nimport { TPSLWidgetProps } from \"../tpsl.widget\";\n\nexport const TPSLEditorWidget = (props: TPSLWidgetProps) => {\n const state = useTPSLEditorBuilder();\n return <TPSLDialog {...props} {...state} />;\n};\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,13 @@
1
+ import { registerSimpleDialog, Flex, Text, textVariants, Box, Badge, Divider, Checkbox, CloseIcon, Button, Grid, Input, inputFormatter, cn, Slider, DataTable, SimpleDialog, modal, Popover, SimpleDropdownMenu, CaretDownIcon, Tooltip, toast, DropdownMenuRoot, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, PopoverRoot, PopoverTrigger, PopoverContent, ShareIcon } from '@orderly.network/ui';
2
+ import { AlgoOrderRootType, AlgoOrderType, OrderSide, OrderType } from '@orderly.network/types';
3
+ import { createContext, useRef, useMemo, useState, useEffect, useContext } from 'react';
4
+ import { usePositionStream, useSymbolsInfo, useTPSLOrder, useLocalStorage, useOrderEntry, useReferralInfo, useSymbolLeverage, utils } from '@orderly.network/hooks';
5
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
+ import { commifyOptional, Decimal, commify } from '@orderly.network/utils';
7
+ import { SharePnLDialogId } from '@orderly.network/ui-share';
8
+
9
+ var fe=createContext({}),O=()=>useContext(fe),Pe=e=>{let[t,o]=useState(Math.abs(e.position.position_qty).toString());useEffect(()=>{o(Math.abs(e.position.position_qty).toString());},[e.position.position_qty]);let[i,r]=useState(""),[s,a]=useState(e.position.position_qty>0?OrderSide.SELL:OrderSide.BUY),[u,l]=useState(OrderType.MARKET),x=useSymbolsInfo(),F=e.position.symbol,m=x?.[F],y=m("quote_dp"),p=m("base_dp"),{helper:g,onSubmit:k,submitting:$}=useOrderEntry(e.position?.symbol,s,!0),U=(S,I)=>{if(l(S),S===OrderType.LIMIT){if(!I)throw new Error("price is required");r(I);}else r("");},b=useMemo(()=>{let{position:S}=e;if(!S)return null;let I={order_quantity:t,symbol:e.position.symbol,order_type:u,side:s,reduce_only:!0};return u===OrderType.LIMIT&&(I.order_price=i),I},[e.position,i,u,t]),C=S=>{let I=g.calculate({},"order_quantity",S);o(I.order_quantity);},G=S=>{let I=g.calculate({},"order_price",S);r(I.order_price);},K=()=>k(b);return jsx(fe.Provider,{value:{quantity:t,price:i,type:u,side:s,position:e.position,updatePriceChange:G,updateQuantity:C,updateOrderType:U,tpslOrder:e.position.algo_order,onSubmit:K,submitting:$,closeOrderData:b,quoteDp:y,baseDp:p},children:e.children})};var ge=createContext({}),ye=()=>useContext(ge),xe=e=>{let t=useSymbolsInfo()[e.symbol];return jsx(ge.Provider,{value:{base_dp:t("base_dp"),quote_dp:t("quote_dp"),base_tick:t("base_tick"),base:t("base"),quote:t("quote"),symbol:e.symbol},children:e.children})};var Te=()=>{let[e,t]=useState(!1),{onSubmit:o,price:i,quantity:r,closeOrderData:s,type:a,submitting:u,quoteDp:l}=O(),{base:x,quote:F}=ye(),m=()=>o().then(g=>{t(!1);},g=>{typeof g=="string"?toast.error(g):toast.error(g.message);}),y=()=>{t(!1);},p=useMemo(()=>a===OrderType.MARKET?!r:!i||!r,[i,r,a]);return jsx(Popover,{open:e,onOpenChange:t,contentProps:{className:"oui-w-[360px] oui-px-5 oui-rounded-xl"},content:a===OrderType.MARKET?jsx(X,{base:x,quantity:r,onClose:y,onConfirm:m,submitting:u}):jsx(Lt,{base:x,quantity:r,price:i,onClose:y,onConfirm:m,submitting:u,quoteDp:l,order:s}),children:jsx(Button,{variant:"outlined",size:"sm",color:"secondary",disabled:p,onClick:g=>{g.stopPropagation();},children:"Close"})})},Le=e=>jsxs("div",{className:"oui-pb-3 oui-border-b oui-border-line-4 oui-relative oui-w-full",children:[jsx(Text,{size:"base",children:e.title}),jsx("button",{onClick:e.onClose,className:"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-54 hover:oui-text-base-contrast-80 oui-p-2",children:jsx(CloseIcon,{size:18,color:"white"})})]}),he=({onCancel:e,onConfirm:t,submitting:o})=>jsxs(Flex,{id:"oui-positions-confirm-footer",gap:2,width:"100%",className:"oui-mt-3 oui-pb-1",children:[jsx(Button,{id:"oui-positions-confirm-footer-cancel-button",color:"secondary",fullWidth:!0,onClick:e,size:"md",children:"Cancel"}),jsx(Button,{id:"oui-positions-confirm-footer-confirm-button",onClick:t,fullWidth:!0,loading:o,size:"md",children:"Confirm"})]}),Tt=e=>{let{quantity:t,price:o,quoteDp:i,side:r}=e;return jsxs(Flex,{direction:"column",gap:1,width:"100%",className:"oui-text-sm oui-text-base-contrast-54",py:5,children:[jsxs(Flex,{justify:"between",width:"100%",gap:1,children:[jsx(Text,{children:"Qty."}),jsx(Text,{color:r===OrderSide.BUY?"success":"danger",children:t})]}),jsxs(Flex,{justify:"between",width:"100%",gap:1,children:[jsx(Text,{children:"Price"}),jsx(Text.formatted,{intensity:98,suffix:jsx(Text,{intensity:54,children:"USDC"}),children:o})]}),jsxs(Flex,{justify:"between",width:"100%",gap:1,children:[jsx(Text,{children:"Total"}),jsx(Text.formatted,{intensity:98,suffix:jsx(Text,{intensity:54,children:"USDC"}),children:new Decimal(o).mul(t).toFixed(i,Decimal.ROUND_DOWN)})]})]})},X=e=>{let t=()=>{(e?.onClose??e.close)?.();};return jsxs(Flex,{direction:"column",children:[jsx(Le,{onClose:t,title:"Market Close"}),jsx(Text,{intensity:54,size:"sm",className:"oui-my-5",children:`You agree closing ${commifyOptional(e.quantity)} ${e.base} position at market price.`}),jsx(he,{onCancel:t,onConfirm:async()=>{await e.onConfirm?.(),t();},submitting:e.submitting})]})},Lt=e=>{let{order:t,quoteDp:o,quantity:i,price:r,submitting:s}=e,{side:a}=t,u=()=>{e.onClose();};return jsxs(Fragment,{children:[jsx(Le,{onClose:u,title:"Limit close"}),jsx(Text,{intensity:54,size:"sm",className:"oui-mt-5",children:`You agree closing ${commify(e.quantity)} ${e.base} position at limit price.`}),jsxs(Flex,{gap:2,mb:4,mt:5,justify:"between",children:[jsx(Text.formatted,{rule:"symbol",formatString:"base-type",size:"base",showIcon:!0,children:t.symbol}),jsxs(Flex,{gap:1,children:[jsx(Badge,{color:"neutural",size:"xs",children:"Limit"}),jsx(Badge,{color:a===OrderSide.BUY?"success":"danger",size:"xs",children:a===OrderSide.BUY?"Buy":"Sell"})]})]}),jsx(Divider,{className:"oui-w-full"}),jsx(Tt,{className:"oui-text-sm",price:r,quantity:i,side:t.side,quoteDp:o??2}),jsx(he,{onCancel:u,onConfirm:e.onConfirm,submitting:e.submitting})]})};var Ie=e=>{let{type:t,values:o}=e,[i,r]=useLocalStorage("TP/SL_Mode","Offset%"),s=useMemo(()=>{switch(i){case"Offset":return `${t.toLowerCase()}_offset`;case"Offset%":return `${t.toLowerCase()}_offset_percentage`;default:return `${t.toLowerCase()}_pnl`}},[i]),a=useMemo(()=>o[i],[o]),u=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"}],[]),l=useRef("");return {mode:i,modes:u,formatter:m=>{return {onRenderBefore:(p,g)=>p===""?p:i==="PnL"||i==="Offset"?commify(p):i==="Offset%"?`${new Decimal(p).mul(100).todp(2,4).toString()}${l.current}`:`${p}`,onSendBefore:p=>(i==="Offset%"&&p!==""&&(l.current=p.endsWith(".")?".":"",p=new Decimal(p).div(100).todp(4,4).toString()),p)}},onModeChange:m=>{r(m);},value:a,onValueChange:m=>{e.onChange(s,m);},quote_db:e.quote_dp}};var Oe=e=>{let{mode:t,modes:o,onModeChange:i,onValueChange:r,quote:s,quote_db:a,value:u}=e;return jsx(Input,{prefix:t,size:"md",placeholder:t==="Offset%"?"%":s,align:"right",value:u,"data-testid":e.testId,autoComplete:"off",onValueChange:r,formatters:[e.formatter({dp:a,mode:t})],suffix:jsx(Ft,{modes:o,onModeChange:l=>i(l.value)})})},Ft=e=>jsx(SimpleDropdownMenu,{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 j=e=>{let{testId:t,quote:o,...i}=e,r=Ie(i);return jsx(Oe,{...r,testId:t,quote:o})};var Ee=e=>{let{TPSL_OrderEntity:t,symbolInfo:o,onCancel:i,onComplete:r}=e;return jsxs("div",{id:"orderly-tp_sl-order-edit-content",children:[!e.isEditing&&jsx(Rt,{maxQty:e.maxQty,quantity:e.orderQuantity??e.maxQty,tick:o("base_tick"),onQuantityChange:e.setQuantity,quote:"BTC"}),jsx(Divider,{my:4,intensity:8}),jsx(At,{sl_pnl:t.sl_pnl,tp_pnl:t.tp_pnl,quote:o("quote"),quote_db:o("quote_dp"),onPriceChange:e.setOrderPrice,onPnLChange:e.setPnL,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:()=>{i?.();},children:"Cancel"}),jsx(Button,{size:"md","data-testid":"tpsl-confirm",disabled:!e.valid,onClick:()=>{e.onSubmit();},children:"Confirm"})]})]})},Rt=e=>{let t=e.quantity===e.maxQty,o=useRef(null),i=()=>{e.onQuantityChange?.(0),o.current?.focus(),setTimeout(()=>{o.current?.setSelectionRange(0,1);},0);};return jsxs(Fragment,{children:[jsxs(Flex,{gap:2,children:[jsx("div",{className:"oui-flex-1",children:jsx(Input,{ref:o,prefix:"Quantity",size:"md",align:"right",value:t?"":e.quantity,autoComplete:"off",formatters:[inputFormatter.numberFormatter,inputFormatter.currencyFormatter],onValueChange:r=>{e.onQuantityChange?.(r);},suffix:t?jsx("button",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",onClick:()=>{i();},children:"Entire position"}):jsx("span",{className:"oui-text-2xs oui-text-base-contrast-54 oui-px-3",children:e.quote})})}),jsx(Button,{onClick:()=>{let r=t?0:e.maxQty;e.onQuantityChange?.(r),r===0&&i();},variant:"outlined",size:"md",className:cn(t?"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20":"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.signle,{markCount:5,color:"primaryLight",max:e.maxQty,min:0,step:e.tick,value:e.quantity,onValueChange:r=>{e.onQuantityChange?.(r);}})}),jsxs(Flex,{justify:"between",children:[jsx(Text.numeral,{rule:"percentages",color:"primaryLight",size:"2xs",children:"0"}),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:"primaryLight",size:"2xs",children:"Max"})}),jsx(Text.numeral,{rule:"price",size:"2xs",intensity:54,tick:e.tick,children:e.maxQty})]})]})]})},At=e=>{let t=(o,i)=>{e.onPnLChange(o,i);};return jsxs(Fragment,{children:[jsxs("div",{children:[jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"sm",children:"Task profit"}),jsxs(Flex,{children:[jsx(Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsx(Text.numeral,{size:"2xs",coloring:!0,showIdentifier:!0,children:e.tp_pnl??"-"})]})]}),jsxs(Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsx(we,{type:"TP",value:e.tp_trigger_price,onValueChange:o=>{e.onPriceChange("tp_trigger_price",o);}}),jsx(j,{type:"TP",onChange:t,quote:e.quote,quote_dp:e.quote_db,values:e.tp_values})]})]}),jsxs("div",{children:[jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"sm",children:"Stop loss"}),jsxs(Flex,{children:[jsx(Text,{size:"2xs",intensity:36,children:"Est. PNL:"}),jsx(Text.numeral,{size:"2xs",coloring:!0,showIdentifier:!0,children:e.sl_pnl??"-"})]})]}),jsxs(Grid,{cols:2,gap:2,pt:2,pb:4,children:[jsx(we,{type:"SL",value:e.sl_trigger_price,onValueChange:o=>{e.onPriceChange("sl_trigger_price",o);}}),jsx(j,{type:"SL",onChange:t,quote:e.quote,quote_dp:e.quote_db,values:e.sl_values})]})]})]})},we=e=>jsx(Input,{prefix:`${e.type} price`,size:"md",placeholder:"USDC",align:"right",autoComplete:"off",value:e.value,onValueChange:e.onValueChange,formatters:[inputFormatter.numberFormatter,inputFormatter.currencyFormatter]}),De=()=>jsx(Button,{variant:"outlined",size:"sm",color:"secondary",children:"TP/SL"}),te=e=>{let{symbol:t,tpPrice:o,slPrice:i,qty:r}=e,s=textVariants({size:"xs",intensity:54});return jsxs(Fragment,{children:[jsxs(Flex,{pt:5,pb:4,children:[jsx(Box,{grow:!0,children:jsx(Text.formatted,{rule:"symbol",size:"base",showIcon:!0,as:"div",children:t})}),jsxs(Flex,{gap:1,children:[jsx(Badge,{size:"xs",color:"primaryLight",children:"Position"}),jsx(Badge,{size:"xs",color:"neutural",children:"TP/SL"})]})]}),jsx(Divider,{}),jsxs(Flex,{direction:"column",itemAlign:"stretch",gapY:1,pt:4,pb:5,className:s,children:[jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"Qty."}),jsx("div",{children:"Entire position"})]}),typeof o=="number"?jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"TP Price"}),jsx(Text.numeral,{as:"div",coloring:!0,unit:"USDC",size:"sm",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:"52.32"})]}):null,jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"SL Price"}),jsx(Text.numeral,{as:"div",coloring:!0,unit:"USDC",size:"sm",unitClassName:"oui-text-base-contrast-54 oui-ml-1",children:"52.32"})]}),jsxs(Flex,{children:[jsx(Box,{grow:!0,children:"Price"}),jsx("div",{children:"Market"})]})]}),jsx(Box,{py:2,children:jsxs(Flex,{gap:1,children:[jsx(Checkbox,{id:"disabledConfirm"}),jsx("label",{htmlFor:"disabledConfirm",className:textVariants({size:"xs",intensity:54,className:"oui-ml-1"}),children:"Disable order confirmation"})]})})]})};var ke=()=>{let{type:e,quoteDp:t,price:o,updatePriceChange:i,updateOrderType:r,position:s}=O();return jsxs(DropdownMenuRoot,{children:[jsx(Input,{size:"sm",value:e===OrderType.LIMIT?o:"Market",onValueChange:a=>i(a),formatters:[inputFormatter.numberFormatter,...t?[inputFormatter.dpFormatter(t)]:[]],onFocus:a=>{e===OrderType.MARKET&&r(OrderType.LIMIT,`${s.mark_price}`);},suffix:jsx(DropdownMenuTrigger,{asChild:!0,children:jsx("button",{className:"oui-px-1 oui-h-full",children:jsx(CaretDownIcon,{size:12,color:"white"})})})}),jsx(DropdownMenuContent,{align:"end",className:"oui-w-[96px] oui-min-w-[96px]",children:jsx(DropdownMenuGroup,{children:jsx(DropdownMenuItem,{size:"xs",onSelect:a=>{r(OrderType.MARKET);},children:jsx("span",{children:"Market"})})})})]})};var Qe=e=>{let[t,o]=useState(!1),[i,r]=useState(100),{baseDp:s,quoteDp:a,updateQuantity:u,quantity:l,type:x}=O();useEffect(()=>{let m=y=>{y.target.closest("[data-popover-root]")||o(!1);};return document.addEventListener("click",m),()=>{document.removeEventListener("click",m);}},[]);let F=m=>{u(`${e.value*(m/100)}`);};return jsxs(PopoverRoot,{children:[jsx(PopoverTrigger,{children:jsx(Input,{size:"sm",onFocus:()=>{o(!0);},formatters:[inputFormatter.numberFormatter,...s?[inputFormatter.dpFormatter(s)]:[]],value:l,onValueChange:m=>{if(u(m),x===OrderType.LIMIT){let y=new Decimal(m).div(e.value).mul(100).abs().toFixed(0,Decimal.ROUND_DOWN);r(Math.min(100,Number(y)));}}})}),jsx(PopoverContent,{className:"oui-w-[360px] oui-rounded-xl",align:"start",side:"bottom",onOpenAutoFocus:m=>{m.preventDefault();},children:jsxs(Flex,{p:1,gap:2,width:"100%",itemAlign:"start",children:[jsx(Text,{size:"xs",intensity:98,className:"oui-min-w-[30px]",children:`${i}%`}),jsxs(Flex,{direction:"column",width:"100%",gap:2,children:[jsx(Slider,{markCount:4,value:[i],onValueChange:m=>{let y=Array.from(m.values());r(y[0]),F(y[0]);}}),jsx(ro,{onClick:m=>{r(m*100),F(m*100);}})]})]})})]})},ro=e=>jsx(Flex,{gap:2,width:"100%",children:[{label:"0%",value:0},{label:"25%",value:.25},{label:"50%",value:.5},{label:"75%",value:.75},{label:"Max",value:1}].map((o,i)=>jsx(Button,{variant:"outlined",color:"secondary",size:"xs",onClick:r=>{r.stopPropagation(),e.onClick(o.value);},className:"oui-w-1/5",children:o.label},i))});var We=(e,t)=>jsx(Text.numeral,{dp:t?.symbolInfo?.("base_dp"),rm:Decimal.ROUND_DOWN,padding:!1,coloring:!0,children:e}),Ve=(e,t)=>jsx(Qe,{value:t.position_qty}),$e=e=>jsx(ke,{});var se=e=>jsx("button",{type:"button",onClick:t=>{t.stopPropagation(),modal.show(SharePnLDialogId,{pnl:{position:e.position,refCode:e.refCode,leverage:e.leverage,...e.sharePnLConfig}});},children:jsx(ShareIcon,{color:"white",size:16})});var Ge=e=>{let{sharePnLConfig:t,position:o}=e,{getFirstRefCode:i}=useReferralInfo(),r=useMemo(()=>i()?.code,[i]),s=useSymbolLeverage(e.position.symbol);return {position:o,refCode:r,leverage:s,sharePnLConfig:t}};var ae=e=>{let t=Ge(e);return jsx(se,{...t})};var He=e=>{let{stopLossPrice:t,takeProfitPrice:o}=e,{tpslOrder:i,position:r}=O();return jsx(xo,{stopLossPrice:t,takeProfitPrice:o,direction:"column",order:i,position:r,tooltip:!0})},Ye=e=>{let{qty:t,price:o,entryPrice:i,orderSide:r,orderType:s,symbolInfo:a}=e,u=utils.priceToPnl({qty:t,price:o,entryPrice:i,orderSide:r,orderType:s},{symbol:a}),l=s===AlgoOrderType.TAKE_PROFIT?"TP":"SL";return jsxs(Flex,{children:[jsx(Text,{intensity:54,className:"oui-mr-1",children:`${l} PnL:`}),jsx(Text.formatted,{rule:"price",className:u===0?"oui-text-base-contrast-36":u>0?"oui-text-trade-profit oui-gap-0":"oui-text-trade-loss oui-gap-0",prefix:jsx(Text,{children:u===0?"":u>0?"+":"-"}),suffix:jsx(Text,{intensity:36,className:"oui-ml-1",children:"USDC"}),children:`${Math.abs(u)}`})]})},xo=e=>{let{direction:t="row",order:o,position:i}=e,r=useSymbolsInfo(),s=useMemo(()=>{let l=[];if(!e.tooltip||!o||!i)return;let x=o.quantity;return x===0&&o.child_orders[0].type==="CLOSE_POSITION"&&(x=i.position_qty),e.takeProfitPrice&&l.push(jsx(Ye,{qty:x,price:e.takeProfitPrice,entryPrice:i.average_open_price,orderSide:o.side,orderType:AlgoOrderType.TAKE_PROFIT,symbolInfo:r[o.symbol]()},"tp")),e.stopLossPrice&&l.push(jsx(Ye,{qty:x,price:e.stopLossPrice,entryPrice:i.average_open_price,orderSide:o.side,orderType:AlgoOrderType.STOP_LOSS,symbolInfo:r[o.symbol]()},"sl")),jsx("div",{children:l})},[e.takeProfitPrice,e.stopLossPrice,i?.average_open_price,o?.side,o?.quantity,o?.algo_type]),a=useMemo(()=>{let l=[];return o?.symbol?(e.takeProfitPrice&&l.push(jsx(Text.formatted,{className:cn("oui-text-trade-profit oui-gap-0 oui-decoration-white/20"),rule:"price",precision:r[o.symbol]("quote_dp",2),children:e.takeProfitPrice,prefix:!e.stopLossPrice||t==="column"?jsx(Text,{intensity:54,children:"TP\xA0-\xA0"}):""},"tp")),e.stopLossPrice&&l.push(jsx(Text.formatted,{className:cn("oui-text-trade-loss oui-gap-0 oui-decoration-white/20 "),rule:"price",precision:r[o.symbol]("quote_dp",2),children:e.stopLossPrice,prefix:!e.takeProfitPrice||t==="column"?jsx(Text,{intensity:54,children:"SL\xA0-\xA0"}):""},"sl")),l.length===0?jsx(Text,{children:"-"}):(l.length===2&&t==="row"&&l.splice(1,0,jsx(Text,{children:"/"},"split")),l)):jsx("span",{children:"-"})},[e.takeProfitPrice,e.stopLossPrice,o?.symbol]),u=jsx("div",{className:cn("oui-inline-flex oui-text-base-contrast-36",e.direction==="column"?"oui-flex-col":"oui-flex-row oui-gap-1",e.className),children:a});return e.tooltip?jsx(Tooltip,{content:s,children:u}):u};var Xe=e=>{let{pnlNotionalDecimalPrecision:t,sharePnLConfig:o}=e;return useMemo(()=>[{title:"Instrument",dataIndex:"symbol",fixed:"left",width:120,onSort:(r,s,a)=>a==="asc"?r.symbol.localeCompare(s.symbol):s.symbol.localeCompare(r.symbol),render:r=>jsx(Text.formatted,{rule:"symbol",onClick:s=>{},children:r})},{title:"Quantity",dataIndex:"position_qty",onSort:!0,width:100,render:We},{title:"Avg. open",className:"orderly-h-[48px]",width:120,onSort:!0,dataIndex:"average_open_price",render:(r,s)=>jsx(Text.numeral,{dp:s?.symbolInfo?.("quote_dp"),rm:Decimal.ROUND_DOWN,children:r})},{title:"Mark price",dataIndex:"mark_price",width:120,onSort:!0,className:"orderly-h-[48px]",render:(r,s)=>jsx(Text.numeral,{dp:s?.symbolInfo?.("quote_dp"),rm:Decimal.ROUND_DOWN,children:r})},{title:"Liq. price",width:100,onSort:!0,hint:"Estimated price at which your position will be liquidated. Prices are estimated and depend on multiple factors across all positions.",dataIndex:"est_liq_price",render:(r,s)=>Number(r)===0?"--":jsx(Text.numeral,{dp:s?.symbolInfo?.("quote_dp"),rm:Decimal.ROUND_DOWN,children:r})},{title:"Unreal. PnL",dataIndex:"unrealized_pnl",width:150,onSort:!0,rule:"price",numeralProps:{coloring:!0},render:(r,s)=>jsxs(Flex,{gap:2,children:[jsxs(Flex,{children:[jsx(Text.numeral,{dp:e.pnlNotionalDecimalPrecision,rm:Decimal.ROUND_DOWN,coloring:!0,className:"orderly-font-semibold",children:r}),jsx(Text.numeral,{rule:"percentages",dp:e.pnlNotionalDecimalPrecision,rm:Decimal.ROUND_DOWN,coloring:!0,className:"orderly-font-semibold",prefix:"(",suffix:")",children:s.unrealized_pnl_ROI})]}),jsx(ae,{position:s,sharePnLConfig:e.sharePnLConfig})]})},{title:"TP/SL",dataIndex:"__",width:150,render:(r,s)=>jsx(He,{stopLossPrice:s.sl_trigger_price,takeProfitPrice:s.tp_trigger_price})},{title:"Est. total",dataIndex:"notional",className:"orderly-h-[48px]",width:100,onSort:!0},{title:"Margin",dataIndex:"mm",onSort:!0,width:100,rule:"price"},{title:"Qty.",dataIndex:"close_qty",width:100,fixed:"right",render:Ve},{title:"Price",dataIndex:"close_price",width:100,fixed:"right",render:$e},{title:"",dataIndex:"close_position",align:"right",width:160,fixed:"right",render:r=>jsxs("div",{className:"oui-flex oui-space-x-2",children:[jsx(Te,{}),jsx(De,{})]})}],[t,o])};var Ze=e=>{let{pnlNotionalDecimalPrecision:t,sharePnLConfig:o}=e,i=Xe({pnlNotionalDecimalPrecision:t,sharePnLConfig:o});return jsx("div",{children:jsx(DataTable,{loading:e.isLoading,id:"oui-desktop-positions-content",classNames:{header:"oui-text-base-contrast-36",body:"oui-text-base-contrast-80"},columns:i,bordered:!0,dataSource:e.dataSource,generatedRowKey:r=>r.symbol,renderRowContainer:(r,s,a)=>jsx(xe,{symbol:r.symbol,children:jsx(Pe,{position:r,children:a})})})})};var je=()=>{let[e,t,{isLoading:o}]=usePositionStream();return {dataSource:e?.rows,isLoading:o}};var To=e=>{let t=je();return jsx(Ze,{...t,pnlNotionalDecimalPrecision:e.pnlNotionalDecimalPrecision,sharePnLConfig:e.sharePnLConfig})};var ot=e=>{let{position:t,order:o}=e,i=!!o,r=i?o.symbol:t.symbol,s=useSymbolsInfo(),[a,{submit:u,setValue:l,validate:x,errors:F}]=useTPSLOrder({symbol:r,position_qty:t.position_qty,average_open_price:t.average_open_price},{defaultOrder:o}),m=b=>{l("quantity",b);},y=(b,C)=>{l(b,C);},p=(b,C)=>{l(b,C);},g=useMemo(()=>t.position_qty,[t.position_qty]),k=useMemo(()=>{let b=o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?g:o?.quantity,C=0;if(Number(a.quantity)!==b&&(C=1),o){let G=o.child_orders.find(S=>S.algo_type===AlgoOrderType.TAKE_PROFIT),K=o.child_orders.find(S=>S.algo_type===AlgoOrderType.STOP_LOSS);G?.trigger_price!==Number(a.tp_trigger_price)&&typeof typeof a.tp_trigger_price<"u"&&(C=2),K?.trigger_price!==Number(a.sl_trigger_price)&&typeof a.sl_trigger_price<"u"&&(C=3);}return C===1&&!a.tp_trigger_price&&!a.sl_trigger_price&&(C=-1),C},[a.tp_trigger_price,a.sl_trigger_price,a.quantity,o]),$=useMemo(()=>o?.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL&&Number(a.quantity)<g&&!a.tp_trigger_price&&!a.sl_trigger_price?!1:k>0&&!!a.quantity,[a.quantity,g,k]),U=async()=>Promise.resolve().then(()=>typeof e.onConfirm!="function"?!0:e.onConfirm()).then(b=>{if(b)return u()});return {isEditing:i,symbolInfo:s[r],maxQty:g,setQuantity:m,orderQuantity:a.quantity,isPosition:a.quantity===t.position_qty,TPSL_OrderEntity:a,setOrderValue:l,setPnL:p,setOrderPrice:y,onSubmit:U,valid:$}};var ce=e=>{let{onCancel:t,...o}=e,i=ot(o);return jsx(Ee,{...i,onCancel:t})};var rt=e=>{let{open:t,needConfirm:o,...i}=e;return jsx(Fragment,{children:jsx(SimpleDialog,{open:t,children:jsx(ce,{...i,onConfirm:()=>o?modal.confirm({content:jsx(te,{symbol:"PERP_ETH_USDC",isPosition:!1,qty:0})}):Promise.resolve(!0)})})})};var it=e=>{let[t,o]=useLocalStorage("orderly_order_confirm",!0),[i,r]=useState(!1);return {open:i,needConfirm:t}};var Bo=e=>{let t=it();return jsx(rt,{...e,...t})};var Mo="MarketCloseConfirmID";registerSimpleDialog(Mo,X,{size:"md",closable:!1});
10
+
11
+ export { Mo as MarketCloseConfirmID, te as PositionTPSLConfirm, To as PositionsWidget, Bo as TPSLEditorWidget, ce as TPSLWidget };
12
+ //# sourceMappingURL=out.js.map
13
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/closeButton.tsx","../src/components/positionRowContext.tsx","../src/providers/symbolProvider.tsx","../src/components/positions.ui.tsx","../src/components/useColumn.tsx","../src/components/tpsl/tpsl.ui.tsx","../src/components/tpsl/pnlInput/pnlInput.ui.tsx","../src/components/tpsl/pnlInput/useBuilder.script.ts","../src/components/tpsl/pnlInput/pnlInput.widget.tsx","../src/components/listElement.tsx","../src/components/priceInput.tsx","../src/components/quantityInput.tsx","../src/components/shareButton/shareButton.ui.tsx","../src/components/shareButton/shareButton.script.tsx","../src/components/shareButton/shareButton.widget.tsx","../src/components/triggerPrice.tsx","../src/components/usePositionsBuilder.script.ts","../src/components/positions.widget.tsx","../src/components/tpsl/useTPSL.script.ts","../src/components/tpsl/tpsl.widget.tsx","../src/components/tpsl/dialog/tpslDialog.ui.tsx","../src/components/tpsl/dialog/tpslDialog.script.ts","../src/components/tpsl/dialog/tpslDialog.widget.tsx"],"names":["registerSimpleDialog","Button","Popover","toast","Text","CloseIcon","Flex","Divider","Badge","OrderSide","OrderType","createContext","useContext","useEffect","useMemo","useState","useOrderEntry","useSymbolsInfo","jsx","PositionsRowContext","usePositionsRowContext","PositionsRowProvider","props","quantity","setQuantity","price","setPrice","side","setSide","type","setType","config","symbol","curSymbolInfo","quoteDp","baseDp","helper","onSubmit","submitting","updateOrderType","closeOrderData","position","data","onUpdateQuantity","value","newValues","onUpdatePrice","postOrder","SymbolContext","useSymbolContext","SymbolProvider","symbolInfo","commify","commifyOptional","Decimal","Fragment","jsxs","CloseButton","open","setOpen","base","quote","onConfirm","res","error","onClose","disabled","MarketCloseConfirm","LimitConfirmDialog","e","ConfirmHeader","ConfirmFooter","onCancel","OrderDetail","order","DataTable","useRef","Box","Grid","Input","Slider","textVariants","cn","inputFormatter","Checkbox","CaretDownIcon","SimpleDropdownMenu","useLocalStorage","usePNLInputBuilder","values","mode","setMode","key","modes","percentageSuffix","options","dp","PNLInput","onModeChange","onValueChange","quote_db","PNLMenus","item","PnlInputWidget","testId","rest","state","TPSL","TPSL_OrderEntity","onComplete","TPSLQuantity","TPSLPrice","isPosition","inputRef","setTPSL","qty","onPnLChange","PriceInput","TPSLButton","PositionTPSLConfirm","tpPrice","slPrice","textClassName","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuRoot","DropdownMenuTrigger","updatePriceChange","vent","PopoverRoot","PopoverContent","PopoverTrigger","QuantityInput","sliderValue","setSliderValue","handleClick","event","resetQuantity","percent","Buttons","index","renderQuantity","record","renderQuantityInput","renderPriceInput","modal","ShareIcon","SharePnLDialogId","ShareButton","useReferralInfo","useSymbolLeverage","useShareButtonScript","sharePnLConfig","getFirstRefCode","refCode","leverage","ShareButtonWidget","AlgoOrderType","utils","Tooltip","TriggerPrice","stopLossPrice","takeProfitPrice","tpslOrder","TPSLTriggerPrice","TriggerPriceItem","entryPrice","orderSide","orderType","pnl","direction","msgs","child","children","content","useColumn","pnlNotionalDecimalPrecision","r1","r2","sortOrder","_","Positions","column","usePositionStream","usePositionsBuilder","info","isLoading","PositionsWidget","useTPSLOrder","AlgoOrderRootType","useTPSLBuilder","isEditing","submit","setValue","validate","errors","setOrderPrice","name","setPnL","maxQty","dirty","diff","tp","o","sl","valid","isConfirm","TPSLWidget","SimpleDialog","TPSLDialog","needConfirm","useTPSLEditorBuilder","setNeedConfirm","TPSLEditorWidget","MarketCloseConfirmID"],"mappings":"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","sourcesContent":["import { registerSimpleDialog } from \"@orderly.network/ui\";\nimport { MarketCloseConfirm } from \"./components/closeButton\";\n\nexport { PositionsWidget } from \"./components/positions.widget\";\nexport { TPSLWidget } from \"./components/tpsl/tpsl.widget\";\nexport { TPSLEditorWidget } from \"./components/tpsl/dialog/tpslDialog.widget\";\nexport { PositionTPSLConfirm } from \"./components/tpsl/tpsl.ui\";\nexport type { PositionsProps } from \"./types/types\";\n\nexport const MarketCloseConfirmID = \"MarketCloseConfirmID\";\nregisterSimpleDialog(MarketCloseConfirmID, MarketCloseConfirm, {\n size: \"md\",\n closable: false,\n});\n","import {\n Button,\n Popover,\n toast,\n Text,\n CloseIcon,\n Flex,\n Box,\n Divider,\n cn,\n NumeralProps,\n Badge,\n} from \"@orderly.network/ui\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { useSymbolContext } from \"../providers/symbolProvider\";\nimport { FC, useMemo, useState } from \"react\";\nimport { OrderEntity, OrderSide, OrderType } from \"@orderly.network/types\";\nimport { commify, commifyOptional, Decimal } from \"@orderly.network/utils\";\nimport { TokenIcon } from \"@orderly.network/ui\";\n\nexport const CloseButton = () => {\n const [open, setOpen] = useState(false);\n const { onSubmit, price, quantity, closeOrderData, type, submitting, quoteDp } =\n usePositionsRowContext();\n\n const { base, quote } = useSymbolContext();\n\n const onConfirm = () => {\n return onSubmit().then(\n (res) => {\n setOpen(false);\n },\n (error: any) => {\n if (typeof error === \"string\") {\n toast.error(error);\n } else {\n toast.error(error.message);\n }\n }\n );\n };\n\n const onClose = () => {\n setOpen(false);\n };\n\n const disabled = useMemo(() => {\n if (type === OrderType.MARKET) {\n if (!quantity) {\n return true;\n }\n return false;\n }\n\n return !price || !quantity;\n }, [price, quantity, type]);\n return (\n <Popover\n open={open}\n onOpenChange={setOpen}\n contentProps={{\n className: \"oui-w-[360px] oui-px-5 oui-rounded-xl\",\n }}\n content={\n type === OrderType.MARKET ? (\n <MarketCloseConfirm\n base={base}\n quantity={quantity}\n onClose={onClose}\n onConfirm={onConfirm}\n submitting={submitting}\n />\n ) : (\n <LimitConfirmDialog\n base={base}\n quantity={quantity}\n price={price}\n onClose={onClose}\n onConfirm={onConfirm}\n submitting={submitting}\n quoteDp={quoteDp}\n order={closeOrderData}\n />\n )\n }\n >\n <Button\n variant=\"outlined\"\n size=\"sm\"\n color=\"secondary\"\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n Close\n </Button>\n </Popover>\n );\n};\n\nexport const ConfirmHeader: FC<{\n onClose: () => void;\n title: string;\n}> = (props) => {\n return (\n <div className=\"oui-pb-3 oui-border-b oui-border-line-4 oui-relative oui-w-full\">\n <Text size={\"base\"}>{props.title}</Text>\n <button\n onClick={props.onClose}\n className=\"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-54 hover:oui-text-base-contrast-80 oui-p-2\"\n >\n <CloseIcon size={18} color=\"white\" />\n </button>\n </div>\n );\n};\n\nexport const ConfirmFooter: FC<{\n onConfirm?: () => Promise<any>;\n onCancel?: () => void;\n submitting?: boolean;\n}> = ({ onCancel, onConfirm, submitting }) => {\n return (\n <Flex\n id=\"oui-positions-confirm-footer\"\n gap={2}\n width={\"100%\"}\n className=\"oui-mt-3 oui-pb-1\"\n >\n <Button\n id=\"oui-positions-confirm-footer-cancel-button\"\n color={\"secondary\"}\n fullWidth\n onClick={onCancel}\n size=\"md\"\n >\n Cancel\n </Button>\n <Button\n id=\"oui-positions-confirm-footer-confirm-button\"\n onClick={onConfirm}\n fullWidth\n loading={submitting}\n size=\"md\"\n >\n Confirm\n </Button>\n </Flex>\n );\n};\n\nexport const OrderDetail = (props: {\n quantity: any;\n price: any;\n side: OrderSide;\n quoteDp: number;\n className?: string;\n}) => {\n const { quantity, price, quoteDp, side } = props;\n \n\n return (\n <Flex\n direction={\"column\"}\n gap={1}\n width={\"100%\"}\n className=\"oui-text-sm oui-text-base-contrast-54\"\n py={5}\n >\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>Qty.</Text>\n <Text color={side === OrderSide.BUY ? \"success\" : \"danger\"}>\n {quantity}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>Price</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {price}\n </Text.formatted>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>Total</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {new Decimal(price).mul(quantity).toFixed(quoteDp, Decimal.ROUND_DOWN)}\n </Text.formatted>\n </Flex>\n </Flex>\n );\n};\n\nexport const MarketCloseConfirm: FC<{\n base?: string;\n quantity?: string;\n onClose?: () => void;\n close?: () => void;\n onConfirm?: () => Promise<any>;\n submitting?: boolean;\n}> = (props) => {\n console.log(\"props\", props);\n \n const onCancel = () => {\n const func = props?.onClose ?? props.close;\n console.log(\"xxxxxxxxxxx func is\", func);\n func?.();\n };\n return (\n <Flex direction={\"column\"}>\n <ConfirmHeader onClose={onCancel} title=\"Market Close\" />\n <Text intensity={54} size=\"sm\" className=\"oui-my-5\">\n {`You agree closing ${commifyOptional(props.quantity)} ${\n props.base\n } position at market price.`}\n </Text>\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={async () => {\n await props.onConfirm?.();\n onCancel();\n }}\n submitting={props.submitting}\n />\n </Flex>\n );\n};\n\nexport const LimitConfirmDialog: FC<{\n base: string;\n quantity: string;\n price: string;\n onClose: () => void;\n onConfirm: () => Promise<any>;\n order: OrderEntity;\n submitting: boolean;\n quoteDp?: number;\n}> = (props) => {\n const { order, quoteDp, quantity, price, submitting } = props;\n\n const { side } = order;\n const onCancel = () => {\n props.onClose();\n };\n return (\n <>\n <ConfirmHeader onClose={onCancel} title=\"Limit close\" />\n <Text intensity={54} size=\"sm\" className=\"oui-mt-5\">\n {`You agree closing ${commify(props.quantity)} ${\n props.base\n } position at limit price.`}\n </Text>\n\n <Flex gap={2} mb={4} mt={5} justify={\"between\"}>\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n >\n {order.symbol}\n </Text.formatted>\n <Flex gap={1}>\n <Badge color=\"neutural\" size=\"xs\">\n Limit\n </Badge>\n <Badge\n color={side === OrderSide.BUY ? \"success\" : \"danger\"}\n size=\"xs\"\n >\n {side === OrderSide.BUY ? \"Buy\" : \"Sell\"}\n </Badge>\n </Flex>\n </Flex>\n\n <Divider className=\"oui-w-full\" />\n\n <OrderDetail\n className=\"oui-text-sm\"\n price={price}\n quantity={quantity}\n side={order.side}\n quoteDp={quoteDp ?? 2}\n />\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={props.onConfirm}\n submitting={props.submitting}\n />\n </>\n );\n};\n\n","import { API, OrderEntity, OrderSide, OrderType } from \"@orderly.network/types\";\nimport {\n FC,\n PropsWithChildren,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { useOrderEntry, useSymbolsInfo } from \"@orderly.network/hooks\";\n\nexport interface PositionsRowContextState {\n quantity: string;\n price: string;\n type: OrderType;\n side: OrderSide;\n position: API.PositionExt | API.PositionTPSLExt;\n updateQuantity: (value: string) => void;\n updatePriceChange: (value: string) => void;\n\n updateOrderType: (value: OrderType, price?: string) => void;\n\n closeOrderData: any;\n\n onSubmit: () => Promise<any>;\n submitting: boolean;\n tpslOrder?: API.AlgoOrder;\n quoteDp?: number;\n baseDp?: number;\n}\n\nexport const PositionsRowContext = createContext(\n {} as PositionsRowContextState\n);\n\nexport const usePositionsRowContext = () => {\n return useContext(PositionsRowContext);\n};\n\nexport const PositionsRowProvider: FC<\n PropsWithChildren<{ position: API.PositionExt | API.PositionTPSLExt }>\n> = (props) => {\n const [quantity, setQuantity] = useState<string>(\n Math.abs(props.position.position_qty).toString()\n );\n\n useEffect(() => {\n setQuantity(Math.abs(props.position.position_qty).toString());\n }, [props.position.position_qty]);\n\n const [price, setPrice] = useState<string>(\"\");\n const [side, setSide] = useState<OrderSide>(\n props.position.position_qty > 0 ? OrderSide.SELL : OrderSide.BUY\n );\n\n const [type, setType] = useState<OrderType>(OrderType.MARKET);\n\n const config = useSymbolsInfo();\n const symbol = props.position.symbol;\n const curSymbolInfo = config?.[symbol];\n const quoteDp = curSymbolInfo(\"quote_dp\");\n const baseDp = curSymbolInfo(\"base_dp\");\n \n\n const { helper, onSubmit, submitting } = useOrderEntry(\n props.position?.symbol!,\n side,\n true\n );\n\n const updateOrderType = (type: OrderType, price?: string) => {\n setType(type);\n if (type === OrderType.LIMIT) {\n if (!price) {\n throw new Error(\"price is required\");\n }\n setPrice(price);\n } else {\n setPrice(\"\");\n }\n };\n\n const closeOrderData = useMemo(() => {\n const { position } = props;\n\n if (!position) return null;\n\n const data: any = {\n // order_price: undefined,\n order_quantity: quantity,\n symbol: props.position.symbol,\n order_type: type,\n side,\n reduce_only: true,\n };\n\n if (type === OrderType.LIMIT) {\n data.order_price = price;\n }\n\n return data;\n }, [props.position, price, type, quantity]);\n\n const onUpdateQuantity = (value: string) => {\n const newValues = helper.calculate(\n {},\n \"order_quantity\",\n value\n ) as OrderEntity;\n setQuantity(newValues[\"order_quantity\"] as string);\n };\n\n const onUpdatePrice = (value: string) => {\n const newValues = helper.calculate({}, \"order_price\", value) as OrderEntity;\n setPrice(newValues[\"order_price\"] as string);\n };\n\n const postOrder = () => {\n return onSubmit(closeOrderData);\n };\n\n return (\n <PositionsRowContext.Provider\n value={{\n quantity,\n price,\n type,\n side,\n position: props.position,\n updatePriceChange: onUpdatePrice,\n updateQuantity: onUpdateQuantity,\n updateOrderType,\n tpslOrder: (props.position as unknown as API.PositionTPSLExt)\n .algo_order,\n onSubmit: postOrder,\n submitting,\n closeOrderData,\n quoteDp,\n baseDp,\n }}\n >\n {props.children}\n </PositionsRowContext.Provider>\n );\n};\n","import { FC, PropsWithChildren, createContext, useContext } from \"react\";\nimport { useSymbolsInfo } from \"@orderly.network/hooks\";\n\ninterface SymbolContextState {\n base_dp: number;\n quote_dp: number;\n base_tick: number;\n base: string;\n quote: string;\n symbol: string;\n}\n\nexport const SymbolContext = createContext({} as SymbolContextState);\n\nexport const useSymbolContext = () => {\n return useContext(SymbolContext);\n};\n\ninterface FormatterProviderProps {\n symbol: string;\n}\n\nexport const SymbolProvider: FC<PropsWithChildren<FormatterProviderProps>> = (\n props\n) => {\n const symbolInfo = useSymbolsInfo()[props.symbol];\n\n return (\n <SymbolContext.Provider\n value={{\n base_dp: symbolInfo(\"base_dp\"),\n quote_dp: symbolInfo(\"quote_dp\"),\n base_tick: symbolInfo(\"base_tick\"),\n base: symbolInfo(\"base\"),\n quote: symbolInfo(\"quote\"),\n symbol: props.symbol,\n }}\n >\n {props.children}\n </SymbolContext.Provider>\n );\n};\n","import { DataTable } from \"@orderly.network/ui\";\nimport { useColumn } from \"./useColumn\";\nimport { API } from \"@orderly.network/types\";\nimport { PositionsBuilderState } from \"./usePositionsBuilder.script\";\nimport { PositionsRowProvider } from \"./positionRowContext\";\nimport { SymbolProvider } from \"../providers/symbolProvider\";\nimport { PositionsProps } from \"../types/types\";\n\nexport const Positions = (\n props: PositionsBuilderState & PositionsProps\n) => {\n const { pnlNotionalDecimalPrecision, sharePnLConfig } = props;\n const column = useColumn({\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n });\n return (\n <div>\n <DataTable<API.PositionTPSLExt>\n loading={props.isLoading}\n id=\"oui-desktop-positions-content\"\n classNames={{\n header: \"oui-text-base-contrast-36\",\n body: \"oui-text-base-contrast-80\",\n }}\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record) => record.symbol}\n renderRowContainer={(record, index, children) => {\n return (\n <SymbolProvider symbol={record.symbol}>\n <PositionsRowProvider position={record}>\n {children}\n </PositionsRowProvider>\n </SymbolProvider>\n );\n }}\n />\n </div>\n );\n};\n","import { Column, Flex, Text } from \"@orderly.network/ui\";\nimport { useMemo } from \"react\";\nimport { TPSLButton } from \"./tpsl/tpsl.ui\";\nimport {\n renderPriceInput,\n renderQuantity,\n renderQuantityInput,\n} from \"./listElement\";\nimport { CloseButton } from \"./closeButton\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { SharePnLConfig } from \"@orderly.network/ui-share\";\nimport { ShareButtonWidget } from \"./shareButton\";\nimport { API } from \"@orderly.network/types\";\nimport { TriggerPrice } from \"./triggerPrice\";\n\nexport const useColumn = (props: {\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const { pnlNotionalDecimalPrecision, sharePnLConfig } = props;\n const column = useMemo<Column<API.PositionTPSLExt>[]>(\n () => [\n {\n title: \"Instrument\",\n dataIndex: \"symbol\",\n fixed: \"left\",\n width: 120,\n onSort: (r1, r2, sortOrder) => {\n if (sortOrder === \"asc\") {\n return r1.symbol.localeCompare(r2.symbol);\n }\n return r2.symbol.localeCompare(r1.symbol);\n },\n render: (value: string) => (\n <Text.formatted\n rule={\"symbol\"}\n onClick={(e) => {\n // props.onSymbolChange?.({ symbol: value } as API.Symbol);\n // e.stopPropagation();\n // e.preventDefault();\n }}\n >\n {value}\n </Text.formatted>\n ),\n },\n {\n title: \"Quantity\",\n dataIndex: \"position_qty\",\n onSort: true,\n width: 100,\n // rule: \"price\",\n // numeralProps: {\n // coloring: true,\n // // tick: \"base_dp\",\n // },\n render: renderQuantity,\n // render: (value: string) => (\n // <NumeralWithCtx\n // coloring\n // className=\"orderly-font-semibold\"\n // tick=\"base_dp\"\n // >\n // {value}\n // </NumeralWithCtx>\n // ),\n },\n {\n title: \"Avg. open\",\n className: \"orderly-h-[48px]\",\n width: 120,\n onSort: true,\n dataIndex: \"average_open_price\",\n render: (value: string, record: any) => {\n return (\n <Text.numeral dp={record?.symbolInfo?.(\"quote_dp\")} rm={Decimal.ROUND_DOWN}>\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: \"Mark price\",\n dataIndex: \"mark_price\",\n width: 120,\n onSort: true,\n className: \"orderly-h-[48px]\",\n\n render: (value: string, record: any) => {\n return (\n <Text.numeral dp={record?.symbolInfo?.(\"quote_dp\")} rm={Decimal.ROUND_DOWN}>\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: \"Liq. price\",\n width: 100,\n onSort: true,\n hint: \"Estimated price at which your position will be liquidated. Prices are estimated and depend on multiple factors across all positions.\",\n dataIndex: \"est_liq_price\",\n render: (value: string, record: any) => {\n return Number(value) === 0 ? (\n \"--\"\n ) : (\n <Text.numeral dp={record?.symbolInfo?.(\"quote_dp\")} rm={Decimal.ROUND_DOWN}>\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: \"Unreal. PnL\",\n dataIndex: \"unrealized_pnl\",\n width: 150,\n onSort: true,\n rule: \"price\",\n numeralProps: {\n coloring: true,\n // tick: \"base_dp\",\n },\n // hint: (\n // <UnrealizedPnLPopoverCard\n // unPnlPriceBasis={props.unPnlPriceBasis}\n // setUnPnlPriceBasic={props.setUnPnlPriceBasic}\n // />\n // ),\n render: (value: string, record: any) => {\n return (\n <Flex gap={2}>\n <Flex>\n <Text.numeral\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"orderly-font-semibold\"\n >\n {value}\n </Text.numeral>\n <Text.numeral\n rule=\"percentages\"\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"orderly-font-semibold\"\n prefix=\"(\"\n suffix=\")\"\n >\n {record.unrealized_pnl_ROI}\n </Text.numeral>\n </Flex>\n <ShareButtonWidget\n position={record}\n sharePnLConfig={props.sharePnLConfig}\n />\n </Flex>\n );\n },\n },\n {\n title: \"TP/SL\",\n dataIndex: \"__\",\n width: 150,\n render: (_: string, record) => (\n <TriggerPrice\n stopLossPrice={record.sl_trigger_price}\n takeProfitPrice={record.tp_trigger_price}\n />\n ),\n },\n\n {\n title: \"Est. total\",\n dataIndex: \"notional\",\n className: \"orderly-h-[48px]\",\n width: 100,\n onSort: true,\n // render: (value: string) => (\n // <Numeral\n // precision={pnlNotionalDecimalPrecision}\n // className=\"orderly-font-semibold\"\n // >\n // {value}\n // </Numeral>\n // ),\n },\n {\n title: \"Margin\",\n dataIndex: \"mm\",\n onSort: true,\n width: 100,\n rule: \"price\",\n // render: (value: string) => (\n // <Numeral className=\"orderly-font-semibold\">{value}</Numeral>\n // ),\n // hint: (\n // <div>\n // <span>The minimum equity to keep your position. </span>\n // <Divider className=\"orderly-py-2 orderly-border-white/10\" />\n // <span>Margin = Position size * Mark price * MMR</span>\n // </div>\n // ),\n // hintClassName: \"orderly-p-2\",\n },\n {\n title: \"Qty.\",\n dataIndex: \"close_qty\",\n width: 100,\n fixed: \"right\",\n render: renderQuantityInput,\n },\n {\n title: \"Price\",\n dataIndex: \"close_price\",\n width: 100,\n fixed: \"right\",\n render: renderPriceInput,\n // render: (value: string) => <PriceInput />,\n },\n {\n title: \"\",\n dataIndex: \"close_position\",\n align: \"right\",\n width: 160,\n fixed: \"right\",\n render: (value: string) => {\n return (\n <div className=\"oui-flex oui-space-x-2\">\n <CloseButton />\n <TPSLButton />\n </div>\n );\n },\n },\n ],\n [pnlNotionalDecimalPrecision, sharePnLConfig]\n );\n\n return column;\n};\n","import { useRef } 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} from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { TPSLBuilderState } from \"./useTPSL.script\";\n\nimport { PNL_Values } from \"./pnlInput/useBuilder.script\";\n\nexport type TPSLProps = {\n onCancel?: () => void;\n onComplete?: () => void;\n};\n\nexport const TPSL = (props: TPSLBuilderState & TPSLProps) => {\n const { TPSL_OrderEntity, symbolInfo, onCancel, onComplete } = props;\n return (\n <div id=\"orderly-tp_sl-order-edit-content\">\n {!props.isEditing && (\n <TPSLQuantity\n maxQty={props.maxQty}\n quantity={(props.orderQuantity ?? props.maxQty) as number}\n tick={symbolInfo(\"base_tick\")}\n onQuantityChange={props.setQuantity}\n quote=\"BTC\"\n />\n )}\n\n <Divider my={4} intensity={8} />\n <TPSLPrice\n sl_pnl={TPSL_OrderEntity.sl_pnl}\n tp_pnl={TPSL_OrderEntity.tp_pnl}\n quote={symbolInfo(\"quote\")}\n quote_db={symbolInfo(\"quote_dp\")}\n onPriceChange={props.setOrderPrice}\n onPnLChange={props.setPnL}\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 <Button\n size={\"md\"}\n data-testid={\"tpsl-confirm\"}\n disabled={!props.valid}\n onClick={() => {\n // if (props.needConfirm) {\n // //show confirm dialog\n // } else {\n props.onSubmit();\n // }\n }}\n >\n Confirm\n </Button>\n </Grid>\n </div>\n );\n};\n\n// ------------- Quantity input start------------\nconst TPSLQuantity = (props: {\n maxQty: number;\n tick: number;\n quote: string;\n onQuantityChange?: (value: number | string) => void;\n quantity: number;\n setOrderValue?: (key: string, value: number | string) => void;\n}) => {\n const isPosition = props.quantity === props.maxQty;\n const inputRef = useRef<HTMLInputElement>(null);\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 return (\n <>\n <Flex gap={2}>\n <div className={\"oui-flex-1\"}>\n <Input\n ref={inputRef}\n prefix={\"Quantity\"}\n size={\"md\"}\n align=\"right\"\n value={isPosition ? \"\" : props.quantity}\n autoComplete=\"off\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\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 <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={\"md\"}\n className={cn(\n isPosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-border-line-12 oui-text-base-contrast-54 hover:oui-bg-base-5\"\n )}\n >\n Position\n </Button>\n </Flex>\n <Flex mt={2} itemAlign={\"center\"} height={\"15px\"}>\n <Slider.signle\n markCount={5}\n color=\"primaryLight\"\n max={props.maxQty}\n min={0}\n step={props.tick}\n value={props.quantity}\n onValueChange={(value) => {\n props.onQuantityChange?.(value);\n }}\n />\n </Flex>\n <Flex justify={\"between\"}>\n <Text.numeral rule={\"percentages\"} color={\"primaryLight\"} size={\"2xs\"}>\n 0\n </Text.numeral>\n <Flex itemAlign={\"center\"} gap={1}>\n <button\n className={\"oui-leading-none\"}\n style={{ lineHeight: 0 }}\n onClick={() => {\n console.log(\"maxQty\", props.maxQty);\n props.onQuantityChange?.(props.maxQty);\n }}\n >\n <Text color={\"primaryLight\"} size={\"2xs\"}>\n Max\n </Text>\n </button>\n <Text.numeral\n rule={\"price\"}\n size={\"2xs\"}\n intensity={54}\n tick={props.tick}\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_db?: 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}) => {\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\"}>Task profit</Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral size={\"2xs\"} coloring showIdentifier>\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 onValueChange={(value) => {\n props.onPriceChange(\"tp_trigger_price\", value);\n }}\n />\n <PnlInputWidget\n type={\"TP\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_db}\n values={props.tp_values}\n />\n </Grid>\n </div>\n <div>\n <Flex justify={\"between\"}>\n <Text size={\"sm\"}>Stop loss</Text>\n <Flex>\n <Text size={\"2xs\"} intensity={36}>\n Est. PNL:\n </Text>\n <Text.numeral size={\"2xs\"} coloring showIdentifier>\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 onValueChange={(value) => {\n props.onPriceChange(\"sl_trigger_price\", value);\n }}\n />\n <PnlInputWidget\n type={\"SL\"}\n onChange={onPnLChange}\n quote={props.quote}\n quote_dp={props.quote_db}\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 onValueChange: (value: string) => void;\n}) => {\n return (\n <Input\n prefix={`${props.type} price`}\n size={\"md\"}\n placeholder={\"USDC\"}\n align={\"right\"}\n autoComplete={\"off\"}\n value={props.value}\n onValueChange={props.onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n// ------------ TP/SL Price input end------------\n\nexport const TPSLButton = () => {\n return (\n <Button variant=\"outlined\" size=\"sm\" color=\"secondary\">\n TP/SL\n </Button>\n );\n};\n\nexport type PositionTPSLConfirmProps = {\n symbol: string;\n isPosition: boolean;\n qty: number;\n tpPrice?: number;\n slPrice?: number;\n // type\n};\n\n// ------------ Position TP/SL Confirm dialog start------------\nexport const PositionTPSLConfirm = (props: PositionTPSLConfirmProps) => {\n const { symbol, tpPrice, slPrice, qty } = props;\n const textClassName = textVariants({\n size: \"xs\",\n intensity: 54,\n });\n return (\n <>\n <Flex pt={5} pb={4}>\n <Box grow>\n <Text.formatted rule={\"symbol\"} size=\"base\" showIcon as=\"div\">\n {symbol}\n </Text.formatted>\n </Box>\n <Flex gap={1}>\n <Badge size=\"xs\" color={\"primaryLight\"}>\n Position\n </Badge>\n <Badge size=\"xs\" color=\"neutural\">\n TP/SL\n </Badge>\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={textClassName}\n >\n <Flex>\n <Box grow>Qty.</Box>\n\n <div>Entire position</div>\n </Flex>\n {typeof tpPrice === \"number\" ? (\n <Flex>\n <Box grow>TP Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n 52.32\n </Text.numeral>\n </Flex>\n ) : null}\n\n <Flex>\n <Box grow>SL Price</Box>\n <Text.numeral\n as={\"div\"}\n coloring\n unit={\"USDC\"}\n size={\"sm\"}\n unitClassName={\"oui-text-base-contrast-54 oui-ml-1\"}\n >\n 52.32\n </Text.numeral>\n </Flex>\n <Flex>\n <Box grow>Price</Box>\n <div>Market</div>\n </Flex>\n </Flex>\n <Box py={2}>\n <Flex gap={1}>\n <Checkbox id=\"disabledConfirm\" />\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","import {\n CaretDownIcon,\n Input,\n MenuItem,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\n\nexport type PNLInputProps = PNLInputState & { testId?: string; quote: string };\n\nexport const PNLInput = (props: PNLInputProps) => {\n const { mode, modes, onModeChange, onValueChange, quote, quote_db, value } =\n props;\n return (\n <Input\n prefix={mode}\n size={\"md\"}\n placeholder={mode === PnLMode.PERCENTAGE ? \"%\" : quote}\n align={\"right\"}\n value={value}\n data-testid={props.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[props.formatter({ dp: quote_db, mode })]}\n // value={props.value}\n suffix={\n <PNLMenus\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\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 } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { commify, Decimal } 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 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 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 if (value === \"\") return value;\n\n if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n return commify(value);\n }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(value).mul(100).todp(2, 4).toString()}${\n percentageSuffix.current\n }`;\n // return (Number(value) * 100).toFixed(2);\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = new Decimal(value).div(100).todp(4, 4).toString();\n }\n } else {\n // value = todpIfNeed(value, quote_dp);\n }\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n value,\n onValueChange,\n quote_db: props.quote_dp,\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 { Button, Text } from \"@orderly.network/ui\";\nimport { NumeralWithCtx } from \"./numeralWithCtx\";\nimport { PriceInput } from \"./priceInput\";\nimport { QuantityInput } from \"./quantityInput\";\nimport { Decimal } from \"@orderly.network/utils\";\n\nexport const renderQuantity = (value: number, record: any) => {\n return (\n <Text.numeral dp={record?.symbolInfo?.(\"base_dp\")} rm={Decimal.ROUND_DOWN} padding={false} coloring>\n {value}\n </Text.numeral>\n );\n};\n\nexport const renderQuantityInput = (value: number, record: any) => {\n return <QuantityInput value={record[\"position_qty\"]} />;\n};\n\nexport const renderPriceInput = (value: number) => {\n return <PriceInput />;\n};\n","import {\n CaretDownIcon,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Input,\n inputFormatter,\n} from \"@orderly.network/ui\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { useState } from \"react\";\nimport { OrderType } from \"@orderly.network/types\";\n\nexport const PriceInput = () => {\n const { type, quoteDp, price, updatePriceChange, updateOrderType, position } =\n usePositionsRowContext();\n\n return (\n <DropdownMenuRoot>\n <Input\n size=\"sm\"\n value={type === OrderType.LIMIT ? price : \"Market\"}\n onValueChange={(e) => updatePriceChange(e)}\n formatters={[\n inputFormatter.numberFormatter,\n ...(quoteDp ? [inputFormatter.dpFormatter(quoteDp)] : []),\n ]}\n onFocus={(e) => {\n if (type === OrderType.MARKET) {\n updateOrderType(OrderType.LIMIT, `${position.mark_price}`);\n }\n }}\n suffix={\n <DropdownMenuTrigger asChild>\n <button className=\"oui-px-1 oui-h-full\">\n <CaretDownIcon size={12} color=\"white\" />\n </button>\n </DropdownMenuTrigger>\n }\n />\n <DropdownMenuContent\n align=\"end\"\n className=\"oui-w-[96px] oui-min-w-[96px]\"\n >\n <DropdownMenuGroup>\n <DropdownMenuItem\n size=\"xs\"\n onSelect={(vent) => {\n updateOrderType(OrderType.MARKET);\n }}\n >\n <span>Market</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenuRoot>\n );\n};\n","import {\n PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n Flex,\n Text,\n Slider,\n Button,\n inputFormatter,\n} from \"@orderly.network/ui\";\nimport { Input } from \"@orderly.network/ui\";\nimport { useEffect, useState } from \"react\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { Decimal } from \"@orderly.network/utils\";\nimport { OrderType } from \"@orderly.network/types\";\n\nexport const QuantityInput = (props: { value: number }) => {\n // const [quantity, setQuantity] = useState(`${props.value}`);\n const [open, setOpen] = useState(false);\n const [sliderValue, setSliderValue] = useState<number>(100);\n const {\n baseDp,\n quoteDp,\n updateQuantity: setQuantity,\n quantity,\n type,\n } = usePositionsRowContext();\n\n useEffect(() => {\n // when click the outside of the popover, close the popover\n const handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (!target.closest(\"[data-popover-root]\")) {\n setOpen(false);\n }\n };\n\n document.addEventListener(\"click\", handleClick);\n\n return () => {\n document.removeEventListener(\"click\", handleClick);\n };\n }, []);\n\n const resetQuantity = (percent: number) => {\n setQuantity(`${props.value * (percent / 100)}`);\n };\n\n return (\n <PopoverRoot>\n <PopoverTrigger>\n <Input\n size=\"sm\"\n onFocus={() => {\n setOpen(true);\n }}\n formatters={[\n inputFormatter.numberFormatter,\n ...(baseDp ? [inputFormatter.dpFormatter(baseDp)] : []),\n ]}\n value={quantity}\n onValueChange={(e) => {\n setQuantity(e);\n if (type === OrderType.LIMIT) {\n const value = new Decimal(e)\n .div(props.value)\n .mul(100)\n .abs()\n .toFixed(0, Decimal.ROUND_DOWN);\n console.log(\"xxxxxx value\", value);\n \n setSliderValue(Math.min(100, Number(value)));\n }\n }}\n />\n </PopoverTrigger>\n <PopoverContent\n className=\"oui-w-[360px] oui-rounded-xl\"\n align=\"start\"\n side=\"bottom\"\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n <Flex p={1} gap={2} width={\"100%\"} itemAlign={\"start\"}>\n <Text size=\"xs\" intensity={98} className=\"oui-min-w-[30px]\">\n {`${sliderValue}%`}\n </Text>\n <Flex direction={\"column\"} width={\"100%\"} gap={2}>\n <Slider\n markCount={4}\n value={[sliderValue]}\n onValueChange={(e) => {\n const values = Array.from(e.values());\n setSliderValue(values[0]);\n resetQuantity(values[0]);\n }}\n />\n <Buttons\n onClick={(value) => {\n setSliderValue(value * 100);\n resetQuantity(value * 100);\n }}\n />\n </Flex>\n </Flex>\n </PopoverContent>\n </PopoverRoot>\n );\n};\n\nconst Buttons = (props: { onClick: (value: number) => void }) => {\n const list = [\n {\n label: \"0%\",\n value: 0,\n },\n {\n label: \"25%\",\n value: 0.25,\n },\n {\n label: \"50%\",\n value: 0.5,\n },\n {\n label: \"75%\",\n value: 0.75,\n },\n {\n label: \"Max\",\n value: 1,\n },\n ];\n\n return (\n <Flex gap={2} width={\"100%\"}>\n {list.map((item, index) => {\n return (\n <Button\n key={index}\n variant=\"outlined\"\n color=\"secondary\"\n size=\"xs\"\n onClick={(e) => {\n e.stopPropagation();\n props.onClick(item.value);\n }}\n className=\"oui-w-1/5\"\n >\n {item.label}\n </Button>\n );\n })}\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { Flex, modal, Text, ShareIcon } from \"@orderly.network/ui\";\nimport { SharePnLDialogId } from \"@orderly.network/ui-share\";\nimport { ShareButtonState } from \"./shareButton.script\";\nimport React from \"react\";\n\nexport const ShareButton: FC<ShareButtonState> = (props) => {\n return (\n <button\n type=\"button\"\n onClick={(e: any) => {\n e.stopPropagation();\n modal.show(SharePnLDialogId, {\n pnl: {\n position: props.position,\n refCode: props.refCode,\n leverage: props.leverage,\n ...props.sharePnLConfig\n\n },\n });\n }}\n >\n <ShareIcon color=\"white\" size={16} />\n </button>\n );\n};\n","import { useReferralInfo, useSymbolLeverage } from \"@orderly.network/hooks\";\nimport { SharePnLConfig, SharePnLParams } from \"@orderly.network/ui-share\";\nimport { useMemo } from \"react\";\n\nexport const useShareButtonScript = (props: {\n position: any;\n sharePnLConfig?: SharePnLConfig &\n Partial<Omit<SharePnLParams, \"position\" | \"refCode\" | \"leverage\">>;\n}) => {\n const { sharePnLConfig, position } = props;\n const { getFirstRefCode } = useReferralInfo();\n const refCode = useMemo(() => {\n return getFirstRefCode()?.code;\n }, [getFirstRefCode]);\n const leverage = useSymbolLeverage(props.position.symbol);\n return {\n position,\n refCode,\n leverage,\n sharePnLConfig,\n };\n};\n\nexport type ShareButtonState = ReturnType<typeof useShareButtonScript>;\n","import { PositionsProps } from \"../../types/types\";\nimport { useShareButtonScript } from \"./shareButton.script\";\nimport { ShareButton } from \"./shareButton.ui\";\nimport { SharePnLConfig, SharePnLParams } from \"@orderly.network/ui-share\";\n\nexport const ShareButtonWidget = (props: {\n position: any;\n sharePnLConfig?: SharePnLConfig & Partial<Omit<PositionsProps, 'position' | 'refCode' | 'leverage'>>;\n}) => {\n const state = useShareButtonScript(props);\n return (<ShareButton {...state} />);\n};\n","import { FC, useMemo } from \"react\";\nimport { usePositionsRowContext } from \"./positionRowContext\";\nimport { AlgoOrderType, API, OrderSide } from \"@orderly.network/types\";\nimport { useSymbolsInfo, utils } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text, Tooltip } from \"@orderly.network/ui\";\n\nexport const TriggerPrice: FC<{\n stopLossPrice?: number;\n takeProfitPrice?: number;\n}> = (props) => {\n const { stopLossPrice, takeProfitPrice } = props;\n const { tpslOrder, position } = usePositionsRowContext();\n\n return (\n <TPSLTriggerPrice\n stopLossPrice={stopLossPrice}\n takeProfitPrice={takeProfitPrice}\n direction={\"column\"}\n order={tpslOrder}\n position={position}\n tooltip\n />\n );\n};\n\n\nexport const TriggerPriceItem: FC<{\n qty: number;\n price: number;\n entryPrice: number;\n orderSide: OrderSide;\n orderType: AlgoOrderType;\n symbolInfo: API.SymbolExt;\n}> = (props) => {\n const { qty, price, entryPrice, orderSide, orderType, symbolInfo } = props;\n const pnl = utils.priceToPnl(\n {\n qty,\n price,\n entryPrice,\n orderSide,\n orderType,\n },\n {\n symbol: symbolInfo,\n }\n );\n\n const type = orderType === AlgoOrderType.TAKE_PROFIT ? \"TP\" : \"SL\";\n\n return (\n <Flex >\n <Text intensity={54} className=\"oui-mr-1\">{`${type} PnL:`}</Text>\n <Text.formatted\n rule=\"price\"\n className={\n pnl === 0\n ? \"oui-text-base-contrast-36\"\n : pnl > 0\n ? \"oui-text-trade-profit oui-gap-0\"\n : \"oui-text-trade-loss oui-gap-0\"\n }\n prefix={\n (<Text>{pnl === 0 ? \"\" : pnl > 0 ? \"+\" : \"-\"}</Text>)\n }\n suffix={\n <Text intensity={36} className=\"oui-ml-1\">\n USDC\n </Text>\n }\n >{`${Math.abs(pnl)}`}</Text.formatted>\n </Flex>\n );\n};\n\n\nexport const TPSLTriggerPrice: FC<{\n takeProfitPrice: number | undefined;\n stopLossPrice: number | undefined;\n className?: string;\n direction?: \"row\" | \"column\";\n tooltip?: boolean;\n order?: API.AlgoOrder;\n position?: API.PositionTPSLExt;\n}> = (props) => {\n const { direction = \"row\", order, position } = props;\n // const symbolInfo = useSymbolsInfo()[position?.symbol ?? \"\"]();\n const symbolInfo = useSymbolsInfo();\n\n const pnl = useMemo(() => {\n const msgs = [];\n\n if (!props.tooltip || !order || !position) return;\n\n let quantity = order.quantity;\n\n if (quantity === 0) {\n if (order.child_orders[0].type === \"CLOSE_POSITION\") {\n quantity = position.position_qty;\n }\n }\n\n if (!!props.takeProfitPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"tp\"}\n qty={quantity}\n price={props.takeProfitPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.TAKE_PROFIT}\n symbolInfo={symbolInfo[order.symbol]()}\n />\n );\n }\n\n if (!!props.stopLossPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"sl\"}\n qty={quantity}\n price={props.stopLossPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.STOP_LOSS}\n symbolInfo={symbolInfo[order.symbol]()}\n />\n );\n }\n\n return <div>{msgs}</div>;\n }, [\n props.takeProfitPrice,\n props.stopLossPrice,\n position?.average_open_price,\n order?.side,\n order?.quantity,\n order?.algo_type,\n ]);\n\n const child = useMemo(() => {\n const children = [];\n\n if (!order?.symbol) return <span>-</span>;\n if (props.takeProfitPrice) {\n children.push(\n <Text.formatted\n className={cn(\n \"oui-text-trade-profit oui-gap-0 oui-decoration-white/20\"\n )}\n key={\"tp\"}\n rule=\"price\"\n precision={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.takeProfitPrice}\n prefix={\n !props.stopLossPrice || direction === \"column\" ? (\n <Text intensity={54}>\n TP&nbsp;-&nbsp;\n </Text>\n ) : (\n \"\"\n )\n }\n />\n );\n }\n if (props.stopLossPrice) {\n children.push(\n <Text.formatted\n key={\"sl\"}\n className={cn(\n \"oui-text-trade-loss oui-gap-0 oui-decoration-white/20 \"\n )}\n rule={\"price\"}\n precision={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.stopLossPrice}\n prefix={\n !props.takeProfitPrice || direction === \"column\" ? (\n <Text intensity={54} >\n SL&nbsp;-&nbsp;\n </Text>\n ) : (\n \"\"\n )\n }\n />\n );\n }\n\n if (children.length === 0) return <Text>-</Text>;\n\n if (children.length === 2 && direction === \"row\") {\n children.splice(1, 0, <Text key={\"split\"}>/</Text>);\n }\n\n return children;\n }, [props.takeProfitPrice, props.stopLossPrice, order?.symbol]);\n\n const content = (\n <div\n className={cn(\n \"oui-inline-flex oui-text-base-contrast-36\",\n props.direction === \"column\"\n ? \"oui-flex-col\"\n : \"oui-flex-row oui-gap-1\",\n props.className\n )}\n >\n {child}\n </div>\n );\n\n if (props.tooltip) {\n return <Tooltip content={pnl}>{content}</Tooltip>;\n }\n\n return content;\n};","import { usePositionStream } from \"@orderly.network/hooks\";\n\nexport const usePositionsBuilder = () => {\n const [data, info, { isLoading }] = usePositionStream();\n return {\n dataSource: data?.rows,\n isLoading,\n };\n};\n\nexport type PositionsBuilderState = ReturnType<typeof usePositionsBuilder>;\n","import { PositionsProps } from \"../types/types\";\nimport { Positions } from \"./positions.ui\";\nimport { usePositionsBuilder } from \"./usePositionsBuilder.script\";\n\nexport const PositionsWidget = (props: PositionsProps) => {\n const state = usePositionsBuilder();\n return (\n <Positions\n {...state}\n pnlNotionalDecimalPrecision={props.pnlNotionalDecimalPrecision}\n sharePnLConfig={props.sharePnLConfig}\n />\n );\n};\n","import {\n useLocalStorage,\n useSymbolsInfo,\n useTPSLOrder,\n} from \"@orderly.network/hooks\";\nimport { AlgoOrderRootType, AlgoOrderType, API } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\n\nexport type TPSLBuilderOptions = {\n position: API.Position;\n order?: API.AlgoOrder;\n\n /**\n * either show the confirm dialog or not,\n * if the Promise reject or return false, cancel the sumbit action\n */\n onConfirm?: () => Promise<boolean>;\n};\n\nexport const useTPSLBuilder = (options: TPSLBuilderOptions) => {\n const { position, order } = options;\n const isEditing = !!order;\n const symbol = isEditing ? order.symbol : position.symbol;\n const symbolInfo = useSymbolsInfo();\n\n const [tpslOrder, { submit, setValue, validate, errors }] = useTPSLOrder(\n {\n symbol,\n position_qty: position.position_qty,\n average_open_price: position.average_open_price,\n },\n {\n defaultOrder: order,\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(() => position.position_qty, [position.position_qty]);\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 }\n\n if (order) {\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 ]);\n\n const valid = useMemo(() => {\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;\n }, [tpslOrder.quantity, maxQty, dirty]);\n\n const onSubmit = async () => {\n console.log(\"submitting\", typeof options.onConfirm);\n\n return Promise.resolve()\n .then(() => {\n if (typeof options.onConfirm !== \"function\") {\n return true;\n }\n return options.onConfirm();\n })\n .then((isConfirm) => {\n if (isConfirm) {\n return submit();\n }\n // return;\n });\n };\n\n return {\n isEditing,\n symbolInfo: symbolInfo[symbol],\n maxQty,\n setQuantity,\n orderQuantity: tpslOrder.quantity,\n isPosition: tpslOrder.quantity === position.position_qty,\n\n TPSL_OrderEntity: tpslOrder,\n setOrderValue: setValue,\n setPnL,\n setOrderPrice,\n // needConfirm,\n onSubmit,\n valid,\n } as const;\n};\n\nexport type TPSLBuilderState = ReturnType<typeof useTPSLBuilder>;\n","import { TPSL, TPSLProps } from \"./tpsl.ui\";\nimport { TPSLBuilderOptions, useTPSLBuilder } from \"./useTPSL.script\";\n\nexport type TPSLWidgetProps = {} & TPSLBuilderOptions & TPSLProps;\n\nexport const TPSLWidget = (props: TPSLWidgetProps) => {\n const { onCancel, ...rest } = props;\n const state = useTPSLBuilder(rest);\n return <TPSL {...state} onCancel={onCancel} />;\n};\n","import { modal, SimpleDialog } from \"@orderly.network/ui\";\nimport { TPSLWidget, TPSLWidgetProps } from \"../tpsl.widget\";\nimport { TPSLEditorBuilderState } from \"./tpslDialog.script\";\nimport { PositionTPSLConfirm } from \"../tpsl.ui\";\n\ntype Props = {\n // onConfirm: () => Promise<boolean>;\n} & TPSLWidgetProps &\n TPSLEditorBuilderState;\n\nexport const TPSLDialog = (props: Props) => {\n const { open, needConfirm, ...rest } = props;\n // const\n return (\n <>\n <SimpleDialog open={open}>\n <TPSLWidget\n {...rest}\n onConfirm={() => {\n console.log(\"onConfirm ********\", needConfirm);\n\n if (!needConfirm) {\n return Promise.resolve(true);\n }\n\n return modal.confirm({\n content: (\n <PositionTPSLConfirm\n symbol={\"PERP_ETH_USDC\"}\n isPosition={false}\n qty={0}\n />\n ),\n });\n }}\n />\n </SimpleDialog>\n {/* <SimpleDialog>\n <PositionTPSLConfirm\n symbol={\"PERP_ETH_USDC\"}\n isPosition={false}\n qty={0}\n />\n </SimpleDialog> */}\n </>\n );\n};\n","import { useLocalStorage } from \"@orderly.network/hooks\";\nimport { useState } from \"react\";\n\nexport const useTPSLEditorBuilder = (props?: {\n // confirmContent:\n}) => {\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n\n const [open, setOpen] = useState(false);\n\n return {\n open,\n needConfirm,\n };\n};\n\nexport type TPSLEditorBuilderState = ReturnType<typeof useTPSLEditorBuilder>;\n","import { TPSLDialog } from \"./tpslDialog.ui\";\nimport { useTPSLEditorBuilder } from \"./tpslDialog.script\";\nimport { TPSLWidgetProps } from \"../tpsl.widget\";\n\nexport const TPSLEditorWidget = (props: TPSLWidgetProps) => {\n const state = useTPSLEditorBuilder();\n return <TPSLDialog {...props} {...state} />;\n};\n"]}
File without changes
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@orderly.network/ui-positions",
3
+ "version": "2.0.0-alpha.1",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "keywords": [
9
+ "Orderly",
10
+ "Exchange",
11
+ "DeFi"
12
+ ],
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "dependencies": {
20
+ "@orderly.network/ui": "2.0.0-alpha.1",
21
+ "@orderly.network/ui-share": "2.0.0-alpha.1",
22
+ "@orderly.network/hooks": "2.0.0-alpha.1",
23
+ "@orderly.network/types": "2.0.0-alpha.1",
24
+ "@orderly.network/utils": "2.0.0-alpha.1"
25
+ },
26
+ "devDependencies": {
27
+ "@types/react": "^18.3.2",
28
+ "@types/react-dom": "^18.3.0",
29
+ "react": "^18.3.1",
30
+ "react-dom": "^18.2.0",
31
+ "tailwindcss": "^3.4.4",
32
+ "tsup": "^7.1.0",
33
+ "typescript": "^5.1.6",
34
+ "tsconfig": "0.3.12"
35
+ },
36
+ "scripts": {
37
+ "build": "tsup && pnpm run build:css",
38
+ "build:css": "tailwindcss build -i src/tailwind.css -o dist/styles.css --minify",
39
+ "test": "echo \"Error: no test specified\" && exit 1"
40
+ }
41
+ }