@orderly.network/ui-order-entry 2.5.3-alpha.0 → 2.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/orderEntry.ui.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.ui.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.script.ts","../src/components/LTVRiskTooltip/LTVRiskTooltip.widget.tsx","../src/components/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.ui.tsx","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.script.ts","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.widget.tsx","../src/components/fees/fees.ui.tsx","../src/components/fees/fees.script.ts","../src/components/fees/fees.widget.tsx","../src/components/orderEntryContext.tsx","../src/components/quantityDistribution/index.tsx","../src/components/slippage/components/slippageCell.tsx","../src/components/slippage/components/slippageEditor.tsx","../src/components/slippage/slippage.ui.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/orderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["forwardRef","useContext","useEffect","useMemo","useState","useLeverage","useLocalStorage","useTranslation","useOrderEntryFormErrorMsg","BBOOrderType","DistributionType","OrderSide","OrderType","Box","Button","CaretRightIcon","cn","Divider","Flex","Grid","InfoCircleIcon","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","ThrottledButton","toast","Tooltip","useScreen","LeverageWidgetWithSheetId","commifyOptional","removeTrailingZeros","jsx","jsxs","calculateLTVColor","val","LTVRiskTooltipUI","props","ltv_threshold","negative_usdc_threshold","isThresholdLoading","holdingData","currentLtv","onConvert","asset","index","useCallback","useComputedLTV","useHoldingStream","useIndexPricesStream","useQuery","useTokensInfo","account","Decimal","useConvertThreshold","data","error","isLoading","useLTVTooltipScript","holdingList","isHoldingLoading","tokensInfo","indexPrices","item","tokenInfo","token","indexPrice","collateralRatio","collateralContribution","LTVRiskTooltipWidget","state","Checkbox","Fragment","AdditionalInfo","pinned","orderTypeExtra","t","onTypeToggle","type","checked","useAdditionalScript","AdditionalInfoWidget","i18n","Badge","registerSimpleDialog","OrderLevel","isBBOOrder","options","order_type","order_type_ext","isBBO","getOrderTypeByBBO","value","size","getOrderLevelByBBO","getBBOType","side","level","getScaledPlaceOrderMessage","result","rows","totalCount","successCount","row","OrderConfirmDialog","symbolInfo","order","onConfirm","onCancel","quote_dp","base_dp","_","setNeedConfirm","renderPrice","bboType","label","OrderTypeTag","typeStr","Dialog","close","resolve","reject","rest","orderConfirmDialogId","DataTable","TokenIcon","ScaledOrderConfirm","dataSource","national","askAndBid","totalQuantity","base","quote","columns","record","showWarning","TooltipIcon","ref","useEventEmitter","zero","useScaledOrderConfirmScript","orders","setAskAndBid","ee","acc","onOrderBookUpdate","ask0","bid0","ScaledOrderConfirmWidget","scaledOrderConfirmDialogId","AuthGuard","FeesUI","takerFeeRate","makerFeeRate","useAccountInfo","useFeesScript","FeesWidget","createContext","OrderEntryContext","OrderEntryProvider","QuantityDistributionInput","className","showHint","QuantityDistributionHint","QuantityDistribution","setType","content","FlatQuantity","AscendingQuantity","DescendingQuantity","currentContent","PriceChart","onValueChange","onChange","distributionTypeMap","useRef","useBoolean","EditIcon","SimpleDialog","useImperativeHandle","ExclamationFillIcon","TooltipTrigger","SlippageEditor","setValue","customValue","setCustomValue","setError","onClick","d","toolTipButton","SlippageItem","isActive","SlippageCell","open","setOpen","setClose","toggle","isMobile","slippageRef","SlippageUI","React","CaretDownIcon","SimpleDropdownMenu","todpIfNeed","PnlInputContext","usePnlInputContext","PnlInputProvider","values","mode","setMode","tipsEle","usePNLInputBuilder","tipVisible","setTipVisible","isFocused","setIsFocused","key","innerValue","setInnerValue","modes","modeLabelMap","percentageSuffix","dp","endStr","PNLInput","onModeChange","tips","onFocus","onBlur","prefix","setPrefix","placeholder","setPlaceholder","id","PNLMenus","event","PnlInputWidget","testIds","OrderTPSL","tpslFormRef","TPSLInputForm","parseErrorMsg","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","getPrefixLabel","trigger_price","_prefix","priceKey","OrderEntry","formattedOrder","setOrderValue","maxQty","freeCollateral","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","disableFeatures","curLeverage","errors","validated","setErrorMsgVisible","needConfirm","setPinned","hidden","setHidden","slippage","setSlippage","buttonLabel","clickHandler","visible","onSubmit","isScaledOrder","message","mergedShowSheet","showLTV","OrderTypeSelect","ScaledOrderInput","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","PinButton","defaultPath","path","setPath","bbo","readOnly","priceSuffix","CustomInput","e","BBOOrderTypeSelect","InputLabel","canTrade","color","maxLabel","displayLabelMap","option","o","showSkewInput","useAccount","useMarginRatio","useOrderEntry","utils","useAppContext","AccountStatusEnum","convertValueToPercentage","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","localBBOType","setLocalBBOType","lastBBOType","setValues","tpslSwitch","setTpslSwitch","accountState","wrongNetwork","disabledConnect","currentLeverage","currentFocusInput","lastScaledOrderPriceInput","triggerPriceInputRef","priceInputRef","priceInputContainerRef","priceInputContainerWidth","setPriceInputContainerWidth","currentQtyPercentage","formatQty","quantity","cancelTP_SL","enableTP_SL","setMaxQty","onTPSLSwitchChanged","orderType","orderLevel","updateOrderPrice","price","focusInputElement","target","orderBookItemClickHandler","field","element","resizeObserver","entries","entry","width","OrderEntryWidget"],"mappings":"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C,QACC,EAAE,KACF,EAAE,KACF,MAAM,MACN,OAAO,IACP,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,GACF,EAIEwI,GAAoB,IAEtBvI,EAAC,OACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,EAAE,KACF,EAAE,KACF,MAAM,MACN,OAAO,IACP,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,GACF,EAIEyI,GAAqB,IAEvBxI,EAAC,OACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,MAAM,MACN,OAAO,IACP,UAAU,0BACV,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,IACH,GAAG,IACH,EAAE,UACF,UAAU,0BACV,KAAK,+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","sourcesContent":["import React, {\n CSSProperties,\n FocusEventHandler,\n forwardRef,\n HTMLAttributes,\n PropsWithChildren,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n OrderValidationResult,\n useLeverage,\n useLocalStorage,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n API,\n BBOOrderType,\n DistributionType,\n OrderLevel,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport {\n Box,\n Button,\n CaretRightIcon,\n cn,\n Divider,\n Flex,\n Grid,\n InfoCircleIcon,\n Input,\n inputFormatter,\n InputProps,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n Select,\n Slider,\n Switch,\n Text,\n textVariants,\n ThrottledButton,\n toast,\n Tooltip,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { LeverageWidgetWithSheetId } from \"@orderly.network/ui-leverage\";\nimport { commifyOptional } from \"@orderly.network/utils\";\nimport { LTVRiskTooltipWidget } from \"./components/LTVRiskTooltip\";\n// import { useBalanceScript } from \"../../trading/src/components/mobile/bottomNavBar/balance\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport { scaledOrderConfirmDialogId } from \"./components/dialog/scaledOrderConfirm\";\nimport { FeesWidget } from \"./components/fees\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { QuantityDistributionInput } from \"./components/quantityDistribution\";\nimport { SlippageUI } from \"./components/slippage/slippage.ui\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { type OrderEntryScriptReturn } from \"./orderEntry.script\";\nimport { InputType } from \"./types\";\nimport { BBOStatus, getScaledPlaceOrderMessage } from \"./utils\";\n\ntype Refs = OrderEntryScriptReturn[\"refs\"];\n\ntype OrderEntryProps = OrderEntryScriptReturn & {\n containerRef: any;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n};\n\nexport const OrderEntry: React.FC<OrderEntryProps> = (props) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n disableFeatures,\n currentLtv,\n } = props;\n\n const { curLeverage } = useLeverage();\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true,\n );\n const [pinned, setPinned] = useLocalStorage(\n \"orderly-order-additional-pinned\",\n true,\n );\n const [hidden, setHidden] = useLocalStorage(\"orderly-order-hidden\", false);\n\n const [slippage, setSlippage] = useLocalStorage(\"orderly-slippage\", \"1\", {\n parseJSON: ((value: string | null) => {\n return !value || value === '\"\"' ? \"1\" : JSON.parse(value);\n }) as any,\n });\n\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(\n validated ? errors : null,\n );\n\n const buttonLabel = useMemo(() => {\n return side === OrderSide.BUY\n ? t(\"orderEntry.buyLong\")\n : t(\"orderEntry.sellShort\");\n }, [side, t]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n // set slippage\n useEffect(() => {\n if (props.disableFeatures?.includes(\"slippageSetting\")) {\n return;\n }\n\n if (slippage) {\n setOrderValue(\"slippage\", Number(slippage));\n } else {\n setOrderValue(\"slippage\", undefined);\n }\n }, [slippage, props.disableFeatures]);\n\n useEffect(() => {\n const clickHandler = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\"#order-entry-submit-button\")\n // || target.closest(\".orderly-order-entry\")\n ) {\n return;\n }\n setErrorMsgVisible((visible) => {\n if (visible) {\n return false;\n }\n return visible;\n });\n };\n\n if (errorMsgVisible) {\n document.addEventListener(\"click\", clickHandler);\n } else {\n document.removeEventListener(\"click\", clickHandler);\n }\n\n return () => {\n document.removeEventListener(\"click\", clickHandler);\n };\n }, [errorMsgVisible]);\n\n const onSubmit = () => {\n const isScaledOrder = formattedOrder.order_type === OrderType.SCALED;\n\n helper\n .validate()\n .then(\n // validate success, it return the order\n // TODO: get order from other function\n (order: any) => {\n // scaled order is always need confirm\n if (isScaledOrder) {\n return modal.show(scaledOrderConfirmDialogId, {\n order,\n symbolInfo,\n size: isMobile ? \"sm\" : \"md\",\n });\n }\n\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n symbolInfo,\n });\n }\n\n return true;\n },\n // should catch validate error first, then submit\n (errors: OrderValidationResult) => {\n // slippage error message is not show input tooltip, so we need to manually show it by toast\n if (errors.slippage) {\n toast.error(errors.slippage.message);\n }\n\n // when switch order type, validated not changed, so we need to set it to true\n setErrorMsgVisible(true);\n\n return Promise.reject();\n },\n )\n .then(() => {\n // validate success, submit order\n return submit({ resetOnSuccess: false }).then((result: any) => {\n if (!result.success && result.message) {\n toast.error(result.message);\n } else if (result.success && isScaledOrder) {\n const message = getScaledPlaceOrderMessage(result);\n if (message) {\n toast.success(message);\n }\n }\n });\n })\n .catch((error) => {\n // submit order error\n if (error?.message) {\n toast.error(error.message);\n }\n });\n };\n\n const mergedShowSheet = isMobile && props.canTrade;\n\n const showLTV =\n typeof currentLtv === \"number\" &&\n !Number.isNaN(currentLtv) &&\n currentLtv > 0;\n\n return (\n <OrderEntryProvider value={{ errorMsgVisible }}>\n <div\n className={\"oui-space-y-2 oui-text-base-contrast-54 xl:oui-space-y-3\"}\n ref={props.containerRef}\n >\n {/* Buy Sell button */}\n <Flex gapX={2} className=\"oui-flex-col oui-gap-y-3 lg:oui-flex-row\">\n <div\n className={cn(\n \"oui-grid oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n mergedShowSheet ? \"oui-grid-cols-3\" : \"oui-grid-cols-2\",\n )}\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n data-type={OrderSide.BUY}\n // color={side === OrderSide.BUY ? \"buy\" : \"secondary\"}\n className={cn(\n side === OrderSide.BUY && props.canTrade\n ? \"oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n {t(\"common.buy\")}\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n data-type={OrderSide.SELL}\n fullWidth\n size={\"md\"}\n // color={side === OrderSide.SELL ? \"sell\" : \"secondary\"}\n className={cn(\n side === OrderSide.SELL && props.canTrade\n ? \"oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n {t(\"common.sell\")}\n </Button>\n {mergedShowSheet && (\n <Button\n size={\"md\"}\n fullWidth\n trailing={\n <CaretRightIcon\n size={12}\n className=\"oui-text-base-contrast-36\"\n />\n }\n onClick={() => {\n modal.show(LeverageWidgetWithSheetId, {\n currentLeverage: curLeverage,\n });\n }}\n className={cn(\n \"oui-bg-base-7 oui-text-primary-light hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n >\n {commifyOptional(curLeverage, { fix: 2 }) + \"x\"}\n </Button>\n )}\n </div>\n <div className={\"oui-w-full lg:oui-flex-1\"}>\n <OrderTypeSelect\n type={formattedOrder.order_type!}\n side={side}\n canTrade={props.canTrade}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n </Flex>\n {/* Available */}\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"common.available\")}</Text>\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={1}>\n {showLTV && (\n <Tooltip\n className={\"oui-bg-base-6 oui-p-2\"}\n content={<LTVRiskTooltipWidget />}\n >\n <InfoCircleIcon\n className={\n \"oui-cursor-pointer oui-text-warning oui-opacity-80\"\n }\n />\n </Tooltip>\n )}\n <Text.numeral\n unit={symbolInfo.quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-54\"}\n dp={2}\n padding={false}\n >\n {props.canTrade ? freeCollateral : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n {/* Inputs (price,quantity,triggerPrice) */}\n {formattedOrder.order_type === OrderType.SCALED ? (\n <ScaledOrderInput\n type={props.type}\n symbolInfo={symbolInfo}\n values={{\n quantity: formattedOrder.order_quantity,\n total: formattedOrder.total,\n side: formattedOrder.side,\n max_price: formattedOrder.max_price,\n min_price: formattedOrder.min_price,\n total_orders: formattedOrder.total_orders,\n distribution_type: formattedOrder.distribution_type,\n skew: formattedOrder.skew,\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n onValuesChange={props.setOrderValues}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n parseErrorMsg={parseErrorMsg}\n />\n ) : (\n <OrderQuantityInput\n type={props.type}\n symbolInfo={symbolInfo}\n values={{\n quantity: formattedOrder.order_quantity,\n price: formattedOrder.order_price,\n trigger_price: formattedOrder.trigger_price,\n total: formattedOrder.total,\n level: formattedOrder.level,\n side: formattedOrder.side,\n order_type_ext: formattedOrder.order_type_ext,\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n onValuesChange={props.setOrderValues}\n refs={props.refs}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n bbo={{\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n }}\n priceInputContainerWidth={props.priceInputContainerWidth}\n parseErrorMsg={parseErrorMsg}\n />\n )}\n {/* Slider */}\n <QuantitySlider\n canTrade={props.canTrade}\n maxQty={maxQty}\n currentQtyPercentage={props.currentQtyPercentage}\n value={\n !formattedOrder.order_quantity\n ? 0\n : Number(formattedOrder.order_quantity)\n }\n tick={symbolInfo.base_tick}\n dp={symbolInfo.base_dp}\n setMaxQty={props.setMaxQty}\n onValueChange={(value) => {\n setOrderValue(\"order_quantity\", value);\n }}\n side={props.side}\n />\n {/* Submit button */}\n <ThrottledButton\n fullWidth\n id={\"order-entry-submit-button\"}\n // color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY\n ? \"orderly-order-entry-submit-button-buy oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"orderly-order-entry-submit-button-sell oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\",\n )}\n onClick={() => {\n onSubmit();\n }}\n loading={props.isMutating}\n disabled={!props.canTrade}\n >\n {buttonLabel}\n </ThrottledButton>\n {/* Asset info */}\n <AssetInfo\n canTrade={props.canTrade}\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n slippage={slippage}\n dp={symbolInfo.quote_dp}\n setSlippage={setSlippage}\n estSlippage={props.estSlippage}\n orderType={formattedOrder.order_type!}\n disableFeatures={disableFeatures}\n />\n\n <Divider className=\"oui-w-full\" />\n {/* TP SL switch and content */}\n <OrderTPSL\n // onCancelTPSL={props.cancelTP_SL}\n // onEnableTP_SL={props.enableTP_SL}\n quote_dp={props.symbolInfo.quote_dp}\n switchState={props.tpslSwitch}\n onSwitchChanged={props.setTpslSwitch}\n orderType={formattedOrder.order_type!}\n errors={validated ? errors : null}\n isReduceOnly={formattedOrder.reduce_only}\n values={{\n tp: {\n trigger_price: formattedOrder.tp_trigger_price ?? \"\",\n PnL: formattedOrder.tp_pnl ?? \"\",\n Offset: formattedOrder.tp_offset ?? \"\",\n \"Offset%\": formattedOrder.tp_offset_percentage ?? \"\",\n ROI: formattedOrder.tp_ROI ?? \"\",\n },\n sl: {\n trigger_price: formattedOrder.sl_trigger_price ?? \"\",\n PnL: formattedOrder.sl_pnl ?? \"\",\n Offset: formattedOrder.sl_offset ?? \"\",\n \"Offset%\": formattedOrder.sl_offset_percentage ?? \"\",\n ROI: formattedOrder.sl_ROI ?? \"\",\n },\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n />\n {/* reduce only switch and label */}\n <Flex\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"!oui-mt-0 xl:!oui-mt-3\"\n >\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n data-testid=\"oui-testid-orderEntry-reduceOnly-switch\"\n className=\"oui-h-[14px]\"\n id={\"reduceOnly\"}\n checked={props.formattedOrder.reduce_only}\n onCheckedChange={(checked) => {\n props.setOrderValue(\"reduce_only\", checked);\n // if (checked) {\n // props.setOrderValue(\"order_type_ext\", \"\");\n // }\n }}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n {t(\"orderEntry.reduceOnly\")}\n </label>\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {!pinned && (\n <AdditionalConfigButton\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n )}\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {pinned && (\n <Box p={2} r={\"md\"} intensity={700} position={\"relative\"}>\n <AdditionalInfoWidget\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n <PinButton\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-group oui-absolute oui-right-2 oui-top-2\"}\n data-testid=\"oui-testid-orderEntry-pinned-button\"\n ></PinButton>\n </Box>\n )}\n </div>\n </OrderEntryProvider>\n );\n};\n\n//------------------- pin button start -------------------\nconst defaultPath =\n \"M10.007 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.852-2.523 1.233.361 1.95.015 2.961-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103 5.35 5.35 0 0 0-2.104-1.312c-.448-.15-.808-.208-1.042-.208\";\n\nconst PinButton = (props: HTMLAttributes<HTMLButtonElement>) => {\n const [path, setPath] = useState(defaultPath);\n return (\n <button {...props}>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onMouseEnter={() => {\n setPath(\n 'M10.008 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.853-2.523 1.232.361 1.95.015 2.96-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103A5.35 5.35 0 0 0 11.05 1.51c-.448-.15-.808-.208-1.042-.208m.258 1.37c.708.131 1.421.6 1.93 1.107.507.508.94 1.13 1.119 1.945-.636.61-1.026.658-1.662.323a.67.67 0 0 0-.779.117c-1.214 1.213-1.533 2.314-1.533 3.8 0 1.292-.076 1.773-.48 2.206-.113.123-.27.104-.374 0L3.799 7.486a.24.24 0 0 1-.017-.34c.239-.29.769-.515 2.226-.514 1.742.001 2.668-.448 3.812-1.52a.67.67 0 0 0 .125-.77c-.343-.686-.29-1.047.321-1.67\"',\n );\n }}\n onMouseLeave={() => {\n setPath(defaultPath);\n }}\n className=\"oui-text-primary-darken \"\n >\n <path d={path} />\n </svg>\n </button>\n );\n};\n\n//----------------- Order Quantity Input Component start -----------------\nconst OrderQuantityInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n values: {\n quantity?: string;\n price?: string;\n trigger_price?: string;\n total?: string;\n side?: OrderSide;\n level?: OrderLevel;\n order_type_ext?: OrderType;\n };\n onChange: (\n key:\n | \"order_quantity\"\n | \"order_price\"\n | \"trigger_price\"\n | \"total\"\n | \"order_type\"\n | \"order_type_ext\"\n | \"level\",\n value: any,\n ) => void;\n onValuesChange: (value: any) => void;\n refs: Refs;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n parseErrorMsg: (key: keyof OrderValidationResult) => string;\n}) => {\n const { type, symbolInfo, values, onFocus, onBlur, bbo, parseErrorMsg } =\n props;\n const { t } = useTranslation();\n\n const readOnly = bbo.bboStatus === BBOStatus.ON;\n\n const priceSuffix =\n type === OrderType.LIMIT ? (\n <Flex direction=\"column\" itemAlign=\"end\" className=\"oui-text-2xs\">\n {symbolInfo.quote}\n <Flex\n height={20}\n px={3}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-mt-[2px] oui-cursor-pointer oui-select-none oui-border\",\n bbo.bboStatus === BBOStatus.ON\n ? \"oui-border-primary\"\n : \"oui-border-line-12\",\n bbo.bboStatus === BBOStatus.DISABLED && \"oui-cursor-not-allowed\",\n )}\n onClick={() => {\n if (bbo.bboStatus === BBOStatus.DISABLED) {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>\n {t(\"orderEntry.bbo.disabled.tips\")}\n </Text>\n ),\n });\n } else {\n bbo.toggleBBO();\n }\n }}\n >\n <Text\n className={cn(\n bbo.bboStatus === BBOStatus.ON && \"oui-text-primary\",\n bbo.bboStatus === BBOStatus.OFF && \"oui-text-base-contrast-54\",\n bbo.bboStatus === BBOStatus.DISABLED &&\n \"oui-text-base-contrast-20\",\n )}\n >\n {t(\"orderEntry.bbo\")}\n </Text>\n </Flex>\n </Flex>\n ) : (\n symbolInfo.quote\n );\n\n return (\n <div className={\"oui-space-y-1\"}>\n {type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET ? (\n <div className={\"oui-group\"}>\n <CustomInput\n label={t(\"common.trigger\")}\n suffix={symbolInfo.quote}\n error={parseErrorMsg(\"trigger_price\")}\n id={\"trigger\"}\n ref={props.refs.triggerPriceInputRef}\n value={values.trigger_price}\n onChange={(e) => {\n props.onChange(\"trigger_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.TRIGGER_PRICE)}\n onBlur={onBlur(InputType.TRIGGER_PRICE)}\n />\n </div>\n ) : null}\n\n {type === OrderType.LIMIT || type === OrderType.STOP_LIMIT ? (\n <div\n ref={props.refs.priceInputContainerRef}\n className=\"oui-group oui-relative oui-w-full\"\n >\n <CustomInput\n label={t(\"common.price\")}\n suffix={priceSuffix}\n id={\"price\"}\n value={values.price}\n error={parseErrorMsg(\"order_price\")}\n ref={props.refs.priceInputRef}\n // helperText=\"Price per unit\"\n onChange={(e) => {\n props.onChange(\"order_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n readonly={readOnly}\n classNames={{\n root: cn(readOnly && \"focus-within:oui-outline-transparent \"),\n input: cn(readOnly && \"oui-cursor-auto\"),\n }}\n />\n {bbo.bboStatus === BBOStatus.ON && (\n <div className={cn(\"oui-absolute oui-bottom-1 oui-left-0\")}>\n <BBOOrderTypeSelect\n value={bbo.bboType}\n onChange={bbo.onBBOChange}\n contentStyle={{\n width: props.priceInputContainerWidth,\n }}\n />\n </div>\n )}\n </div>\n ) : null}\n\n <Grid cols={2} className={\"oui-group oui-space-x-1\"}>\n <CustomInput\n label={t(\"common.qty\")}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-r\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={`${t(\"common.total\")}≈`}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-l\"}\n value={values.total}\n error={parseErrorMsg(\"total\")}\n onChange={(e) => {\n props.onChange(\"total\", e);\n }}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n />\n </Grid>\n </div>\n );\n};\n\n// ----------- Custom Input Component start ------------\nconst CustomInput = forwardRef<\n HTMLInputElement,\n {\n label: string;\n suffix?: ReactNode;\n placeholder?: string;\n id: string;\n className?: string;\n name?: string;\n // onChange?: InputProps[\"onChange\"];\n onChange?: (value: string) => void;\n value?: InputProps[\"value\"];\n autoFocus?: InputProps[\"autoFocus\"];\n error?: string;\n onFocus: InputProps[\"onFocus\"];\n onBlur: InputProps[\"onBlur\"];\n formatters?: InputProps[\"formatters\"];\n overrideFormatters?: InputProps[\"formatters\"];\n // helperText?: InputProps[\"helperText\"];\n classNames?: InputProps[\"classNames\"];\n readonly?: boolean;\n }\n>((props, ref) => {\n const { placeholder = \"0\" } = props;\n const { errorMsgVisible } = useContext(OrderEntryContext);\n return (\n <Input.tooltip\n ref={ref}\n tooltip={errorMsgVisible ? props.error : undefined}\n autoComplete={\"off\"}\n autoFocus={props.autoFocus}\n size={\"lg\"}\n placeholder={props.readonly ? \"\" : placeholder}\n id={props.id}\n name={props.name}\n color={props.error ? \"danger\" : undefined}\n prefix={\n <InputLabel id={props.id} className={props.classNames?.prefix}>\n {props.label}\n </InputLabel>\n }\n suffix={props.suffix}\n value={props.readonly ? \"\" : props.value || \"\"}\n // onChange={props.onChange}\n onValueChange={props.onChange}\n onFocus={(event) => {\n props.onFocus?.(event);\n }}\n onBlur={(event) => {\n props.onBlur?.(event);\n }}\n formatters={\n props.overrideFormatters || [\n ...(props.formatters ?? []),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]\n }\n classNames={{\n root: cn(\n \"orderly-order-entry oui-relative oui-h-[54px] oui-rounded oui-border oui-border-solid oui-border-line oui-px-2 oui-py-1 group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root,\n ),\n input: cn(\"oui-mb-1 oui-mt-5 oui-h-5\", props?.classNames?.input),\n // prefix: cn(props.classNames?.prefix),\n suffix: cn(\n \"oui-absolute oui-right-0 oui-top-0 oui-justify-start oui-py-2 oui-text-2xs oui-text-base-contrast-36\",\n props.classNames?.suffix,\n ),\n }}\n readOnly={props.readonly}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (\n props: PropsWithChildren<{ id: string; className?: string }>,\n) => {\n return (\n <label\n htmlFor={props.id}\n className={cn(\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-2xs oui-text-base-contrast-36\",\n props.className,\n )}\n >\n {props.children}\n </label>\n );\n};\n\n// ----------- Custom Input Component end ------------\n\nconst QuantitySlider = (props: {\n canTrade: boolean;\n side: OrderSide;\n value: number;\n maxQty: number;\n currentQtyPercentage: number;\n tick: number;\n dp: number;\n setMaxQty: () => void;\n onValueChange: (value: number) => void;\n}) => {\n const { canTrade } = props;\n const { t } = useTranslation();\n\n const color = useMemo(\n () =>\n canTrade ? (props.side === OrderSide.BUY ? \"buy\" : \"sell\") : undefined,\n [props.side, canTrade],\n );\n\n const maxLabel = useMemo(() => {\n return props.side === OrderSide.BUY\n ? t(\"orderEntry.maxBuy\")\n : t(\"orderEntry.maxSell\");\n }, [props.side, t]);\n\n return (\n <div>\n <Slider.single\n disabled={props.maxQty === 0 || !canTrade}\n value={props.value}\n color={color}\n markCount={4}\n showTip\n max={props.maxQty}\n step={props.tick}\n onValueChange={props.onValueChange}\n />\n <Flex justify={\"between\"} className=\"oui-pt-1 xl:oui-pt-2\">\n <Text.numeral\n rule={\"percentages\"}\n size={\"2xs\"}\n color={color}\n dp={2}\n padding={false}\n >\n {canTrade ? props.currentQtyPercentage : 0}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={() => props.setMaxQty()}\n data-testid=\"oui-testid-orderEntry-maxQty-value-button\"\n >\n {maxLabel}\n </button>\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={props.dp}\n padding={false}\n data-testid=\"oui-testid-orderEntry-maxQty-value\"\n >\n {canTrade ? props.maxQty : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n </div>\n );\n};\n\n// -----------Order type Select Component start ------------\n\nconst OrderTypeSelect = (props: {\n type: OrderType;\n onChange: (type: OrderType) => void;\n side: OrderSide;\n canTrade: boolean;\n}) => {\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"orderEntry.orderType.limitOrder\"), value: OrderType.LIMIT },\n { label: t(\"orderEntry.orderType.marketOrder\"), value: OrderType.MARKET },\n {\n label: t(\"orderEntry.orderType.stopLimit\"),\n value: OrderType.STOP_LIMIT,\n },\n {\n label: t(\"orderEntry.orderType.stopMarket\"),\n value: OrderType.STOP_MARKET,\n },\n {\n label: t(\"orderEntry.orderType.scaledOrder\"),\n value: OrderType.SCALED,\n },\n ];\n }, [t]);\n\n const displayLabelMap = useMemo(() => {\n return {\n [OrderType.LIMIT]: t(\"orderEntry.orderType.limit\"),\n [OrderType.MARKET]: t(\"common.marketPrice\"),\n [OrderType.STOP_LIMIT]: t(\"orderEntry.orderType.stopLimit\"),\n [OrderType.STOP_MARKET]: t(\"orderEntry.orderType.stopMarket\"),\n [OrderType.SCALED]: t(\"orderEntry.orderType.scaledOrder\"),\n };\n }, [t]);\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-orderType-button\"\n currentValue={props.type}\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"xs\"}>{option.placeholder}</Text>;\n }\n\n const label = displayLabelMap[value as keyof typeof displayLabelMap];\n\n return (\n <Text\n size={\"xs\"}\n color={\n props.canTrade\n ? props.side === OrderSide.BUY\n ? \"buy\"\n : \"sell\"\n : undefined\n }\n >\n {label}\n </Text>\n );\n }}\n size={\"md\"}\n />\n );\n};\n\n// -----------Order type Select Component end ------------\n\nfunction AssetInfo(props: {\n canTrade: boolean;\n quote: string;\n estLiqPrice: number | null;\n estLeverage: number | null;\n currentLeverage: number | null;\n slippage: string;\n dp: number;\n estSlippage: number | null;\n setSlippage: (slippage: string) => void;\n orderType: OrderType;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n}) {\n const { canTrade } = props;\n const { t } = useTranslation();\n\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"orderEntry.estLiqPrice\")}</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n dp={props.dp}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {canTrade ? (props.estLiqPrice ?? \"--\") : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"leverage.accountLeverage\")}</Text>\n <Flex\n gapX={1}\n className={textVariants({\n size: \"2xs\",\n intensity: 80,\n })}\n >\n <Text.numeral unit={canTrade ? \"x\" : undefined}>\n {canTrade ? (props.currentLeverage ?? \"--\") : \"--\"}\n </Text.numeral>\n {props.estLeverage && (\n <>\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.505 4.997c0-.23.186-.416.416-.416H6.07L4.833 3.332l.586-.585 1.964 1.95a.42.42 0 0 1 .122.3.42.42 0 0 1-.122.3l-1.964 1.95-.586-.585L6.07 5.413H2.921a.416.416 0 0 1-.416-.416\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n\n <span>{`${props.estLeverage}x`}</span>\n </>\n )}\n </Flex>\n {/* <Text.numeral unit={\"x\"} size={\"2xs\"}>\n {props.estLeverage ?? \"--\"}\n </Text.numeral> */}\n </Flex>\n {props.orderType === OrderType.MARKET &&\n !props.disableFeatures?.includes(\"slippageSetting\") && (\n <SlippageUI\n slippage={props.slippage}\n setSlippage={props.setSlippage}\n estSlippage={props.estSlippage}\n />\n )}\n\n {!props.disableFeatures?.includes(\"feesInfo\") && <FeesWidget />}\n </div>\n );\n}\n\nfunction AdditionalConfigButton(props: {\n pinned: boolean;\n setPinned: (pinned: boolean) => void;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n orderTypeExtra?: OrderType;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n showExtra: boolean;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n data-testid=\"oui-testid-orderEntry-additional-button\"\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white/[.36] hover:oui-fill-white/80\"\n >\n <path\n d=\"M3.332 2.665a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667z\"\n // fill=\"#fff\"\n // fillOpacity={open ? 0.8 : 0.36}\n />\n </svg>\n </button>\n </PopoverTrigger>\n <PopoverContent side={\"top\"} align={\"end\"} className={\"oui-w-[230px]\"}>\n <AdditionalInfoWidget {...props} />\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\n// -----------BBO Select Component start ------------\n\nconst BBOOrderTypeSelect = (props: {\n value?: BBOOrderType;\n onChange: (value: BBOOrderType) => void;\n contentStyle?: CSSProperties;\n}) => {\n const { t } = useTranslation();\n\n const options = [\n {\n label: t(\"orderEntry.bbo.counterparty1\"),\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: t(\"orderEntry.bbo.counterparty5\"),\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: t(\"orderEntry.bbo.queue1\"),\n value: BBOOrderType.QUEUE1,\n },\n {\n label: t(\"orderEntry.bbo.queue5\"),\n value: BBOOrderType.QUEUE5,\n },\n ];\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-bbo-orderType-button\"\n currentValue={props.value}\n value={props.value}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n style: props.contentStyle,\n }}\n size={\"sm\"}\n classNames={{\n trigger: \"oui-border-none oui-bg-transparent\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((item) => item.value === value);\n\n return (\n <Box>\n <Text size=\"sm\">{item?.label}</Text>\n </Box>\n );\n }}\n />\n );\n};\n\n// -----------BBO type Select Component end ------------\n\nconst ScaledOrderInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n values: {\n quantity?: string;\n total?: string;\n side?: OrderSide;\n max_price?: string;\n min_price?: string;\n total_orders?: number;\n distribution_type?: DistributionType;\n skew?: number;\n };\n onChange: (\n key:\n | \"order_quantity\"\n | \"total\"\n | \"order_type\"\n | \"min_price\"\n | \"max_price\"\n | \"total_orders\"\n | \"distribution_type\"\n | \"skew\",\n value: any,\n ) => void;\n onValuesChange: (value: any) => void;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n parseErrorMsg: (key: keyof OrderValidationResult) => string;\n}) => {\n const { symbolInfo, values, onFocus, onBlur, parseErrorMsg } = props;\n const { t } = useTranslation();\n\n const showSkewInput = values.distribution_type === DistributionType.CUSTOM;\n\n return (\n <div className=\"oui-space-y-1\">\n <CustomInput\n label={t(\"orderEntry.upperPrice\")}\n suffix={symbolInfo.quote}\n id=\"order_max_price_input\"\n value={values.max_price}\n error={parseErrorMsg(\"max_price\")}\n onChange={(e) => {\n props.onChange(\"max_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.MAX_PRICE)}\n onBlur={onBlur(InputType.MAX_PRICE)}\n classNames={{\n root: \"oui-rounded-t-xl\",\n }}\n />\n\n <CustomInput\n label={t(\"orderEntry.lowerPrice\")}\n suffix={symbolInfo.quote}\n id=\"order_min_price_input\"\n value={values.min_price}\n error={parseErrorMsg(\"min_price\")}\n onChange={(e) => {\n props.onChange(\"min_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.MIN_PRICE)}\n onBlur={onBlur(InputType.MIN_PRICE)}\n />\n\n <Grid cols={2} className={\"oui-group oui-space-x-1\"}>\n <CustomInput\n label={t(\"common.qty\")}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-r\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={t(\"orderEntry.totalOrders\")}\n placeholder=\"2-20\"\n id=\"order_total_orders_input\"\n className={\"!oui-rounded-l\"}\n value={values.total_orders}\n error={parseErrorMsg(\"total_orders\")}\n onChange={(e) => {\n props.onChange(\"total_orders\", e);\n }}\n overrideFormatters={[\n // inputFormatter.rangeFormatter({ min: 2, max: 20 }),\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(0),\n ]}\n onFocus={onFocus(InputType.TOTAL_ORDERS)}\n onBlur={onBlur(InputType.TOTAL_ORDERS)}\n />\n </Grid>\n <QuantityDistributionInput\n value={values.distribution_type}\n onValueChange={(value) => {\n props.onChange(\"distribution_type\", value);\n }}\n className={cn(!showSkewInput && \"oui-rounded-b-xl\")}\n />\n\n {showSkewInput && (\n <CustomInput\n id=\"order_skew_input\"\n label={t(\"orderEntry.skew\")}\n value={values.skew}\n error={parseErrorMsg(\"skew\")}\n onChange={(e) => {\n props.onChange(\"skew\", e);\n }}\n onFocus={onFocus(InputType.SKEW)}\n onBlur={onBlur(InputType.SKEW)}\n overrideFormatters={[\n inputFormatter.rangeFormatter({ min: 0, max: 100, dp: 2 }),\n inputFormatter.dpFormatter(2),\n ]}\n classNames={{\n root: \"oui-rounded-b-xl\",\n }}\n />\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Button, cn, Divider, Flex, Text } from \"@orderly.network/ui\";\nimport { removeTrailingZeros } from \"@orderly.network/utils\";\nimport type { LTVTooltipScriptReturn } from \"./LTVRiskTooltip.script\";\n\nconst calculateLTVColor = (val: number): string => {\n if (val >= 0 && val < 50) {\n return \"oui-text-success\";\n } else if (val >= 50 && val < 80) {\n return \"oui-text-warning\";\n } else if (val >= 80) {\n return \"oui-text-danger\";\n } else {\n return \"\";\n }\n};\n\nexport const LTVRiskTooltipUI: React.FC<LTVTooltipScriptReturn> = (props) => {\n const { t } = useTranslation();\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n holdingData = [],\n currentLtv,\n onConvert,\n } = props;\n return (\n <Flex gap={1} className=\"oui-w-72 oui-max-w-72\" direction=\"column\">\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"common.assets\")}\n </Text>\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.deposit.collateralContribution\")}\n </Text>\n </Flex>\n {holdingData.map((asset, index) => {\n return (\n <Flex\n key={`item-${index}`}\n width={\"100%\"}\n justify=\"between\"\n itemAlign=\"center\"\n >\n <Text intensity={80} size=\"xs\">\n {asset.token}\n </Text>\n <Text\n size=\"xs\"\n intensity={80}\n className={cn(\n Number(asset.collateralContribution) < 0 && \"oui-text-warning\",\n )}\n >\n {removeTrailingZeros(asset.collateralContribution)}\n </Text>\n </Flex>\n );\n })}\n <Divider className=\"oui-w-full\" />\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.LTV.currentLTV\")}\n </Text>\n <Text\n size=\"xs\"\n intensity={36}\n className={cn(\"oui-select-none\", calculateLTVColor(currentLtv))}\n >\n {currentLtv}%\n </Text>\n </Flex>\n <Text className=\"oui-py-2\" intensity={54} size=\"2xs\">\n {t(\"transfer.LTV.tooltip\", {\n threshold: isThresholdLoading ? \"-\" : ltv_threshold,\n usdcThreshold: isThresholdLoading ? \"-\" : negative_usdc_threshold,\n })}\n </Text>\n <Button\n fullWidth\n size={\"md\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={onConvert}\n >\n {t(\"transfer.convert.convertAssets\")}\n </Button>\n </Flex>\n );\n};\n","import { useCallback } from \"react\";\nimport {\n useComputedLTV,\n useHoldingStream,\n useIndexPricesStream,\n useQuery,\n useTokensInfo,\n} from \"@orderly.network/hooks\";\nimport { account } from \"@orderly.network/perp\";\nimport type { API } from \"@orderly.network/types\";\nimport { modal } from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\n\nconst useConvertThreshold = () => {\n const { data, error, isLoading } = useQuery<API.ConvertThreshold>(\n \"/v1/public/auto_convert_threshold\",\n { errorRetryCount: 3 },\n );\n return {\n ltv_threshold: new Decimal(data?.ltv_threshold ?? 0).mul(100).toNumber(),\n negative_usdc_threshold: data?.negative_usdc_threshold,\n isLoading,\n error,\n } as const;\n};\n\nexport const useLTVTooltipScript = () => {\n const { data: holdingList = [], isLoading: isHoldingLoading } =\n useHoldingStream();\n\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isLoading: isThresholdLoading,\n } = useConvertThreshold();\n\n const tokensInfo = useTokensInfo();\n\n const { data: indexPrices } = useIndexPricesStream();\n\n const holdingData = holdingList.map((item) => {\n const tokenInfo = tokensInfo?.find(({ token }) => token === item.token);\n\n // Use extracted function for index price calculation\n const indexPrice =\n item.token === \"USDC\"\n ? 1\n : (indexPrices?.[`PERP_${item.token}_USDC`] ?? 0);\n\n // Calculate collateral ratio for this token\n const collateralRatio = tokenInfo\n ? account.collateralRatio({\n baseWeight: tokenInfo.base_weight ?? 0,\n discountFactor: tokenInfo.discount_factor ?? 0,\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n indexPrice: indexPrice,\n })\n : 0;\n\n // Calculate collateral contribution for this token\n const collateralContribution = account.collateralContribution({\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n collateralRatio: collateralRatio,\n indexPrice: indexPrice,\n });\n\n return {\n ...item,\n collateralContribution: collateralContribution,\n };\n });\n\n const currentLtv = useComputedLTV();\n\n const onConvert = useCallback(async () => {\n return modal.show(\"ConvertDialogId\");\n }, []);\n\n return {\n holdingData,\n isHoldingLoading,\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n currentLtv: currentLtv,\n onConvert: onConvert,\n };\n};\n\nexport type LTVTooltipScriptReturn = ReturnType<typeof useLTVTooltipScript>;\n","import React from \"react\";\nimport { useLTVTooltipScript } from \"./LTVRiskTooltip.script\";\nimport { LTVRiskTooltipUI } from \"./LTVRiskTooltip.ui\";\n\nexport const LTVRiskTooltipWidget: React.FC = () => {\n const state = useLTVTooltipScript();\n return <LTVRiskTooltipUI {...state} />;\n};\n","import { Checkbox, cn, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type AdditionalInfoProps = {\n pinned: boolean;\n setPinned: (value: boolean) => void;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n orderTypeExtra?: OrderType;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n showExtra?: boolean;\n hidden: boolean;\n setHidden: (value: boolean) => void;\n};\n\nexport const AdditionalInfo = (props: AdditionalInfoProps) => {\n const { pinned, orderTypeExtra } = props;\n const { t } = useTranslation();\n\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\"\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n\n useEffect(() => {\n props.onValueChange?.(\"visible_quantity\", props.hidden ? 0 : 1);\n }, [props.hidden]);\n\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n {/* {props.showExtra && (\n\n )} */}\n <Flex\n // gapX={3}\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n className=\"oui-gap-x-2 md:oui-gap-x-3\"\n wrap=\"wrap\"\n gapY={1}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-postOnly-checkBox\"\n id={\"toggle_order_post_only\"}\n className=\"oui-peer\"\n color={\"white\"}\n variant={\"radio\"}\n disabled={!props.showExtra}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.postOnly\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-ioc-checkBox\"\n id={\"toggle_order_iov\"}\n color={\"white\"}\n className=\"oui-peer\"\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.ioc\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-fox-checkBox\"\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n className=\"oui-peer\"\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.fok\")}\n </label>\n </Flex>\n </Flex>\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-orderConfirm-checkBox\"\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.orderConfirm\")}\n </label>\n </Flex>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-hidden-checkBox\"\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n checked={props.hidden}\n onCheckedChange={(checked: boolean) => {\n props.setHidden(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.hidden\")}\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n data-testid=\"oui-testid-orderEntry-additional-keepVisible-switch\"\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.keepVisible\")}\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","export const useAdditionalScript = () => {\n // const [needConfirm, setNeedConfirm] = useLocalStorage(\n // \"orderly_order_confirm\",\n // true\n // );\n\n return {\n // needConfirm,\n // setNeedConfirm,\n };\n};\n","import { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo.ui\";\nimport { useAdditionalScript } from \"./additional.script\";\n\nexport const AdditionalInfoWidget = (props: AdditionalInfoProps) => {\n const state = useAdditionalScript();\n return <AdditionalInfo {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { i18n, useTranslation } from \"@orderly.network/i18n\";\nimport {\n API,\n BBOOrderType,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport {\n Badge,\n Box,\n Button,\n Checkbox,\n Divider,\n Flex,\n Grid,\n registerSimpleDialog,\n Text,\n textVariants,\n} from \"@orderly.network/ui\";\nimport { getBBOType, isBBOOrder } from \"../../utils\";\n\ntype OrderConfirmDialogProps = {\n order: OrderlyOrder;\n symbolInfo: API.SymbolExt;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: OrderConfirmDialogProps) => {\n const { symbolInfo, order, onConfirm, onCancel } = props;\n const { quote_dp, base_dp } = symbolInfo;\n const { side, order_type, order_type_ext, level } = order;\n const { t } = useTranslation();\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const renderPrice = () => {\n if (\n order_type === OrderType.MARKET ||\n order_type === OrderType.STOP_MARKET\n ) {\n return <Text intensity={80}>{t(\"common.marketPrice\")}</Text>;\n }\n\n if (isBBOOrder({ order_type, order_type_ext })) {\n const bboType = getBBOType({\n type: order_type_ext!,\n side,\n level,\n });\n const label = {\n [BBOOrderType.COUNTERPARTY1]: t(\"orderEntry.bbo.counterparty1\"),\n [BBOOrderType.COUNTERPARTY5]: t(\"orderEntry.bbo.counterparty5\"),\n [BBOOrderType.QUEUE1]: t(\"orderEntry.bbo.queue1\"),\n [BBOOrderType.QUEUE5]: t(\"orderEntry.bbo.queue5\"),\n }[bboType!];\n\n return <Text intensity={80}>{label}</Text>;\n }\n\n return (\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {order.order_price}\n </Text.numeral>\n );\n };\n\n return (\n <>\n <Flex justify={\"between\"}>\n <Text.formatted rule={\"symbol\"} showIcon>\n {order.symbol}\n </Text.formatted>\n <Flex justify={\"end\"} gapX={1}>\n <OrderTypeTag type={order_type} />\n {side === OrderSide.BUY ? (\n <Badge color={\"buy\"} size={\"sm\"}>\n {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n {t(\"common.sell\")}\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n <Flex justify={\"between\"}>\n <Text>{t(\"common.qty\")}</Text>\n <Text.numeral\n rule={\"price\"}\n dp={base_dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n >\n {order.order_quantity}\n </Text.numeral>\n </Flex>\n {!order.trigger_price ? null : (\n <Flex justify={\"between\"}>\n <Text>{t(\"common.trigger\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>{t(\"common.price\")}</Text>\n {renderPrice()}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={quote_dp}\n padding={false}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.total}\n </Text.numeral>\n </Flex>\n </div>\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n {order.tp_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>{t(\"orderEntry.tpMarkPrice\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n dp={quote_dp}\n padding={false}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.tp_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n {order.sl_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>{t(\"orderEntry.slMarkPrice\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {order.sl_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n </div>\n </>\n ) : null}\n\n <Flex gapX={1} pt={4} pb={5}>\n <Checkbox\n id=\"orderConfirm\"\n color={\"white\"}\n onCheckedChange={(checked) => {\n setNeedConfirm(!!!checked);\n }}\n />\n <label\n htmlFor=\"orderConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n })}\n >\n {t(\"orderEntry.disableOrderConfirm\")}\n </label>\n </Flex>\n\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <Box py={3} px={3} className=\"oui-text-center\">\n <Text color=\"warning\" size=\"xs\">\n {t(\"orderEntry.tpsl.trigger.description\")}\n </Text>\n </Box>\n ) : null}\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const { t } = useTranslation();\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return t(\"orderEntry.orderType.limit\");\n case OrderType.MARKET:\n return t(\"common.marketPrice\");\n case OrderType.STOP_LIMIT:\n return t(\"orderEntry.orderType.stopLimit\");\n case OrderType.STOP_MARKET:\n return t(\"orderEntry.orderType.stopMarket\");\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<OrderConfirmDialogProps, \"onCancel\" | \"onConfirm\"> & {\n close: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n },\n) => {\n const { close, resolve, reject, ...rest } = props;\n\n return (\n <OrderConfirmDialog\n {...rest}\n onCancel={() => {\n reject();\n close();\n }}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: () => i18n.t(\"orderEntry.orderConfirm\"),\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\n\nexport enum BBOStatus {\n ON = \"on\",\n OFF = \"off\",\n DISABLED = \"disabled\",\n}\n\n/**\n * if provide order_type, check order_type and order_type_ext, otherswise only check order_type_ext\n */\nexport function isBBOOrder(options: {\n order_type?: OrderType;\n order_type_ext?: OrderType;\n}) {\n const { order_type, order_type_ext } = options;\n\n const isBBO = [OrderType.ASK, OrderType.BID].includes(order_type_ext!);\n\n if (order_type) {\n return order_type === OrderType.LIMIT && isBBO;\n }\n\n return isBBO;\n}\n\nexport function getOrderTypeByBBO(value: BBOOrderType, size: OrderSide) {\n if (\n [BBOOrderType.COUNTERPARTY1, BBOOrderType.COUNTERPARTY5].includes(value)\n ) {\n return size === OrderSide.BUY ? OrderType.ASK : OrderType.BID;\n }\n\n if ([BBOOrderType.QUEUE1, BBOOrderType.QUEUE5].includes(value)) {\n return size === OrderSide.BUY ? OrderType.BID : OrderType.ASK;\n }\n}\n\nexport function getOrderLevelByBBO(value: BBOOrderType) {\n if ([BBOOrderType.COUNTERPARTY1, BBOOrderType.QUEUE1].includes(value)) {\n return OrderLevel.ONE;\n }\n\n if ([BBOOrderType.COUNTERPARTY5, BBOOrderType.QUEUE5].includes(value)) {\n return OrderLevel.FIVE;\n }\n}\n\nexport function getBBOType(options: {\n type: OrderType;\n side: OrderSide;\n level: OrderLevel;\n}) {\n const { type, side, level } = options;\n if (type === OrderType.ASK) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY1\n : BBOOrderType.QUEUE1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY5\n : BBOOrderType.QUEUE5;\n }\n }\n\n if (type === OrderType.BID) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE1\n : BBOOrderType.COUNTERPARTY1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE5\n : BBOOrderType.COUNTERPARTY5;\n }\n }\n}\n\nexport function getScaledPlaceOrderMessage(result: any) {\n const rows = result?.data?.rows || [];\n\n if (rows.length > 0) {\n const totalCount = rows.length;\n const successCount = rows.filter((row: any) => row.success).length;\n\n // fully successful\n if (successCount === totalCount) {\n return i18n.t(\"orderEntry.scaledOrder.fullySuccessful\", {\n total: totalCount,\n });\n }\n\n // all failed\n if (successCount === 0) {\n return i18n.t(\"orderEntry.scaledOrder.allFailed\");\n }\n\n // partially successful\n return i18n.t(\"orderEntry.scaledOrder.partiallySuccessful\", {\n successCount,\n total: totalCount,\n });\n }\n}\n","import { forwardRef, SVGProps, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport {\n Button,\n Flex,\n Grid,\n DataTable,\n cn,\n Badge,\n TokenIcon,\n Tooltip,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n ScaledOrderConfirmScriptOptions,\n ScaledOrderConfirmScriptReturns,\n} from \"./scaledOrderConfirm.script\";\n\nexport type ScaledOrderConfirmProps = ScaledOrderConfirmScriptOptions &\n ScaledOrderConfirmScriptReturns & {\n close?: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n };\n\nexport const ScaledOrderConfirm = (props: ScaledOrderConfirmProps) => {\n const { order, symbolInfo, dataSource, national, askAndBid, totalQuantity } =\n props;\n const { base, quote, base_dp, quote_dp } = symbolInfo;\n const { t } = useTranslation();\n\n const onCancel = () => {\n props.reject();\n props.close?.();\n };\n\n const onConfirm = () => {\n props.resolve();\n props.close?.();\n };\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n width: 125,\n render: (value: string, record: any) => {\n return (\n <Flex gap={2}>\n <div\n className={cn(\n \"oui-h-[38px] oui-w-1 oui-shrink-0 oui-rounded-[1px]\",\n record.side === OrderSide.BUY\n ? \"oui-bg-trade-profit\"\n : \"oui-bg-trade-loss\",\n )}\n />\n <Flex direction=\"column\" itemAlign=\"start\">\n <Flex gapX={1}>\n <TokenIcon symbol={value} className=\"oui-size-3\" />\n <Text.formatted\n rule=\"symbol\"\n size=\"xs\"\n formatString=\"base-type\"\n >\n {value}\n </Text.formatted>\n </Flex>\n\n <Badge color=\"neutral\" size=\"xs\">\n {t(\"orderEntry.orderType.limit\")}\n </Badge>\n </Flex>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.quantity\"),\n dataIndex: \"order_quantity\",\n width: 100,\n render: (value: string, record: any) => {\n return (\n <Text.numeral\n rule=\"price\"\n dp={base_dp}\n padding={false}\n color={record.side === OrderSide.BUY ? \"buy\" : \"sell\"}\n >\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.orderPrice\"),\n dataIndex: \"order_price\",\n width: 100,\n render: (value: string, record: any) => {\n // buy: limit_price_i >= ask0 , show warning.\n // sell: limit price <= bid0 , show warning.\n const showWarning = !!(record.side === OrderSide.BUY\n ? askAndBid?.[0] && Number(value) >= askAndBid?.[0]\n : askAndBid?.[1] && Number(value) <= askAndBid?.[1]);\n\n return (\n <Flex gapX={1}>\n <Text.numeral rule=\"price\" dp={quote_dp}>\n {value}\n </Text.numeral>\n\n {showWarning && (\n <Tooltip\n content={t(\n \"orderEntry.confirmScaledOrder.orderPrice.warning\",\n )}\n className=\"oui-w-[240px] oui-text-2xs oui-font-semibold oui-text-base-contrast-80\"\n >\n <TooltipIcon className=\"oui-text-warning-darken\" />\n </Tooltip>\n )}\n </Flex>\n );\n },\n },\n ];\n }, [t, symbolInfo, askAndBid, base_dp, quote_dp]);\n\n return (\n <div className=\"oui-font-semibold\">\n <DataTable\n classNames={{\n root: cn(\n \"oui-bg-base-7\",\n \"oui-rounded-lg\",\n // need to set overflow hidden because table header will avoid the border radius\n \"oui-overflow-hidden\",\n // \"oui-text-2xs lg:oui-text-xs\",\n // if orders is greater than 6, set the height to 320px to show scroll bar\n order.orders?.length >= 6 && \"oui-h-[320px]\",\n ),\n // set the min height of the table to show 2 rows\n scroll: \"!oui-min-h-[130px]\",\n }}\n dataSource={dataSource}\n columns={columns}\n bordered\n onRow={() => {\n return {\n className: cn(\"oui-h-[50px]\"),\n };\n }}\n />\n <div className=\"oui-mb-5 oui-mt-4 oui-text-2xs\">\n <Flex justify=\"between\">\n <Text>{t(\"orderEntry.totalOrders\")}</Text>\n <Text intensity={80}>{order.orders?.length}</Text>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"orderEntry.totalQuantity\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={base}\n dp={base_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {totalQuantity}\n </Text.numeral>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={quote}\n dp={quote_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {national}\n </Text.numeral>\n </Flex>\n </div>\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={onCancel}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={onConfirm}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </div>\n );\n};\n\nexport const TooltipIcon = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => {\n return (\n <svg\n width=\"12\"\n height=\"13\"\n viewBox=\"0 0 12 13\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path d=\"M5.99951 1.50708C3.23811 1.50708 0.999512 3.74558 0.999512 6.50708C0.999512 9.26858 3.23811 11.5071 5.99951 11.5071C8.76091 11.5071 10.9995 9.26858 10.9995 6.50708C10.9995 3.74558 8.76091 1.50708 5.99951 1.50708ZM5.99951 4.00708C6.27566 4.00708 6.49951 4.23108 6.49951 4.50708C6.49951 4.78308 6.27566 5.00708 5.99951 5.00708C5.72336 5.00708 5.49951 4.78308 5.49951 4.50708C5.49951 4.23108 5.72336 4.00708 5.99951 4.00708ZM5.99951 5.50708C6.27566 5.50708 6.49951 5.73108 6.49951 6.00708V8.50708C6.49951 8.78308 6.27566 9.00708 5.99951 9.00708C5.72336 9.00708 5.49951 8.78308 5.49951 8.50708V6.00708C5.49951 5.73108 5.72336 5.50708 5.99951 5.50708Z\" />\n </svg>\n );\n },\n);\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useEventEmitter } from \"@orderly.network/hooks\";\nimport { API, OrderlyOrder } from \"@orderly.network/types\";\nimport { Decimal, zero } from \"@orderly.network/utils\";\n\nexport type ScaledOrderConfirmScriptOptions = {\n order: OrderlyOrder & {\n orders: OrderlyOrder[];\n };\n symbolInfo: API.SymbolExt;\n};\n\nexport type ScaledOrderConfirmScriptReturns = ReturnType<\n typeof useScaledOrderConfirmScript\n>;\n\nexport function useScaledOrderConfirmScript(\n options: ScaledOrderConfirmScriptOptions,\n) {\n const { order, symbolInfo } = options;\n const orders = order.orders;\n\n const [askAndBid, setAskAndBid] = useState<number[]>();\n\n const ee = useEventEmitter();\n\n const national = useMemo(() => {\n const national = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_price).mul(order.order_quantity));\n }, zero);\n\n return national.toNumber();\n }, [orders]);\n\n const totalQuantity = useMemo(() => {\n const totalQuantity = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_quantity));\n }, zero);\n\n return totalQuantity.toString();\n }, [orders, symbolInfo.base_dp]);\n\n useEffect(() => {\n const onOrderBookUpdate = (data: any) => {\n const ask0 = data.asks?.[data.asks.length - 1]?.[0];\n const bid0 = data.bids?.[0]?.[0];\n setAskAndBid([ask0, bid0]);\n };\n ee.on(\"orderbook:update\", onOrderBookUpdate);\n\n return () => {\n ee.off(\"orderbook:update\", onOrderBookUpdate);\n };\n }, []);\n\n return { dataSource: orders, national, askAndBid, totalQuantity };\n}\n","import { FC } from \"react\";\nimport { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog } from \"@orderly.network/ui\";\nimport { useScaledOrderConfirmScript } from \"./scaledOrderConfirm.script\";\nimport {\n ScaledOrderConfirm,\n ScaledOrderConfirmProps,\n} from \"./scaledOrderConfirm.ui\";\n\nexport type ScaledOrderConfirmWidgetProps = ScaledOrderConfirmProps;\n\nexport const ScaledOrderConfirmWidget: FC<ScaledOrderConfirmWidgetProps> = (\n props,\n) => {\n const state = useScaledOrderConfirmScript(props);\n\n return <ScaledOrderConfirm {...props} {...state} />;\n};\n\nexport const scaledOrderConfirmDialogId = \"scaledOrderConfirm\";\n\nregisterSimpleDialog(scaledOrderConfirmDialogId, ScaledOrderConfirmWidget, {\n size: \"md\",\n title: () => i18n.t(\"orderEntry.confirmScaledOrder\"),\n contentProps: {\n // className: \"oui-p-0\",\n },\n});\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Text } from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { useFeesScript } from \"./fees.script\";\n\nexport const FeesUI: React.FC<ReturnType<typeof useFeesScript>> = (props) => {\n const { t } = useTranslation();\n const { takerFeeRate, makerFeeRate } = props;\n return (\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"common.fees\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"portfolio.feeTier.column.taker\")}: --% /{\" \"}\n {t(\"portfolio.feeTier.column.maker\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text size=\"2xs\">{t(\"portfolio.feeTier.column.taker\")}:</Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {takerFeeRate}\n </Text>\n <Text size=\"2xs\">/</Text>\n <Text size=\"2xs\">{t(\"portfolio.feeTier.column.maker\")}:</Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {makerFeeRate}\n </Text>\n </Flex>\n </AuthGuard>\n </Flex>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccountInfo } from \"@orderly.network/hooks\";\nimport { Decimal } from \"@orderly.network/utils\";\n\nexport const useFeesScript = () => {\n const { data } = useAccountInfo();\n\n const takerFeeRate = useMemo(() => {\n const value = data?.futures_taker_fee_rate;\n if (typeof value === \"undefined\") {\n return undefined;\n }\n return `${new Decimal(value).mul(0.01).toString()}%`;\n }, [data]);\n\n const makerFeeRate = useMemo(() => {\n const value = data?.futures_maker_fee_rate;\n if (typeof value === \"undefined\") {\n return undefined;\n }\n return `${new Decimal(value).mul(0.01).toString()}%`;\n }, [data]);\n\n return { takerFeeRate, makerFeeRate } as const;\n};\n","import React from \"react\";\nimport { useFeesScript } from \"./fees.script\";\nimport { FeesUI } from \"./fees.ui\";\n\nexport const FeesWidget: React.FC = () => {\n const state = useFeesScript();\n return <FeesUI {...state} />;\n};\n","import { createContext } from \"react\";\n\nexport type OrderEntryContextState = {\n errorMsgVisible: boolean;\n};\n\nexport const OrderEntryContext = createContext<OrderEntryContextState>(\n {} as OrderEntryContextState\n);\n\nexport const OrderEntryProvider = OrderEntryContext.Provider;\n","import { FC, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { DistributionType } from \"@orderly.network/types\";\nimport { Box, Checkbox, cn, Flex, modal, Text } from \"@orderly.network/ui\";\n\nexport type QuantityDistributionInputProps = QuantityDistributionProps & {\n className?: string;\n};\n\nexport const QuantityDistributionInput: FC<QuantityDistributionInputProps> = (\n props,\n) => {\n const { t } = useTranslation();\n\n const { className, ...rest } = props;\n\n const showHint = () => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"sm\",\n content: <QuantityDistributionHint value={props.value} />,\n // classNames: {\n // content: \"oui-bg-base-6\",\n // },\n });\n };\n\n return (\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n justify=\"center\"\n p={2}\n r=\"base\"\n // gapY={1}\n width=\"100%\"\n intensity={600}\n className={cn(\n \"oui-t-rounded oui-text-base-contrast-36\",\n \"oui-border oui-border-solid oui-border-line\",\n className,\n )}\n >\n <Text\n size=\"2xs\"\n className=\"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\"\n onClick={showHint}\n >\n {t(\"orderEntry.quantityDistribution\")}\n </Text>\n <QuantityDistribution {...rest} />\n </Flex>\n );\n};\n\ntype QuantityDistributionHintProps = {\n value?: DistributionType;\n};\n\nconst QuantityDistributionHint: FC<QuantityDistributionHintProps> = (props) => {\n const { t } = useTranslation();\n const [type, setType] = useState(DistributionType.FLAT);\n\n useEffect(() => {\n setType(\n [\n DistributionType.FLAT,\n DistributionType.ASCENDING,\n DistributionType.DESCENDING,\n ].includes(props.value!)\n ? props.value!\n : DistributionType.FLAT,\n );\n }, [props.value]);\n\n const content = useMemo(() => {\n return [\n {\n type: DistributionType.FLAT,\n title: t(\"orderEntry.distributionType.flat\"),\n description: t(\"orderEntry.distributionType.flat.description\"),\n formula: `${t(\"orderEntry.skew\")} = 1`,\n quantity: <FlatQuantity />,\n },\n {\n type: DistributionType.ASCENDING,\n title: t(\"orderEntry.distributionType.ascending\"),\n description: t(\"orderEntry.distributionType.ascending.description\"),\n formula: `${t(\"orderEntry.skew\")} > 1`,\n quantity: <AscendingQuantity />,\n },\n {\n type: DistributionType.DESCENDING,\n title: t(\"orderEntry.distributionType.descending\"),\n description: t(\"orderEntry.distributionType.descending.description\"),\n formula: `0 < ${t(\"orderEntry.skew\")} < 1`,\n quantity: <DescendingQuantity />,\n },\n ];\n }, []);\n\n const currentContent = useMemo(() => {\n return content.find((item) => item.type === type);\n }, [content, type]);\n\n return (\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-54\">\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text intensity={80}>\n {t(\"orderEntry.quantityDistribution.description\")}\n </Text>\n <Text>{t(\"orderEntry.quantityDistribution.formula\")}</Text>\n </Flex>\n <Flex intensity={600} p={1} r=\"base\" mt={3} itemAlign=\"start\">\n <Flex direction=\"column\" itemAlign=\"start\">\n {content.map((item) => (\n <Box\n key={item.title}\n intensity={type === item.type ? 500 : 600}\n width={78}\n p={2}\n className=\"oui-cursor-pointer oui-rounded-l\"\n onClick={() => {\n setType(item.type);\n }}\n >\n <Text>{item.title}</Text>\n </Box>\n ))}\n </Flex>\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n gapY={1}\n p={2}\n intensity={500}\n width=\"100%\"\n className={cn(\n \"oui-rounded-r\",\n type === DistributionType.FLAT && \"oui-rounded-bl\",\n type === DistributionType.ASCENDING && \"oui-rounded-l\",\n type === DistributionType.DESCENDING && \"oui-rounded-tl\",\n )}\n >\n <div>{currentContent?.formula}</div>\n <Text>{currentContent?.description}</Text>\n <Flex width=\"100%\" justify=\"center\">\n {currentContent?.quantity}\n </Flex>\n <Flex width=\"100%\" gapX={1} justify=\"center\">\n <Text className=\"oui-text-base-1\">{t(\"common.price\")}</Text>\n <PriceChart />\n </Flex>\n </Flex>\n </Flex>\n </div>\n );\n};\n\ntype QuantityDistributionProps = {\n value?: DistributionType;\n onValueChange: (value: DistributionType) => void;\n};\n\nconst QuantityDistribution: FC<QuantityDistributionProps> = (props) => {\n const { value, onValueChange } = props;\n const { t } = useTranslation();\n\n const onChange = (value: DistributionType) => (checked: boolean) => {\n onValueChange(value);\n };\n\n const distributionTypeMap = useMemo(() => {\n return {\n [DistributionType.FLAT]: t(\"orderEntry.distributionType.flat\"),\n [DistributionType.ASCENDING]: t(\n \"orderEntry.distributionType.ascending.abbr\",\n ),\n [DistributionType.DESCENDING]: t(\n \"orderEntry.distributionType.descending.abbr\",\n ),\n [DistributionType.CUSTOM]: t(\"orderEntry.distributionType.custom\"),\n };\n }, [t]);\n\n return (\n <Flex className={cn(\"oui-gap-x-[6px] lg:oui-gap-x-2\")} wrap=\"wrap\">\n {Object.values(DistributionType).map((type) => {\n return (\n <Flex itemAlign={\"center\"} key={type}>\n <Checkbox\n id={`distribution-type-${type}`}\n color={\"white\"}\n variant={\"radio\"}\n checked={value === type}\n onCheckedChange={onChange(type)}\n />\n <label\n htmlFor={`distribution-type-${type}`}\n className={cn(\n \"oui-text-2xs\",\n \"oui-ml-1\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {distributionTypeMap[type]}\n </label>\n </Flex>\n );\n })}\n </Flex>\n );\n};\n\nconst FlatQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\nconst AscendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"4.28571\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"5.14286\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6.85714\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"7.71429\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst DescendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n width=\"181\"\n height=\"4\"\n transform=\"matrix(-1 0 0 1 200 18)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"5\"\n cy=\"5\"\n r=\"4.28571\"\n transform=\"matrix(-1 0 0 1 208 15)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"5.14286\"\n transform=\"matrix(-1 0 0 1 162 14)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"7\"\n cy=\"7\"\n r=\"6\"\n transform=\"matrix(-1 0 0 1 116 13)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6.85714\"\n transform=\"matrix(-1 0 0 1 70 12)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"9\"\n cy=\"9\"\n r=\"7.71429\"\n transform=\"matrix(-1 0 0 1 24 11)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst PriceChart = () => {\n return (\n <svg\n width=\"176\"\n height=\"8\"\n viewBox=\"0 0 176 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M175.354 4.35355C175.549 4.15829 175.549 3.84171 175.354 3.64645L172.172 0.464466C171.976 0.269204 171.66 0.269204 171.464 0.464466C171.269 0.659728 171.269 0.976311 171.464 1.17157L174.293 4L171.464 6.82843C171.269 7.02369 171.269 7.34027 171.464 7.53553C171.66 7.7308 171.976 7.7308 172.172 7.53553L175.354 4.35355ZM0 4V4.5H175V4V3.5H0V4Z\"\n fill=\"rgb(var(--oui-color-base-1))\"\n />\n </svg>\n );\n};\n","import { useRef } from \"react\";\nimport { useBoolean } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n EditIcon,\n Flex,\n Text,\n SimpleDialog,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { SlippageEditor } from \"./slippageEditor\";\n\nexport const SlippageCell = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n const { t } = useTranslation();\n const [open, { setTrue: setOpen, setFalse: setClose, toggle }] =\n useBoolean(false);\n\n const { isMobile } = useScreen();\n const slippageRef = useRef<{ getValue: () => number | undefined }>(null);\n\n const onConfirm = () => {\n const val = slippageRef.current?.getValue();\n\n props.setSlippage(!val ? \"1\" : val.toString());\n setClose();\n return Promise.resolve(true);\n };\n\n return (\n <>\n <SimpleDialog\n open={open}\n onOpenChange={toggle}\n title={t(\"common.settings\")}\n contentProps={{ size: isMobile ? \"xs\" : \"sm\" }}\n actions={{\n primary: {\n disabled: false,\n label: t(\"common.save\"),\n onClick: onConfirm,\n },\n secondary: {\n label: t(\"common.cancel\"),\n onClick: () => setClose(),\n },\n }}\n >\n <SlippageEditor\n ref={slippageRef}\n isMobile={isMobile}\n initialValue={props.slippage ? Number(props.slippage) : undefined}\n />\n </SimpleDialog>\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"orderEntry.slippage\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"orderEntry.slippage.est\")}: -% / {t(\"common.max\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text.numeral\n size=\"2xs\"\n rule=\"percentages\"\n prefix={`${t(\"orderEntry.slippage.est\")}: `}\n suffix={` / ${t(\"common.max\")}: `}\n >\n {props.estSlippage ?? 0}\n </Text.numeral>\n <button className=\"oui-text-2xs\" onClick={() => setOpen()}>\n <Flex className=\"oui-gap-0.5\" as=\"span\">\n <Text size=\"2xs\" className=\"oui-text-primary\">\n {`${props.slippage || \"-\"}%`}\n </Text>\n <EditIcon\n className=\"oui-text-primary oui-hidden md:oui-block\"\n size={12}\n opacity={1}\n />\n </Flex>\n </button>\n </Flex>\n </AuthGuard>\n </Flex>\n </>\n );\n};\n","import {\n FC,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n cn,\n ExclamationFillIcon,\n Flex,\n Input,\n inputFormatter,\n modal,\n Text,\n Tooltip,\n TooltipTrigger,\n} from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\n\ninterface SlippageProps {\n initialValue?: number;\n isMobile?: boolean;\n}\n\nconst options = [0.01, 0.05, 0.1];\n\nexport const SlippageEditor = forwardRef<\n { getValue: () => number | undefined },\n SlippageProps\n>((props, ref) => {\n const { t } = useTranslation();\n const [value, setValue] = useState<number>();\n const [customValue, setCustomValue] = useState(\"\");\n const [error, setError] = useState<string | undefined>(undefined);\n\n useImperativeHandle(ref, () => ({\n getValue: () =>\n customValue ? new Decimal(customValue)?.toNumber() : value,\n }));\n\n useEffect(() => {\n if (props.initialValue && !options.includes(props.initialValue!)) {\n setCustomValue(props.initialValue!.toString());\n } else {\n setValue(props.initialValue);\n }\n }, [props.initialValue, open]);\n\n const onClick = (val: number) => {\n setValue(val);\n setCustomValue(\"\");\n setError(undefined);\n };\n\n const onValueChange = (val: string) => {\n if (!val) {\n setCustomValue(val);\n return;\n }\n\n const d = new Decimal(val);\n setValue(undefined);\n if (d.gt(3)) {\n setCustomValue(\"3\");\n setError(t(\"orderEntry.slippage.error.exceed\"));\n } else {\n setCustomValue(val);\n setError(undefined);\n }\n };\n\n const toolTipButton = props.isMobile ? (\n <button\n onClick={() => {\n // setOpen(true)\n modal.alert({\n title: t(\"common.tips\"),\n message: <Text size=\"2xs\">{t(\"orderEntry.slippage.tips\")}</Text>,\n });\n }}\n >\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </button>\n ) : (\n <Tooltip\n // @ts-ignore\n content={\n <Text intensity={80} size=\"2xs\">\n {t(\"orderEntry.slippage.tips\")}\n </Text>\n }\n className=\"oui-w-[260px] oui-bg-base-6\"\n arrow={{ className: \"oui-fill-base-6\" }}\n >\n <TooltipTrigger>\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </TooltipTrigger>\n </Tooltip>\n );\n\n return (\n <div className=\"oui-text-2xs\">\n <Flex mb={2} gapX={1}>\n <Text size=\"xs\">{t(\"orderEntry.slippage\")}</Text>\n {toolTipButton}\n </Flex>\n <Flex gapX={2}>\n {options.map((item) => {\n const isActive = value === item;\n return (\n <SlippageItem\n key={item}\n value={item}\n isActive={isActive}\n onClick={() => {\n onClick(item);\n }}\n />\n );\n })}\n\n <Input\n suffix=\"%\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(2),\n ]}\n value={customValue}\n onValueChange={onValueChange}\n classNames={{\n root: cn(\n \"oui-rounded-md oui-bg-base-6\",\n \"oui-h-[40px] oui-w-[74px]\",\n ),\n input: \"oui-text-base-contrast\",\n additional: \"oui-pl-1\",\n }}\n />\n </Flex>\n {!!error && (\n <Box mt={5} className=\"-oui-mb-5\">\n <Text size=\"2xs\" color=\"danger\">\n {error}\n </Text>\n </Box>\n )}\n </div>\n );\n});\n\ntype SlippageItemProps = {\n value: number;\n isActive: boolean;\n onClick: () => void;\n};\n\nconst SlippageItem: FC<SlippageItemProps> = ({ value, isActive, onClick }) => {\n return (\n <Flex\n intensity={600}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"md\"\n width={74}\n height={40}\n className={cn(\n \"oui-cursor-pointer oui-select-none\",\n isActive && \"oui-bg-primary-light\",\n )}\n onClick={onClick}\n >\n <Text size=\"sm\" intensity={80}>\n {value}%\n </Text>\n </Flex>\n );\n};\n","import { SlippageCell } from \"./components/slippageCell\";\n\nexport const SlippageUI = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n return <SlippageCell {...props} />;\n};\n","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { OrderType } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n Text,\n Input,\n inputFormatter,\n modal,\n Switch,\n} from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\n\ntype OrderValueKeys = keyof OrderlyOrder;\n\ntype Est_Values = PNL_Values & {\n trigger_price?: string;\n};\n\ntype TPSL_Values = { tp: Est_Values; sl: Est_Values };\n\nexport const OrderTPSL = (props: {\n // onCancelTPSL: () => void;\n // onEnableTP_SL: () => void;\n switchState: boolean;\n onSwitchChanged: (state: boolean) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n // setOpen(false);\n props.onSwitchChanged(false);\n\n // props.onCancelTPSL();\n }\n }, [props.orderType]);\n\n if (\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n )\n return null;\n\n return (\n <div>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"order_entry_tpsl\"}\n className=\"oui-h-[14px]\"\n checked={props.switchState}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n // setOpen(checked);\n props.onSwitchChanged(checked);\n // if (!checked) {\n // props.onCancelTPSL();\n // } else {\n // props.onEnableTP_SL();\n // }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n {t(\"common.tpsl\")}\n </label>\n <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-white/[.36] hover:oui-text-white/80\"\n onClick={() => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: <Text intensity={54}>{t(\"orderEntry.tpsl.tips\")}</Text>,\n });\n }}\n />\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n props.switchState && \"oui-max-h-[100px]\",\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\n \"opacity\",\n props.switchState ? \"1\" : \"0\",\n );\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n quote_dp={props.quote_dp}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n }\n>((props, ref) => {\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(props.errors);\n\n return (\n <div\n ref={ref}\n className={\"oui-space-y-1 oui-px-px oui-py-2 oui-transition-all\"}\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={parseErrorMsg(\"tp_trigger_price\")}\n onChange={props.onChange}\n values={props.values.tp}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-tpPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-tpPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-tp-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={parseErrorMsg(\"sl_trigger_price\")}\n onChange={props.onChange}\n values={props.values.sl}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-slPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-slPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-sl-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n </div>\n );\n});\n\nTPSLInputForm.displayName = \"TPSLInputForm\";\n\n//------- TPSLTriggerPriceInput start -------\nconst TPSLTriggerPriceInput = (props: {\n type: \"TP\" | \"SL\";\n error: string | undefined;\n values: Est_Values;\n onChange: (value: string) => void;\n quote_dp: number | undefined;\n testId?: string;\n}) => {\n const { t } = useTranslation();\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const { tipsEle } = usePnlInputContext();\n const [prefix, setPrefix] = useState<string>(`${props.type} Price`);\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const [innerValue, setInnerValue] = useState<string>(\n props.values.trigger_price ?? \"\",\n );\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(props.values.trigger_price ?? \"\");\n }, [props.values.trigger_price, isFocused]);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n const getPrefixLabel = (trigger_price?: string) => {\n let _prefix = props.type === \"TP\" ? t(\"tpsl.tpPrice\") : t(\"tpsl.slPrice\");\n\n if (trigger_price) {\n _prefix = props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\");\n }\n return _prefix;\n };\n\n const onValueChange = (value: string) => {\n setInnerValue(value);\n props.onChange(value);\n };\n\n // console.log(\"props.values.trigger_price\", props.values.trigger_price);\n\n useEffect(() => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n\n if (!isFocused) {\n setInnerValue(props.values.trigger_price ?? \"\");\n }\n }, [props.type, props.values.trigger_price]);\n\n const onFocus = () => {\n setPrefix(props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\"));\n setPlaceholder(\"\");\n setTipVisible(true);\n setIsFocused(true);\n };\n\n const onBlur = () => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(innerValue);\n };\n\n return (\n <Input.tooltip\n data-testid={props.testId}\n prefix={prefix}\n size={\"md\"}\n placeholder={placeholder}\n align=\"right\"\n onFocus={onFocus}\n onBlur={onBlur}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={innerValue}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n root: \"oui-pr-2 md:oui-pr-3\",\n prefix: \"oui-pr-1 md:oui-pr-2\",\n }}\n // onChange={props.onChange}\n onValueChange={onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp ?? 2),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\n//------- TPSLTriggerPriceInput end -------\n\nconst TPSLInputRow = (props: {\n type: \"TP\" | \"SL\";\n values: Est_Values;\n error?: string;\n onChange: (key: OrderValueKeys, value: any) => void;\n quote_dp: number | undefined;\n testIds?: {\n first?: string;\n second?: string;\n dropDown?: string;\n };\n}) => {\n const priceKey =\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\";\n\n return (\n <Grid cols={2} gapX={1}>\n <TPSLTriggerPriceInput\n testId={props.testIds?.first}\n type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(priceKey, event);\n }}\n quote_dp={props.quote_dp}\n />\n\n <PnlInputWidget\n testIds={{\n input: props.testIds?.second,\n dropDown: props.testIds?.dropDown,\n }}\n onChange={props.onChange}\n quote={\"USDC\"}\n quote_dp={props.quote_dp}\n type={props.type}\n values={{\n PnL: props.values.PnL,\n Offset: props.values.Offset,\n \"Offset%\": props.values[\"Offset%\"],\n ROI: props.values.ROI,\n }}\n />\n </Grid>\n );\n};\n","import {\n CaretDownIcon,\n cn,\n Flex,\n Input,\n MenuItem,\n Text,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n modeLabelMap,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n useEffect(() => {\n setPrefix(!!value ? \"\" : mode);\n }, [value]);\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={modeLabelMap[prefix as keyof typeof modeLabelMap] || prefix}\n size={\"md\"}\n placeholder={placeholder}\n id={id}\n align={\"right\"}\n value={value}\n tooltip={tips}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n data-testid={props.testIds?.input}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_dp, mode, type }),\n inputFormatter.currencyFormatter,\n // inputFormatter.identifierFormatter(),\n ]}\n classNames={{\n root: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n additional: \"oui-text-base-contrast-54\",\n input: \"oui-text-inherit\",\n }}\n onFocus={() => {\n setPrefix(\"\");\n setPlaceholder(\"\");\n onFocus();\n }}\n onBlur={() => {\n setPrefix(!!value ? \"\" : mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n onBlur();\n }}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className=\"oui-ml-[2px]\">\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n testId={props.testIds?.dropDown}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n testId?: string;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"} data-testid={props.testId}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\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 ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values, quote_dp } = props;\n const { t } = useTranslation();\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const [innerValue, setInnerValue] = useState<string>(\n values[mode as keyof PNL_Values],\n );\n\n // const value = useMemo(() => {\n // // console.log(\"mode\", mode, values);\n // const value = values[mode as keyof PNL_Values];\n // // if (isFocused) {\n // // return value;\n // // }\n // return value;\n // }, [values, mode, isFocused]);\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(values[mode as keyof PNL_Values]);\n }, [values, mode, isFocused]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n {\n label: t(\"tpsl.pnl\"),\n value: PnLMode.PnL,\n testId: `${PnLMode.PnL}_menu_item`,\n },\n {\n label: t(\"tpsl.offset\"),\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: `${t(\"tpsl.offset\")}%`,\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, [t]);\n\n const modeLabelMap = useMemo(() => {\n return {\n [PnLMode.PnL]: t(\"tpsl.pnl\"),\n [PnLMode.OFFSET]: t(\"tpsl.offset\"),\n [PnLMode.PERCENTAGE]: `${t(\"tpsl.offset\")}%`,\n };\n }, [t]);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n // if (!isFocused) {\n // props.onChange(key, value);\n // } else {\n // setInnerValue(value);\n // }\n setInnerValue(value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n setIsFocused(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(key, innerValue);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions,\n ) => {\n value = `${value}`; // convert to string\n\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n // value = new Decimal(\n // value.replace(\n // new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n // \"\"\n // )\n // )\n // .mul(100)\n // .toString();\n\n // return `${todpIfNeed(value, 2)}${percentageSuffix.current}`;\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\",\n ),\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n // return (Number(value) * 100).toFixed(2);\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n // console.log(\"onSendBefore\", value);\n\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n modeLabelMap,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value: innerValue,\n onValueChange,\n quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import {\n createContext,\n PropsWithChildren,\n ReactNode,\n useContext,\n useMemo,\n} from \"react\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype TipType = \"ROI\" | \"PnL\" | \"Error\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n\nexport const PnlInputProvider = (\n props: PropsWithChildren<{\n values: PNL_Values & {\n trigger_price?: string;\n };\n type: \"TP\" | \"SL\";\n }>\n) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n const { t } = useTranslation();\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n \n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {mode === PnLMode.PnL\n ? t(\"orderEntry.estRoi\")\n : t(\"orderEntry.estPnL\")}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, props.values.PnL, props.values.trigger_price]);\n\n return (\n <PnlInputContext.Provider\n value={{\n mode,\n setMode,\n tipsEle,\n }}\n >\n {props.children}\n </PnlInputContext.Provider>\n );\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n }\n) => {\n const { testIds, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testIds={testIds} quote={quote} type={props.type} />\n );\n};\n","import { useEffect, useRef, FocusEvent, useMemo, useState } from \"react\";\nimport {\n useAccount,\n useComputedLTV,\n useEventEmitter,\n useLocalStorage,\n useMarginRatio,\n useOrderEntry,\n utils,\n} from \"@orderly.network/hooks\";\nimport { useAppContext } from \"@orderly.network/react-app\";\nimport {\n BBOOrderType,\n DistributionType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"./utils\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport type OrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const [localOrderType, setLocalOrderType] = useLocalStorage(\n \"orderly-order-entry-order-type\",\n OrderType.LIMIT,\n );\n const [localOrderSide, setLocalOrderSide] = useLocalStorage(\n \"orderly-order-entry-order-side\",\n OrderSide.BUY,\n );\n const [localBBOType, setLocalBBOType] = useLocalStorage<\n BBOOrderType | undefined\n >(\"orderly_order_bbo_type\", undefined);\n\n const lastBBOType = useRef<BBOOrderType>(localBBOType);\n\n const { formattedOrder, setValue, setValues, symbolInfo, ...state } =\n useOrderEntry(inputs.symbol, {\n initialOrder: {\n symbol: inputs.symbol,\n order_type: localOrderType,\n side: localOrderSide,\n },\n });\n const [tpslSwitch, setTpslSwitch] = useLocalStorage(\n \"orderly-order-entry-tp_sl-switch\",\n false,\n );\n\n const { state: accountState } = useAccount();\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (accountState.status === AccountStatusEnum.EnableTrading ||\n accountState.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [accountState.status, wrongNetwork, disabledConnect]);\n\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const lastScaledOrderPriceInput = useRef<InputType>(InputType.MAX_PRICE);\n const triggerPriceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputContainerRef = useRef<HTMLDivElement | null>(null);\n const [priceInputContainerWidth, setPriceInputContainerWidth] = useState(0);\n\n const currentQtyPercentage = useMemo(() => {\n if (Number(formattedOrder.order_quantity) >= Number(state.maxQty)) return 1;\n return (\n convertValueToPercentage(\n Number(formattedOrder.order_quantity ?? 0),\n 0,\n state.maxQty,\n ) / 100\n );\n }, [formattedOrder.order_quantity, state.maxQty]);\n\n const formatQty = () => {\n if (\n symbolInfo.base_tick < 1 ||\n // scaled order should not format quantity, because it is total quantity\n formattedOrder.order_type === OrderType.SCALED ||\n !formattedOrder.order_quantity\n ) {\n return;\n }\n\n // TODO: use this to format quantity instead of utils.formatNumber, need time to test\n // const formatQty = new Decimal(formattedOrder.order_quantity)\n // .todp(0, Decimal.ROUND_DOWN)\n // .div(symbolInfo.base_tick)\n // .toString();\n\n const quantity = utils.formatNumber(\n formattedOrder?.order_quantity,\n new Decimal(symbolInfo?.base_tick || \"0\").toNumber(),\n );\n\n setValue(\"order_quantity\", quantity, {\n shouldUpdateLastChangedField: false,\n });\n };\n\n const onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\n\n // set last scaled order price input\n if (\n [InputType.MIN_PRICE, InputType.MAX_PRICE].includes(\n currentFocusInput.current!,\n )\n ) {\n lastScaledOrderPriceInput.current = type;\n }\n };\n\n const onBlur = (type: InputType) => (_: FocusEvent) => {\n setTimeout(() => {\n if (currentFocusInput.current !== type) return;\n currentFocusInput.current = InputType.NONE;\n }, 300);\n\n if (type === InputType.QUANTITY) {\n formatQty();\n }\n };\n\n // cancel TP/SL\n const cancelTP_SL = () => {\n // if(formattedOrder.)\n setValues({\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n });\n };\n\n const enableTP_SL = () => {\n setValues({\n order_type_ext: undefined,\n });\n };\n\n const setMaxQty = () => {\n setValue(\"order_quantity\", state.maxQty);\n };\n\n const setOrderValue = (\n key: any,\n value: any,\n options?: {\n shouldUpdateLastChangedField?: boolean;\n },\n ) => {\n if (key === \"order_type\") {\n setLocalOrderType(value);\n }\n if (key === \"side\") {\n setLocalOrderSide(value);\n }\n\n if (\n (key === \"reduce_only\" && value) ||\n (key === \"order_type\" &&\n (value === OrderType.STOP_LIMIT || value === OrderType.STOP_MARKET))\n ) {\n // cancelTP_SL();\n\n const data = {\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n [key]: value,\n };\n\n if (key === \"order_type\") {\n data[\"order_type_ext\" as any] = \"\";\n }\n\n setValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value !== OrderType.LIMIT) {\n const data = {\n level: undefined,\n order_type_ext: undefined,\n [key]: value,\n };\n\n setValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value === OrderType.SCALED) {\n setValues({\n distribution_type: DistributionType.FLAT,\n [key]: value,\n });\n return;\n }\n\n setValue(key, value, options);\n };\n\n const onTPSLSwitchChanged = (state: boolean) => {\n setTpslSwitch(state);\n if (state) {\n enableTP_SL();\n } else {\n cancelTP_SL();\n }\n };\n\n const bboStatus = useMemo(() => {\n if (\n tpslSwitch ||\n [OrderType.POST_ONLY, OrderType.IOC, OrderType.FOK].includes(\n formattedOrder.order_type_ext!,\n )\n ) {\n return BBOStatus.DISABLED;\n }\n\n return localBBOType && formattedOrder.order_type === OrderType.LIMIT\n ? BBOStatus.ON\n : BBOStatus.OFF;\n }, [\n localBBOType,\n tpslSwitch,\n formattedOrder.order_type,\n formattedOrder.order_type_ext!,\n ]);\n\n const toggleBBO = () => {\n if (localBBOType) {\n // unselect bbo\n setLocalBBOType(undefined);\n // update formattedOrder values immediately instead of via useEffect\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n } else {\n setLocalBBOType(lastBBOType.current || BBOOrderType.COUNTERPARTY1);\n }\n };\n\n const onBBOChange = (value: BBOOrderType) => {\n setLocalBBOType(value);\n lastBBOType.current = value;\n };\n\n useEffect(() => {\n if (bboStatus === BBOStatus.DISABLED) {\n const { order_type_ext } = formattedOrder;\n setValues({\n // if order_type_ext is not bbo(ask, bid), keep previous value\n order_type_ext: isBBOOrder({ order_type_ext })\n ? undefined\n : order_type_ext,\n level: undefined,\n });\n }\n }, [bboStatus, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n if (bboStatus === BBOStatus.ON) {\n const orderType = getOrderTypeByBBO(localBBOType, formattedOrder.side!);\n const orderLevel = getOrderLevelByBBO(localBBOType)!;\n setValues({\n order_type_ext: orderType,\n level: orderLevel,\n });\n }\n }, [localBBOType, bboStatus, formattedOrder.side!]);\n\n // useEffect(() => {\n // if (\n // priceInputContainerRef.current &&\n // // update BBO select width when is BBO order\n // isBBOOrder({ order_type_ext: formattedOrder.order_type_ext })\n // ) {\n // const width =\n // priceInputContainerRef.current.getBoundingClientRect()?.width;\n // if (width) {\n // setPriceInputContainerWidth(width);\n // }\n // }\n // }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n const updateOrderPrice = (price: string) => {\n setValue(\"order_price\", price);\n };\n ee.on(\"update:orderPrice\", updateOrderPrice);\n\n return () => {\n ee.off(\"update:orderPrice\", updateOrderPrice);\n };\n }, []);\n\n useEffect(() => {\n const focusInputElement = (target: HTMLInputElement | null) => {\n setTimeout(() => {\n target?.focus();\n }, 0);\n };\n\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n const price = removeTrailingZeros(item[0]);\n const { order_type, order_type_ext } = formattedOrder;\n\n // handle trigger price input, focus on trigger price input\n if (\n currentFocusInput.current === InputType.TRIGGER_PRICE &&\n (order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.STOP_MARKET)\n ) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle bbo order, unselect bbo and set order price, focus on order price input\n if (isBBOOrder({ order_type, order_type_ext })) {\n setLocalBBOType(undefined);\n\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n\n setTimeout(() => {\n // Since BBO will update the price when unselected, we should set order price in setTimeout\n // We can't call setValue directly here because it's inside a setTimeout, and the formattedOrder accessed inside setValue would be the old value\n // setValue(\"order_price\", price);\n ee.emit(\"update:orderPrice\", price);\n }, 0);\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle limit order and stop limit order, set order price and focus on order price input\n if (\n order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle stop market order, set trigger price and focus on trigger price input\n if (order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle market order, set order type to limit\n if (order_type === OrderType.MARKET) {\n // unselect bbo\n setLocalBBOType(undefined);\n\n // You can't call setValue twice here , the second value will override the first, so you need to combine them into a single setValues call\n setValues({\n order_type: OrderType.LIMIT,\n order_price: price,\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n if (\n order_type === OrderType.SCALED &&\n lastScaledOrderPriceInput.current\n ) {\n const field =\n lastScaledOrderPriceInput.current === InputType.MIN_PRICE\n ? \"min_price\"\n : \"max_price\";\n setValue(field, price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // default, set order price and focus on order price input\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n // Please do not modify this deps lightly, because `setValue` also relies on these state internally\n }, [formattedOrder, symbolInfo]);\n\n useEffect(() => {\n const element = priceInputContainerRef.current;\n\n if (!element) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n if (width) {\n // update BBO order select dropdown width when priceInputContainerRef width changed\n setPriceInputContainerWidth(width);\n }\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.unobserve(element);\n };\n }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n // after switching symbol, all the input number should be cleared (price, qty, TP/SL, etc)\n state.reset();\n state.resetMetaState();\n }, [inputs.symbol]);\n\n // if scaled order, and distribution_type is not set, set it to flat\n useEffect(() => {\n if (\n formattedOrder.order_type === OrderType.SCALED &&\n !formattedOrder.distribution_type\n ) {\n setValue(\"distribution_type\", DistributionType.FLAT);\n }\n }, [formattedOrder.order_type, formattedOrder.distribution_type]);\n\n const currentLtv = useComputedLTV();\n\n return {\n ...state,\n currentQtyPercentage,\n side: formattedOrder.side as OrderSide,\n type: formattedOrder.order_type as OrderType,\n level: formattedOrder.level as OrderLevel,\n setOrderValue,\n setOrderValues: setValues,\n\n currentLeverage,\n\n formattedOrder,\n // cancelTP_SL,\n // enableTP_SL,\n tpslSwitch,\n setTpslSwitch: onTPSLSwitchChanged,\n setMaxQty,\n symbolInfo,\n onFocus,\n onBlur,\n refs: {\n triggerPriceInputRef,\n priceInputRef,\n priceInputContainerRef,\n },\n\n canTrade,\n\n bboStatus,\n bboType: localBBOType,\n onBBOChange,\n toggleBBO,\n priceInputContainerWidth,\n currentLtv,\n };\n};\n","import {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./orderEntry.script\";\nimport { OrderEntry } from \"./orderEntry.ui\";\n\nexport const OrderEntryWidget = (\n props: OrderEntryScriptInputs & {\n containerRef?: any;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n },\n) => {\n const state = useOrderEntryScript(props);\n return (\n <OrderEntry\n {...state}\n containerRef={props.containerRef}\n disableFeatures={props.disableFeatures}\n />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/orderEntry.ui.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.ui.tsx","../src/components/LTVRiskTooltip/LTVRiskTooltip.script.ts","../src/components/LTVRiskTooltip/LTVRiskTooltip.widget.tsx","../src/components/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.ui.tsx","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.script.ts","../src/components/dialog/scaledOrderConfirm/scaledOrderConfirm.widget.tsx","../src/components/fees/fees.ui.tsx","../src/components/fees/fees.script.ts","../src/components/fees/fees.widget.tsx","../src/components/orderEntryContext.tsx","../src/components/quantityDistribution/index.tsx","../src/components/slippage/components/slippageCell.tsx","../src/components/slippage/components/slippageEditor.tsx","../src/components/slippage/slippage.ui.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/orderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["forwardRef","useContext","useEffect","useMemo","useState","useLeverage","useLocalStorage","useTranslation","useOrderEntryFormErrorMsg","BBOOrderType","DistributionType","OrderSide","OrderType","Box","Button","CaretRightIcon","cn","Divider","Flex","Grid","InfoCircleIcon","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","ThrottledButton","toast","Tooltip","useScreen","LeverageWidgetWithSheetId","commifyOptional","removeTrailingZeros","jsx","jsxs","calculateLTVColor","val","LTVRiskTooltipUI","props","ltv_threshold","negative_usdc_threshold","isThresholdLoading","holdingData","currentLtv","onConvert","asset","index","useCallback","useComputedLTV","useHoldingStream","useIndexPricesStream","useQuery","useTokensInfo","account","Decimal","zero","useConvertThreshold","data","error","isLoading","useLTVTooltipScript","holdingList","isHoldingLoading","tokensInfo","indexPrices","item","tokenInfo","token","indexPrice","collateralRatio","collateralContribution","LTVRiskTooltipWidget","state","Checkbox","Fragment","AdditionalInfo","pinned","orderTypeExtra","t","onTypeToggle","type","checked","useAdditionalScript","AdditionalInfoWidget","i18n","Badge","registerSimpleDialog","OrderLevel","isBBOOrder","options","order_type","order_type_ext","isBBO","getOrderTypeByBBO","value","size","getOrderLevelByBBO","getBBOType","side","level","getScaledPlaceOrderMessage","result","rows","totalCount","successCount","row","OrderConfirmDialog","symbolInfo","order","onConfirm","onCancel","quote_dp","base_dp","_","setNeedConfirm","renderPrice","bboType","label","OrderTypeTag","typeStr","Dialog","close","resolve","reject","rest","orderConfirmDialogId","DataTable","TokenIcon","ScaledOrderConfirm","dataSource","national","askAndBid","totalQuantity","base","quote","columns","record","showWarning","TooltipIcon","ref","useEventEmitter","useScaledOrderConfirmScript","orders","setAskAndBid","ee","acc","onOrderBookUpdate","ask0","bid0","ScaledOrderConfirmWidget","scaledOrderConfirmDialogId","AuthGuard","FeesUI","takerFeeRate","makerFeeRate","useAccountInfo","useFeesScript","FeesWidget","createContext","OrderEntryContext","OrderEntryProvider","QuantityDistributionInput","className","showHint","QuantityDistributionHint","QuantityDistribution","setType","content","FlatQuantity","AscendingQuantity","DescendingQuantity","currentContent","PriceChart","onValueChange","onChange","distributionTypeMap","useRef","useBoolean","EditIcon","SimpleDialog","useImperativeHandle","ExclamationFillIcon","TooltipTrigger","SlippageEditor","setValue","customValue","setCustomValue","setError","onClick","d","toolTipButton","SlippageItem","isActive","SlippageCell","open","setOpen","setClose","toggle","isMobile","slippageRef","SlippageUI","React","CaretDownIcon","SimpleDropdownMenu","todpIfNeed","PnlInputContext","usePnlInputContext","PnlInputProvider","values","mode","setMode","tipsEle","usePNLInputBuilder","tipVisible","setTipVisible","isFocused","setIsFocused","key","innerValue","setInnerValue","modes","modeLabelMap","percentageSuffix","dp","endStr","PNLInput","onModeChange","tips","onFocus","onBlur","prefix","setPrefix","placeholder","setPlaceholder","id","PNLMenus","event","PnlInputWidget","testIds","OrderTPSL","tpslFormRef","TPSLInputForm","parseErrorMsg","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","getPrefixLabel","trigger_price","_prefix","priceKey","OrderEntry","formattedOrder","setOrderValue","maxQty","freeCollateral","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","disableFeatures","fillMiddleValue","curLeverage","errors","validated","setErrorMsgVisible","needConfirm","setPinned","hidden","setHidden","slippage","setSlippage","buttonLabel","clickHandler","visible","onSubmit","isScaledOrder","message","mergedShowSheet","showLTV","OrderTypeSelect","ScaledOrderInput","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","PinButton","defaultPath","path","setPath","bbo","readOnly","priceSuffix","CustomInput","e","BBOOrderTypeSelect","InputLabel","canTrade","color","maxLabel","displayLabelMap","option","o","showSkewInput","useAccount","useDebouncedCallback","useMarginRatio","useOrderEntry","utils","useAppContext","AccountStatusEnum","convertValueToPercentage","safeNumber","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","localBBOType","setLocalBBOType","lastBBOType","setValues","tpslSwitch","setTpslSwitch","accountState","wrongNetwork","disabledConnect","currentLeverage","currentFocusInput","lastScaledOrderPriceInput","triggerPriceInputRef","priceInputRef","priceInputContainerRef","priceInputContainerWidth","setPriceInputContainerWidth","currentQtyPercentage","formatQty","quantity","cancelTP_SL","enableTP_SL","setMaxQty","onTPSLSwitchChanged","orderType","orderLevel","updateOrderPrice","price","focusInputElement","target","orderBookItemClickHandler","field","element","resizeObserver","entries","entry","width","bestAsk","bestBid","midPrice","OrderEntryWidget"],"mappings":"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OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,EAAE,KACF,EAAE,KACF,MAAM,MACN,OAAO,IACP,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,GACF,EAIEwI,GAAoB,IAEtBvI,EAAC,OACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,EAAE,KACF,EAAE,KACF,MAAM,MACN,OAAO,IACP,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,IACF,KAAK,+BACL,OAAO,+BACP,YAAY,IACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,EACAA,EAAC,UACC,GAAG,MACH,GAAG,KACH,EAAE,UACF,KAAK,+BACL,OAAO,+BACP,YAAY,UACd,GACF,EAIEyI,GAAqB,IAEvBxI,EAAC,OACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,OACL,MAAM,6BAEN,UAAAD,EAAC,QACC,MAAM,MACN,OAAO,IACP,UAAU,0BACV,KAAK,+BACP,EACAA,EAAC,UACC,GAAG,IACH,GAAG,IACH,EA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","sourcesContent":["import React, {\n CSSProperties,\n FocusEventHandler,\n forwardRef,\n HTMLAttributes,\n PropsWithChildren,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n OrderValidationResult,\n useLeverage,\n useLocalStorage,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n API,\n BBOOrderType,\n DistributionType,\n OrderLevel,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport {\n Box,\n Button,\n CaretRightIcon,\n cn,\n Divider,\n Flex,\n Grid,\n InfoCircleIcon,\n Input,\n inputFormatter,\n InputProps,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n Select,\n Slider,\n Switch,\n Text,\n textVariants,\n ThrottledButton,\n toast,\n Tooltip,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { LeverageWidgetWithSheetId } from \"@orderly.network/ui-leverage\";\nimport { commifyOptional } from \"@orderly.network/utils\";\nimport { LTVRiskTooltipWidget } from \"./components/LTVRiskTooltip\";\n// import { useBalanceScript } from \"../../trading/src/components/mobile/bottomNavBar/balance\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport { scaledOrderConfirmDialogId } from \"./components/dialog/scaledOrderConfirm\";\nimport { FeesWidget } from \"./components/fees\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { QuantityDistributionInput } from \"./components/quantityDistribution\";\nimport { SlippageUI } from \"./components/slippage/slippage.ui\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { type OrderEntryScriptReturn } from \"./orderEntry.script\";\nimport { InputType } from \"./types\";\nimport { BBOStatus, getScaledPlaceOrderMessage } from \"./utils\";\n\ntype Refs = OrderEntryScriptReturn[\"refs\"];\n\ntype OrderEntryProps = OrderEntryScriptReturn & {\n containerRef: any;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n};\n\nexport const OrderEntry: React.FC<OrderEntryProps> = (props) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n disableFeatures,\n currentLtv,\n fillMiddleValue,\n } = props;\n\n const { curLeverage } = useLeverage();\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true,\n );\n const [pinned, setPinned] = useLocalStorage(\n \"orderly-order-additional-pinned\",\n true,\n );\n const [hidden, setHidden] = useLocalStorage(\"orderly-order-hidden\", false);\n\n const [slippage, setSlippage] = useLocalStorage(\"orderly-slippage\", \"1\", {\n parseJSON: ((value: string | null) => {\n return !value || value === '\"\"' ? \"1\" : JSON.parse(value);\n }) as any,\n });\n\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(\n validated ? errors : null,\n );\n\n const buttonLabel = useMemo(() => {\n return side === OrderSide.BUY\n ? t(\"orderEntry.buyLong\")\n : t(\"orderEntry.sellShort\");\n }, [side, t]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n // set slippage\n useEffect(() => {\n if (props.disableFeatures?.includes(\"slippageSetting\")) {\n return;\n }\n\n if (slippage) {\n setOrderValue(\"slippage\", Number(slippage));\n } else {\n setOrderValue(\"slippage\", undefined);\n }\n }, [slippage, props.disableFeatures]);\n\n useEffect(() => {\n const clickHandler = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\"#order-entry-submit-button\")\n // || target.closest(\".orderly-order-entry\")\n ) {\n return;\n }\n setErrorMsgVisible((visible) => {\n if (visible) {\n return false;\n }\n return visible;\n });\n };\n\n if (errorMsgVisible) {\n document.addEventListener(\"click\", clickHandler);\n } else {\n document.removeEventListener(\"click\", clickHandler);\n }\n\n return () => {\n document.removeEventListener(\"click\", clickHandler);\n };\n }, [errorMsgVisible]);\n\n const onSubmit = () => {\n const isScaledOrder = formattedOrder.order_type === OrderType.SCALED;\n\n helper\n .validate()\n .then(\n // validate success, it return the order\n // TODO: get order from other function\n (order: any) => {\n // scaled order is always need confirm\n if (isScaledOrder) {\n return modal.show(scaledOrderConfirmDialogId, {\n order,\n symbolInfo,\n size: isMobile ? \"sm\" : \"md\",\n });\n }\n\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n symbolInfo,\n });\n }\n\n return true;\n },\n // should catch validate error first, then submit\n (errors: OrderValidationResult) => {\n // slippage error message is not show input tooltip, so we need to manually show it by toast\n if (errors.slippage) {\n toast.error(t(\"orderEntry.slippage.error.max\"));\n }\n\n // when switch order type, validated not changed, so we need to set it to true\n setErrorMsgVisible(true);\n\n return Promise.reject();\n },\n )\n .then(() => {\n // validate success, submit order\n return submit({ resetOnSuccess: false }).then((result: any) => {\n if (!result.success && result.message) {\n toast.error(result.message);\n } else if (result.success && isScaledOrder) {\n const message = getScaledPlaceOrderMessage(result);\n if (message) {\n toast.success(message);\n }\n }\n });\n })\n .catch((error) => {\n // submit order error\n if (error?.message) {\n toast.error(error.message);\n }\n });\n };\n\n const mergedShowSheet = isMobile && props.canTrade;\n\n const showLTV =\n typeof currentLtv === \"number\" &&\n !Number.isNaN(currentLtv) &&\n currentLtv > 0;\n\n return (\n <OrderEntryProvider value={{ errorMsgVisible }}>\n <div\n className={\"oui-space-y-2 oui-text-base-contrast-54 xl:oui-space-y-3\"}\n ref={props.containerRef}\n >\n {/* Buy Sell button */}\n <Flex gapX={2} className=\"oui-flex-col oui-gap-y-3 lg:oui-flex-row\">\n <div\n className={cn(\n \"oui-grid oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n mergedShowSheet ? \"oui-grid-cols-3\" : \"oui-grid-cols-2\",\n )}\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n data-type={OrderSide.BUY}\n // color={side === OrderSide.BUY ? \"buy\" : \"secondary\"}\n className={cn(\n side === OrderSide.BUY && props.canTrade\n ? \"oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n {t(\"common.buy\")}\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n data-type={OrderSide.SELL}\n fullWidth\n size={\"md\"}\n // color={side === OrderSide.SELL ? \"sell\" : \"secondary\"}\n className={cn(\n side === OrderSide.SELL && props.canTrade\n ? \"oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n {t(\"common.sell\")}\n </Button>\n {mergedShowSheet && (\n <Button\n size={\"md\"}\n fullWidth\n trailing={\n <CaretRightIcon\n size={12}\n className=\"oui-text-base-contrast-36\"\n />\n }\n onClick={() => {\n modal.show(LeverageWidgetWithSheetId, {\n currentLeverage: curLeverage,\n });\n }}\n className={cn(\n \"oui-bg-base-7 oui-text-primary-light hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n >\n {commifyOptional(curLeverage, { fix: 2 }) + \"x\"}\n </Button>\n )}\n </div>\n <div className={\"oui-w-full lg:oui-flex-1\"}>\n <OrderTypeSelect\n type={formattedOrder.order_type!}\n side={side}\n canTrade={props.canTrade}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n </Flex>\n {/* Available */}\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"common.available\")}</Text>\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={1}>\n {showLTV && (\n <Tooltip\n className={\"oui-bg-base-6 oui-p-2\"}\n content={<LTVRiskTooltipWidget />}\n >\n <InfoCircleIcon\n className={\n \"oui-cursor-pointer oui-text-warning oui-opacity-80\"\n }\n />\n </Tooltip>\n )}\n <Text.numeral\n unit={symbolInfo.quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-54\"}\n dp={2}\n padding={false}\n >\n {props.canTrade ? freeCollateral : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n {/* Inputs (price,quantity,triggerPrice) */}\n {formattedOrder.order_type === OrderType.SCALED ? (\n <ScaledOrderInput\n type={props.type}\n symbolInfo={symbolInfo}\n values={{\n quantity: formattedOrder.order_quantity,\n total: formattedOrder.total,\n side: formattedOrder.side,\n max_price: formattedOrder.max_price,\n min_price: formattedOrder.min_price,\n total_orders: formattedOrder.total_orders,\n distribution_type: formattedOrder.distribution_type,\n skew: formattedOrder.skew,\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n onValuesChange={props.setOrderValues}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n parseErrorMsg={parseErrorMsg}\n />\n ) : (\n <OrderQuantityInput\n type={props.type}\n symbolInfo={symbolInfo}\n values={{\n quantity: formattedOrder.order_quantity,\n price: formattedOrder.order_price,\n trigger_price: formattedOrder.trigger_price,\n total: formattedOrder.total,\n level: formattedOrder.level,\n side: formattedOrder.side,\n order_type_ext: formattedOrder.order_type_ext,\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n onValuesChange={props.setOrderValues}\n refs={props.refs}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n bbo={{\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n }}\n priceInputContainerWidth={props.priceInputContainerWidth}\n parseErrorMsg={parseErrorMsg}\n fillMiddleValue={fillMiddleValue}\n />\n )}\n {/* Slider */}\n <QuantitySlider\n canTrade={props.canTrade}\n maxQty={maxQty}\n currentQtyPercentage={props.currentQtyPercentage}\n value={\n !formattedOrder.order_quantity\n ? 0\n : Number(formattedOrder.order_quantity)\n }\n tick={symbolInfo.base_tick}\n dp={symbolInfo.base_dp}\n setMaxQty={props.setMaxQty}\n onValueChange={(value) => {\n setOrderValue(\"order_quantity\", value);\n }}\n side={props.side}\n />\n {/* Submit button */}\n <ThrottledButton\n fullWidth\n id={\"order-entry-submit-button\"}\n // color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY\n ? \"orderly-order-entry-submit-button-buy oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"orderly-order-entry-submit-button-sell oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\",\n )}\n onClick={() => {\n onSubmit();\n }}\n loading={props.isMutating}\n disabled={!props.canTrade}\n >\n {buttonLabel}\n </ThrottledButton>\n {/* Asset info */}\n <AssetInfo\n canTrade={props.canTrade}\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n slippage={slippage}\n dp={symbolInfo.quote_dp}\n setSlippage={setSlippage}\n estSlippage={props.estSlippage}\n orderType={formattedOrder.order_type!}\n disableFeatures={disableFeatures}\n />\n\n <Divider className=\"oui-w-full\" />\n {/* TP SL switch and content */}\n <OrderTPSL\n // onCancelTPSL={props.cancelTP_SL}\n // onEnableTP_SL={props.enableTP_SL}\n quote_dp={props.symbolInfo.quote_dp}\n switchState={props.tpslSwitch}\n onSwitchChanged={props.setTpslSwitch}\n orderType={formattedOrder.order_type!}\n errors={validated ? errors : null}\n isReduceOnly={formattedOrder.reduce_only}\n values={{\n tp: {\n trigger_price: formattedOrder.tp_trigger_price ?? \"\",\n PnL: formattedOrder.tp_pnl ?? \"\",\n Offset: formattedOrder.tp_offset ?? \"\",\n \"Offset%\": formattedOrder.tp_offset_percentage ?? \"\",\n ROI: formattedOrder.tp_ROI ?? \"\",\n },\n sl: {\n trigger_price: formattedOrder.sl_trigger_price ?? \"\",\n PnL: formattedOrder.sl_pnl ?? \"\",\n Offset: formattedOrder.sl_offset ?? \"\",\n \"Offset%\": formattedOrder.sl_offset_percentage ?? \"\",\n ROI: formattedOrder.sl_ROI ?? \"\",\n },\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n />\n {/* reduce only switch and label */}\n <Flex\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"!oui-mt-0 xl:!oui-mt-3\"\n >\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n data-testid=\"oui-testid-orderEntry-reduceOnly-switch\"\n className=\"oui-h-[14px]\"\n id={\"reduceOnly\"}\n checked={props.formattedOrder.reduce_only}\n onCheckedChange={(checked) => {\n props.setOrderValue(\"reduce_only\", checked);\n // if (checked) {\n // props.setOrderValue(\"order_type_ext\", \"\");\n // }\n }}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n {t(\"orderEntry.reduceOnly\")}\n </label>\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {!pinned && (\n <AdditionalConfigButton\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n )}\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {pinned && (\n <Box p={2} r={\"md\"} intensity={700} position={\"relative\"}>\n <AdditionalInfoWidget\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n <PinButton\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-group oui-absolute oui-right-2 oui-top-2\"}\n data-testid=\"oui-testid-orderEntry-pinned-button\"\n />\n </Box>\n )}\n </div>\n </OrderEntryProvider>\n );\n};\n\n//------------------- pin button start -------------------\nconst defaultPath =\n \"M10.007 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.852-2.523 1.233.361 1.95.015 2.961-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103 5.35 5.35 0 0 0-2.104-1.312c-.448-.15-.808-.208-1.042-.208\";\n\nconst PinButton = (props: HTMLAttributes<HTMLButtonElement>) => {\n const [path, setPath] = useState(defaultPath);\n return (\n <button {...props}>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onMouseEnter={() => {\n setPath(\n 'M10.008 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.853-2.523 1.232.361 1.95.015 2.96-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103A5.35 5.35 0 0 0 11.05 1.51c-.448-.15-.808-.208-1.042-.208m.258 1.37c.708.131 1.421.6 1.93 1.107.507.508.94 1.13 1.119 1.945-.636.61-1.026.658-1.662.323a.67.67 0 0 0-.779.117c-1.214 1.213-1.533 2.314-1.533 3.8 0 1.292-.076 1.773-.48 2.206-.113.123-.27.104-.374 0L3.799 7.486a.24.24 0 0 1-.017-.34c.239-.29.769-.515 2.226-.514 1.742.001 2.668-.448 3.812-1.52a.67.67 0 0 0 .125-.77c-.343-.686-.29-1.047.321-1.67\"',\n );\n }}\n onMouseLeave={() => {\n setPath(defaultPath);\n }}\n className=\"oui-text-primary-darken \"\n >\n <path d={path} />\n </svg>\n </button>\n );\n};\n\n//----------------- Order Quantity Input Component start -----------------\nconst OrderQuantityInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n values: {\n quantity?: string;\n price?: string;\n trigger_price?: string;\n total?: string;\n side?: OrderSide;\n level?: OrderLevel;\n order_type_ext?: OrderType;\n };\n onChange: (\n key:\n | \"order_quantity\"\n | \"order_price\"\n | \"trigger_price\"\n | \"total\"\n | \"order_type\"\n | \"order_type_ext\"\n | \"level\",\n value: any,\n ) => void;\n onValuesChange: (value: any) => void;\n refs: Refs;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n parseErrorMsg: (key: keyof OrderValidationResult) => string;\n fillMiddleValue: OrderEntryScriptReturn[\"fillMiddleValue\"];\n}) => {\n const {\n type,\n symbolInfo,\n values,\n onFocus,\n onBlur,\n bbo,\n parseErrorMsg,\n fillMiddleValue,\n } = props;\n const { t } = useTranslation();\n\n const readOnly = bbo.bboStatus === BBOStatus.ON;\n\n const priceSuffix =\n type === OrderType.LIMIT ? (\n <Flex direction=\"column\" itemAlign=\"end\" className=\"oui-text-2xs\">\n {symbolInfo.quote}\n <Flex justify={\"end\"} itemAlign=\"center\" gap={2}>\n <Flex\n px={3}\n height={20}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-mt-[2px] oui-cursor-pointer oui-select-none oui-border\",\n bbo.bboStatus === BBOStatus.ON\n ? \"oui-border-primary\"\n : \"oui-border-line-12\",\n bbo.bboStatus === BBOStatus.DISABLED && \"oui-cursor-not-allowed\",\n )}\n onClick={() => {\n if (bbo.bboStatus === BBOStatus.DISABLED) {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>\n {t(\"orderEntry.bbo.disabled.tips\")}\n </Text>\n ),\n });\n } else {\n bbo.toggleBBO();\n }\n }}\n >\n <Text\n className={cn(\n bbo.bboStatus === BBOStatus.ON && \"oui-text-primary\",\n bbo.bboStatus === BBOStatus.OFF && \"oui-text-base-contrast-54\",\n bbo.bboStatus === BBOStatus.DISABLED &&\n \"oui-text-base-contrast-20\",\n )}\n >\n {t(\"orderEntry.bbo\")}\n </Text>\n </Flex>\n <Text\n className={cn(\n \"oui-select-none\",\n \"oui-cursor-pointer oui-text-primary\",\n )}\n onClick={fillMiddleValue}\n >\n Mid\n </Text>\n </Flex>\n </Flex>\n ) : (\n symbolInfo.quote\n );\n\n return (\n <div className={\"oui-space-y-1\"}>\n {type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET ? (\n <div className={\"oui-group\"}>\n <CustomInput\n label={t(\"common.trigger\")}\n suffix={symbolInfo.quote}\n error={parseErrorMsg(\"trigger_price\")}\n id={\"trigger\"}\n ref={props.refs.triggerPriceInputRef}\n value={values.trigger_price}\n onChange={(e) => {\n props.onChange(\"trigger_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.TRIGGER_PRICE)}\n onBlur={onBlur(InputType.TRIGGER_PRICE)}\n />\n </div>\n ) : null}\n\n {type === OrderType.LIMIT || type === OrderType.STOP_LIMIT ? (\n <div\n ref={props.refs.priceInputContainerRef}\n className=\"oui-group oui-relative oui-w-full\"\n >\n <CustomInput\n label={t(\"common.price\")}\n suffix={priceSuffix}\n id={\"price\"}\n value={values.price}\n error={parseErrorMsg(\"order_price\")}\n ref={props.refs.priceInputRef}\n // helperText=\"Price per unit\"\n onChange={(e) => {\n props.onChange(\"order_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n readonly={readOnly}\n classNames={{\n root: cn(readOnly && \"focus-within:oui-outline-transparent \"),\n input: cn(readOnly && \"oui-cursor-auto\"),\n }}\n />\n {bbo.bboStatus === BBOStatus.ON && (\n <div className={cn(\"oui-absolute oui-bottom-1 oui-left-0\")}>\n <BBOOrderTypeSelect\n value={bbo.bboType}\n onChange={bbo.onBBOChange}\n contentStyle={{\n width: props.priceInputContainerWidth,\n }}\n />\n </div>\n )}\n </div>\n ) : null}\n\n <Grid cols={2} className={\"oui-group oui-space-x-1\"}>\n <CustomInput\n label={t(\"common.qty\")}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-r\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={`${t(\"common.total\")}≈`}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-l\"}\n value={values.total}\n error={parseErrorMsg(\"total\")}\n onChange={(e) => {\n props.onChange(\"total\", e);\n }}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n />\n </Grid>\n </div>\n );\n};\n\n// ----------- Custom Input Component start ------------\nconst CustomInput = forwardRef<\n HTMLInputElement,\n {\n label: string;\n suffix?: ReactNode;\n placeholder?: string;\n id: string;\n className?: string;\n name?: string;\n // onChange?: InputProps[\"onChange\"];\n onChange?: (value: string) => void;\n value?: InputProps[\"value\"];\n autoFocus?: InputProps[\"autoFocus\"];\n error?: string;\n onFocus: InputProps[\"onFocus\"];\n onBlur: InputProps[\"onBlur\"];\n formatters?: InputProps[\"formatters\"];\n overrideFormatters?: InputProps[\"formatters\"];\n // helperText?: InputProps[\"helperText\"];\n classNames?: InputProps[\"classNames\"];\n readonly?: boolean;\n }\n>((props, ref) => {\n const { placeholder = \"0\" } = props;\n const { errorMsgVisible } = useContext(OrderEntryContext);\n return (\n <Input.tooltip\n ref={ref}\n tooltip={errorMsgVisible ? props.error : undefined}\n autoComplete={\"off\"}\n autoFocus={props.autoFocus}\n size={\"lg\"}\n placeholder={props.readonly ? \"\" : placeholder}\n id={props.id}\n name={props.name}\n color={props.error ? \"danger\" : undefined}\n prefix={\n <InputLabel id={props.id} className={props.classNames?.prefix}>\n {props.label}\n </InputLabel>\n }\n suffix={props.suffix}\n value={props.readonly ? \"\" : props.value || \"\"}\n // onChange={props.onChange}\n onValueChange={props.onChange}\n onFocus={(event) => {\n props.onFocus?.(event);\n }}\n onBlur={(event) => {\n props.onBlur?.(event);\n }}\n formatters={\n props.overrideFormatters || [\n ...(props.formatters ?? []),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]\n }\n classNames={{\n root: cn(\n \"orderly-order-entry oui-relative oui-h-[54px] oui-rounded oui-border oui-border-solid oui-border-line oui-px-2 oui-py-1 group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root,\n ),\n input: cn(\"oui-mb-1 oui-mt-5 oui-h-5\", props?.classNames?.input),\n // prefix: cn(props.classNames?.prefix),\n suffix: cn(\n \"oui-absolute oui-right-0 oui-top-0 oui-justify-start oui-py-2 oui-text-2xs oui-text-base-contrast-36\",\n props.classNames?.suffix,\n ),\n }}\n readOnly={props.readonly}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (\n props: PropsWithChildren<{ id: string; className?: string }>,\n) => {\n return (\n <label\n htmlFor={props.id}\n className={cn(\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-2xs oui-text-base-contrast-36\",\n props.className,\n )}\n >\n {props.children}\n </label>\n );\n};\n\n// ----------- Custom Input Component end ------------\n\nconst QuantitySlider = (props: {\n canTrade: boolean;\n side: OrderSide;\n value: number;\n maxQty: number;\n currentQtyPercentage: number;\n tick: number;\n dp: number;\n setMaxQty: () => void;\n onValueChange: (value: number) => void;\n}) => {\n const { canTrade } = props;\n const { t } = useTranslation();\n\n const color = useMemo(\n () =>\n canTrade ? (props.side === OrderSide.BUY ? \"buy\" : \"sell\") : undefined,\n [props.side, canTrade],\n );\n\n const maxLabel = useMemo(() => {\n return props.side === OrderSide.BUY\n ? t(\"orderEntry.maxBuy\")\n : t(\"orderEntry.maxSell\");\n }, [props.side, t]);\n\n return (\n <div>\n <Slider.single\n disabled={props.maxQty === 0 || !canTrade}\n value={props.value}\n color={color}\n markCount={4}\n showTip\n max={props.maxQty}\n step={props.tick}\n onValueChange={props.onValueChange}\n />\n <Flex justify={\"between\"} className=\"oui-pt-1 xl:oui-pt-2\">\n <Text.numeral\n rule={\"percentages\"}\n size={\"2xs\"}\n color={color}\n dp={2}\n padding={false}\n >\n {canTrade ? props.currentQtyPercentage : 0}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={() => props.setMaxQty()}\n data-testid=\"oui-testid-orderEntry-maxQty-value-button\"\n >\n {maxLabel}\n </button>\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={props.dp}\n padding={false}\n data-testid=\"oui-testid-orderEntry-maxQty-value\"\n >\n {canTrade ? props.maxQty : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n </div>\n );\n};\n\n// -----------Order type Select Component start ------------\n\nconst OrderTypeSelect = (props: {\n type: OrderType;\n onChange: (type: OrderType) => void;\n side: OrderSide;\n canTrade: boolean;\n}) => {\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"orderEntry.orderType.limitOrder\"), value: OrderType.LIMIT },\n { label: t(\"orderEntry.orderType.marketOrder\"), value: OrderType.MARKET },\n {\n label: t(\"orderEntry.orderType.stopLimit\"),\n value: OrderType.STOP_LIMIT,\n },\n {\n label: t(\"orderEntry.orderType.stopMarket\"),\n value: OrderType.STOP_MARKET,\n },\n {\n label: t(\"orderEntry.orderType.scaledOrder\"),\n value: OrderType.SCALED,\n },\n ];\n }, [t]);\n\n const displayLabelMap = useMemo(() => {\n return {\n [OrderType.LIMIT]: t(\"orderEntry.orderType.limit\"),\n [OrderType.MARKET]: t(\"common.marketPrice\"),\n [OrderType.STOP_LIMIT]: t(\"orderEntry.orderType.stopLimit\"),\n [OrderType.STOP_MARKET]: t(\"orderEntry.orderType.stopMarket\"),\n [OrderType.SCALED]: t(\"orderEntry.orderType.scaledOrder\"),\n };\n }, [t]);\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-orderType-button\"\n currentValue={props.type}\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"xs\"}>{option.placeholder}</Text>;\n }\n\n const label = displayLabelMap[value as keyof typeof displayLabelMap];\n\n return (\n <Text\n size={\"xs\"}\n color={\n props.canTrade\n ? props.side === OrderSide.BUY\n ? \"buy\"\n : \"sell\"\n : undefined\n }\n >\n {label}\n </Text>\n );\n }}\n size={\"md\"}\n />\n );\n};\n\n// -----------Order type Select Component end ------------\n\nfunction AssetInfo(props: {\n canTrade: boolean;\n quote: string;\n estLiqPrice: number | null;\n estLeverage: number | null;\n currentLeverage: number | null;\n slippage: string;\n dp: number;\n estSlippage: number | null;\n setSlippage: (slippage: string) => void;\n orderType: OrderType;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n}) {\n const { canTrade } = props;\n const { t } = useTranslation();\n\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"orderEntry.estLiqPrice\")}</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n dp={props.dp}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {canTrade ? (props.estLiqPrice ?? \"--\") : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"leverage.accountLeverage\")}</Text>\n <Flex\n gapX={1}\n className={textVariants({\n size: \"2xs\",\n intensity: 80,\n })}\n >\n <Text.numeral unit={canTrade ? \"x\" : undefined}>\n {canTrade ? (props.currentLeverage ?? \"--\") : \"--\"}\n </Text.numeral>\n {props.estLeverage && (\n <>\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.505 4.997c0-.23.186-.416.416-.416H6.07L4.833 3.332l.586-.585 1.964 1.95a.42.42 0 0 1 .122.3.42.42 0 0 1-.122.3l-1.964 1.95-.586-.585L6.07 5.413H2.921a.416.416 0 0 1-.416-.416\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n\n <span>{`${props.estLeverage}x`}</span>\n </>\n )}\n </Flex>\n {/* <Text.numeral unit={\"x\"} size={\"2xs\"}>\n {props.estLeverage ?? \"--\"}\n </Text.numeral> */}\n </Flex>\n {props.orderType === OrderType.MARKET &&\n !props.disableFeatures?.includes(\"slippageSetting\") && (\n <SlippageUI\n slippage={props.slippage}\n setSlippage={props.setSlippage}\n estSlippage={props.estSlippage}\n />\n )}\n\n {!props.disableFeatures?.includes(\"feesInfo\") && <FeesWidget />}\n </div>\n );\n}\n\nfunction AdditionalConfigButton(props: {\n pinned: boolean;\n setPinned: (pinned: boolean) => void;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n orderTypeExtra?: OrderType;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n showExtra: boolean;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n data-testid=\"oui-testid-orderEntry-additional-button\"\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white/[.36] hover:oui-fill-white/80\"\n >\n <path\n d=\"M3.332 2.665a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667z\"\n // fill=\"#fff\"\n // fillOpacity={open ? 0.8 : 0.36}\n />\n </svg>\n </button>\n </PopoverTrigger>\n <PopoverContent side={\"top\"} align={\"end\"} className={\"oui-w-[230px]\"}>\n <AdditionalInfoWidget {...props} />\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\n// -----------BBO Select Component start ------------\n\nconst BBOOrderTypeSelect = (props: {\n value?: BBOOrderType;\n onChange: (value: BBOOrderType) => void;\n contentStyle?: CSSProperties;\n}) => {\n const { t } = useTranslation();\n\n const options = [\n {\n label: t(\"orderEntry.bbo.counterparty1\"),\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: t(\"orderEntry.bbo.counterparty5\"),\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: t(\"orderEntry.bbo.queue1\"),\n value: BBOOrderType.QUEUE1,\n },\n {\n label: t(\"orderEntry.bbo.queue5\"),\n value: BBOOrderType.QUEUE5,\n },\n ];\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-bbo-orderType-button\"\n currentValue={props.value}\n value={props.value}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n style: props.contentStyle,\n }}\n size={\"sm\"}\n classNames={{\n trigger: \"oui-border-none oui-bg-transparent\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((item) => item.value === value);\n\n return (\n <Box>\n <Text size=\"sm\">{item?.label}</Text>\n </Box>\n );\n }}\n />\n );\n};\n\n// -----------BBO type Select Component end ------------\n\nconst ScaledOrderInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n values: {\n quantity?: string;\n total?: string;\n side?: OrderSide;\n max_price?: string;\n min_price?: string;\n total_orders?: number;\n distribution_type?: DistributionType;\n skew?: number;\n };\n onChange: (\n key:\n | \"order_quantity\"\n | \"total\"\n | \"order_type\"\n | \"min_price\"\n | \"max_price\"\n | \"total_orders\"\n | \"distribution_type\"\n | \"skew\",\n value: any,\n ) => void;\n onValuesChange: (value: any) => void;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n parseErrorMsg: (key: keyof OrderValidationResult) => string;\n}) => {\n const { symbolInfo, values, onFocus, onBlur, parseErrorMsg } = props;\n const { t } = useTranslation();\n\n const showSkewInput = values.distribution_type === DistributionType.CUSTOM;\n\n return (\n <div className=\"oui-space-y-1\">\n <CustomInput\n label={t(\"orderEntry.upperPrice\")}\n suffix={symbolInfo.quote}\n id=\"order_max_price_input\"\n value={values.max_price}\n error={parseErrorMsg(\"max_price\")}\n onChange={(e) => {\n props.onChange(\"max_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.MAX_PRICE)}\n onBlur={onBlur(InputType.MAX_PRICE)}\n classNames={{\n root: \"oui-rounded-t-xl\",\n }}\n />\n\n <CustomInput\n label={t(\"orderEntry.lowerPrice\")}\n suffix={symbolInfo.quote}\n id=\"order_min_price_input\"\n value={values.min_price}\n error={parseErrorMsg(\"min_price\")}\n onChange={(e) => {\n props.onChange(\"min_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.MIN_PRICE)}\n onBlur={onBlur(InputType.MIN_PRICE)}\n />\n\n <Grid cols={2} className={\"oui-group oui-space-x-1\"}>\n <CustomInput\n label={t(\"common.qty\")}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-r\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={t(\"orderEntry.totalOrders\")}\n placeholder=\"2-20\"\n id=\"order_total_orders_input\"\n className={\"!oui-rounded-l\"}\n value={values.total_orders}\n error={parseErrorMsg(\"total_orders\")}\n onChange={(e) => {\n props.onChange(\"total_orders\", e);\n }}\n overrideFormatters={[\n // inputFormatter.rangeFormatter({ min: 2, max: 20 }),\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(0),\n ]}\n onFocus={onFocus(InputType.TOTAL_ORDERS)}\n onBlur={onBlur(InputType.TOTAL_ORDERS)}\n />\n </Grid>\n <QuantityDistributionInput\n value={values.distribution_type}\n onValueChange={(value) => {\n props.onChange(\"distribution_type\", value);\n }}\n className={cn(!showSkewInput && \"oui-rounded-b-xl\")}\n />\n\n {showSkewInput && (\n <CustomInput\n id=\"order_skew_input\"\n label={t(\"orderEntry.skew\")}\n value={values.skew}\n error={parseErrorMsg(\"skew\")}\n onChange={(e) => {\n props.onChange(\"skew\", e);\n }}\n onFocus={onFocus(InputType.SKEW)}\n onBlur={onBlur(InputType.SKEW)}\n overrideFormatters={[\n inputFormatter.rangeFormatter({ min: 0, max: 100, dp: 2 }),\n inputFormatter.dpFormatter(2),\n ]}\n classNames={{\n root: \"oui-rounded-b-xl\",\n }}\n />\n )}\n </div>\n );\n};\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Button, cn, Divider, Flex, Text } from \"@orderly.network/ui\";\nimport { removeTrailingZeros } from \"@orderly.network/utils\";\nimport type { LTVTooltipScriptReturn } from \"./LTVRiskTooltip.script\";\n\nconst calculateLTVColor = (val: number): string => {\n if (val >= 0 && val < 50) {\n return \"oui-text-success\";\n } else if (val >= 50 && val < 80) {\n return \"oui-text-warning\";\n } else if (val >= 80) {\n return \"oui-text-danger\";\n } else {\n return \"\";\n }\n};\n\nexport const LTVRiskTooltipUI: React.FC<LTVTooltipScriptReturn> = (props) => {\n const { t } = useTranslation();\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n holdingData = [],\n currentLtv,\n onConvert,\n } = props;\n return (\n <Flex gap={1} className=\"oui-w-72 oui-max-w-72\" direction=\"column\">\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"common.assets\")}\n </Text>\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.deposit.collateralContribution\")}\n </Text>\n </Flex>\n {holdingData.map((asset, index) => {\n return (\n <Flex\n key={`item-${index}`}\n width={\"100%\"}\n justify=\"between\"\n itemAlign=\"center\"\n >\n <Text intensity={80} size=\"xs\">\n {asset.token}\n </Text>\n <Text\n size=\"xs\"\n intensity={80}\n className={cn(\n Number(asset.collateralContribution) < 0 && \"oui-text-warning\",\n )}\n >\n {removeTrailingZeros(asset.collateralContribution)}\n </Text>\n </Flex>\n );\n })}\n <Divider className=\"oui-w-full\" />\n <Flex width={\"100%\"} justify=\"between\" itemAlign=\"center\">\n <Text intensity={36} size=\"xs\">\n {t(\"transfer.LTV.currentLTV\")}\n </Text>\n <Text\n size=\"xs\"\n intensity={36}\n className={cn(\"oui-select-none\", calculateLTVColor(currentLtv))}\n >\n {currentLtv}%\n </Text>\n </Flex>\n <Text className=\"oui-py-2\" intensity={54} size=\"2xs\">\n {t(\"transfer.LTV.tooltip\", {\n threshold: isThresholdLoading ? \"-\" : ltv_threshold,\n usdcThreshold: isThresholdLoading ? \"-\" : negative_usdc_threshold,\n })}\n </Text>\n <Button\n fullWidth\n size={\"md\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={onConvert}\n >\n {t(\"transfer.convert.convertAssets\")}\n </Button>\n </Flex>\n );\n};\n","import { useCallback } from \"react\";\nimport {\n useComputedLTV,\n useHoldingStream,\n useIndexPricesStream,\n useQuery,\n useTokensInfo,\n} from \"@orderly.network/hooks\";\nimport { account } from \"@orderly.network/perp\";\nimport type { API } from \"@orderly.network/types\";\nimport { modal } from \"@orderly.network/ui\";\nimport { Decimal, zero } from \"@orderly.network/utils\";\n\nconst useConvertThreshold = () => {\n const { data, error, isLoading } = useQuery<API.ConvertThreshold>(\n \"/v1/public/auto_convert_threshold\",\n { errorRetryCount: 3 },\n );\n return {\n ltv_threshold: new Decimal(data?.ltv_threshold ?? 0).mul(100).toNumber(),\n negative_usdc_threshold: data?.negative_usdc_threshold,\n isLoading,\n error,\n } as const;\n};\n\nexport const useLTVTooltipScript = () => {\n const { data: holdingList = [], isLoading: isHoldingLoading } =\n useHoldingStream();\n\n const {\n ltv_threshold,\n negative_usdc_threshold,\n isLoading: isThresholdLoading,\n } = useConvertThreshold();\n\n const tokensInfo = useTokensInfo();\n\n const { data: indexPrices } = useIndexPricesStream();\n\n const holdingData = holdingList.map((item) => {\n const tokenInfo = tokensInfo?.find(({ token }) => token === item.token);\n\n // Use extracted function for index price calculation\n const indexPrice =\n item.token === \"USDC\"\n ? 1\n : (indexPrices?.[`PERP_${item.token}_USDC`] ?? 0);\n\n // Calculate collateral ratio for this token\n const collateralRatio = tokenInfo\n ? account.collateralRatio({\n baseWeight: tokenInfo.base_weight ?? 0,\n discountFactor: tokenInfo.discount_factor ?? 0,\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n indexPrice: indexPrice,\n })\n : zero;\n\n // Calculate collateral contribution for this token\n const collateralContribution = account.collateralContribution({\n collateralQty: item.holding,\n collateralCap: tokenInfo?.user_max_qty ?? item.holding,\n collateralRatio: collateralRatio.toNumber(),\n indexPrice: indexPrice,\n });\n\n return {\n ...item,\n collateralContribution: collateralContribution,\n };\n });\n\n const currentLtv = useComputedLTV();\n\n const onConvert = useCallback(async () => {\n return modal.show(\"ConvertDialogId\");\n }, []);\n\n return {\n holdingData,\n isHoldingLoading,\n ltv_threshold,\n negative_usdc_threshold,\n isThresholdLoading,\n currentLtv: currentLtv,\n onConvert: onConvert,\n };\n};\n\nexport type LTVTooltipScriptReturn = ReturnType<typeof useLTVTooltipScript>;\n","import React from \"react\";\nimport { useLTVTooltipScript } from \"./LTVRiskTooltip.script\";\nimport { LTVRiskTooltipUI } from \"./LTVRiskTooltip.ui\";\n\nexport const LTVRiskTooltipWidget: React.FC = () => {\n const state = useLTVTooltipScript();\n return <LTVRiskTooltipUI {...state} />;\n};\n","import { Checkbox, cn, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type AdditionalInfoProps = {\n pinned: boolean;\n setPinned: (value: boolean) => void;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n orderTypeExtra?: OrderType;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n showExtra?: boolean;\n hidden: boolean;\n setHidden: (value: boolean) => void;\n};\n\nexport const AdditionalInfo = (props: AdditionalInfoProps) => {\n const { pinned, orderTypeExtra } = props;\n const { t } = useTranslation();\n\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\"\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n\n useEffect(() => {\n props.onValueChange?.(\"visible_quantity\", props.hidden ? 0 : 1);\n }, [props.hidden]);\n\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n {/* {props.showExtra && (\n\n )} */}\n <Flex\n // gapX={3}\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n className=\"oui-gap-x-2 md:oui-gap-x-3\"\n wrap=\"wrap\"\n gapY={1}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-postOnly-checkBox\"\n id={\"toggle_order_post_only\"}\n className=\"oui-peer\"\n color={\"white\"}\n variant={\"radio\"}\n disabled={!props.showExtra}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.postOnly\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-ioc-checkBox\"\n id={\"toggle_order_iov\"}\n color={\"white\"}\n className=\"oui-peer\"\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.ioc\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-fox-checkBox\"\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n className=\"oui-peer\"\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.fok\")}\n </label>\n </Flex>\n </Flex>\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-orderConfirm-checkBox\"\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.orderConfirm\")}\n </label>\n </Flex>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-hidden-checkBox\"\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n checked={props.hidden}\n onCheckedChange={(checked: boolean) => {\n props.setHidden(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.hidden\")}\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n data-testid=\"oui-testid-orderEntry-additional-keepVisible-switch\"\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.keepVisible\")}\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","export const useAdditionalScript = () => {\n // const [needConfirm, setNeedConfirm] = useLocalStorage(\n // \"orderly_order_confirm\",\n // true\n // );\n\n return {\n // needConfirm,\n // setNeedConfirm,\n };\n};\n","import { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo.ui\";\nimport { useAdditionalScript } from \"./additional.script\";\n\nexport const AdditionalInfoWidget = (props: AdditionalInfoProps) => {\n const state = useAdditionalScript();\n return <AdditionalInfo {...state} {...props} />;\n};\n","import { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { i18n, useTranslation } from \"@orderly.network/i18n\";\nimport {\n API,\n BBOOrderType,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport {\n Badge,\n Box,\n Button,\n Checkbox,\n Divider,\n Flex,\n Grid,\n registerSimpleDialog,\n Text,\n textVariants,\n} from \"@orderly.network/ui\";\nimport { getBBOType, isBBOOrder } from \"../../utils\";\n\ntype OrderConfirmDialogProps = {\n order: OrderlyOrder;\n symbolInfo: API.SymbolExt;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: OrderConfirmDialogProps) => {\n const { symbolInfo, order, onConfirm, onCancel } = props;\n const { quote_dp, base_dp } = symbolInfo;\n const { side, order_type, order_type_ext, level } = order;\n const { t } = useTranslation();\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const renderPrice = () => {\n if (\n order_type === OrderType.MARKET ||\n order_type === OrderType.STOP_MARKET\n ) {\n return <Text intensity={80}>{t(\"common.marketPrice\")}</Text>;\n }\n\n if (isBBOOrder({ order_type, order_type_ext })) {\n const bboType = getBBOType({\n type: order_type_ext!,\n side,\n level,\n });\n const label = {\n [BBOOrderType.COUNTERPARTY1]: t(\"orderEntry.bbo.counterparty1\"),\n [BBOOrderType.COUNTERPARTY5]: t(\"orderEntry.bbo.counterparty5\"),\n [BBOOrderType.QUEUE1]: t(\"orderEntry.bbo.queue1\"),\n [BBOOrderType.QUEUE5]: t(\"orderEntry.bbo.queue5\"),\n }[bboType!];\n\n return <Text intensity={80}>{label}</Text>;\n }\n\n return (\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {order.order_price}\n </Text.numeral>\n );\n };\n\n return (\n <>\n <Flex justify={\"between\"}>\n <Text.formatted rule={\"symbol\"} showIcon>\n {order.symbol}\n </Text.formatted>\n <Flex justify={\"end\"} gapX={1}>\n <OrderTypeTag type={order_type} />\n {side === OrderSide.BUY ? (\n <Badge color={\"buy\"} size={\"sm\"}>\n {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n {t(\"common.sell\")}\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n <Flex justify={\"between\"}>\n <Text>{t(\"common.qty\")}</Text>\n <Text.numeral\n rule={\"price\"}\n dp={base_dp}\n padding={false}\n className=\"oui-text-base-contrast\"\n >\n {order.order_quantity}\n </Text.numeral>\n </Flex>\n {!order.trigger_price ? null : (\n <Flex justify={\"between\"}>\n <Text>{t(\"common.trigger\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>{t(\"common.price\")}</Text>\n {renderPrice()}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={quote_dp}\n padding={false}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.total}\n </Text.numeral>\n </Flex>\n </div>\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n {order.tp_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>{t(\"orderEntry.tpMarkPrice\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n dp={quote_dp}\n padding={false}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.tp_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n {order.sl_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>{t(\"orderEntry.slMarkPrice\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quote_dp}\n padding={false}\n >\n {order.sl_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n </div>\n </>\n ) : null}\n\n <Flex gapX={1} pt={4} pb={5}>\n <Checkbox\n id=\"orderConfirm\"\n color={\"white\"}\n onCheckedChange={(checked) => {\n setNeedConfirm(!!!checked);\n }}\n />\n <label\n htmlFor=\"orderConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n })}\n >\n {t(\"orderEntry.disableOrderConfirm\")}\n </label>\n </Flex>\n\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <Box py={3} px={3} className=\"oui-text-center\">\n <Text color=\"warning\" size=\"xs\">\n {t(\"orderEntry.tpsl.trigger.description\")}\n </Text>\n </Box>\n ) : null}\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const { t } = useTranslation();\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return t(\"orderEntry.orderType.limit\");\n case OrderType.MARKET:\n return t(\"common.marketPrice\");\n case OrderType.STOP_LIMIT:\n return t(\"orderEntry.orderType.stopLimit\");\n case OrderType.STOP_MARKET:\n return t(\"orderEntry.orderType.stopMarket\");\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<OrderConfirmDialogProps, \"onCancel\" | \"onConfirm\"> & {\n close: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n },\n) => {\n const { close, resolve, reject, ...rest } = props;\n\n return (\n <OrderConfirmDialog\n {...rest}\n onCancel={() => {\n reject();\n close();\n }}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: () => i18n.t(\"orderEntry.orderConfirm\"),\n});\n","import { i18n } from \"@orderly.network/i18n\";\nimport {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\n\nexport enum BBOStatus {\n ON = \"on\",\n OFF = \"off\",\n DISABLED = \"disabled\",\n}\n\n/**\n * if provide order_type, check order_type and order_type_ext, otherswise only check order_type_ext\n */\nexport function isBBOOrder(options: {\n order_type?: OrderType;\n order_type_ext?: OrderType;\n}) {\n const { order_type, order_type_ext } = options;\n\n const isBBO = [OrderType.ASK, OrderType.BID].includes(order_type_ext!);\n\n if (order_type) {\n return order_type === OrderType.LIMIT && isBBO;\n }\n\n return isBBO;\n}\n\nexport function getOrderTypeByBBO(value: BBOOrderType, size: OrderSide) {\n if (\n [BBOOrderType.COUNTERPARTY1, BBOOrderType.COUNTERPARTY5].includes(value)\n ) {\n return size === OrderSide.BUY ? OrderType.ASK : OrderType.BID;\n }\n\n if ([BBOOrderType.QUEUE1, BBOOrderType.QUEUE5].includes(value)) {\n return size === OrderSide.BUY ? OrderType.BID : OrderType.ASK;\n }\n}\n\nexport function getOrderLevelByBBO(value: BBOOrderType) {\n if ([BBOOrderType.COUNTERPARTY1, BBOOrderType.QUEUE1].includes(value)) {\n return OrderLevel.ONE;\n }\n\n if ([BBOOrderType.COUNTERPARTY5, BBOOrderType.QUEUE5].includes(value)) {\n return OrderLevel.FIVE;\n }\n}\n\nexport function getBBOType(options: {\n type: OrderType;\n side: OrderSide;\n level: OrderLevel;\n}) {\n const { type, side, level } = options;\n if (type === OrderType.ASK) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY1\n : BBOOrderType.QUEUE1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY5\n : BBOOrderType.QUEUE5;\n }\n }\n\n if (type === OrderType.BID) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE1\n : BBOOrderType.COUNTERPARTY1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE5\n : BBOOrderType.COUNTERPARTY5;\n }\n }\n}\n\nexport function getScaledPlaceOrderMessage(result: any) {\n const rows = result?.data?.rows || [];\n\n if (rows.length > 0) {\n const totalCount = rows.length;\n const successCount = rows.filter((row: any) => row.success).length;\n\n // fully successful\n if (successCount === totalCount) {\n return i18n.t(\"orderEntry.scaledOrder.fullySuccessful\", {\n total: totalCount,\n });\n }\n\n // all failed\n if (successCount === 0) {\n return i18n.t(\"orderEntry.scaledOrder.allFailed\");\n }\n\n // partially successful\n return i18n.t(\"orderEntry.scaledOrder.partiallySuccessful\", {\n successCount,\n total: totalCount,\n });\n }\n}\n","import { forwardRef, SVGProps, useMemo } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { OrderSide } from \"@orderly.network/types\";\nimport {\n Button,\n Flex,\n Grid,\n DataTable,\n cn,\n Badge,\n TokenIcon,\n Tooltip,\n Text,\n} from \"@orderly.network/ui\";\nimport {\n ScaledOrderConfirmScriptOptions,\n ScaledOrderConfirmScriptReturns,\n} from \"./scaledOrderConfirm.script\";\n\nexport type ScaledOrderConfirmProps = ScaledOrderConfirmScriptOptions &\n ScaledOrderConfirmScriptReturns & {\n close?: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n };\n\nexport const ScaledOrderConfirm = (props: ScaledOrderConfirmProps) => {\n const { order, symbolInfo, dataSource, national, askAndBid, totalQuantity } =\n props;\n const { base, quote, base_dp, quote_dp } = symbolInfo;\n const { t } = useTranslation();\n\n const onCancel = () => {\n props.reject();\n props.close?.();\n };\n\n const onConfirm = () => {\n props.resolve();\n props.close?.();\n };\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n width: 125,\n render: (value: string, record: any) => {\n return (\n <Flex gap={2}>\n <div\n className={cn(\n \"oui-h-[38px] oui-w-1 oui-shrink-0 oui-rounded-[1px]\",\n record.side === OrderSide.BUY\n ? \"oui-bg-trade-profit\"\n : \"oui-bg-trade-loss\",\n )}\n />\n <Flex direction=\"column\" itemAlign=\"start\">\n <Flex gapX={1}>\n <TokenIcon symbol={value} className=\"oui-size-3\" />\n <Text.formatted\n rule=\"symbol\"\n size=\"xs\"\n formatString=\"base-type\"\n >\n {value}\n </Text.formatted>\n </Flex>\n\n <Badge color=\"neutral\" size=\"xs\">\n {t(\"orderEntry.orderType.limit\")}\n </Badge>\n </Flex>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.quantity\"),\n dataIndex: \"order_quantity\",\n width: 100,\n render: (value: string, record: any) => {\n return (\n <Text.numeral\n rule=\"price\"\n dp={base_dp}\n padding={false}\n color={record.side === OrderSide.BUY ? \"buy\" : \"sell\"}\n >\n {value}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.orderPrice\"),\n dataIndex: \"order_price\",\n width: 100,\n render: (value: string, record: any) => {\n // buy: limit_price_i >= ask0 , show warning.\n // sell: limit price <= bid0 , show warning.\n const showWarning = !!(record.side === OrderSide.BUY\n ? askAndBid?.[0] && Number(value) >= askAndBid?.[0]\n : askAndBid?.[1] && Number(value) <= askAndBid?.[1]);\n\n return (\n <Flex gapX={1}>\n <Text.numeral rule=\"price\" dp={quote_dp}>\n {value}\n </Text.numeral>\n\n {showWarning && (\n <Tooltip\n content={t(\n \"orderEntry.confirmScaledOrder.orderPrice.warning\",\n )}\n className=\"oui-w-[240px] oui-text-2xs oui-font-semibold oui-text-base-contrast-80\"\n >\n <TooltipIcon className=\"oui-text-warning-darken\" />\n </Tooltip>\n )}\n </Flex>\n );\n },\n },\n ];\n }, [t, symbolInfo, askAndBid, base_dp, quote_dp]);\n\n return (\n <div className=\"oui-font-semibold\">\n <DataTable\n classNames={{\n root: cn(\n \"oui-bg-base-7\",\n \"oui-rounded-lg\",\n // need to set overflow hidden because table header will avoid the border radius\n \"oui-overflow-hidden\",\n // \"oui-text-2xs lg:oui-text-xs\",\n // if orders is greater than 6, set the height to 320px to show scroll bar\n order.orders?.length >= 6 && \"oui-h-[320px]\",\n ),\n // set the min height of the table to show 2 rows\n scroll: \"!oui-min-h-[130px]\",\n }}\n dataSource={dataSource}\n columns={columns}\n bordered\n onRow={() => {\n return {\n className: cn(\"oui-h-[50px]\"),\n };\n }}\n />\n <div className=\"oui-mb-5 oui-mt-4 oui-text-2xs\">\n <Flex justify=\"between\">\n <Text>{t(\"orderEntry.totalOrders\")}</Text>\n <Text intensity={80}>{order.orders?.length}</Text>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"orderEntry.totalQuantity\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={base}\n dp={base_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {totalQuantity}\n </Text.numeral>\n </Flex>\n\n <Flex justify=\"between\" mt={2}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n rule=\"price\"\n unit={quote}\n dp={quote_dp}\n padding={false}\n intensity={80}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {national}\n </Text.numeral>\n </Flex>\n </div>\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={onCancel}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={onConfirm}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </div>\n );\n};\n\nexport const TooltipIcon = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => {\n return (\n <svg\n width=\"12\"\n height=\"13\"\n viewBox=\"0 0 12 13\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path d=\"M5.99951 1.50708C3.23811 1.50708 0.999512 3.74558 0.999512 6.50708C0.999512 9.26858 3.23811 11.5071 5.99951 11.5071C8.76091 11.5071 10.9995 9.26858 10.9995 6.50708C10.9995 3.74558 8.76091 1.50708 5.99951 1.50708ZM5.99951 4.00708C6.27566 4.00708 6.49951 4.23108 6.49951 4.50708C6.49951 4.78308 6.27566 5.00708 5.99951 5.00708C5.72336 5.00708 5.49951 4.78308 5.49951 4.50708C5.49951 4.23108 5.72336 4.00708 5.99951 4.00708ZM5.99951 5.50708C6.27566 5.50708 6.49951 5.73108 6.49951 6.00708V8.50708C6.49951 8.78308 6.27566 9.00708 5.99951 9.00708C5.72336 9.00708 5.49951 8.78308 5.49951 8.50708V6.00708C5.49951 5.73108 5.72336 5.50708 5.99951 5.50708Z\" />\n </svg>\n );\n },\n);\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useEventEmitter } from \"@orderly.network/hooks\";\nimport { API, OrderlyOrder } from \"@orderly.network/types\";\nimport { Decimal, zero } from \"@orderly.network/utils\";\n\nexport type ScaledOrderConfirmScriptOptions = {\n order: OrderlyOrder & {\n orders: OrderlyOrder[];\n };\n symbolInfo: API.SymbolExt;\n};\n\nexport type ScaledOrderConfirmScriptReturns = ReturnType<\n typeof useScaledOrderConfirmScript\n>;\n\nexport function useScaledOrderConfirmScript(\n options: ScaledOrderConfirmScriptOptions,\n) {\n const { order, symbolInfo } = options;\n const orders = order.orders;\n\n const [askAndBid, setAskAndBid] = useState<number[]>();\n\n const ee = useEventEmitter();\n\n const national = useMemo(() => {\n const national = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_price).mul(order.order_quantity));\n }, zero);\n\n return national.toNumber();\n }, [orders]);\n\n const totalQuantity = useMemo(() => {\n const totalQuantity = orders.reduce((acc, order) => {\n return acc.add(new Decimal(order.order_quantity));\n }, zero);\n\n return totalQuantity.toString();\n }, [orders, symbolInfo.base_dp]);\n\n useEffect(() => {\n const onOrderBookUpdate = (data: any) => {\n const ask0 = data.asks?.[data.asks.length - 1]?.[0];\n const bid0 = data.bids?.[0]?.[0];\n setAskAndBid([ask0, bid0]);\n };\n ee.on(\"orderbook:update\", onOrderBookUpdate);\n\n return () => {\n ee.off(\"orderbook:update\", onOrderBookUpdate);\n };\n }, []);\n\n return { dataSource: orders, national, askAndBid, totalQuantity };\n}\n","import { FC } from \"react\";\nimport { i18n } from \"@orderly.network/i18n\";\nimport { registerSimpleDialog } from \"@orderly.network/ui\";\nimport { useScaledOrderConfirmScript } from \"./scaledOrderConfirm.script\";\nimport {\n ScaledOrderConfirm,\n ScaledOrderConfirmProps,\n} from \"./scaledOrderConfirm.ui\";\n\nexport type ScaledOrderConfirmWidgetProps = ScaledOrderConfirmProps;\n\nexport const ScaledOrderConfirmWidget: FC<ScaledOrderConfirmWidgetProps> = (\n props,\n) => {\n const state = useScaledOrderConfirmScript(props);\n\n return <ScaledOrderConfirm {...props} {...state} />;\n};\n\nexport const scaledOrderConfirmDialogId = \"scaledOrderConfirm\";\n\nregisterSimpleDialog(scaledOrderConfirmDialogId, ScaledOrderConfirmWidget, {\n size: \"md\",\n title: () => i18n.t(\"orderEntry.confirmScaledOrder\"),\n contentProps: {\n // className: \"oui-p-0\",\n },\n});\n","import React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Text } from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { useFeesScript } from \"./fees.script\";\n\nexport const FeesUI: React.FC<ReturnType<typeof useFeesScript>> = (props) => {\n const { t } = useTranslation();\n const { takerFeeRate, makerFeeRate } = props;\n return (\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"common.fees\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"portfolio.feeTier.column.taker\")}: --% /{\" \"}\n {t(\"portfolio.feeTier.column.maker\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text size=\"2xs\">{t(\"portfolio.feeTier.column.taker\")}:</Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {takerFeeRate}\n </Text>\n <Text size=\"2xs\">/</Text>\n <Text size=\"2xs\">{t(\"portfolio.feeTier.column.maker\")}:</Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {makerFeeRate}\n </Text>\n </Flex>\n </AuthGuard>\n </Flex>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccountInfo } from \"@orderly.network/hooks\";\nimport { Decimal } from \"@orderly.network/utils\";\n\nexport const useFeesScript = () => {\n const { data } = useAccountInfo();\n\n const takerFeeRate = useMemo(() => {\n const value = data?.futures_taker_fee_rate;\n if (typeof value === \"undefined\") {\n return undefined;\n }\n return `${new Decimal(value).mul(0.01).toString()}%`;\n }, [data]);\n\n const makerFeeRate = useMemo(() => {\n const value = data?.futures_maker_fee_rate;\n if (typeof value === \"undefined\") {\n return undefined;\n }\n return `${new Decimal(value).mul(0.01).toString()}%`;\n }, [data]);\n\n return { takerFeeRate, makerFeeRate } as const;\n};\n","import React from \"react\";\nimport { useFeesScript } from \"./fees.script\";\nimport { FeesUI } from \"./fees.ui\";\n\nexport const FeesWidget: React.FC = () => {\n const state = useFeesScript();\n return <FeesUI {...state} />;\n};\n","import { createContext } from \"react\";\n\nexport type OrderEntryContextState = {\n errorMsgVisible: boolean;\n};\n\nexport const OrderEntryContext = createContext<OrderEntryContextState>(\n {} as OrderEntryContextState\n);\n\nexport const OrderEntryProvider = OrderEntryContext.Provider;\n","import { FC, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { DistributionType } from \"@orderly.network/types\";\nimport { Box, Checkbox, cn, Flex, modal, Text } from \"@orderly.network/ui\";\n\nexport type QuantityDistributionInputProps = QuantityDistributionProps & {\n className?: string;\n};\n\nexport const QuantityDistributionInput: FC<QuantityDistributionInputProps> = (\n props,\n) => {\n const { t } = useTranslation();\n\n const { className, ...rest } = props;\n\n const showHint = () => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"sm\",\n content: <QuantityDistributionHint value={props.value} />,\n // classNames: {\n // content: \"oui-bg-base-6\",\n // },\n });\n };\n\n return (\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n justify=\"center\"\n p={2}\n r=\"base\"\n // gapY={1}\n width=\"100%\"\n intensity={600}\n className={cn(\n \"oui-t-rounded oui-text-base-contrast-36\",\n \"oui-border oui-border-solid oui-border-line\",\n className,\n )}\n >\n <Text\n size=\"2xs\"\n className=\"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\"\n onClick={showHint}\n >\n {t(\"orderEntry.quantityDistribution\")}\n </Text>\n <QuantityDistribution {...rest} />\n </Flex>\n );\n};\n\ntype QuantityDistributionHintProps = {\n value?: DistributionType;\n};\n\nconst QuantityDistributionHint: FC<QuantityDistributionHintProps> = (props) => {\n const { t } = useTranslation();\n const [type, setType] = useState(DistributionType.FLAT);\n\n useEffect(() => {\n setType(\n [\n DistributionType.FLAT,\n DistributionType.ASCENDING,\n DistributionType.DESCENDING,\n ].includes(props.value!)\n ? props.value!\n : DistributionType.FLAT,\n );\n }, [props.value]);\n\n const content = useMemo(() => {\n return [\n {\n type: DistributionType.FLAT,\n title: t(\"orderEntry.distributionType.flat\"),\n description: t(\"orderEntry.distributionType.flat.description\"),\n formula: `${t(\"orderEntry.skew\")} = 1`,\n quantity: <FlatQuantity />,\n },\n {\n type: DistributionType.ASCENDING,\n title: t(\"orderEntry.distributionType.ascending\"),\n description: t(\"orderEntry.distributionType.ascending.description\"),\n formula: `${t(\"orderEntry.skew\")} > 1`,\n quantity: <AscendingQuantity />,\n },\n {\n type: DistributionType.DESCENDING,\n title: t(\"orderEntry.distributionType.descending\"),\n description: t(\"orderEntry.distributionType.descending.description\"),\n formula: `0 < ${t(\"orderEntry.skew\")} < 1`,\n quantity: <DescendingQuantity />,\n },\n ];\n }, []);\n\n const currentContent = useMemo(() => {\n return content.find((item) => item.type === type);\n }, [content, type]);\n\n return (\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-54\">\n <Flex direction=\"column\" itemAlign=\"start\" gapY={1}>\n <Text intensity={80}>\n {t(\"orderEntry.quantityDistribution.description\")}\n </Text>\n <Text>{t(\"orderEntry.quantityDistribution.formula\")}</Text>\n </Flex>\n <Flex intensity={600} p={1} r=\"base\" mt={3} itemAlign=\"start\">\n <Flex direction=\"column\" itemAlign=\"start\">\n {content.map((item) => (\n <Box\n key={item.title}\n intensity={type === item.type ? 500 : 600}\n width={78}\n p={2}\n className=\"oui-cursor-pointer oui-rounded-l\"\n onClick={() => {\n setType(item.type);\n }}\n >\n <Text>{item.title}</Text>\n </Box>\n ))}\n </Flex>\n <Flex\n direction=\"column\"\n itemAlign=\"start\"\n gapY={1}\n p={2}\n intensity={500}\n width=\"100%\"\n className={cn(\n \"oui-rounded-r\",\n type === DistributionType.FLAT && \"oui-rounded-bl\",\n type === DistributionType.ASCENDING && \"oui-rounded-l\",\n type === DistributionType.DESCENDING && \"oui-rounded-tl\",\n )}\n >\n <div>{currentContent?.formula}</div>\n <Text>{currentContent?.description}</Text>\n <Flex width=\"100%\" justify=\"center\">\n {currentContent?.quantity}\n </Flex>\n <Flex width=\"100%\" gapX={1} justify=\"center\">\n <Text className=\"oui-text-base-1\">{t(\"common.price\")}</Text>\n <PriceChart />\n </Flex>\n </Flex>\n </Flex>\n </div>\n );\n};\n\ntype QuantityDistributionProps = {\n value?: DistributionType;\n onValueChange: (value: DistributionType) => void;\n};\n\nconst QuantityDistribution: FC<QuantityDistributionProps> = (props) => {\n const { value, onValueChange } = props;\n const { t } = useTranslation();\n\n const onChange = (value: DistributionType) => (checked: boolean) => {\n onValueChange(value);\n };\n\n const distributionTypeMap = useMemo(() => {\n return {\n [DistributionType.FLAT]: t(\"orderEntry.distributionType.flat\"),\n [DistributionType.ASCENDING]: t(\n \"orderEntry.distributionType.ascending.abbr\",\n ),\n [DistributionType.DESCENDING]: t(\n \"orderEntry.distributionType.descending.abbr\",\n ),\n [DistributionType.CUSTOM]: t(\"orderEntry.distributionType.custom\"),\n };\n }, [t]);\n\n return (\n <Flex className={cn(\"oui-gap-x-[6px] lg:oui-gap-x-2\")} wrap=\"wrap\">\n {Object.values(DistributionType).map((type) => {\n return (\n <Flex itemAlign={\"center\"} key={type}>\n <Checkbox\n id={`distribution-type-${type}`}\n color={\"white\"}\n variant={\"radio\"}\n checked={value === type}\n onCheckedChange={onChange(type)}\n />\n <label\n htmlFor={`distribution-type-${type}`}\n className={cn(\n \"oui-text-2xs\",\n \"oui-ml-1\",\n \"oui-whitespace-nowrap oui-break-normal\",\n )}\n >\n {distributionTypeMap[type]}\n </label>\n </Flex>\n );\n })}\n </Flex>\n );\n};\n\nconst FlatQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n </svg>\n );\n};\n\nconst AscendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n x=\"18\"\n y=\"18\"\n width=\"181\"\n height=\"4\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"15\"\n cy=\"20\"\n r=\"4.28571\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"62\"\n cy=\"20\"\n r=\"5.14286\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"109\"\n cy=\"20\"\n r=\"6\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"156\"\n cy=\"20\"\n r=\"6.85714\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"203\"\n cy=\"20\"\n r=\"7.71429\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst DescendingQuantity = () => {\n return (\n <svg\n width=\"218\"\n height=\"40\"\n viewBox=\"0 0 218 40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect\n width=\"181\"\n height=\"4\"\n transform=\"matrix(-1 0 0 1 200 18)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n />\n <circle\n cx=\"5\"\n cy=\"5\"\n r=\"4.28571\"\n transform=\"matrix(-1 0 0 1 208 15)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.42857\"\n />\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"5.14286\"\n transform=\"matrix(-1 0 0 1 162 14)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"1.71429\"\n />\n <circle\n cx=\"7\"\n cy=\"7\"\n r=\"6\"\n transform=\"matrix(-1 0 0 1 116 13)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2\"\n />\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6.85714\"\n transform=\"matrix(-1 0 0 1 70 12)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.28571\"\n />\n <circle\n cx=\"9\"\n cy=\"9\"\n r=\"7.71429\"\n transform=\"matrix(-1 0 0 1 24 11)\"\n fill=\"rgb(var(--oui-color-base-2))\"\n stroke=\"rgb(var(--oui-color-base-5))\"\n strokeWidth=\"2.57143\"\n />\n </svg>\n );\n};\n\nconst PriceChart = () => {\n return (\n <svg\n width=\"176\"\n height=\"8\"\n viewBox=\"0 0 176 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M175.354 4.35355C175.549 4.15829 175.549 3.84171 175.354 3.64645L172.172 0.464466C171.976 0.269204 171.66 0.269204 171.464 0.464466C171.269 0.659728 171.269 0.976311 171.464 1.17157L174.293 4L171.464 6.82843C171.269 7.02369 171.269 7.34027 171.464 7.53553C171.66 7.7308 171.976 7.7308 172.172 7.53553L175.354 4.35355ZM0 4V4.5H175V4V3.5H0V4Z\"\n fill=\"rgb(var(--oui-color-base-1))\"\n />\n </svg>\n );\n};\n","import { useRef } from \"react\";\nimport { useBoolean } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n EditIcon,\n Flex,\n Text,\n SimpleDialog,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { SlippageEditor } from \"./slippageEditor\";\n\nexport const SlippageCell = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n const { t } = useTranslation();\n const [open, { setTrue: setOpen, setFalse: setClose, toggle }] =\n useBoolean(false);\n\n const { isMobile } = useScreen();\n const slippageRef = useRef<{ getValue: () => number | undefined }>(null);\n\n const onConfirm = () => {\n const val = slippageRef.current?.getValue();\n\n props.setSlippage(!val ? \"1\" : val.toString());\n setClose();\n return Promise.resolve(true);\n };\n\n return (\n <>\n <SimpleDialog\n open={open}\n onOpenChange={toggle}\n title={t(\"common.settings\")}\n contentProps={{ size: isMobile ? \"xs\" : \"sm\" }}\n actions={{\n primary: {\n disabled: false,\n label: t(\"common.save\"),\n onClick: onConfirm,\n },\n secondary: {\n label: t(\"common.cancel\"),\n onClick: () => setClose(),\n },\n }}\n >\n <SlippageEditor\n ref={slippageRef}\n isMobile={isMobile}\n initialValue={props.slippage ? Number(props.slippage) : undefined}\n />\n </SimpleDialog>\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"orderEntry.slippage\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"orderEntry.slippage.est\")}: -% / {t(\"common.max\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text.numeral\n size=\"2xs\"\n rule=\"percentages\"\n prefix={`${t(\"orderEntry.slippage.est\")}: `}\n suffix={` / ${t(\"common.max\")}: `}\n >\n {props.estSlippage ?? 0}\n </Text.numeral>\n <button className=\"oui-text-2xs\" onClick={() => setOpen()}>\n <Flex className=\"oui-gap-0.5\" as=\"span\">\n <Text size=\"2xs\" className=\"oui-text-primary\">\n {`${props.slippage || \"-\"}%`}\n </Text>\n <EditIcon\n className=\"oui-text-primary oui-hidden md:oui-block\"\n size={12}\n opacity={1}\n />\n </Flex>\n </button>\n </Flex>\n </AuthGuard>\n </Flex>\n </>\n );\n};\n","import {\n FC,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n cn,\n ExclamationFillIcon,\n Flex,\n Input,\n inputFormatter,\n modal,\n Text,\n Tooltip,\n TooltipTrigger,\n} from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\n\ninterface SlippageProps {\n initialValue?: number;\n isMobile?: boolean;\n}\n\nconst options = [0.01, 0.05, 0.1];\n\nexport const SlippageEditor = forwardRef<\n { getValue: () => number | undefined },\n SlippageProps\n>((props, ref) => {\n const { t } = useTranslation();\n const [value, setValue] = useState<number>();\n const [customValue, setCustomValue] = useState(\"\");\n const [error, setError] = useState<string | undefined>(undefined);\n\n useImperativeHandle(ref, () => ({\n getValue: () =>\n customValue ? new Decimal(customValue)?.toNumber() : value,\n }));\n\n useEffect(() => {\n if (props.initialValue && !options.includes(props.initialValue!)) {\n setCustomValue(props.initialValue!.toString());\n } else {\n setValue(props.initialValue);\n }\n }, [props.initialValue, open]);\n\n const onClick = (val: number) => {\n setValue(val);\n setCustomValue(\"\");\n setError(undefined);\n };\n\n const onValueChange = (val: string) => {\n if (!val) {\n setCustomValue(val);\n return;\n }\n\n const d = new Decimal(val);\n setValue(undefined);\n if (d.gt(3)) {\n setCustomValue(\"3\");\n setError(t(\"orderEntry.slippage.error.exceed\"));\n } else {\n setCustomValue(val);\n setError(undefined);\n }\n };\n\n const toolTipButton = props.isMobile ? (\n <button\n onClick={() => {\n // setOpen(true)\n modal.alert({\n title: t(\"common.tips\"),\n message: <Text size=\"2xs\">{t(\"orderEntry.slippage.tips\")}</Text>,\n });\n }}\n >\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </button>\n ) : (\n <Tooltip\n // @ts-ignore\n content={\n <Text intensity={80} size=\"2xs\">\n {t(\"orderEntry.slippage.tips\")}\n </Text>\n }\n className=\"oui-w-[260px] oui-bg-base-6\"\n arrow={{ className: \"oui-fill-base-6\" }}\n >\n <TooltipTrigger>\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </TooltipTrigger>\n </Tooltip>\n );\n\n return (\n <div className=\"oui-text-2xs\">\n <Flex mb={2} gapX={1}>\n <Text size=\"xs\">{t(\"orderEntry.slippage\")}</Text>\n {toolTipButton}\n </Flex>\n <Flex gapX={2}>\n {options.map((item) => {\n const isActive = value === item;\n return (\n <SlippageItem\n key={item}\n value={item}\n isActive={isActive}\n onClick={() => {\n onClick(item);\n }}\n />\n );\n })}\n\n <Input\n suffix=\"%\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(2),\n ]}\n value={customValue}\n onValueChange={onValueChange}\n classNames={{\n root: cn(\n \"oui-rounded-md oui-bg-base-6\",\n \"oui-h-[40px] oui-w-[74px]\",\n ),\n input: \"oui-text-base-contrast\",\n additional: \"oui-pl-1\",\n }}\n />\n </Flex>\n {!!error && (\n <Box mt={5} className=\"-oui-mb-5\">\n <Text size=\"2xs\" color=\"danger\">\n {error}\n </Text>\n </Box>\n )}\n </div>\n );\n});\n\ntype SlippageItemProps = {\n value: number;\n isActive: boolean;\n onClick: () => void;\n};\n\nconst SlippageItem: FC<SlippageItemProps> = ({ value, isActive, onClick }) => {\n return (\n <Flex\n intensity={600}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"md\"\n width={74}\n height={40}\n className={cn(\n \"oui-cursor-pointer oui-select-none\",\n isActive && \"oui-bg-primary-light\",\n )}\n onClick={onClick}\n >\n <Text size=\"sm\" intensity={80}>\n {value}%\n </Text>\n </Flex>\n );\n};\n","import { SlippageCell } from \"./components/slippageCell\";\n\nexport const SlippageUI = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n return <SlippageCell {...props} />;\n};\n","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { OrderType } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n Text,\n Input,\n inputFormatter,\n modal,\n Switch,\n} from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\n\ntype OrderValueKeys = keyof OrderlyOrder;\n\ntype Est_Values = PNL_Values & {\n trigger_price?: string;\n};\n\ntype TPSL_Values = { tp: Est_Values; sl: Est_Values };\n\nexport const OrderTPSL = (props: {\n // onCancelTPSL: () => void;\n // onEnableTP_SL: () => void;\n switchState: boolean;\n onSwitchChanged: (state: boolean) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n // setOpen(false);\n props.onSwitchChanged(false);\n\n // props.onCancelTPSL();\n }\n }, [props.orderType]);\n\n if (\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n )\n return null;\n\n return (\n <div>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"order_entry_tpsl\"}\n className=\"oui-h-[14px]\"\n checked={props.switchState}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n // setOpen(checked);\n props.onSwitchChanged(checked);\n // if (!checked) {\n // props.onCancelTPSL();\n // } else {\n // props.onEnableTP_SL();\n // }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n {t(\"common.tpsl\")}\n </label>\n <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-white/[.36] hover:oui-text-white/80\"\n onClick={() => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: <Text intensity={54}>{t(\"orderEntry.tpsl.tips\")}</Text>,\n });\n }}\n />\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n props.switchState && \"oui-max-h-[100px]\",\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\n \"opacity\",\n props.switchState ? \"1\" : \"0\",\n );\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n quote_dp={props.quote_dp}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n }\n>((props, ref) => {\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(props.errors);\n\n return (\n <div\n ref={ref}\n className={\"oui-space-y-1 oui-px-px oui-py-2 oui-transition-all\"}\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={parseErrorMsg(\"tp_trigger_price\")}\n onChange={props.onChange}\n values={props.values.tp}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-tpPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-tpPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-tp-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={parseErrorMsg(\"sl_trigger_price\")}\n onChange={props.onChange}\n values={props.values.sl}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-slPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-slPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-sl-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n </div>\n );\n});\n\nTPSLInputForm.displayName = \"TPSLInputForm\";\n\n//------- TPSLTriggerPriceInput start -------\nconst TPSLTriggerPriceInput = (props: {\n type: \"TP\" | \"SL\";\n error: string | undefined;\n values: Est_Values;\n onChange: (value: string) => void;\n quote_dp: number | undefined;\n testId?: string;\n}) => {\n const { t } = useTranslation();\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const { tipsEle } = usePnlInputContext();\n const [prefix, setPrefix] = useState<string>(`${props.type} Price`);\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const [innerValue, setInnerValue] = useState<string>(\n props.values.trigger_price ?? \"\",\n );\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(props.values.trigger_price ?? \"\");\n }, [props.values.trigger_price, isFocused]);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n const getPrefixLabel = (trigger_price?: string) => {\n let _prefix = props.type === \"TP\" ? t(\"tpsl.tpPrice\") : t(\"tpsl.slPrice\");\n\n if (trigger_price) {\n _prefix = props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\");\n }\n return _prefix;\n };\n\n const onValueChange = (value: string) => {\n setInnerValue(value);\n props.onChange(value);\n };\n\n // console.log(\"props.values.trigger_price\", props.values.trigger_price);\n\n useEffect(() => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n\n if (!isFocused) {\n setInnerValue(props.values.trigger_price ?? \"\");\n }\n }, [props.type, props.values.trigger_price]);\n\n const onFocus = () => {\n setPrefix(props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\"));\n setPlaceholder(\"\");\n setTipVisible(true);\n setIsFocused(true);\n };\n\n const onBlur = () => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(innerValue);\n };\n\n return (\n <Input.tooltip\n data-testid={props.testId}\n prefix={prefix}\n size={\"md\"}\n placeholder={placeholder}\n align=\"right\"\n onFocus={onFocus}\n onBlur={onBlur}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={innerValue}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n root: \"oui-pr-2 md:oui-pr-3\",\n prefix: \"oui-pr-1 md:oui-pr-2\",\n }}\n // onChange={props.onChange}\n onValueChange={onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp ?? 2),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\n//------- TPSLTriggerPriceInput end -------\n\nconst TPSLInputRow = (props: {\n type: \"TP\" | \"SL\";\n values: Est_Values;\n error?: string;\n onChange: (key: OrderValueKeys, value: any) => void;\n quote_dp: number | undefined;\n testIds?: {\n first?: string;\n second?: string;\n dropDown?: string;\n };\n}) => {\n const priceKey =\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\";\n\n return (\n <Grid cols={2} gapX={1}>\n <TPSLTriggerPriceInput\n testId={props.testIds?.first}\n type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(priceKey, event);\n }}\n quote_dp={props.quote_dp}\n />\n\n <PnlInputWidget\n testIds={{\n input: props.testIds?.second,\n dropDown: props.testIds?.dropDown,\n }}\n onChange={props.onChange}\n quote={\"USDC\"}\n quote_dp={props.quote_dp}\n type={props.type}\n values={{\n PnL: props.values.PnL,\n Offset: props.values.Offset,\n \"Offset%\": props.values[\"Offset%\"],\n ROI: props.values.ROI,\n }}\n />\n </Grid>\n );\n};\n","import {\n CaretDownIcon,\n cn,\n Flex,\n Input,\n MenuItem,\n Text,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n modeLabelMap,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n useEffect(() => {\n setPrefix(!!value ? \"\" : mode);\n }, [value]);\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={modeLabelMap[prefix as keyof typeof modeLabelMap] || prefix}\n size={\"md\"}\n placeholder={placeholder}\n id={id}\n align={\"right\"}\n value={value}\n tooltip={tips}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n data-testid={props.testIds?.input}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_dp, mode, type }),\n inputFormatter.currencyFormatter,\n // inputFormatter.identifierFormatter(),\n ]}\n classNames={{\n root: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n additional: \"oui-text-base-contrast-54\",\n input: \"oui-text-inherit\",\n }}\n onFocus={() => {\n setPrefix(\"\");\n setPlaceholder(\"\");\n onFocus();\n }}\n onBlur={() => {\n setPrefix(!!value ? \"\" : mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n onBlur();\n }}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className=\"oui-ml-[2px]\">\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n testId={props.testIds?.dropDown}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n testId?: string;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"} data-testid={props.testId}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\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 ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values, quote_dp } = props;\n const { t } = useTranslation();\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const [innerValue, setInnerValue] = useState<string>(\n values[mode as keyof PNL_Values],\n );\n\n // const value = useMemo(() => {\n // // console.log(\"mode\", mode, values);\n // const value = values[mode as keyof PNL_Values];\n // // if (isFocused) {\n // // return value;\n // // }\n // return value;\n // }, [values, mode, isFocused]);\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(values[mode as keyof PNL_Values]);\n }, [values, mode, isFocused]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n {\n label: t(\"tpsl.pnl\"),\n value: PnLMode.PnL,\n testId: `${PnLMode.PnL}_menu_item`,\n },\n {\n label: t(\"tpsl.offset\"),\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: `${t(\"tpsl.offset\")}%`,\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, [t]);\n\n const modeLabelMap = useMemo(() => {\n return {\n [PnLMode.PnL]: t(\"tpsl.pnl\"),\n [PnLMode.OFFSET]: t(\"tpsl.offset\"),\n [PnLMode.PERCENTAGE]: `${t(\"tpsl.offset\")}%`,\n };\n }, [t]);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n // if (!isFocused) {\n // props.onChange(key, value);\n // } else {\n // setInnerValue(value);\n // }\n setInnerValue(value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n setIsFocused(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(key, innerValue);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions,\n ) => {\n value = `${value}`; // convert to string\n\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n // value = new Decimal(\n // value.replace(\n // new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n // \"\"\n // )\n // )\n // .mul(100)\n // .toString();\n\n // return `${todpIfNeed(value, 2)}${percentageSuffix.current}`;\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\",\n ),\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n // return (Number(value) * 100).toFixed(2);\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n // console.log(\"onSendBefore\", value);\n\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n modeLabelMap,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value: innerValue,\n onValueChange,\n quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import {\n createContext,\n PropsWithChildren,\n ReactNode,\n useContext,\n useMemo,\n} from \"react\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype TipType = \"ROI\" | \"PnL\" | \"Error\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n\nexport const PnlInputProvider = (\n props: PropsWithChildren<{\n values: PNL_Values & {\n trigger_price?: string;\n };\n type: \"TP\" | \"SL\";\n }>\n) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n const { t } = useTranslation();\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n \n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {mode === PnLMode.PnL\n ? t(\"orderEntry.estRoi\")\n : t(\"orderEntry.estPnL\")}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, props.values.PnL, props.values.trigger_price]);\n\n return (\n <PnlInputContext.Provider\n value={{\n mode,\n setMode,\n tipsEle,\n }}\n >\n {props.children}\n </PnlInputContext.Provider>\n );\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n }\n) => {\n const { testIds, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testIds={testIds} quote={quote} type={props.type} />\n );\n};\n","import { useEffect, useRef, FocusEvent, useMemo, useState } from \"react\";\nimport {\n useAccount,\n useComputedLTV,\n useDebouncedCallback,\n useEventEmitter,\n useLocalStorage,\n useMarginRatio,\n useOrderEntry,\n utils,\n} from \"@orderly.network/hooks\";\nimport { useAppContext } from \"@orderly.network/react-app\";\nimport {\n BBOOrderType,\n DistributionType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"./utils\";\n\nconst safeNumber = (val: number | string) => {\n return Number.isNaN(Number(val)) ? 0 : Number(val);\n};\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport type OrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const [localOrderType, setLocalOrderType] = useLocalStorage(\n \"orderly-order-entry-order-type\",\n OrderType.LIMIT,\n );\n const [localOrderSide, setLocalOrderSide] = useLocalStorage(\n \"orderly-order-entry-order-side\",\n OrderSide.BUY,\n );\n const [localBBOType, setLocalBBOType] = useLocalStorage<\n BBOOrderType | undefined\n >(\"orderly_order_bbo_type\", undefined);\n\n const lastBBOType = useRef<BBOOrderType>(localBBOType);\n\n const { formattedOrder, setValue, setValues, symbolInfo, ...state } =\n useOrderEntry(inputs.symbol, {\n initialOrder: {\n symbol: inputs.symbol,\n order_type: localOrderType,\n side: localOrderSide,\n },\n });\n const [tpslSwitch, setTpslSwitch] = useLocalStorage(\n \"orderly-order-entry-tp_sl-switch\",\n false,\n );\n\n const { state: accountState } = useAccount();\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (accountState.status === AccountStatusEnum.EnableTrading ||\n accountState.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [accountState.status, wrongNetwork, disabledConnect]);\n\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const lastScaledOrderPriceInput = useRef<InputType>(InputType.MAX_PRICE);\n const triggerPriceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputContainerRef = useRef<HTMLDivElement | null>(null);\n const [priceInputContainerWidth, setPriceInputContainerWidth] = useState(0);\n\n const currentQtyPercentage = useMemo(() => {\n if (Number(formattedOrder.order_quantity) >= Number(state.maxQty)) {\n return 1;\n }\n return (\n convertValueToPercentage(\n Number(formattedOrder.order_quantity ?? 0),\n 0,\n state.maxQty,\n ) / 100\n );\n }, [formattedOrder.order_quantity, state.maxQty]);\n\n const formatQty = () => {\n if (\n symbolInfo.base_tick < 1 ||\n // scaled order should not format quantity, because it is total quantity\n formattedOrder.order_type === OrderType.SCALED ||\n !formattedOrder.order_quantity\n ) {\n return;\n }\n\n // TODO: use this to format quantity instead of utils.formatNumber, need time to test\n // const formatQty = new Decimal(formattedOrder.order_quantity)\n // .todp(0, Decimal.ROUND_DOWN)\n // .div(symbolInfo.base_tick)\n // .toString();\n\n const quantity = utils.formatNumber(\n formattedOrder?.order_quantity,\n new Decimal(symbolInfo?.base_tick || \"0\").toNumber(),\n );\n\n setValue(\"order_quantity\", quantity, {\n shouldUpdateLastChangedField: false,\n });\n };\n\n const onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\n\n // set last scaled order price input\n if (\n [InputType.MIN_PRICE, InputType.MAX_PRICE].includes(\n currentFocusInput.current!,\n )\n ) {\n lastScaledOrderPriceInput.current = type;\n }\n };\n\n const onBlur = (type: InputType) => (_: FocusEvent) => {\n setTimeout(() => {\n if (currentFocusInput.current !== type) {\n return;\n }\n currentFocusInput.current = InputType.NONE;\n }, 300);\n\n if (type === InputType.QUANTITY) {\n formatQty();\n }\n };\n\n // cancel TP/SL\n const cancelTP_SL = () => {\n // if(formattedOrder.)\n setValues({\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n });\n };\n\n const enableTP_SL = () => {\n setValues({\n order_type_ext: undefined,\n });\n };\n\n const setMaxQty = () => {\n setValue(\"order_quantity\", state.maxQty);\n };\n\n const setOrderValue = (\n key: any,\n value: any,\n options?: {\n shouldUpdateLastChangedField?: boolean;\n },\n ) => {\n if (key === \"order_type\") {\n setLocalOrderType(value);\n }\n if (key === \"side\") {\n setLocalOrderSide(value);\n }\n\n if (\n (key === \"reduce_only\" && value) ||\n (key === \"order_type\" &&\n (value === OrderType.STOP_LIMIT || value === OrderType.STOP_MARKET))\n ) {\n // cancelTP_SL();\n\n const data = {\n tp_trigger_price: \"\",\n sl_trigger_price: \"\",\n [key]: value,\n };\n\n if (key === \"order_type\") {\n data[\"order_type_ext\" as any] = \"\";\n }\n\n setValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value !== OrderType.LIMIT) {\n const data = {\n level: undefined,\n order_type_ext: undefined,\n [key]: value,\n };\n\n setValues(data);\n\n return;\n }\n\n if (key === \"order_type\" && value === OrderType.SCALED) {\n setValues({\n distribution_type: DistributionType.FLAT,\n [key]: value,\n });\n return;\n }\n\n setValue(key, value, options);\n };\n\n const onTPSLSwitchChanged = (state: boolean) => {\n setTpslSwitch(state);\n if (state) {\n enableTP_SL();\n } else {\n cancelTP_SL();\n }\n };\n\n const bboStatus = useMemo(() => {\n if (\n tpslSwitch ||\n [OrderType.POST_ONLY, OrderType.IOC, OrderType.FOK].includes(\n formattedOrder.order_type_ext!,\n )\n ) {\n return BBOStatus.DISABLED;\n }\n\n return localBBOType && formattedOrder.order_type === OrderType.LIMIT\n ? BBOStatus.ON\n : BBOStatus.OFF;\n }, [\n tpslSwitch,\n formattedOrder.order_type_ext,\n formattedOrder.order_type,\n localBBOType,\n ]);\n\n const toggleBBO = () => {\n if (localBBOType) {\n // unselect bbo\n setLocalBBOType(undefined);\n // update formattedOrder values immediately instead of via useEffect\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n } else {\n setLocalBBOType(lastBBOType.current || BBOOrderType.COUNTERPARTY1);\n }\n };\n\n const onBBOChange = (value: BBOOrderType) => {\n setLocalBBOType(value);\n lastBBOType.current = value;\n };\n\n useEffect(() => {\n if (bboStatus === BBOStatus.DISABLED) {\n const { order_type_ext } = formattedOrder;\n setValues({\n // if order_type_ext is not bbo(ask, bid), keep previous value\n order_type_ext: isBBOOrder({ order_type_ext })\n ? undefined\n : order_type_ext,\n level: undefined,\n });\n }\n }, [bboStatus, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n if (bboStatus === BBOStatus.ON) {\n const orderType = getOrderTypeByBBO(localBBOType, formattedOrder.side!);\n const orderLevel = getOrderLevelByBBO(localBBOType)!;\n setValues({\n order_type_ext: orderType,\n level: orderLevel,\n });\n }\n }, [localBBOType, bboStatus, formattedOrder.side]);\n\n // useEffect(() => {\n // if (\n // priceInputContainerRef.current &&\n // // update BBO select width when is BBO order\n // isBBOOrder({ order_type_ext: formattedOrder.order_type_ext })\n // ) {\n // const width =\n // priceInputContainerRef.current.getBoundingClientRect()?.width;\n // if (width) {\n // setPriceInputContainerWidth(width);\n // }\n // }\n // }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n const updateOrderPrice = (price: string) => {\n setValue(\"order_price\", price);\n };\n ee.on(\"update:orderPrice\", updateOrderPrice);\n\n return () => {\n ee.off(\"update:orderPrice\", updateOrderPrice);\n };\n }, []);\n\n useEffect(() => {\n const focusInputElement = (target: HTMLInputElement | null) => {\n setTimeout(() => {\n target?.focus();\n }, 0);\n };\n\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n const price = removeTrailingZeros(item[0]);\n const { order_type, order_type_ext } = formattedOrder;\n\n // handle trigger price input, focus on trigger price input\n if (\n currentFocusInput.current === InputType.TRIGGER_PRICE &&\n (order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.STOP_MARKET)\n ) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle bbo order, unselect bbo and set order price, focus on order price input\n if (isBBOOrder({ order_type, order_type_ext })) {\n setLocalBBOType(undefined);\n\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n\n setTimeout(() => {\n // Since BBO will update the price when unselected, we should set order price in setTimeout\n // We can't call setValue directly here because it's inside a setTimeout, and the formattedOrder accessed inside setValue would be the old value\n // setValue(\"order_price\", price);\n ee.emit(\"update:orderPrice\", price);\n }, 0);\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle limit order and stop limit order, set order price and focus on order price input\n if (\n order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle stop market order, set trigger price and focus on trigger price input\n if (order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle market order, set order type to limit\n if (order_type === OrderType.MARKET) {\n // unselect bbo\n setLocalBBOType(undefined);\n\n // You can't call setValue twice here , the second value will override the first, so you need to combine them into a single setValues call\n setValues({\n order_type: OrderType.LIMIT,\n order_price: price,\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n if (\n order_type === OrderType.SCALED &&\n lastScaledOrderPriceInput.current\n ) {\n const field =\n lastScaledOrderPriceInput.current === InputType.MIN_PRICE\n ? \"min_price\"\n : \"max_price\";\n setValue(field, price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // default, set order price and focus on order price input\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n // Please do not modify this deps lightly, because `setValue` also relies on these state internally\n }, [formattedOrder, symbolInfo]);\n\n useEffect(() => {\n const element = priceInputContainerRef.current;\n\n if (!element) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n if (width) {\n // update BBO order select dropdown width when priceInputContainerRef width changed\n setPriceInputContainerWidth(width);\n }\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.unobserve(element);\n };\n }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n // after switching symbol, all the input number should be cleared (price, qty, TP/SL, etc)\n state.reset();\n state.resetMetaState();\n }, [inputs.symbol]);\n\n // if scaled order, and distribution_type is not set, set it to flat\n useEffect(() => {\n if (\n formattedOrder.order_type === OrderType.SCALED &&\n !formattedOrder.distribution_type\n ) {\n setValue(\"distribution_type\", DistributionType.FLAT);\n }\n }, [formattedOrder.order_type, formattedOrder.distribution_type]);\n\n const currentLtv = useComputedLTV();\n\n const [askAndBid, setAskAndBid] = useState<[number, number]>([0, 0]);\n\n const onOrderBookUpdate = useDebouncedCallback((data: any) => {\n setAskAndBid([data.asks?.[data.asks.length - 1]?.[0], data.bids?.[0]?.[0]]);\n }, 200);\n\n useEffect(() => {\n ee.on(\"orderbook:update\", onOrderBookUpdate);\n return () => {\n ee.off(\"orderbook:update\", onOrderBookUpdate);\n onOrderBookUpdate.cancel();\n };\n }, [onOrderBookUpdate]);\n\n const fillMiddleValue = () => {\n if (bboStatus === BBOStatus.ON) {\n toggleBBO();\n }\n if (formattedOrder.order_type === OrderType.LIMIT) {\n const [bestAsk = 0, bestBid = 0] = askAndBid;\n const midPrice = new Decimal(safeNumber(bestAsk))\n .add(safeNumber(bestBid))\n .div(2)\n .toNumber();\n setValue(\"order_price\", midPrice);\n }\n };\n\n return {\n ...state,\n currentQtyPercentage,\n side: formattedOrder.side as OrderSide,\n type: formattedOrder.order_type as OrderType,\n level: formattedOrder.level as OrderLevel,\n setOrderValue,\n setOrderValues: setValues,\n\n currentLeverage,\n\n formattedOrder,\n // cancelTP_SL,\n // enableTP_SL,\n tpslSwitch,\n setTpslSwitch: onTPSLSwitchChanged,\n setMaxQty,\n symbolInfo,\n onFocus,\n onBlur,\n refs: {\n triggerPriceInputRef,\n priceInputRef,\n priceInputContainerRef,\n },\n canTrade,\n bboStatus,\n bboType: localBBOType,\n onBBOChange,\n toggleBBO,\n priceInputContainerWidth,\n currentLtv,\n fillMiddleValue,\n };\n};\n","import {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./orderEntry.script\";\nimport { OrderEntry } from \"./orderEntry.ui\";\n\nexport const OrderEntryWidget = (\n props: OrderEntryScriptInputs & {\n containerRef?: any;\n disableFeatures?: (\"slippageSetting\" | \"feesInfo\")[];\n },\n) => {\n const state = useOrderEntryScript(props);\n return (\n <OrderEntry\n {...state}\n containerRef={props.containerRef}\n disableFeatures={props.disableFeatures}\n />\n );\n};\n"]}
|