@orderly.network/ui-order-entry 2.0.2 → 2.0.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.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +8 -8
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/orderEntry.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/components/orderEntryContext.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/useOrderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["AuthGuard","Box","Button","cn","Divider","Flex","Grid","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","ThrottledButton","toast","forwardRef","useContext","useEffect","useMemo","useState","BBOOrderType","OrderSide","OrderType","React","CaretDownIcon","SimpleDropdownMenu","useRef","Decimal","todpIfNeed","createContext","useLocalStorage","jsx","jsxs","PnlInputContext","usePnlInputContext","PnlInputProvider","props","type","values","mode","setMode","tipsEle","usePNLInputBuilder","quote_dp","tipVisible","setTipVisible","key","value","modes","percentageSuffix","options","dp","endStr","Fragment","PNLInput","onModeChange","onValueChange","quote","tips","onFocus","onBlur","prefix","setPrefix","setPlaceholder","placeholder","id","PNLMenus","item","event","PnlInputWidget","testIds","rest","state","OrderEntryContext","OrderEntryProvider","ExclamationFillIcon","OrderTPSL","tpslFormRef","checked","TPSLInputForm","ref","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","priceKey","Badge","Checkbox","registerSimpleDialog","OrderLevel","BBOType2Label","isBBOOrder","order_type","order_type_ext","isBBO","getOrderTypeByBBO","size","getOrderLevelByBBO","getBBOType","side","level","OrderConfirmDialog","baseDP","quoteDP","order","onConfirm","onCancel","_","setNeedConfirm","renderPrice","bboType","OrderTypeTag","typeStr","Dialog","close","resolve","reject","orderConfirmDialogId","AdditionalInfo","pinned","orderTypeExtra","onTypeToggle","useAdditionalScript","AdditionalInfoWidget","OrderEntry","formattedOrder","setOrderValue","setOrderValues","symbolInfo","maxQty","freeCollateral","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","errors","validated","setErrorMsgVisible","needConfirm","setPinned","hidden","setHidden","buttonLabel","clickHandler","visible","onSubmit","result","error","OrderTypeSelect","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","PinButton","defaultPath","path","setPath","bbo","parseErrorMsg","readOnly","priceSuffix","CustomInput","e","BBOOrderTypeSelect","InputLabel","canTrade","color","maxLabel","option","o","open","setOpen","useAccount","useEventEmitter","useMarginRatio","useOrderEntry","utils","removeTrailingZeros","convertValueToPercentage","AccountStatusEnum","useAppContext","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","localBBOType","setLocalBBOType","lastBBOType","setValue","setValues","tpslSwitch","setTpslSwitch","accountState","wrongNetwork","currentLeverage","ee","currentFocusInput","triggerPriceInputRef","priceInputRef","priceInputContainerRef","priceInputContainerWidth","setPriceInputContainerWidth","currentQtyPercentage","formatQty","quantity","orderBookItemClickHandler","focusInputElement","newType","target","cancelTP_SL","enableTP_SL","setMaxQty","data","onTPSLSwitchChanged","orderType","orderLevel","element","resizeObserver","entries","entry","width","OrderEntryWidget"],"mappings":"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","sourcesContent":["import { type uesOrderEntryScriptReturn } from \"./useOrderEntry.script\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport {\n Box,\n Button,\n cn,\n Divider,\n Flex,\n Grid,\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} from \"@orderly.network/ui\";\nimport {\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 AccountStatusEnum,\n API,\n BBOOrderType,\n OrderLevel,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { InputType } from \"./types\";\nimport { SDKError } from \"@orderly.network/types\";\nimport { ApiError } from \"@orderly.network/types\";\nimport { BBOStatus, BBOType2Label } from \"./utils\";\n\ntype Refs = uesOrderEntryScriptReturn[\"refs\"];\n\nexport const OrderEntry = (\n props: uesOrderEntryScriptReturn & {\n containerRef: any;\n }\n) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n setOrderValues,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n } = props;\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\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 buttonLabel = useMemo(() => {\n return side === OrderSide.BUY ? \"Buy / Long\" : \"Sell / Short\";\n }, [side]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\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 helper\n .validate()\n .then(\n (order: any) => {\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n\n quote: symbolInfo.quote,\n base: symbolInfo.base,\n\n quoteDP: symbolInfo.quote_dp,\n baseDP: symbolInfo.base_dp,\n });\n }\n\n return true;\n },\n (errors) => {\n setErrorMsgVisible(true);\n\n if (typeof errors === \"object\") {\n if (\n errors.total != null ||\n errors.order_quantity != null ||\n errors.order_price != null ||\n errors.trigger_price != null\n )\n return Promise.reject();\n }\n }\n )\n .then(() => {\n return submit().then((result: any) => {\n console.log(result);\n if (result.success) {\n // setOrderValue(\"order_quantity\", \"\");\n } else {\n toast.error(result.message);\n }\n });\n })\n .catch((error) => {\n console.log(\"catch:\", error);\n if (error === \"cancel\") return;\n if (typeof error === \"object\" && error.message)\n toast.error(error.message);\n // toast.error(`Error:${error.message}`);\n\n // if (error instanceof ApiError) {\n // toast.error(error.message);\n // }\n });\n };\n\n return (\n <OrderEntryProvider\n value={{\n errorMsgVisible,\n }}\n >\n <div\n className={\"oui-space-y-2 xl:oui-space-y-3 oui-text-base-contrast-54\"}\n ref={props.containerRef}\n >\n {/* Buy Sell button */}\n <Flex gapX={2} className=\"oui-flex-col lg:oui-flex-row oui-gap-y-3\">\n <div\n className={\n \"oui-grid oui-grid-cols-2 oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\"\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 hover:oui-bg-base-6 active:oui-bg-base-6 oui-text-base-contrast-36\"\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n 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 hover:oui-bg-base-6 active:oui-bg-base-6 oui-text-base-contrast-36\"\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n Sell\n </Button>\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 justify={\"between\"}>\n <Text size={\"2xs\"}>Available</Text>\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 {/* Inputs (price,quantity,triggerPrice) */}\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 errors={validated ? errors : null}\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 />\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 <AuthGuard buttonProps={{ fullWidth: true }}>\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 >\n {buttonLabel}\n </ThrottledButton>\n </AuthGuard>\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 />\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-[0px] 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 Reduce only\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-absolute oui-top-2 oui-right-2 oui-group\"}\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 errors: any;\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 uesOrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n}) => {\n const { type, symbolInfo, errors, values, onFocus, onBlur, bbo } = props;\n\n const parseErrorMsg = (key: string) => {\n if (errors && errors[key]) {\n return errors[key].message;\n }\n return \"\";\n };\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 width={48}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-border oui-cursor-pointer oui-mt-[2px] oui-select-none\",\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: \"Tips\",\n size: \"xs\",\n content: (\n <Text intensity={54}>\n BBO is not supported when TP/SL, Post-Only, IOC, or FOK is\n selected.\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 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={\"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-relative oui-group oui-w-full\"\n >\n <CustomInput\n label={\"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-left-0 oui-bottom-1\")}>\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-space-x-1 oui-group\"}>\n <CustomInput\n label={\"Qty\"}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-br !oui-rounded-tr\"}\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={\"Total≈\"}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-bl !oui-rounded-tl\"}\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 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 // helperText?: InputProps[\"helperText\"];\n classNames?: InputProps[\"classNames\"];\n readonly?: boolean;\n }\n>((props, ref) => {\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const [placeholder, setPlaceholder] = useState<string>(\"0\");\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={<InputLabel id={props.id}>{props.label}</InputLabel>}\n suffix={props.suffix}\n value={props.readonly ? \"\" : props.value || \"\"}\n // onChange={props.onChange}\n onValueChange={props.onChange}\n onFocus={(event) => {\n setPlaceholder(\"\");\n props.onFocus?.(event);\n }}\n onBlur={(event) => {\n setPlaceholder(\"0\");\n props.onBlur?.(event);\n }}\n formatters={[\n ...(props.formatters ?? []),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n classNames={{\n root: cn(\n \"orderly-order-entry oui-relative oui-pt-8 oui-h-[54px] oui-px-2 oui-py-1 oui-pr-2 oui-border oui-border-solid oui-border-line oui-rounded group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root\n ),\n input: cn(\"oui-mt-5 oui-mb-1 oui-h-5\", props?.classNames?.input),\n prefix: cn(\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36\",\n props.classNames?.prefix\n ),\n suffix: cn(\n \"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-36 oui-text-2xs oui-justify-start oui-py-2\",\n props.classNames?.suffix\n ),\n }}\n readOnly={props.readonly}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (props: PropsWithChildren<{ id: string }>) => {\n return (\n <label\n htmlFor={props.id}\n className={\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36 oui-text-2xs\"\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 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 ? \"Max buy\" : \"Max sell\";\n }, [props.side]);\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 options = [\n { label: \"Limit order\", value: OrderType.LIMIT },\n { label: \"Market order\", value: OrderType.MARKET },\n { label: \"Stop limit\", value: OrderType.STOP_LIMIT },\n { label: \"Stop market\", value: OrderType.STOP_MARKET },\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 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 {item?.label.replace(\" order\", \"\")}\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}) {\n const { canTrade } = props;\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Est. Liq. price</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\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\"}>Account leverage</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 </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 []\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 options = [\n {\n label: BBOType2Label[BBOOrderType.COUNTERPARTY1],\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: BBOType2Label[BBOOrderType.COUNTERPARTY5],\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: BBOType2Label[BBOOrderType.QUEUE1],\n value: BBOOrderType.QUEUE1,\n },\n {\n label: BBOType2Label[BBOOrderType.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","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\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 { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\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: any;\n quote_dp: number | undefined;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\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 TP/SL\n </label>\n <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-text-white/[.36] hover:oui-text-white/80 oui-cursor-pointer\"\n onClick={() => {\n modal.dialog({\n title: \"Tips\",\n size: \"xs\",\n content: (\n <Text intensity={54}>\n Set TP/SL to trigger at a specified price and execute as a\n market order. By default, TP/SL applies to the entire\n position. For partial TP/SL, adjust settings in the open\n positions section.\n </Text>\n ),\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: Record<string, { message: string }> | null;\n quote_dp: number | undefined;\n }\n>((props, ref) => {\n return (\n <div\n ref={ref}\n className={\n \"oui-transition-all oui-pt-2 oui-pb-2 oui-px-[1px] oui-space-y-1\"\n }\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={props.errors ? props.errors[\"tp_trigger_price\"]?.message : \"\"}\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={props.errors ? props.errors[\"sl_trigger_price\"]?.message : \"\"}\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 { 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\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 priceKey =\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\";\n\n useEffect(() => {\n setPrefix(\n !!props.values.trigger_price ? props.type : `${props.type} Price`\n );\n }, [props.values.trigger_price]);\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={() => {\n setPrefix(props.type);\n setPlaceholder(\"\");\n setTipVisible(true);\n }}\n onBlur={() => {\n setPrefix(\n !!props.values.trigger_price ? props.type : `${props.type} Price`\n );\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n }}\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={props.values.trigger_price}\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={props.onChange}\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 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 useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\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={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 { ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, MenuItem } from \"@orderly.network/ui\";\nimport { commify, Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\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 [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\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 value = useMemo(() => {\n // console.log(\"mode\", mode, values);\n return values[mode as keyof PNL_Values];\n }, [values, mode]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\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 formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value,\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\";\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\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {`Est.${mode === PnLMode.PnL ? \"ROI\" : \"PNL\"}:`}\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 { 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 {\n Badge,\n Button,\n Checkbox,\n Divider,\n Flex,\n Grid,\n registerSimpleDialog,\n Text,\n textVariants,\n} from \"@orderly.network/ui\";\nimport { OrderSide, OrderType } from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { BBOType2Label, getBBOType, isBBOOrder } from \"../../utils\";\n\ntype Props = {\n order: OrderlyOrder;\n quoteDP: number;\n baseDP: number;\n\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: Props) => {\n const { baseDP, quoteDP, order, onConfirm, onCancel } = props;\n\n const { side, order_type, order_type_ext, level } = order;\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}>Market</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 return <Text intensity={80}>{BBOType2Label[bboType!]}</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={quoteDP}\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 Buy\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n 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>Qty.</Text>\n <Text.numeral\n rule={\"price\"}\n dp={baseDP}\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>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={quoteDP}\n padding={false}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>Price</Text>\n {renderPrice()}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>Notional</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={quoteDP}\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>TP Price</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n dp={quoteDP}\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>SL Price</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={quoteDP}\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={8} pb={3}>\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 Disable order confirmation\n </label>\n </Flex>\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n Cancel\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n Confirm\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return \"Limit\";\n case OrderType.MARKET:\n return \"Market\";\n case OrderType.STOP_LIMIT:\n return \"Stop Limit\";\n case OrderType.STOP_MARKET:\n return \"Stop Market\";\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<Props, \"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={close}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: \"Order confirm\",\n});\n","import {\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\nexport const BBOType2Label: Record<BBOOrderType, string> = {\n [BBOOrderType.COUNTERPARTY1]: \"Counterparty 1\",\n [BBOOrderType.COUNTERPARTY5]: \"Counterparty 5\",\n [BBOOrderType.QUEUE1]: \"Queue 1\",\n [BBOOrderType.QUEUE5]: \"Queue 5\",\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","import { Checkbox, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { useEffect } from \"react\";\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 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 >\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={\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\"\n }\n >\n Post only\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={\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\"\n }\n >\n 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={\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\"\n }\n >\n 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 Order confirm\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 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 Keep visible\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 {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport {\n useAccount,\n useEventEmitter,\n useLocalStorage,\n useMarginRatio,\n useOrderEntry,\n utils,\n} from \"@orderly.network/hooks\";\nimport { useEffect, useRef, FocusEvent, useMemo, useState } from \"react\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"@orderly.network/react-app\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"./utils\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\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 } = useAppContext();\n const canTrade = useMemo(() => {\n return (\n (accountState.status === AccountStatusEnum.EnableTrading ||\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected) &&\n !wrongNetwork\n );\n }, [accountState.status, wrongNetwork]);\n\n // const [maxLeverage] = useLeverage();\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\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 (symbolInfo.base_tick < 1) return;\n const quantity = utils.formatNumber(\n formattedOrder?.order_quantity,\n new Decimal(symbolInfo?.base_tick || \"0\").toNumber()\n );\n setValue(\"order_quantity\", quantity, {\n shouldUpdateLastChangedField: false,\n });\n };\n\n const onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\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 || type === InputType.TOTAL) {\n formatQty();\n }\n };\n\n useEffect(() => {\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n if (currentFocusInput.current === InputType.TRIGGER_PRICE) {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.STOP_MARKET\n ) {\n setValue(\"trigger_price\", removeTrailingZeros(item[0]));\n focusInputElement(triggerPriceInputRef.current);\n }\n } else {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n } else {\n let newType;\n\n if (formattedOrder.order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", removeTrailingZeros(item[0]));\n focusInputElement(triggerPriceInputRef.current);\n newType = OrderType.STOP_LIMIT;\n } else if (formattedOrder.order_type === OrderType.MARKET) {\n newType = OrderType.LIMIT;\n }\n\n if (typeof newType !== \"undefined\") {\n setValue(\"order_type\", newType);\n }\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n }\n }\n\n function focusInputElement(target: HTMLInputElement | null) {\n setTimeout(() => {\n target?.focus();\n }, 0);\n }\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n }, [formattedOrder, symbolInfo]);\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 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 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 // console.log(\n // \"===\",\n // localBBOType,\n // formattedOrder.order_type,\n // formattedOrder.order_type_ext,\n // formattedOrder.level\n // );\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 element = priceInputContainerRef.current;\n\n if (!element) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (let 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 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 };\n};\n\nexport type uesOrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n","import { OrderEntry } from \"./orderEntry.ui\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./useOrderEntry.script\";\n\nexport const OrderEntryWidget = (\n props: OrderEntryScriptInputs & {\n containerRef?: any;\n }\n) => {\n const state = useOrderEntryScript(props);\n return <OrderEntry {...state} containerRef={props.containerRef} />;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/orderEntry.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/components/orderEntryContext.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/useOrderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["AuthGuard","Box","Button","cn","Divider","Flex","Grid","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","ThrottledButton","toast","forwardRef","useContext","useEffect","useMemo","useState","BBOOrderType","OrderSide","OrderType","React","CaretDownIcon","SimpleDropdownMenu","useRef","Decimal","todpIfNeed","createContext","useLocalStorage","jsx","jsxs","PnlInputContext","usePnlInputContext","PnlInputProvider","props","type","values","mode","setMode","tipsEle","usePNLInputBuilder","quote_dp","tipVisible","setTipVisible","key","value","modes","percentageSuffix","options","dp","endStr","Fragment","PNLInput","onModeChange","onValueChange","quote","tips","onFocus","onBlur","prefix","setPrefix","setPlaceholder","placeholder","id","PNLMenus","item","event","PnlInputWidget","testIds","rest","state","OrderEntryContext","OrderEntryProvider","ExclamationFillIcon","OrderTPSL","tpslFormRef","checked","TPSLInputForm","ref","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","priceKey","Badge","Checkbox","registerSimpleDialog","OrderLevel","BBOType2Label","isBBOOrder","order_type","order_type_ext","isBBO","getOrderTypeByBBO","size","getOrderLevelByBBO","getBBOType","side","level","OrderConfirmDialog","baseDP","quoteDP","order","onConfirm","onCancel","_","setNeedConfirm","renderPrice","bboType","OrderTypeTag","typeStr","Dialog","close","resolve","reject","orderConfirmDialogId","AdditionalInfo","pinned","orderTypeExtra","onTypeToggle","useAdditionalScript","AdditionalInfoWidget","OrderEntry","formattedOrder","setOrderValue","setOrderValues","symbolInfo","maxQty","freeCollateral","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","errors","validated","setErrorMsgVisible","needConfirm","setPinned","hidden","setHidden","buttonLabel","clickHandler","visible","onSubmit","result","error","OrderTypeSelect","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","PinButton","defaultPath","path","setPath","bbo","parseErrorMsg","readOnly","priceSuffix","CustomInput","e","BBOOrderTypeSelect","InputLabel","canTrade","color","maxLabel","option","o","open","setOpen","useAccount","useEventEmitter","useMarginRatio","useOrderEntry","utils","removeTrailingZeros","convertValueToPercentage","AccountStatusEnum","useAppContext","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","localBBOType","setLocalBBOType","lastBBOType","setValue","setValues","tpslSwitch","setTpslSwitch","accountState","wrongNetwork","currentLeverage","ee","currentFocusInput","triggerPriceInputRef","priceInputRef","priceInputContainerRef","priceInputContainerWidth","setPriceInputContainerWidth","currentQtyPercentage","formatQty","quantity","orderBookItemClickHandler","focusInputElement","newType","target","cancelTP_SL","enableTP_SL","setMaxQty","data","onTPSLSwitchChanged","orderType","orderLevel","element","resizeObserver","entries","entry","width","OrderEntryWidget"],"mappings":"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","sourcesContent":["import { type uesOrderEntryScriptReturn } from \"./useOrderEntry.script\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport {\n Box,\n Button,\n cn,\n Divider,\n Flex,\n Grid,\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} from \"@orderly.network/ui\";\nimport {\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 AccountStatusEnum,\n API,\n BBOOrderType,\n OrderLevel,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { InputType } from \"./types\";\nimport { SDKError } from \"@orderly.network/types\";\nimport { ApiError } from \"@orderly.network/types\";\nimport { BBOStatus, BBOType2Label } from \"./utils\";\n\ntype Refs = uesOrderEntryScriptReturn[\"refs\"];\n\nexport const OrderEntry = (\n props: uesOrderEntryScriptReturn & {\n containerRef: any;\n }\n) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n setOrderValues,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n } = props;\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\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 buttonLabel = useMemo(() => {\n return side === OrderSide.BUY ? \"Buy / Long\" : \"Sell / Short\";\n }, [side]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\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 helper\n .validate()\n .then(\n (order: any) => {\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n\n quote: symbolInfo.quote,\n base: symbolInfo.base,\n\n quoteDP: symbolInfo.quote_dp,\n baseDP: symbolInfo.base_dp,\n });\n }\n\n return true;\n },\n (errors) => {\n setErrorMsgVisible(true);\n\n if (typeof errors === \"object\") {\n if (\n errors.total != null ||\n errors.order_quantity != null ||\n errors.order_price != null ||\n errors.trigger_price != null\n )\n return Promise.reject();\n }\n }\n )\n .then(() => {\n return submit().then((result: any) => {\n console.log(result);\n if (result.success) {\n // setOrderValue(\"order_quantity\", \"\");\n } else {\n toast.error(result.message);\n }\n });\n })\n .catch((error) => {\n console.log(\"catch:\", error);\n if (error === \"cancel\") return;\n if (typeof error === \"object\" && error.message)\n toast.error(error.message);\n // toast.error(`Error:${error.message}`);\n\n // if (error instanceof ApiError) {\n // toast.error(error.message);\n // }\n });\n };\n\n return (\n <OrderEntryProvider\n value={{\n errorMsgVisible,\n }}\n >\n <div\n className={\"oui-space-y-2 xl:oui-space-y-3 oui-text-base-contrast-54\"}\n ref={props.containerRef}\n >\n {/* Buy Sell button */}\n <Flex gapX={2} className=\"oui-flex-col lg:oui-flex-row oui-gap-y-3\">\n <div\n className={\n \"oui-grid oui-grid-cols-2 oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\"\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 hover:oui-bg-base-6 active:oui-bg-base-6 oui-text-base-contrast-36\"\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n 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 hover:oui-bg-base-6 active:oui-bg-base-6 oui-text-base-contrast-36\"\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n Sell\n </Button>\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 justify={\"between\"}>\n <Text size={\"2xs\"}>Available</Text>\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 {/* Inputs (price,quantity,triggerPrice) */}\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 errors={validated ? errors : null}\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 />\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 <AuthGuard buttonProps={{ fullWidth: true }}>\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 >\n {buttonLabel}\n </ThrottledButton>\n </AuthGuard>\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 />\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-[0px] 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 Reduce only\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-absolute oui-top-2 oui-right-2 oui-group\"}\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 errors: any;\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 uesOrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n}) => {\n const { type, symbolInfo, errors, values, onFocus, onBlur, bbo } = props;\n\n const parseErrorMsg = (key: string) => {\n if (errors && errors[key]) {\n return errors[key].message;\n }\n return \"\";\n };\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 width={48}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-border oui-cursor-pointer oui-mt-[2px] oui-select-none\",\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: \"Tips\",\n size: \"xs\",\n content: (\n <Text intensity={54}>\n BBO is not supported when TP/SL, Post-Only, IOC, or FOK is\n selected.\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 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={\"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-relative oui-group oui-w-full\"\n >\n <CustomInput\n label={\"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-left-0 oui-bottom-1\")}>\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-space-x-1 oui-group\"}>\n <CustomInput\n label={\"Qty\"}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-br !oui-rounded-tr\"}\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={\"Total≈\"}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-bl !oui-rounded-tl\"}\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 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 // helperText?: InputProps[\"helperText\"];\n classNames?: InputProps[\"classNames\"];\n readonly?: boolean;\n }\n>((props, ref) => {\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const [placeholder, setPlaceholder] = useState<string>(\"0\");\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={<InputLabel id={props.id}>{props.label}</InputLabel>}\n suffix={props.suffix}\n value={props.readonly ? \"\" : props.value || \"\"}\n // onChange={props.onChange}\n onValueChange={props.onChange}\n onFocus={(event) => {\n setPlaceholder(\"\");\n props.onFocus?.(event);\n }}\n onBlur={(event) => {\n setPlaceholder(\"0\");\n props.onBlur?.(event);\n }}\n formatters={[\n ...(props.formatters ?? []),\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n inputFormatter.decimalPointFormatter,\n ]}\n classNames={{\n root: cn(\n \"orderly-order-entry oui-relative oui-pt-8 oui-h-[54px] oui-px-2 oui-py-1 oui-pr-2 oui-border oui-border-solid oui-border-line oui-rounded group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root\n ),\n input: cn(\"oui-mt-5 oui-mb-1 oui-h-5\", props?.classNames?.input),\n prefix: cn(\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36\",\n props.classNames?.prefix\n ),\n suffix: cn(\n \"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-36 oui-text-2xs oui-justify-start oui-py-2\",\n props.classNames?.suffix\n ),\n }}\n readOnly={props.readonly}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (props: PropsWithChildren<{ id: string }>) => {\n return (\n <label\n htmlFor={props.id}\n className={\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36 oui-text-2xs\"\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 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 ? \"Max buy\" : \"Max sell\";\n }, [props.side]);\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 options = [\n { label: \"Limit order\", value: OrderType.LIMIT },\n { label: \"Market order\", value: OrderType.MARKET },\n { label: \"Stop limit\", value: OrderType.STOP_LIMIT },\n { label: \"Stop market\", value: OrderType.STOP_MARKET },\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 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 {item?.label.replace(\" order\", \"\")}\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}) {\n const { canTrade } = props;\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Est. Liq. price</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\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\"}>Account leverage</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 </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 []\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 options = [\n {\n label: BBOType2Label[BBOOrderType.COUNTERPARTY1],\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: BBOType2Label[BBOOrderType.COUNTERPARTY5],\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: BBOType2Label[BBOOrderType.QUEUE1],\n value: BBOOrderType.QUEUE1,\n },\n {\n label: BBOType2Label[BBOOrderType.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","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\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 { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\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: any;\n quote_dp: number | undefined;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\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 TP/SL\n </label>\n <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-text-white/[.36] hover:oui-text-white/80 oui-cursor-pointer\"\n onClick={() => {\n modal.dialog({\n title: \"Tips\",\n size: \"xs\",\n content: (\n <Text intensity={54}>\n TP/SL triggers at the specified mark price and executes as a\n market order. By default, it applies to the entire position.\n Adjust settings in open positions for partial TP/SL.\n </Text>\n ),\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: Record<string, { message: string }> | null;\n quote_dp: number | undefined;\n }\n>((props, ref) => {\n return (\n <div\n ref={ref}\n className={\n \"oui-transition-all oui-pt-2 oui-pb-2 oui-px-[1px] oui-space-y-1\"\n }\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={props.errors ? props.errors[\"tp_trigger_price\"]?.message : \"\"}\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={props.errors ? props.errors[\"sl_trigger_price\"]?.message : \"\"}\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 { 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\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 priceKey =\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\";\n\n useEffect(() => {\n setPrefix(\n !!props.values.trigger_price ? props.type : `${props.type} Price`\n );\n }, [props.values.trigger_price]);\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={() => {\n setPrefix(props.type);\n setPlaceholder(\"\");\n setTipVisible(true);\n }}\n onBlur={() => {\n setPrefix(\n !!props.values.trigger_price ? props.type : `${props.type} Price`\n );\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n }}\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={props.values.trigger_price}\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={props.onChange}\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 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 useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\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={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 { ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, MenuItem } from \"@orderly.network/ui\";\nimport { commify, Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\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 [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\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 value = useMemo(() => {\n // console.log(\"mode\", mode, values);\n return values[mode as keyof PNL_Values];\n }, [values, mode]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\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 formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value,\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\";\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\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {`Est.${mode === PnLMode.PnL ? \"ROI\" : \"PNL\"}:`}\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 { 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 {\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 { OrderSide, OrderType } from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { BBOType2Label, getBBOType, isBBOOrder } from \"../../utils\";\n\ntype Props = {\n order: OrderlyOrder;\n quoteDP: number;\n baseDP: number;\n\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: Props) => {\n const { baseDP, quoteDP, order, onConfirm, onCancel } = props;\n\n const { side, order_type, order_type_ext, level } = order;\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}>Market</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 return <Text intensity={80}>{BBOType2Label[bboType!]}</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={quoteDP}\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 Buy\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n 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>Qty.</Text>\n <Text.numeral\n rule={\"price\"}\n dp={baseDP}\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>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={quoteDP}\n padding={false}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>Price</Text>\n {renderPrice()}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>Notional</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={quoteDP}\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>TP Price (Mark)</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n dp={quoteDP}\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>SL Price (Mark)</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={quoteDP}\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 Disable order confirmation\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 TP/SL triggers at the specified mark price and executes as a market\n order.\n </Text>\n </Box>\n ) : null}\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n Cancel\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n Confirm\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return \"Limit\";\n case OrderType.MARKET:\n return \"Market\";\n case OrderType.STOP_LIMIT:\n return \"Stop Limit\";\n case OrderType.STOP_MARKET:\n return \"Stop Market\";\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<Props, \"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={close}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: \"Order confirm\",\n});\n","import {\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\nexport const BBOType2Label: Record<BBOOrderType, string> = {\n [BBOOrderType.COUNTERPARTY1]: \"Counterparty 1\",\n [BBOOrderType.COUNTERPARTY5]: \"Counterparty 5\",\n [BBOOrderType.QUEUE1]: \"Queue 1\",\n [BBOOrderType.QUEUE5]: \"Queue 5\",\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","import { Checkbox, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { useEffect } from \"react\";\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 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 >\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={\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\"\n }\n >\n Post only\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={\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\"\n }\n >\n 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={\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\"\n }\n >\n 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 Order confirm\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 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 Keep visible\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 {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport {\n useAccount,\n useEventEmitter,\n useLocalStorage,\n useMarginRatio,\n useOrderEntry,\n utils,\n} from \"@orderly.network/hooks\";\nimport { useEffect, useRef, FocusEvent, useMemo, useState } from \"react\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"@orderly.network/react-app\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"./utils\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\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 } = useAppContext();\n const canTrade = useMemo(() => {\n return (\n (accountState.status === AccountStatusEnum.EnableTrading ||\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected) &&\n !wrongNetwork\n );\n }, [accountState.status, wrongNetwork]);\n\n // const [maxLeverage] = useLeverage();\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\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 (symbolInfo.base_tick < 1) return;\n const quantity = utils.formatNumber(\n formattedOrder?.order_quantity,\n new Decimal(symbolInfo?.base_tick || \"0\").toNumber()\n );\n setValue(\"order_quantity\", quantity, {\n shouldUpdateLastChangedField: false,\n });\n };\n\n const onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\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 useEffect(() => {\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n if (currentFocusInput.current === InputType.TRIGGER_PRICE) {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.STOP_MARKET\n ) {\n setValue(\"trigger_price\", removeTrailingZeros(item[0]));\n focusInputElement(triggerPriceInputRef.current);\n }\n } else {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n } else {\n let newType;\n\n if (formattedOrder.order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", removeTrailingZeros(item[0]));\n focusInputElement(triggerPriceInputRef.current);\n newType = OrderType.STOP_LIMIT;\n } else if (formattedOrder.order_type === OrderType.MARKET) {\n newType = OrderType.LIMIT;\n }\n\n if (typeof newType !== \"undefined\") {\n setValue(\"order_type\", newType);\n }\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n }\n }\n\n function focusInputElement(target: HTMLInputElement | null) {\n setTimeout(() => {\n target?.focus();\n }, 0);\n }\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n }, [formattedOrder, symbolInfo]);\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 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 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 // console.log(\n // \"===\",\n // localBBOType,\n // formattedOrder.order_type,\n // formattedOrder.order_type_ext,\n // formattedOrder.level\n // );\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 element = priceInputContainerRef.current;\n\n if (!element) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (let 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 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 };\n};\n\nexport type uesOrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n","import { OrderEntry } from \"./orderEntry.ui\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./useOrderEntry.script\";\n\nexport const OrderEntryWidget = (\n props: OrderEntryScriptInputs & {\n containerRef?: any;\n }\n) => {\n const state = useOrderEntryScript(props);\n return <OrderEntry {...state} containerRef={props.containerRef} />;\n};\n"]}
|