@orderly.network/ui-order-entry 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -6
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +10 -10
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/orderEntry.ui.tsx","../src/components/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/orderEntryContext.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/orderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["forwardRef","useContext","useEffect","useMemo","useState","useLeverage","useLocalStorage","useTranslation","useOrderEntryFormErrorMsg","BBOOrderType","OrderSide","OrderType","Box","Button","CaretRightIcon","cn","Divider","Flex","Grid","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","ThrottledButton","toast","useScreen","LeverageWidgetWithSheetId","commifyOptional","Checkbox","Fragment","jsx","jsxs","AdditionalInfo","props","pinned","orderTypeExtra","t","onTypeToggle","type","checked","useAdditionalScript","AdditionalInfoWidget","state","Badge","registerSimpleDialog","OrderLevel","isBBOOrder","options","order_type","order_type_ext","isBBO","getOrderTypeByBBO","value","size","getOrderLevelByBBO","getBBOType","side","level","i18n","OrderConfirmDialog","baseDP","quoteDP","order","onConfirm","onCancel","_","setNeedConfirm","renderPrice","bboType","label","OrderTypeTag","typeStr","Dialog","close","resolve","reject","rest","orderConfirmDialogId","createContext","OrderEntryContext","OrderEntryProvider","React","ExclamationFillIcon","CaretDownIcon","SimpleDropdownMenu","useRef","Decimal","todpIfNeed","PnlInputContext","usePnlInputContext","PnlInputProvider","values","mode","setMode","tipsEle","usePNLInputBuilder","quote_dp","tipVisible","setTipVisible","isFocused","setIsFocused","key","innerValue","setInnerValue","modes","modeLabelMap","percentageSuffix","dp","endStr","PNLInput","onModeChange","onValueChange","quote","tips","onFocus","onBlur","prefix","setPrefix","placeholder","setPlaceholder","id","PNLMenus","item","event","PnlInputWidget","testIds","OrderTPSL","tpslFormRef","TPSLInputForm","ref","parseErrorMsg","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","getPrefixLabel","trigger_price","_prefix","priceKey","OrderEntry","formattedOrder","setOrderValue","symbolInfo","maxQty","freeCollateral","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","curLeverage","isMobile","errors","validated","setErrorMsgVisible","needConfirm","setPinned","hidden","setHidden","buttonLabel","clickHandler","visible","onSubmit","result","error","mergedShowSheet","OrderTypeSelect","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","PinButton","defaultPath","path","setPath","bbo","readOnly","priceSuffix","CustomInput","e","BBOOrderTypeSelect","InputLabel","canTrade","color","maxLabel","option","o","displayLabel","open","setOpen","useAccount","useEventEmitter","useMarginRatio","useOrderEntry","utils","useAppContext","AccountStatusEnum","convertValueToPercentage","removeTrailingZeros","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","localBBOType","setLocalBBOType","lastBBOType","setValue","setValues","tpslSwitch","setTpslSwitch","accountState","wrongNetwork","disabledConnect","currentLeverage","ee","currentFocusInput","triggerPriceInputRef","priceInputRef","priceInputContainerRef","priceInputContainerWidth","setPriceInputContainerWidth","currentQtyPercentage","formatQty","quantity","cancelTP_SL","enableTP_SL","setMaxQty","data","onTPSLSwitchChanged","orderType","orderLevel","updateOrderPrice","price","focusInputElement","target","orderBookItemClickHandler","element","resizeObserver","entries","entry","width","OrderEntryWidget"],"mappings":"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","sourcesContent":["import React, {\n CSSProperties,\n FocusEventHandler,\n forwardRef,\n HTMLAttributes,\n PropsWithChildren,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n OrderValidationResult,\n useLeverage,\n useLocalStorage,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n API,\n BBOOrderType,\n OrderLevel,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport {\n Box,\n Button,\n CaretRightIcon,\n cn,\n Divider,\n Flex,\n Grid,\n 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 useScreen,\n} from \"@orderly.network/ui\";\nimport { LeverageWidgetWithSheetId } from \"@orderly.network/ui-leverage\";\nimport { commifyOptional } from \"@orderly.network/utils\";\n// import { useBalanceScript } from \"../../trading/src/components/mobile/bottomNavBar/balance\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { type OrderEntryScriptReturn } from \"./orderEntry.script\";\nimport { InputType } from \"./types\";\nimport { BBOStatus } from \"./utils\";\n\ntype Refs = OrderEntryScriptReturn[\"refs\"];\n\ntype OrderEntryProps = OrderEntryScriptReturn & {\n containerRef: any;\n};\n\nexport const OrderEntry: React.FC<OrderEntryProps> = (props) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n } = props;\n\n const { curLeverage } = useLeverage();\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n 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\n ? t(\"orderEntry.buyLong\")\n : t(\"orderEntry.sellShort\");\n }, [side, t]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n 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 () => {\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 )\n .then(() => {\n return submit({ resetOnSuccess: false }).then((result: any) => {\n if (result.success) {\n // setOrderValue(\"order_quantity\", \"\");\n } else {\n toast.error(result.message);\n }\n });\n })\n .catch((error) => {\n if (error === \"cancel\") {\n return;\n }\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 const mergedShowSheet = isMobile && props.canTrade;\n\n return (\n <OrderEntryProvider value={{ errorMsgVisible }}>\n <div\n className={\"oui-space-y-2 oui-text-base-contrast-54 xl:oui-space-y-3\"}\n ref={props.containerRef}\n >\n {/* Buy Sell button */}\n <Flex gapX={2} className=\"oui-flex-col oui-gap-y-3 lg:oui-flex-row\">\n <div\n className={cn(\n \"oui-grid oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n mergedShowSheet ? \"oui-grid-cols-3\" : \"oui-grid-cols-2\",\n )}\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n data-type={OrderSide.BUY}\n // color={side === OrderSide.BUY ? \"buy\" : \"secondary\"}\n className={cn(\n side === OrderSide.BUY && props.canTrade\n ? \"oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n {t(\"common.buy\")}\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n data-type={OrderSide.SELL}\n fullWidth\n size={\"md\"}\n // color={side === OrderSide.SELL ? \"sell\" : \"secondary\"}\n className={cn(\n side === OrderSide.SELL && props.canTrade\n ? \"oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n {t(\"common.sell\")}\n </Button>\n {mergedShowSheet && (\n <Button\n size={\"md\"}\n fullWidth\n trailing={\n <CaretRightIcon\n size={12}\n className=\"oui-text-base-contrast-36\"\n />\n }\n onClick={() => {\n modal.show(LeverageWidgetWithSheetId, {\n currentLeverage: curLeverage,\n });\n }}\n className={cn(\n \"oui-bg-base-7 oui-text-primary-light hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n >\n {commifyOptional(curLeverage, { fix: 2 }) + \"x\"}\n </Button>\n )}\n </div>\n <div className={\"oui-w-full lg:oui-flex-1\"}>\n <OrderTypeSelect\n type={formattedOrder.order_type!}\n side={side}\n canTrade={props.canTrade}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n </Flex>\n {/* Available */}\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"common.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 <ThrottledButton\n fullWidth\n id={\"order-entry-submit-button\"}\n // color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY\n ? \"orderly-order-entry-submit-button-buy oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"orderly-order-entry-submit-button-sell oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\",\n )}\n onClick={() => {\n onSubmit();\n }}\n loading={props.isMutating}\n disabled={!props.canTrade}\n >\n {buttonLabel}\n </ThrottledButton>\n {/* Asset info */}\n <AssetInfo\n canTrade={props.canTrade}\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n />\n <Divider className=\"oui-w-full\" />\n {/* TP SL switch and content */}\n <OrderTPSL\n // onCancelTPSL={props.cancelTP_SL}\n // onEnableTP_SL={props.enableTP_SL}\n quote_dp={props.symbolInfo.quote_dp}\n switchState={props.tpslSwitch}\n onSwitchChanged={props.setTpslSwitch}\n orderType={formattedOrder.order_type!}\n errors={validated ? errors : null}\n isReduceOnly={formattedOrder.reduce_only}\n values={{\n tp: {\n trigger_price: formattedOrder.tp_trigger_price ?? \"\",\n PnL: formattedOrder.tp_pnl ?? \"\",\n Offset: formattedOrder.tp_offset ?? \"\",\n \"Offset%\": formattedOrder.tp_offset_percentage ?? \"\",\n ROI: formattedOrder.tp_ROI ?? \"\",\n },\n sl: {\n trigger_price: formattedOrder.sl_trigger_price ?? \"\",\n PnL: formattedOrder.sl_pnl ?? \"\",\n Offset: formattedOrder.sl_offset ?? \"\",\n \"Offset%\": formattedOrder.sl_offset_percentage ?? \"\",\n ROI: formattedOrder.sl_ROI ?? \"\",\n },\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n />\n {/* reduce only switch and label */}\n <Flex\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"!oui-mt-0 xl:!oui-mt-3\"\n >\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n data-testid=\"oui-testid-orderEntry-reduceOnly-switch\"\n className=\"oui-h-[14px]\"\n id={\"reduceOnly\"}\n checked={props.formattedOrder.reduce_only}\n onCheckedChange={(checked) => {\n props.setOrderValue(\"reduce_only\", checked);\n // if (checked) {\n // props.setOrderValue(\"order_type_ext\", \"\");\n // }\n }}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n {t(\"orderEntry.reduceOnly\")}\n </label>\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {!pinned && (\n <AdditionalConfigButton\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n )}\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {pinned && (\n <Box p={2} r={\"md\"} intensity={700} position={\"relative\"}>\n <AdditionalInfoWidget\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n <PinButton\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-group oui-absolute oui-right-2 oui-top-2\"}\n data-testid=\"oui-testid-orderEntry-pinned-button\"\n ></PinButton>\n </Box>\n )}\n </div>\n </OrderEntryProvider>\n );\n};\n\n//------------------- pin button start -------------------\nconst defaultPath =\n \"M10.007 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.852-2.523 1.233.361 1.95.015 2.961-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103 5.35 5.35 0 0 0-2.104-1.312c-.448-.15-.808-.208-1.042-.208\";\n\nconst PinButton = (props: HTMLAttributes<HTMLButtonElement>) => {\n const [path, setPath] = useState(defaultPath);\n return (\n <button {...props}>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onMouseEnter={() => {\n setPath(\n 'M10.008 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.853-2.523 1.232.361 1.95.015 2.96-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103A5.35 5.35 0 0 0 11.05 1.51c-.448-.15-.808-.208-1.042-.208m.258 1.37c.708.131 1.421.6 1.93 1.107.507.508.94 1.13 1.119 1.945-.636.61-1.026.658-1.662.323a.67.67 0 0 0-.779.117c-1.214 1.213-1.533 2.314-1.533 3.8 0 1.292-.076 1.773-.48 2.206-.113.123-.27.104-.374 0L3.799 7.486a.24.24 0 0 1-.017-.34c.239-.29.769-.515 2.226-.514 1.742.001 2.668-.448 3.812-1.52a.67.67 0 0 0 .125-.77c-.343-.686-.29-1.047.321-1.67\"',\n );\n }}\n onMouseLeave={() => {\n setPath(defaultPath);\n }}\n className=\"oui-text-primary-darken \"\n >\n <path d={path} />\n </svg>\n </button>\n );\n};\n\n//----------------- Order Quantity Input Component start -----------------\nconst OrderQuantityInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n errors: OrderValidationResult | null;\n values: {\n quantity?: string;\n price?: string;\n trigger_price?: string;\n total?: string;\n side?: OrderSide;\n level?: OrderLevel;\n order_type_ext?: OrderType;\n };\n onChange: (\n key:\n | \"order_quantity\"\n | \"order_price\"\n | \"trigger_price\"\n | \"total\"\n | \"order_type\"\n | \"order_type_ext\"\n | \"level\",\n value: any,\n ) => void;\n onValuesChange: (value: any) => void;\n refs: Refs;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n}) => {\n const { type, symbolInfo, errors, values, onFocus, onBlur, bbo } = props;\n const { t } = useTranslation();\n\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(errors);\n\n const readOnly = bbo.bboStatus === BBOStatus.ON;\n\n const priceSuffix =\n type === OrderType.LIMIT ? (\n <Flex direction=\"column\" itemAlign=\"end\" className=\"oui-text-2xs\">\n {symbolInfo.quote}\n <Flex\n height={20}\n px={3}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-mt-[2px] oui-cursor-pointer oui-select-none oui-border\",\n bbo.bboStatus === BBOStatus.ON\n ? \"oui-border-primary\"\n : \"oui-border-line-12\",\n bbo.bboStatus === BBOStatus.DISABLED && \"oui-cursor-not-allowed\",\n )}\n onClick={() => {\n if (bbo.bboStatus === BBOStatus.DISABLED) {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>\n {t(\"orderEntry.bbo.disabled.tips\")}\n </Text>\n ),\n });\n } else {\n bbo.toggleBBO();\n }\n }}\n >\n <Text\n className={cn(\n bbo.bboStatus === BBOStatus.ON && \"oui-text-primary\",\n bbo.bboStatus === BBOStatus.OFF && \"oui-text-base-contrast-54\",\n bbo.bboStatus === BBOStatus.DISABLED &&\n \"oui-text-base-contrast-20\",\n )}\n >\n {t(\"orderEntry.bbo\")}\n </Text>\n </Flex>\n </Flex>\n ) : (\n symbolInfo.quote\n );\n\n return (\n <div className={\"oui-space-y-1\"}>\n {type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET ? (\n <div className={\"oui-group\"}>\n <CustomInput\n label={t(\"common.trigger\")}\n suffix={symbolInfo.quote}\n error={parseErrorMsg(\"trigger_price\")}\n id={\"trigger\"}\n ref={props.refs.triggerPriceInputRef}\n value={values.trigger_price}\n onChange={(e) => {\n props.onChange(\"trigger_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.TRIGGER_PRICE)}\n onBlur={onBlur(InputType.TRIGGER_PRICE)}\n />\n </div>\n ) : null}\n\n {type === OrderType.LIMIT || type === OrderType.STOP_LIMIT ? (\n <div\n ref={props.refs.priceInputContainerRef}\n className=\"oui-group oui-relative oui-w-full\"\n >\n <CustomInput\n label={t(\"common.price\")}\n suffix={priceSuffix}\n id={\"price\"}\n value={values.price}\n error={parseErrorMsg(\"order_price\")}\n ref={props.refs.priceInputRef}\n // helperText=\"Price per unit\"\n onChange={(e) => {\n props.onChange(\"order_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n readonly={readOnly}\n classNames={{\n root: cn(readOnly && \"focus-within:oui-outline-transparent \"),\n input: cn(readOnly && \"oui-cursor-auto\"),\n }}\n />\n {bbo.bboStatus === BBOStatus.ON && (\n <div className={cn(\"oui-absolute oui-bottom-1 oui-left-0\")}>\n <BBOOrderTypeSelect\n value={bbo.bboType}\n onChange={bbo.onBBOChange}\n contentStyle={{\n width: props.priceInputContainerWidth,\n }}\n />\n </div>\n )}\n </div>\n ) : null}\n\n <Grid cols={2} className={\"oui-group oui-space-x-1\"}>\n <CustomInput\n label={t(\"common.qty\")}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-r\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={`${t(\"common.total\")}≈`}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-l\"}\n value={values.total}\n error={parseErrorMsg(\"total\")}\n onChange={(e) => {\n props.onChange(\"total\", e);\n }}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n />\n </Grid>\n </div>\n );\n};\n\n// ----------- Custom Input Component start ------------\nconst CustomInput = forwardRef<\n HTMLInputElement,\n {\n label: string;\n suffix: ReactNode;\n 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-h-[54px] oui-rounded oui-border oui-border-solid oui-border-line oui-px-2 oui-py-1 group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root,\n ),\n input: cn(\"oui-mb-1 oui-mt-5 oui-h-5\", props?.classNames?.input),\n prefix: cn(\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-justify-start oui-py-2 oui-text-2xs oui-text-base-contrast-36\",\n props.classNames?.suffix,\n ),\n }}\n readOnly={props.readonly}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (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-2xs oui-text-base-contrast-36\"\n }\n >\n {props.children}\n </label>\n );\n};\n\n// ----------- Custom Input Component end ------------\n\nconst QuantitySlider = (props: {\n canTrade: boolean;\n side: OrderSide;\n value: number;\n maxQty: number;\n currentQtyPercentage: number;\n tick: number;\n dp: number;\n setMaxQty: () => void;\n onValueChange: (value: number) => void;\n}) => {\n const { canTrade } = props;\n const { t } = useTranslation();\n\n const color = useMemo(\n () =>\n canTrade ? (props.side === OrderSide.BUY ? \"buy\" : \"sell\") : undefined,\n [props.side, canTrade],\n );\n\n const maxLabel = useMemo(() => {\n return props.side === OrderSide.BUY\n ? t(\"orderEntry.maxBuy\")\n : t(\"orderEntry.maxSell\");\n }, [props.side, t]);\n\n return (\n <div>\n <Slider.single\n disabled={props.maxQty === 0 || !canTrade}\n value={props.value}\n color={color}\n markCount={4}\n showTip\n max={props.maxQty}\n step={props.tick}\n onValueChange={props.onValueChange}\n />\n <Flex justify={\"between\"} className=\"oui-pt-1 xl:oui-pt-2\">\n <Text.numeral\n rule={\"percentages\"}\n size={\"2xs\"}\n color={color}\n dp={2}\n padding={false}\n >\n {canTrade ? props.currentQtyPercentage : 0}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={() => props.setMaxQty()}\n data-testid=\"oui-testid-orderEntry-maxQty-value-button\"\n >\n {maxLabel}\n </button>\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={props.dp}\n padding={false}\n data-testid=\"oui-testid-orderEntry-maxQty-value\"\n >\n {canTrade ? props.maxQty : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n </div>\n );\n};\n\n// -----------Order type Select Component start ------------\n\nconst OrderTypeSelect = (props: {\n type: OrderType;\n onChange: (type: OrderType) => void;\n side: OrderSide;\n canTrade: boolean;\n}) => {\n const { t } = useTranslation();\n\n const options = [\n { label: t(\"orderEntry.orderType.limitOrder\"), value: OrderType.LIMIT },\n { label: t(\"orderEntry.orderType.marketOrder\"), value: OrderType.MARKET },\n { label: t(\"orderEntry.orderType.stopLimit\"), value: OrderType.STOP_LIMIT },\n {\n label: t(\"orderEntry.orderType.stopMarket\"),\n value: OrderType.STOP_MARKET,\n },\n ];\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-orderType-button\"\n currentValue={props.type}\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"xs\"}>{option.placeholder}</Text>;\n }\n\n const displayLabel = {\n [OrderType.LIMIT]: t(\"orderEntry.orderType.limit\"),\n [OrderType.MARKET]: t(\"common.marketPrice\"),\n [OrderType.STOP_LIMIT]: t(\"orderEntry.orderType.stopLimit\"),\n [OrderType.STOP_MARKET]: t(\"orderEntry.orderType.stopMarket\"),\n }[value];\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 {displayLabel}\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 const { t } = useTranslation();\n\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"orderEntry.estLiqPrice\")}</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {canTrade ? (props.estLiqPrice ?? \"--\") : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"leverage.accountLeverage\")}</Text>\n <Flex\n gapX={1}\n className={textVariants({\n size: \"2xs\",\n intensity: 80,\n })}\n >\n <Text.numeral unit={canTrade ? \"x\" : undefined}>\n {canTrade ? (props.currentLeverage ?? \"--\") : \"--\"}\n </Text.numeral>\n {props.estLeverage && (\n <>\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.505 4.997c0-.23.186-.416.416-.416H6.07L4.833 3.332l.586-.585 1.964 1.95a.42.42 0 0 1 .122.3.42.42 0 0 1-.122.3l-1.964 1.95-.586-.585L6.07 5.413H2.921a.416.416 0 0 1-.416-.416\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n\n <span>{`${props.estLeverage}x`}</span>\n </>\n )}\n </Flex>\n {/* <Text.numeral unit={\"x\"} size={\"2xs\"}>\n {props.estLeverage ?? \"--\"}\n </Text.numeral> */}\n </Flex>\n </div>\n );\n}\n\nfunction AdditionalConfigButton(props: {\n pinned: boolean;\n setPinned: (pinned: boolean) => void;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n orderTypeExtra?: OrderType;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n showExtra: boolean;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n data-testid=\"oui-testid-orderEntry-additional-button\"\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white/[.36] hover:oui-fill-white/80\"\n >\n <path\n d=\"M3.332 2.665a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667z\"\n // fill=\"#fff\"\n // fillOpacity={open ? 0.8 : 0.36}\n />\n </svg>\n </button>\n </PopoverTrigger>\n <PopoverContent side={\"top\"} align={\"end\"} className={\"oui-w-[230px]\"}>\n <AdditionalInfoWidget {...props} />\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\n// -----------BBO Select Component start ------------\n\nconst BBOOrderTypeSelect = (props: {\n value?: BBOOrderType;\n onChange: (value: BBOOrderType) => void;\n contentStyle?: CSSProperties;\n}) => {\n const { t } = useTranslation();\n\n const options = [\n {\n label: t(\"orderEntry.bbo.counterparty1\"),\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: t(\"orderEntry.bbo.counterparty5\"),\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: t(\"orderEntry.bbo.queue1\"),\n value: BBOOrderType.QUEUE1,\n },\n {\n label: t(\"orderEntry.bbo.queue5\"),\n value: BBOOrderType.QUEUE5,\n },\n ];\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-bbo-orderType-button\"\n currentValue={props.value}\n value={props.value}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n style: props.contentStyle,\n }}\n size={\"sm\"}\n classNames={{\n trigger: \"oui-border-none oui-bg-transparent\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((item) => item.value === value);\n\n return (\n <Box>\n <Text size=\"sm\">{item?.label}</Text>\n </Box>\n );\n }}\n />\n );\n};\n\n// -----------BBO type Select Component end ------------\n","import { Checkbox, cn, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type AdditionalInfoProps = {\n pinned: boolean;\n setPinned: (value: boolean) => void;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n orderTypeExtra?: OrderType;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n showExtra?: boolean;\n hidden: boolean;\n setHidden: (value: boolean) => void;\n};\n\nexport const AdditionalInfo = (props: AdditionalInfoProps) => {\n const { pinned, orderTypeExtra } = props;\n const { t } = useTranslation();\n\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\"\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n\n useEffect(() => {\n props.onValueChange?.(\"visible_quantity\", props.hidden ? 0 : 1);\n }, [props.hidden]);\n\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n {/* {props.showExtra && (\n\n )} */}\n <Flex\n // gapX={3}\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n className=\"oui-gap-x-2 md:oui-gap-x-3\"\n wrap=\"wrap\"\n gapY={1}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-postOnly-checkBox\"\n id={\"toggle_order_post_only\"}\n className=\"oui-peer\"\n color={\"white\"}\n variant={\"radio\"}\n disabled={!props.showExtra}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.postOnly\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-ioc-checkBox\"\n id={\"toggle_order_iov\"}\n color={\"white\"}\n className=\"oui-peer\"\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.ioc\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-fox-checkBox\"\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n className=\"oui-peer\"\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.fok\")}\n </label>\n </Flex>\n </Flex>\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-orderConfirm-checkBox\"\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.orderConfirm\")}\n </label>\n </Flex>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-hidden-checkBox\"\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n checked={props.hidden}\n onCheckedChange={(checked: boolean) => {\n props.setHidden(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.hidden\")}\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n data-testid=\"oui-testid-orderEntry-additional-keepVisible-switch\"\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.keepVisible\")}\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","export const useAdditionalScript = () => {\n // const [needConfirm, setNeedConfirm] = useLocalStorage(\n // \"orderly_order_confirm\",\n // true\n // );\n\n return {\n // needConfirm,\n // setNeedConfirm,\n };\n};\n","import { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo.ui\";\nimport { useAdditionalScript } from \"./additional.script\";\n\nexport const AdditionalInfoWidget = (props: AdditionalInfoProps) => {\n const state = useAdditionalScript();\n return <AdditionalInfo {...state} {...props} />;\n};\n","import {\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 { BBOOrderType, OrderSide, OrderType } from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { getBBOType, isBBOOrder } from \"../../utils\";\nimport { i18n, useTranslation } from \"@orderly.network/i18n\";\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 const { side, order_type, order_type_ext, level } = order;\n const { t } = useTranslation();\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const renderPrice = () => {\n if (\n order_type === OrderType.MARKET ||\n order_type === OrderType.STOP_MARKET\n ) {\n return <Text intensity={80}>{t(\"common.marketPrice\")}</Text>;\n }\n\n if (isBBOOrder({ order_type, order_type_ext })) {\n const bboType = getBBOType({\n type: order_type_ext!,\n side,\n level,\n });\n const label = {\n [BBOOrderType.COUNTERPARTY1]: t(\"orderEntry.bbo.counterparty1\"),\n [BBOOrderType.COUNTERPARTY5]: t(\"orderEntry.bbo.counterparty5\"),\n [BBOOrderType.QUEUE1]: t(\"orderEntry.bbo.queue1\"),\n [BBOOrderType.QUEUE5]: t(\"orderEntry.bbo.queue5\"),\n }[bboType!];\n\n return <Text intensity={80}>{label}</Text>;\n }\n\n return (\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={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 {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n {t(\"common.sell\")}\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n <Flex justify={\"between\"}>\n <Text>{t(\"common.qty\")}</Text>\n <Text.numeral\n rule={\"price\"}\n dp={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>{t(\"common.trigger\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quoteDP}\n padding={false}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>{t(\"common.price\")}</Text>\n {renderPrice()}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={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>{t(\"orderEntry.tpMarkPrice\")}</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>{t(\"orderEntry.slMarkPrice\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={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 {t(\"orderEntry.disableOrderConfirm\")}\n </label>\n </Flex>\n\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <Box py={3} px={3} className=\"oui-text-center\">\n <Text color=\"warning\" size=\"xs\">\n {t(\"orderEntry.tpsl.trigger.description\")}\n </Text>\n </Box>\n ) : null}\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const { t } = useTranslation();\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return t(\"orderEntry.orderType.limit\");\n case OrderType.MARKET:\n return t(\"common.marketPrice\");\n case OrderType.STOP_LIMIT:\n return t(\"orderEntry.orderType.stopLimit\");\n case OrderType.STOP_MARKET:\n return t(\"orderEntry.orderType.stopMarket\");\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<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: () => i18n.t(\"orderEntry.orderConfirm\"),\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\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 { 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 React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { OrderType } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n Text,\n Input,\n inputFormatter,\n modal,\n Switch,\n} from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\n\ntype OrderValueKeys = keyof OrderlyOrder;\n\ntype Est_Values = PNL_Values & {\n trigger_price?: string;\n};\n\ntype TPSL_Values = { tp: Est_Values; sl: Est_Values };\n\nexport const OrderTPSL = (props: {\n // onCancelTPSL: () => void;\n // onEnableTP_SL: () => void;\n switchState: boolean;\n onSwitchChanged: (state: boolean) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n // setOpen(false);\n props.onSwitchChanged(false);\n\n // props.onCancelTPSL();\n }\n }, [props.orderType]);\n\n if (\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n )\n return null;\n\n return (\n <div>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"order_entry_tpsl\"}\n className=\"oui-h-[14px]\"\n checked={props.switchState}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n // setOpen(checked);\n props.onSwitchChanged(checked);\n // if (!checked) {\n // props.onCancelTPSL();\n // } else {\n // props.onEnableTP_SL();\n // }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n {t(\"common.tpsl\")}\n </label>\n <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-white/[.36] hover:oui-text-white/80\"\n onClick={() => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: <Text intensity={54}>{t(\"orderEntry.tpsl.tips\")}</Text>,\n });\n }}\n />\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n props.switchState && \"oui-max-h-[100px]\",\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\n \"opacity\",\n props.switchState ? \"1\" : \"0\",\n );\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n quote_dp={props.quote_dp}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n }\n>((props, ref) => {\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(props.errors);\n\n return (\n <div\n ref={ref}\n className={\"oui-space-y-1 oui-px-px oui-py-2 oui-transition-all\"}\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={parseErrorMsg(\"tp_trigger_price\")}\n onChange={props.onChange}\n values={props.values.tp}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-tpPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-tpPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-tp-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={parseErrorMsg(\"sl_trigger_price\")}\n onChange={props.onChange}\n values={props.values.sl}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-slPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-slPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-sl-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n </div>\n );\n});\n\nTPSLInputForm.displayName = \"TPSLInputForm\";\n\n//------- TPSLTriggerPriceInput start -------\nconst TPSLTriggerPriceInput = (props: {\n type: \"TP\" | \"SL\";\n error: string | undefined;\n values: Est_Values;\n onChange: (value: string) => void;\n quote_dp: number | undefined;\n testId?: string;\n}) => {\n const { t } = useTranslation();\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const { tipsEle } = usePnlInputContext();\n const [prefix, setPrefix] = useState<string>(`${props.type} Price`);\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const [innerValue, setInnerValue] = useState<string>(\n props.values.trigger_price ?? \"\",\n );\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(props.values.trigger_price ?? \"\");\n }, [props.values.trigger_price, isFocused]);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n const getPrefixLabel = (trigger_price?: string) => {\n let _prefix = props.type === \"TP\" ? t(\"tpsl.tpPrice\") : t(\"tpsl.slPrice\");\n\n if (trigger_price) {\n _prefix = props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\");\n }\n return _prefix;\n };\n\n const onValueChange = (value: string) => {\n setInnerValue(value);\n props.onChange(value);\n };\n\n // console.log(\"props.values.trigger_price\", props.values.trigger_price);\n\n useEffect(() => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n\n if (!isFocused) {\n setInnerValue(props.values.trigger_price ?? \"\");\n }\n }, [props.type, props.values.trigger_price]);\n\n const onFocus = () => {\n setPrefix(props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\"));\n setPlaceholder(\"\");\n setTipVisible(true);\n setIsFocused(true);\n };\n\n const onBlur = () => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(innerValue);\n };\n\n return (\n <Input.tooltip\n data-testid={props.testId}\n prefix={prefix}\n size={\"md\"}\n placeholder={placeholder}\n align=\"right\"\n onFocus={onFocus}\n onBlur={onBlur}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={innerValue}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n root: \"oui-pr-2 md:oui-pr-3\",\n prefix: \"oui-pr-1 md:oui-pr-2\",\n }}\n // onChange={props.onChange}\n onValueChange={onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp ?? 2),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\n//------- TPSLTriggerPriceInput end -------\n\nconst TPSLInputRow = (props: {\n type: \"TP\" | \"SL\";\n values: Est_Values;\n error?: string;\n onChange: (key: OrderValueKeys, value: any) => void;\n quote_dp: number | undefined;\n testIds?: {\n first?: string;\n second?: string;\n dropDown?: string;\n };\n}) => {\n const priceKey =\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\";\n\n return (\n <Grid cols={2} gapX={1}>\n <TPSLTriggerPriceInput\n testId={props.testIds?.first}\n type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(priceKey, event);\n }}\n quote_dp={props.quote_dp}\n />\n\n <PnlInputWidget\n testIds={{\n input: props.testIds?.second,\n dropDown: props.testIds?.dropDown,\n }}\n onChange={props.onChange}\n quote={\"USDC\"}\n quote_dp={props.quote_dp}\n type={props.type}\n values={{\n PnL: props.values.PnL,\n Offset: props.values.Offset,\n \"Offset%\": props.values[\"Offset%\"],\n ROI: props.values.ROI,\n }}\n />\n </Grid>\n );\n};\n","import {\n CaretDownIcon,\n cn,\n Flex,\n Input,\n MenuItem,\n Text,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n modeLabelMap,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n useEffect(() => {\n setPrefix(!!value ? \"\" : mode);\n }, [value]);\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={modeLabelMap[prefix as keyof typeof modeLabelMap] || prefix}\n size={\"md\"}\n placeholder={placeholder}\n id={id}\n align={\"right\"}\n value={value}\n tooltip={tips}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n data-testid={props.testIds?.input}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_dp, mode, type }),\n inputFormatter.currencyFormatter,\n // inputFormatter.identifierFormatter(),\n ]}\n classNames={{\n root: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n additional: \"oui-text-base-contrast-54\",\n input: \"oui-text-inherit\",\n }}\n onFocus={() => {\n setPrefix(\"\");\n setPlaceholder(\"\");\n onFocus();\n }}\n onBlur={() => {\n setPrefix(!!value ? \"\" : mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n onBlur();\n }}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className=\"oui-ml-[2px]\">\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n testId={props.testIds?.dropDown}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n testId?: string;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"} data-testid={props.testId}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values, quote_dp } = props;\n const { t } = useTranslation();\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const [innerValue, setInnerValue] = useState<string>(\n values[mode as keyof PNL_Values],\n );\n\n // const value = useMemo(() => {\n // // console.log(\"mode\", mode, values);\n // const value = values[mode as keyof PNL_Values];\n // // if (isFocused) {\n // // return value;\n // // }\n // return value;\n // }, [values, mode, isFocused]);\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(values[mode as keyof PNL_Values]);\n }, [values, mode, isFocused]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n {\n label: t(\"tpsl.pnl\"),\n value: PnLMode.PnL,\n testId: `${PnLMode.PnL}_menu_item`,\n },\n {\n label: t(\"tpsl.offset\"),\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: `${t(\"tpsl.offset\")}%`,\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, [t]);\n\n const modeLabelMap = useMemo(() => {\n return {\n [PnLMode.PnL]: t(\"tpsl.pnl\"),\n [PnLMode.OFFSET]: t(\"tpsl.offset\"),\n [PnLMode.PERCENTAGE]: `${t(\"tpsl.offset\")}%`,\n };\n }, [t]);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n // if (!isFocused) {\n // props.onChange(key, value);\n // } else {\n // setInnerValue(value);\n // }\n setInnerValue(value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n setIsFocused(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(key, innerValue);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions,\n ) => {\n value = `${value}`; // convert to string\n\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n // value = new Decimal(\n // value.replace(\n // new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n // \"\"\n // )\n // )\n // .mul(100)\n // .toString();\n\n // return `${todpIfNeed(value, 2)}${percentageSuffix.current}`;\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\",\n ),\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n // return (Number(value) * 100).toFixed(2);\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n // console.log(\"onSendBefore\", value);\n\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n modeLabelMap,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value: innerValue,\n onValueChange,\n quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import {\n createContext,\n PropsWithChildren,\n ReactNode,\n useContext,\n useMemo,\n} from \"react\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype TipType = \"ROI\" | \"PnL\" | \"Error\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n\nexport const PnlInputProvider = (\n props: PropsWithChildren<{\n values: PNL_Values & {\n trigger_price?: string;\n };\n type: \"TP\" | \"SL\";\n }>\n) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n const { t } = useTranslation();\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n \n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {mode === PnLMode.PnL\n ? t(\"orderEntry.estRoi\")\n : t(\"orderEntry.estPnL\")}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, props.values.PnL, props.values.trigger_price]);\n\n return (\n <PnlInputContext.Provider\n value={{\n mode,\n setMode,\n tipsEle,\n }}\n >\n {props.children}\n </PnlInputContext.Provider>\n );\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n }\n) => {\n const { testIds, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testIds={testIds} quote={quote} type={props.type} />\n );\n};\n","import { useEffect, useRef, FocusEvent, useMemo, useState } from \"react\";\nimport {\n useAccount,\n useEventEmitter,\n useLeverage,\n useLocalStorage,\n useMarginRatio,\n useOrderEntry,\n utils,\n} from \"@orderly.network/hooks\";\nimport { useAppContext } from \"@orderly.network/react-app\";\nimport {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"./utils\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport type OrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const [localOrderType, setLocalOrderType] = useLocalStorage(\n \"orderly-order-entry-order-type\",\n OrderType.LIMIT,\n );\n const [localOrderSide, setLocalOrderSide] = useLocalStorage(\n \"orderly-order-entry-order-side\",\n OrderSide.BUY,\n );\n const [localBBOType, setLocalBBOType] = useLocalStorage<\n BBOOrderType | undefined\n >(\"orderly_order_bbo_type\", undefined);\n\n const lastBBOType = useRef<BBOOrderType>(localBBOType);\n\n const { formattedOrder, setValue, setValues, symbolInfo, ...state } =\n useOrderEntry(inputs.symbol, {\n initialOrder: {\n symbol: inputs.symbol,\n order_type: localOrderType,\n side: localOrderSide,\n },\n });\n const [tpslSwitch, setTpslSwitch] = useLocalStorage(\n \"orderly-order-entry-tp_sl-switch\",\n false,\n );\n\n const { state: accountState } = useAccount();\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (accountState.status === AccountStatusEnum.EnableTrading ||\n accountState.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [accountState.status, wrongNetwork, disabledConnect]);\n\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const 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 // 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 // unselect bbo\n setLocalBBOType(undefined);\n // update formattedOrder values immediately instead of via useEffect\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n } else {\n setLocalBBOType(lastBBOType.current || BBOOrderType.COUNTERPARTY1);\n }\n };\n\n const onBBOChange = (value: BBOOrderType) => {\n setLocalBBOType(value);\n lastBBOType.current = value;\n };\n\n useEffect(() => {\n if (bboStatus === BBOStatus.DISABLED) {\n const { order_type_ext } = formattedOrder;\n setValues({\n // if order_type_ext is not bbo(ask, bid), keep previous value\n order_type_ext: isBBOOrder({ order_type_ext })\n ? undefined\n : order_type_ext,\n level: undefined,\n });\n }\n }, [bboStatus, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n if (bboStatus === BBOStatus.ON) {\n const orderType = getOrderTypeByBBO(localBBOType, formattedOrder.side!);\n const orderLevel = getOrderLevelByBBO(localBBOType)!;\n setValues({\n order_type_ext: orderType,\n level: orderLevel,\n });\n }\n }, [localBBOType, bboStatus, formattedOrder.side!]);\n\n // useEffect(() => {\n // if (\n // priceInputContainerRef.current &&\n // // update BBO select width when is BBO order\n // isBBOOrder({ order_type_ext: formattedOrder.order_type_ext })\n // ) {\n // const width =\n // priceInputContainerRef.current.getBoundingClientRect()?.width;\n // if (width) {\n // setPriceInputContainerWidth(width);\n // }\n // }\n // }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n const updateOrderPrice = (price: string) => {\n setValue(\"order_price\", price);\n };\n ee.on(\"update:orderPrice\", updateOrderPrice);\n\n return () => {\n ee.off(\"update:orderPrice\", updateOrderPrice);\n };\n }, []);\n\n useEffect(() => {\n const focusInputElement = (target: HTMLInputElement | null) => {\n setTimeout(() => {\n target?.focus();\n }, 0);\n };\n\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n const price = removeTrailingZeros(item[0]);\n const { order_type, order_type_ext } = formattedOrder;\n\n // handle trigger price input, focus on trigger price input\n if (\n currentFocusInput.current === InputType.TRIGGER_PRICE &&\n (order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.STOP_MARKET)\n ) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle bbo order, unselect bbo and set order price, focus on order price input\n if (isBBOOrder({ order_type, order_type_ext })) {\n setLocalBBOType(undefined);\n\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n\n setTimeout(() => {\n // Since BBO will update the price when unselected, we should set order price in setTimeout\n // We can't call setValue directly here because it's inside a setTimeout, and the formattedOrder accessed inside setValue would be the old value\n // setValue(\"order_price\", price);\n ee.emit(\"update:orderPrice\", price);\n }, 0);\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle limit order and stop limit order, set order price and focus on order price input\n if (\n order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle stop market order, set trigger price and focus on trigger price input\n if (order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle market order, set order type to limit\n if (order_type === OrderType.MARKET) {\n // unselect bbo\n setLocalBBOType(undefined);\n\n // You can't call setValue twice here , the second value will override the first, so you need to combine them into a single setValues call\n setValues({\n order_type: OrderType.LIMIT,\n order_price: price,\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // default, set order price and focus on order price input\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n // Please do not modify this deps lightly, because `setValue` also relies on these state internally\n }, [formattedOrder, symbolInfo]);\n\n useEffect(() => {\n const element = priceInputContainerRef.current;\n\n if (!element) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n if (width) {\n // update BBO order select dropdown width when priceInputContainerRef width changed\n setPriceInputContainerWidth(width);\n }\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.unobserve(element);\n };\n }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n // after switching symbol, all the input number should be cleared (price, qty, TP/SL, etc)\n state.reset();\n state.resetMetaState();\n }, [inputs.symbol]);\n\n 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","import { OrderEntry } from \"./orderEntry.ui\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./orderEntry.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/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/components/dialog/confirm.ui.tsx","../src/utils.ts","../src/components/fees/fees.ui.tsx","../src/components/fees/fees.script.ts","../src/components/fees/fees.widget.tsx","../src/components/orderEntryContext.tsx","../src/components/slippage/components/slippageCell.tsx","../src/components/slippage/components/slippageEditor.tsx","../src/components/slippage/slippage.ui.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/orderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["forwardRef","useContext","useEffect","useMemo","useState","useLeverage","useLocalStorage","useTranslation","useOrderEntryFormErrorMsg","BBOOrderType","OrderSide","OrderType","Box","Button","CaretRightIcon","cn","Divider","Flex","Grid","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","ThrottledButton","toast","useScreen","LeverageWidgetWithSheetId","commifyOptional","Checkbox","Fragment","jsx","jsxs","AdditionalInfo","props","pinned","orderTypeExtra","t","onTypeToggle","type","checked","useAdditionalScript","AdditionalInfoWidget","state","Badge","registerSimpleDialog","OrderLevel","isBBOOrder","options","order_type","order_type_ext","isBBO","getOrderTypeByBBO","value","size","getOrderLevelByBBO","getBBOType","side","level","i18n","OrderConfirmDialog","baseDP","quoteDP","order","onConfirm","onCancel","_","setNeedConfirm","renderPrice","bboType","label","OrderTypeTag","typeStr","Dialog","close","resolve","reject","rest","orderConfirmDialogId","AuthGuard","FeesUI","takerFeeRate","makerFeeRate","useAccountInfo","Decimal","useFeesScript","data","FeesWidget","createContext","OrderEntryContext","OrderEntryProvider","useRef","useBoolean","EditIcon","SimpleDialog","useImperativeHandle","ExclamationFillIcon","Tooltip","TooltipTrigger","SlippageEditor","ref","setValue","customValue","setCustomValue","error","setError","onClick","val","onValueChange","d","toolTipButton","item","SlippageItem","isActive","SlippageCell","open","setOpen","setClose","toggle","isMobile","slippageRef","SlippageUI","React","CaretDownIcon","SimpleDropdownMenu","todpIfNeed","PnlInputContext","usePnlInputContext","PnlInputProvider","values","mode","setMode","tipsEle","usePNLInputBuilder","quote_dp","tipVisible","setTipVisible","isFocused","setIsFocused","key","innerValue","setInnerValue","modes","modeLabelMap","percentageSuffix","dp","endStr","PNLInput","onModeChange","quote","tips","onFocus","onBlur","prefix","setPrefix","placeholder","setPlaceholder","id","PNLMenus","event","PnlInputWidget","testIds","OrderTPSL","tpslFormRef","TPSLInputForm","parseErrorMsg","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","getPrefixLabel","trigger_price","_prefix","priceKey","OrderEntry","formattedOrder","setOrderValue","symbolInfo","maxQty","freeCollateral","helper","submit","metaState","bboStatus","onBBOChange","toggleBBO","curLeverage","errors","validated","setErrorMsgVisible","needConfirm","setPinned","hidden","setHidden","slippage","setSlippage","buttonLabel","clickHandler","visible","onSubmit","result","mergedShowSheet","OrderTypeSelect","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","PinButton","defaultPath","path","setPath","bbo","readOnly","priceSuffix","CustomInput","e","BBOOrderTypeSelect","InputLabel","canTrade","color","maxLabel","option","o","displayLabel","useAccount","useEventEmitter","useMarginRatio","useOrderEntry","utils","useAppContext","AccountStatusEnum","convertValueToPercentage","removeTrailingZeros","useOrderEntryScript","inputs","localOrderType","setLocalOrderType","localOrderSide","setLocalOrderSide","localBBOType","setLocalBBOType","lastBBOType","setValues","tpslSwitch","setTpslSwitch","accountState","wrongNetwork","disabledConnect","currentLeverage","ee","currentFocusInput","triggerPriceInputRef","priceInputRef","priceInputContainerRef","priceInputContainerWidth","setPriceInputContainerWidth","currentQtyPercentage","formatQty","quantity","cancelTP_SL","enableTP_SL","setMaxQty","onTPSLSwitchChanged","orderType","orderLevel","updateOrderPrice","price","focusInputElement","target","orderBookItemClickHandler","element","resizeObserver","entries","entry","width","OrderEntryWidget"],"mappings":"AAAA,OAGE,cAAAA,GAIA,cAAAC,GACA,aAAAC,GACA,WAAAC,GACA,YAAAC,OACK,QACP,OAEE,eAAAC,GACA,mBAAAC,OACK,yBACP,OAAS,kBAAAC,OAAsB,wBAC/B,OAAS,6BAAAC,OAAiC,6BAC1C,OAEE,gBAAAC,GAGA,aAAAC,EACA,aAAAC,MACK,yBACP,OACE,OAAAC,GACA,UAAAC,GACA,kBAAAC,GACA,MAAAC,EACA,WAAAC,GACA,QAAAC,EACA,QAAAC,GACA,SAAAC,GACA,kBAAAC,GAEA,SAAAC,GACA,kBAAAC,GACA,eAAAC,GACA,kBAAAC,GACA,UAAAC,GACA,UAAAC,GACA,UAAAC,GACA,QAAAC,EACA,gBAAAC,GACA,mBAAAC,GACA,SAAAC,GACA,aAAAC,OACK,sBACP,OAAS,6BAAAC,OAAiC,+BAC1C,OAAS,mBAAAC,OAAuB,yBCpDhC,OAAS,YAAAC,GAAU,MAAApB,GAAI,WAAAC,GAAS,QAAAC,EAAY,UAAAU,OAAc,sBAC1D,OAAuB,aAAAhB,OAAiB,yBACxC,OAAS,aAAAT,OAAiB,QAC1B,OAAS,kBAAAK,OAAsB,wBA8CvB,OAsGA,YAAA6B,GArGE,OAAAC,EADF,QAAAC,MAAA,oBAhCD,IAAMC,GAAkBC,GAA+B,CAC5D,GAAM,CAAE,OAAAC,EAAQ,eAAAC,CAAe,EAAIF,EAC7B,CAAE,EAAAG,CAAE,EAAIpC,GAAe,EAEvBqC,EAAgBC,GAAqBC,GAAqB,CAC1DN,EAAM,eACRA,EAAM,cACJ,iBACAM,EAAUD,EAAO,EAEnB,CAEJ,EAEA,OAAA3C,GAAU,IAAM,CACdsC,EAAM,gBAAgB,mBAAoBA,EAAM,OAAS,EAAI,CAAC,CAChE,EAAG,CAACA,EAAM,MAAM,CAAC,EAGfF,EAAC,OAAI,UAAW,4BAId,UAAAA,EAACrB,EAAA,CAEC,QAASwB,EAAS,QAAU,UAC5B,GAAI,EACJ,MAAOA,EAAS,QAAU,OAC1B,UAAU,6BACV,KAAK,OACL,KAAM,EAEN,UAAAH,EAACrB,EAAA,CAAK,UAAW,SACf,UAAAoB,EAACF,GAAA,CACC,cAAY,0CACZ,GAAI,yBACJ,UAAU,WACV,MAAO,QACP,QAAS,QACT,SAAU,CAACK,EAAM,UACjB,QAASE,IAAmB/B,GAAU,UACtC,gBAAiBiC,EAAajC,GAAU,SAAS,EACnD,EACA0B,EAAC,SACC,QAAS,yBACT,UAAWtB,GACT,uEACA,wCACF,EAEC,SAAA4B,EAAE,+BAA+B,EACpC,GACF,EACAL,EAACrB,EAAA,CAAK,UAAW,SACf,UAAAoB,EAACF,GAAA,CACC,cAAY,qCACZ,GAAI,mBACJ,MAAO,QACP,UAAU,WACV,QAAS,QACT,QAASO,IAAmB/B,GAAU,IACtC,gBAAiBiC,EAAajC,GAAU,GAAG,EAC3C,SAAU,CAAC6B,EAAM,UACnB,EACAH,EAAC,SACC,QAAS,mBACT,UAAWtB,GACT,uEACA,wCACF,EAEC,SAAA4B,EAAE,0BAA0B,EAC/B,GACF,EACAL,EAACrB,EAAA,CAAK,UAAW,SACf,UAAAoB,EAACF,GAAA,CACC,cAAY,qCACZ,GAAI,mBACJ,MAAO,QACP,QAAS,QACT,UAAU,WACV,QAASO,IAAmB/B,GAAU,IACtC,gBAAiBiC,EAAajC,GAAU,GAAG,EAC3C,SAAU,CAAC6B,EAAM,UACnB,EACAH,EAAC,SACC,QAAS,mBACT,UAAWtB,GACT,uEACA,wCACF,EAEC,SAAA4B,EAAE,0BAA0B,EAC/B,GACF,GACF,EAEAL,EAACrB,EAAA,CAAK,KAAM,EACV,UAAAqB,EAACrB,EAAA,CACC,UAAAoB,EAACF,GAAA,CACC,cAAY,8CACZ,GAAI,uBACJ,MAAO,QACP,QAASK,EAAM,YACf,gBAAkBM,GAAY,CAC5BN,EAAM,eAAe,CAAC,CAACM,CAAO,CAChC,EACF,EACAT,EAAC,SACC,QAAS,uBACT,UAAW,wBAEV,SAAAM,EAAE,yBAAyB,EAC9B,GACF,EACAL,EAACrB,EAAA,CACC,UAAAoB,EAACF,GAAA,CACC,cAAY,wCACZ,GAAI,sBACJ,MAAO,QACP,QAASK,EAAM,OACf,gBAAkBM,GAAqB,CACrCN,EAAM,UAAUM,CAAO,CACzB,EACF,EACAT,EAAC,SACC,QAAS,sBACT,UAAW,wBAEV,SAAAM,EAAE,mBAAmB,EACxB,GACF,GACF,EACC,CAACF,GACAH,EAAAF,GAAA,CACE,UAAAC,EAACrB,GAAA,CAAQ,UAAW,WAAY,EAChCsB,EAACrB,EAAA,CACC,UAAAoB,EAACV,GAAA,CACC,cAAY,sDACZ,GAAI,4BACJ,gBAAkBmB,GAAY,CAC5BN,EAAM,UAAUM,CAAO,CACzB,EACF,EACAT,EAAC,SACC,QAAS,4BACT,UAAW,wBAEV,SAAAM,EAAE,wBAAwB,EAC7B,GACF,GACF,GAEJ,CAEJ,EC5KO,IAAMI,GAAsB,KAM1B,CAGP,GCJO,cAAAV,OAAA,oBAFF,IAAMW,GAAwBR,GAA+B,CAClE,IAAMS,EAAQF,GAAoB,EAClC,OAAOV,GAACE,GAAA,CAAgB,GAAGU,EAAQ,GAAGT,EAAO,CAC/C,ECNA,OACE,SAAAU,GACA,OAAAtC,GACA,UAAAC,GACA,YAAAsB,GACA,WAAAnB,GACA,QAAAC,EACA,QAAAC,GACA,wBAAAiC,GACA,QAAAvB,EACA,gBAAAC,OACK,sBACP,OAAS,gBAAApB,GAAc,aAAAC,GAAW,aAAAC,OAAiB,yBAEnD,OAAS,WAAAR,OAAe,QACxB,OAAS,mBAAAG,OAAuB,yBCfhC,OACE,gBAAAG,EACA,cAAA2C,GACA,aAAA1C,GACA,aAAAC,MACK,yBAWA,SAAS0C,GAAWC,EAGxB,CACD,GAAM,CAAE,WAAAC,EAAY,eAAAC,CAAe,EAAIF,EAEjCG,EAAQ,CAAC9C,EAAU,IAAKA,EAAU,GAAG,EAAE,SAAS6C,CAAe,EAErE,OAAID,EACKA,IAAe5C,EAAU,OAAS8C,EAGpCA,CACT,CAEO,SAASC,GAAkBC,EAAqBC,EAAiB,CACtE,GACE,CAACnD,EAAa,cAAeA,EAAa,aAAa,EAAE,SAASkD,CAAK,EAEvE,OAAOC,IAASlD,GAAU,IAAMC,EAAU,IAAMA,EAAU,IAG5D,GAAI,CAACF,EAAa,OAAQA,EAAa,MAAM,EAAE,SAASkD,CAAK,EAC3D,OAAOC,IAASlD,GAAU,IAAMC,EAAU,IAAMA,EAAU,GAE9D,CAEO,SAASkD,GAAmBF,EAAqB,CACtD,GAAI,CAAClD,EAAa,cAAeA,EAAa,MAAM,EAAE,SAASkD,CAAK,EAClE,OAAOP,GAAW,IAGpB,GAAI,CAAC3C,EAAa,cAAeA,EAAa,MAAM,EAAE,SAASkD,CAAK,EAClE,OAAOP,GAAW,IAEtB,CAEO,SAASU,GAAWR,EAIxB,CACD,GAAM,CAAE,KAAAT,EAAM,KAAAkB,EAAM,MAAAC,CAAM,EAAIV,EAC9B,GAAIT,IAASlC,EAAU,IAAK,CAC1B,GAAIqD,IAAUZ,GAAW,IACvB,OAAOW,IAASrD,GAAU,IACtBD,EAAa,cACbA,EAAa,OAGnB,GAAIuD,IAAUZ,GAAW,KACvB,OAAOW,IAASrD,GAAU,IACtBD,EAAa,cACbA,EAAa,MAErB,CAEA,GAAIoC,IAASlC,EAAU,IAAK,CAC1B,GAAIqD,IAAUZ,GAAW,IACvB,OAAOW,IAASrD,GAAU,IACtBD,EAAa,OACbA,EAAa,cAGnB,GAAIuD,IAAUZ,GAAW,KACvB,OAAOW,IAASrD,GAAU,IACtBD,EAAa,OACbA,EAAa,aAErB,CACF,CDrEA,OAAS,QAAAwD,GAAM,kBAAA1D,OAAsB,wBAuBxB,OAyGL,YAAA6B,GAzGK,OAAAC,EAuCL,QAAAC,MAvCK,oBAZN,IAAM4B,GAAsB1B,GAAiB,CAClD,GAAM,CAAE,OAAA2B,EAAQ,QAAAC,EAAS,MAAAC,EAAO,UAAAC,EAAW,SAAAC,CAAS,EAAI/B,EAClD,CAAE,KAAAuB,EAAM,WAAAR,EAAY,eAAAC,EAAgB,MAAAQ,CAAM,EAAIK,EAC9C,CAAE,EAAA1B,CAAE,EAAIpC,GAAe,EAEvB,CAACiE,EAAGC,CAAc,EAAInE,GAAgB,wBAAyB,EAAI,EAEnEoE,EAAc,IAAM,CACxB,GACEnB,IAAe5C,GAAU,QACzB4C,IAAe5C,GAAU,YAEzB,OAAO0B,EAACT,EAAA,CAAK,UAAW,GAAK,SAAAe,EAAE,oBAAoB,EAAE,EAGvD,GAAIU,GAAW,CAAE,WAAAE,EAAY,eAAAC,CAAe,CAAC,EAAG,CAC9C,IAAMmB,EAAUb,GAAW,CACzB,KAAMN,EACN,KAAAO,EACA,MAAAC,CACF,CAAC,EACKY,EAAQ,CACZ,CAACnE,GAAa,aAAa,EAAGkC,EAAE,8BAA8B,EAC9D,CAAClC,GAAa,aAAa,EAAGkC,EAAE,8BAA8B,EAC9D,CAAClC,GAAa,MAAM,EAAGkC,EAAE,uBAAuB,EAChD,CAAClC,GAAa,MAAM,EAAGkC,EAAE,uBAAuB,CAClD,EAAEgC,CAAQ,EAEV,OAAOtC,EAACT,EAAA,CAAK,UAAW,GAAK,SAAAgD,EAAM,CACrC,CAEA,OACEvC,EAACT,EAAK,QAAL,CACC,KAAM,OACN,KAAM,QACN,UAAW,yBACX,cAAe,qCACf,GAAIwC,EACJ,QAAS,GAER,SAAAC,EAAM,YACT,CAEJ,EAEA,OACE/B,EAAAF,GAAA,CACE,UAAAE,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAK,UAAL,CAAe,KAAM,SAAU,SAAQ,GACrC,SAAAyC,EAAM,OACT,EACA/B,EAACrB,EAAA,CAAK,QAAS,MAAO,KAAM,EAC1B,UAAAoB,EAACwC,GAAA,CAAa,KAAMtB,EAAY,EAC/BQ,IAASrD,GAAU,IAClB2B,EAACa,GAAA,CAAM,MAAO,MAAO,KAAM,KACxB,SAAAP,EAAE,YAAY,EACjB,EAEAN,EAACa,GAAA,CAAM,MAAO,OAAQ,KAAM,KACzB,SAAAP,EAAE,aAAa,EAClB,GAEJ,GACF,EACAN,EAACrB,GAAA,CAAQ,UAAU,WAAW,EAC9BsB,EAAC,OACC,UAAWT,GAAa,CACtB,KAAM,KACN,UAAW,GACX,UAAW,eACb,CAAC,EAED,UAAAS,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAM,SAAAe,EAAE,YAAY,EAAE,EACvBN,EAACT,EAAK,QAAL,CACC,KAAM,QACN,GAAIuC,EACJ,QAAS,GACT,UAAU,yBAET,SAAAE,EAAM,eACT,GACF,EACEA,EAAM,cACN/B,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAM,SAAAe,EAAE,gBAAgB,EAAE,EAC3BN,EAACT,EAAK,QAAL,CACC,KAAM,OACN,KAAM,QACN,UAAW,yBACX,cAAe,qCACf,GAAIwC,EACJ,QAAS,GAER,SAAAC,EAAM,cACT,GACF,EAbsB,KAexB/B,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAM,SAAAe,EAAE,cAAc,EAAE,EACxB+B,EAAY,GACf,EACApC,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAM,SAAAe,EAAE,iBAAiB,EAAE,EAC5BN,EAACT,EAAK,QAAL,CACC,KAAM,OACN,KAAM,QACN,GAAIwC,EACJ,QAAS,GACT,UAAW,yBACX,cAAe,qCAEd,SAAAC,EAAM,MACT,GACF,GACF,EACCA,EAAM,kBAAoBA,EAAM,iBAC/B/B,EAAAF,GAAA,CACE,UAAAC,EAACrB,GAAA,CAAQ,UAAU,WAAW,EAC9BsB,EAAC,OACC,UAAWT,GAAa,CACtB,KAAM,KACN,UAAW,GACX,UAAW,eACb,CAAC,EAEA,UAAAwC,EAAM,kBACL/B,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAM,SAAAe,EAAE,wBAAwB,EAAE,EACnCN,EAACT,EAAK,QAAL,CACC,KAAM,OACN,KAAM,QACN,SAAQ,GACR,GAAIwC,EACJ,QAAS,GACT,cAAe,qCAEd,SAAAC,EAAM,iBACT,GACF,EAEDA,EAAM,kBACL/B,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAM,SAAAe,EAAE,wBAAwB,EAAE,EACnCN,EAACT,EAAK,QAAL,CACC,KAAM,OACN,KAAM,QACN,SAAQ,GACR,UAAU,sBACV,cAAe,qCACf,GAAIwC,EACJ,QAAS,GAER,SAAAC,EAAM,iBACT,GACF,GAEJ,GACF,EACE,KAEJ/B,EAACrB,EAAA,CAAK,KAAM,EAAG,GAAI,EAAG,GAAI,EACxB,UAAAoB,EAACF,GAAA,CACC,GAAG,eACH,MAAO,QACP,gBAAkBW,GAAY,CAC5B2B,EAAe,CAAG3B,CAAO,CAC3B,EACF,EACAT,EAAC,SACC,QAAQ,eACR,UAAWR,GAAa,CACtB,KAAM,KACN,UAAW,EACb,CAAC,EAEA,SAAAc,EAAE,gCAAgC,EACrC,GACF,EAEC0B,EAAM,kBAAoBA,EAAM,iBAC/BhC,EAACzB,GAAA,CAAI,GAAI,EAAG,GAAI,EAAG,UAAU,kBAC3B,SAAAyB,EAACT,EAAA,CAAK,MAAM,UAAU,KAAK,KACxB,SAAAe,EAAE,qCAAqC,EAC1C,EACF,EACE,KAEJL,EAACpB,GAAA,CAAK,KAAM,EAAG,KAAM,EACnB,UAAAmB,EAACxB,GAAA,CAAO,MAAO,YAAa,KAAM,KAAM,QAAS,IAAM0D,EAAS,EAC7D,SAAA5B,EAAE,eAAe,EACpB,EACAN,EAACxB,GAAA,CAAO,KAAM,KAAM,QAAS,IAAMyD,EAAU,EAC1C,SAAA3B,EAAE,gBAAgB,EACrB,GACF,GACF,CAEJ,EAEAuB,GAAmB,YAAc,qBAEjC,IAAMW,GAAgBrC,GAA+B,CACnD,GAAM,CAAE,CAAE,EAAIjC,GAAe,EACvBuE,EAAU3E,GAAQ,IAAM,CAC5B,OAAQqC,EAAM,KAAM,CAClB,KAAK7B,GAAU,MACb,OAAO,EAAE,4BAA4B,EACvC,KAAKA,GAAU,OACb,OAAO,EAAE,oBAAoB,EAC/B,KAAKA,GAAU,WACb,OAAO,EAAE,gCAAgC,EAC3C,KAAKA,GAAU,YACb,OAAO,EAAE,iCAAiC,EAC5C,QACE,MAAO,EACX,CACF,EAAG,CAAC6B,EAAM,IAAI,CAAC,EAEf,OACEH,EAACa,GAAA,CAAM,MAAO,UAAW,KAAM,KAC5B,SAAA4B,EACH,CAEJ,EAEMC,GACJvC,GAKG,CACH,GAAM,CAAE,MAAAwC,EAAO,QAAAC,EAAS,OAAAC,EAAQ,GAAGC,CAAK,EAAI3C,EAE5C,OACEH,EAAC6B,GAAA,CACE,GAAGiB,EACJ,SAAUH,EACV,UAAW,IAAM,CACfC,EAAQ,EACRD,EAAM,CACR,EACF,CAEJ,EAEaI,GAAuB,eAEpCjC,GAAqBiC,GAAsBL,GAAQ,CACjD,KAAM,KACN,MAAO,IAAMd,GAAK,EAAE,yBAAyB,CAC/C,CAAC,EEvRD,OAAS,kBAAA1D,OAAsB,wBAC/B,OAAS,QAAAU,GAAM,QAAAW,MAAY,sBAC3B,OAAS,aAAAyD,OAAiB,gCAQpB,cAAAhD,GAGI,QAAAC,OAHJ,oBALC,IAAMgD,GAAsD9C,GAAU,CAC3E,GAAM,CAAE,CAAE,EAAIjC,GAAe,EACvB,CAAE,aAAAgF,EAAc,aAAAC,CAAa,EAAIhD,EACvC,OACEF,GAACrB,GAAA,CAAK,QAAS,UACb,UAAAoB,GAACT,EAAA,CAAK,KAAK,MAAO,WAAE,aAAa,EAAE,EACnCS,GAACgD,GAAA,CACC,SAAU,IACR/C,GAACV,EAAA,CAAK,KAAK,MACR,YAAE,gCAAgC,EAAE,UAAQ,IAC5C,EAAE,gCAAgC,EAAE,SACvC,EAGF,SAAAU,GAACrB,GAAA,CAAK,IAAK,EACT,UAAAqB,GAACV,EAAA,CAAK,KAAK,MAAO,YAAE,gCAAgC,EAAE,KAAC,EACvDS,GAACT,EAAA,CAAK,KAAK,MAAM,UAAU,4BACxB,SAAA2D,EACH,EACAlD,GAACT,EAAA,CAAK,KAAK,MAAM,aAAC,EAClBU,GAACV,EAAA,CAAK,KAAK,MAAO,YAAE,gCAAgC,EAAE,KAAC,EACvDS,GAACT,EAAA,CAAK,KAAK,MAAM,UAAU,4BACxB,SAAA4D,EACH,GACF,EACF,GACF,CAEJ,EClCA,OAAS,WAAArF,OAAe,QACxB,OAAS,kBAAAsF,OAAsB,yBAC/B,OAAS,WAAAC,OAAe,yBAEjB,IAAMC,GAAgB,IAAM,CACjC,GAAM,CAAE,KAAAC,CAAK,EAAIH,GAAe,EAE1BF,EAAepF,GAAQ,IAAM,CACjC,IAAMwD,EAAQiC,GAAM,uBACpB,GAAI,SAAOjC,EAAU,KAGrB,MAAO,GAAG,IAAI+B,GAAQ/B,CAAK,EAAE,IAAI,GAAI,EAAE,SAAS,CAAC,GACnD,EAAG,CAACiC,CAAI,CAAC,EAEHJ,EAAerF,GAAQ,IAAM,CACjC,IAAMwD,EAAQiC,GAAM,uBACpB,GAAI,SAAOjC,EAAU,KAGrB,MAAO,GAAG,IAAI+B,GAAQ/B,CAAK,EAAE,IAAI,GAAI,EAAE,SAAS,CAAC,GACnD,EAAG,CAACiC,CAAI,CAAC,EAET,MAAO,CAAE,aAAAL,EAAc,aAAAC,CAAa,CACtC,EClBS,cAAAnD,OAAA,oBAFF,IAAMwD,GAAuB,IAAM,CACxC,IAAM5C,EAAQ0C,GAAc,EAC5B,OAAOtD,GAACiD,GAAA,CAAQ,GAAGrC,EAAO,CAC5B,ECPA,OAAS,iBAAA6C,OAAqB,QAMvB,IAAMC,GAAoBD,GAC/B,CAAC,CACH,EAEaE,GAAqBD,GAAkB,SCVpD,OAAS,UAAAE,OAAc,QACvB,OAAS,cAAAC,OAAkB,yBAC3B,OAAS,kBAAA3F,OAAsB,wBAC/B,OACE,YAAA4F,GACA,QAAAlF,GACA,QAAAW,GACA,gBAAAwE,GACA,aAAApE,OACK,sBACP,OAAS,aAAAqD,OAAiB,gCCV1B,OAEE,cAAArF,GACA,aAAAE,GACA,uBAAAmG,GACA,YAAAjG,OACK,QACP,OAAS,kBAAAG,OAAsB,wBAC/B,OACE,OAAAK,GACA,MAAAG,GACA,uBAAAuF,GACA,QAAArF,GACA,SAAAE,GACA,kBAAAC,GACA,SAAAC,GACA,QAAAO,GACA,WAAA2E,GACA,kBAAAC,OACK,sBACP,OAAS,WAAAd,OAAe,yBA4DL,cAAArD,EAyBb,QAAAC,OAzBa,oBArDnB,IAAMgB,GAAU,CAAC,IAAM,IAAM,EAAG,EAEnBmD,GAAiBzG,GAG5B,CAACwC,EAAOkE,IAAQ,CAChB,GAAM,CAAE,EAAA/D,CAAE,EAAIpC,GAAe,EACvB,CAACoD,EAAOgD,CAAQ,EAAIvG,GAAiB,EACrC,CAACwG,EAAaC,CAAc,EAAIzG,GAAS,EAAE,EAC3C,CAAC0G,EAAOC,CAAQ,EAAI3G,GAA6B,MAAS,EAEhEiG,GAAoBK,EAAK,KAAO,CAC9B,SAAU,IACRE,EAAc,IAAIlB,GAAQkB,CAAW,GAAG,SAAS,EAAIjD,CACzD,EAAE,EAEFzD,GAAU,IAAM,CACVsC,EAAM,cAAgB,CAACc,GAAQ,SAASd,EAAM,YAAa,EAC7DqE,EAAerE,EAAM,aAAc,SAAS,CAAC,EAE7CmE,EAASnE,EAAM,YAAY,CAE/B,EAAG,CAACA,EAAM,aAAc,IAAI,CAAC,EAE7B,IAAMwE,EAAWC,GAAgB,CAC/BN,EAASM,CAAG,EACZJ,EAAe,EAAE,EACjBE,EAAS,MAAS,CACpB,EAEMG,EAAiBD,GAAgB,CACrC,GAAI,CAACA,EAAK,CACRJ,EAAeI,CAAG,EAClB,MACF,CAEA,IAAME,EAAI,IAAIzB,GAAQuB,CAAG,EACzBN,EAAS,MAAS,EACdQ,EAAE,GAAG,CAAC,GACRN,EAAe,GAAG,EAClBE,EAASpE,EAAE,kCAAkC,CAAC,IAE9CkE,EAAeI,CAAG,EAClBF,EAAS,MAAS,EAEtB,EAEMK,EAAgB5E,EAAM,SAC1BH,EAAC,UACC,QAAS,IAAM,CAEbhB,GAAM,MAAM,CACV,MAAOsB,EAAE,aAAa,EACtB,QAASN,EAACT,GAAA,CAAK,KAAK,MAAO,SAAAe,EAAE,0BAA0B,EAAE,CAC3D,CAAC,CACH,EAEA,SAAAN,EAACiE,GAAA,CAAoB,UAAU,4BAA4B,KAAM,GAAI,EACvE,EAEAjE,EAACkE,GAAA,CAEC,QACElE,EAACT,GAAA,CAAK,UAAW,GAAI,KAAK,MACvB,SAAAe,EAAE,0BAA0B,EAC/B,EAEF,UAAU,8BACV,MAAO,CAAE,UAAW,iBAAkB,EAEtC,SAAAN,EAACmE,GAAA,CACC,SAAAnE,EAACiE,GAAA,CAAoB,UAAU,4BAA4B,KAAM,GAAI,EACvE,EACF,EAGF,OACEhE,GAAC,OAAI,UAAU,eACb,UAAAA,GAACrB,GAAA,CAAK,GAAI,EAAG,KAAM,EACjB,UAAAoB,EAACT,GAAA,CAAK,KAAK,KAAM,SAAAe,EAAE,qBAAqB,EAAE,EACzCyE,GACH,EACA9E,GAACrB,GAAA,CAAK,KAAM,EACT,UAAAqC,GAAQ,IAAK+D,GAGVhF,EAACiF,GAAA,CAEC,MAAOD,EACP,SALa1D,IAAU0D,EAMvB,QAAS,IAAM,CACbL,EAAQK,CAAI,CACd,GALKA,CAMP,CAEH,EAEDhF,EAAClB,GAAA,CACC,OAAO,IACP,WAAY,CACVC,GAAe,gBACfA,GAAe,YAAY,CAAC,CAC9B,EACA,MAAOwF,EACP,cAAeM,EACf,WAAY,CACV,KAAMnG,GACJ,+BACA,2BACF,EACA,MAAO,yBACP,WAAY,UACd,EACF,GACF,EACC,CAAC,CAAC+F,GACDzE,EAACzB,GAAA,CAAI,GAAI,EAAG,UAAU,YACpB,SAAAyB,EAACT,GAAA,CAAK,KAAK,MAAM,MAAM,SACpB,SAAAkF,EACH,EACF,GAEJ,CAEJ,CAAC,EAQKQ,GAAsC,CAAC,CAAE,MAAA3D,EAAO,SAAA4D,EAAU,QAAAP,CAAQ,IAEpE3E,EAACpB,GAAA,CACC,UAAW,IACX,QAAQ,SACR,UAAU,SACV,EAAE,KACF,MAAO,GACP,OAAQ,GACR,UAAWF,GACT,qCACAwG,GAAY,sBACd,EACA,QAASP,EAET,SAAA1E,GAACV,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,UAAA+B,EAAM,KACT,EACF,ED/IA,mBAAAvB,GAkBI,OAAAC,EAUI,QAAAC,OA5BR,oBArBG,IAAMkF,GAAgBhF,GAIvB,CACJ,GAAM,CAAE,CAAE,EAAIjC,GAAe,EACvB,CAACkH,EAAM,CAAE,QAASC,EAAS,SAAUC,EAAU,OAAAC,CAAO,CAAC,EAC3D1B,GAAW,EAAK,EAEZ,CAAE,SAAA2B,CAAS,EAAI7F,GAAU,EACzB8F,EAAc7B,GAA+C,IAAI,EAEjE3B,EAAY,IAAM,CACtB,IAAM2C,EAAMa,EAAY,SAAS,SAAS,EAE1C,OAAAtF,EAAM,YAAayE,EAAYA,EAAI,SAAS,EAAnB,GAAoB,EAC7CU,EAAS,EACF,QAAQ,QAAQ,EAAI,CAC7B,EAEA,OACErF,GAAAF,GAAA,CACE,UAAAC,EAAC+D,GAAA,CACC,KAAMqB,EACN,aAAcG,EACd,MAAO,EAAE,iBAAiB,EAC1B,aAAc,CAAE,KAAMC,EAAW,KAAO,IAAK,EAC7C,QAAS,CACP,QAAS,CACP,SAAU,GACV,MAAO,EAAE,aAAa,EACtB,QAASvD,CACX,EACA,UAAW,CACT,MAAO,EAAE,eAAe,EACxB,QAAS,IAAMqD,EAAS,CAC1B,CACF,EAEA,SAAAtF,EAACoE,GAAA,CACC,IAAKqB,EACL,SAAUD,EACV,aAAcrF,EAAM,SAAW,OAAOA,EAAM,QAAQ,EAAI,OAC1D,EACF,EACAF,GAACrB,GAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,GAAA,CAAK,KAAK,MAAO,WAAE,qBAAqB,EAAE,EAC3CS,EAACgD,GAAA,CACC,SAAU,IACR/C,GAACV,GAAA,CAAK,KAAK,MACR,YAAE,yBAAyB,EAAE,UAAQ,EAAE,YAAY,EAAE,SACxD,EAGF,SAAAU,GAACrB,GAAA,CAAK,IAAK,EACT,UAAAoB,EAACT,GAAK,QAAL,CACC,KAAK,MACL,KAAK,cACL,OAAQ,GAAG,EAAE,yBAAyB,CAAC,KACvC,OAAQ,MAAM,EAAE,YAAY,CAAC,KAE5B,SAAAY,EAAM,aAAe,EACxB,EACAH,EAAC,UAAO,UAAU,eAAe,QAAS,IAAMqF,EAAQ,EACtD,SAAApF,GAACrB,GAAA,CAAK,UAAU,cAAc,GAAG,OAC/B,UAAAoB,EAACT,GAAA,CAAK,KAAK,MAAM,UAAU,mBACxB,YAAGY,EAAM,UAAY,GAAG,IAC3B,EACAH,EAAC8D,GAAA,CACC,UAAU,2CACV,KAAM,GACN,QAAS,EACX,GACF,EACF,GACF,EACF,GACF,GACF,CAEJ,EEtFS,cAAA9D,OAAA,oBALF,IAAM0F,GAAcvF,GAKlBH,GAACmF,GAAA,CAAc,GAAGhF,EAAO,ECPlC,OAAOwF,IAEL,cAAA/H,GACA,aAAAC,GACA,WAAAC,GAEA,YAAAC,OACK,QAEP,OAAS,kBAAAG,OAAsB,wBAC/B,OAAS,6BAAAC,OAAiC,6BAE1C,OAAS,aAAAG,OAAiB,yBAC1B,OACE,MAAAI,GACA,QAAAE,GACA,QAAAW,GACA,SAAAT,GACA,kBAAAC,GACA,SAAAC,GACA,UAAAM,OACK,sBACP,OAAS,QAAAT,OAAY,sBACrB,OAAS,uBAAAoF,OAA2B,sBCvBpC,OACE,iBAAA2B,GAGA,SAAA9G,GAEA,QAAAS,GACA,sBAAAsG,OACK,sBCRP,OAAS,aAAAhI,GAAW,WAAAC,GAAS,UAAA8F,GAAQ,YAAA7F,OAAgB,QACrD,OAAS,kBAAAG,OAAsB,wBAM/B,OAAS,WAAAmF,GAAS,cAAAyC,OAAkB,yBCPpC,OACE,iBAAArC,GAGA,cAAA7F,GACA,WAAAE,OACK,QAEP,OAAS,mBAAAG,OAAuB,yBAChC,OAAS,MAAAS,GAAI,QAAAE,GAAM,QAAAW,OAAY,sBAC/B,OAAS,kBAAArB,OAAsB,wBAqCzB,OACE,OAAA8B,GADF,QAAAC,OAAA,oBA3BC,IAAM8F,GAAkBtC,GAC7B,CAAC,CACH,EAEauC,GAAqB,IACzBpI,GAAWmI,EAAe,EAGtBE,GACX9F,GAMG,CACH,GAAM,CAAE,KAAAK,EAAM,OAAA0F,CAAO,EAAI/F,EACnB,CAACgG,EAAMC,CAAO,EAAInI,GACtB,sBAEF,EACM,CAAE,EAAAqC,CAAE,EAAIpC,GAAe,EAEvBmI,EAAUvI,GAAQ,IAClB,CAACoI,EAAO,KAAO,CAAC/F,EAAM,OAAO,cAAsB,KAGrDF,GAACrB,GAAA,CACC,UAAAoB,GAAC,QAAK,UAAW,wCACd,SAAAmG,UACG7F,EAAE,mBAAmB,EACrBA,EAAE,mBAAmB,EAC3B,EACC6F,UACCnG,GAACT,GAAK,QAAL,CACC,KAAM,cACN,UAAWb,GACT,uBACA8B,IAAS,KAAO,wBAA0B,qBAC5C,EAEC,SAAA0F,EAAO,IACV,EAEAlG,GAACT,GAAK,QAAL,CACC,KAAM,QACN,UAAWb,GACT,uBACA8B,IAAS,KAAO,wBAA0B,qBAC5C,EAEC,SAAA0F,EAAO,IACV,GAEJ,EAED,CAACC,EAAMhG,EAAM,OAAO,IAAKA,EAAM,OAAO,aAAa,CAAC,EAEvD,OACEH,GAAC+F,GAAgB,SAAhB,CACC,MAAO,CACL,KAAAI,EACA,QAAAC,EACA,QAAAC,CACF,EAEC,SAAAlG,EAAM,SACT,CAEJ,EDjDO,IAAMmG,GAAsBnG,GAAwB,CACzD,GAAM,CAAE,KAAAK,EAAM,OAAA0F,EAAQ,SAAAK,CAAS,EAAIpG,EAC7B,CAAE,EAAAG,CAAE,EAAIpC,GAAe,EAKvB,CAAE,KAAAiI,EAAM,QAAAC,EAAS,QAAAC,CAAQ,EAAIL,GAAmB,EAEhD,CAACQ,EAAYC,CAAa,EAAI1I,GAAS,EAAK,EAC5C,CAAC2I,EAAWC,CAAY,EAAI5I,GAAS,EAAK,EAE1C6I,EAAM9I,GAAkB,IAAM,CAClC,OAAQqI,EAAM,CACZ,IAAK,SACH,MAAO,GAAG3F,EAAK,YAAY,CAAC,UAC9B,IAAK,UACH,MAAO,GAAGA,EAAK,YAAY,CAAC,qBAC9B,QACE,MAAO,GAAGA,EAAK,YAAY,CAAC,MAChC,CACF,EAAG,CAAC2F,CAAI,CAAC,EAEH,CAACU,EAAYC,CAAa,EAAI/I,GAClCmI,EAAOC,CAAwB,CACjC,EAWAtI,GAAU,IAAM,CACV6I,GAGJI,EAAcZ,EAAOC,CAAwB,CAAC,CAChD,EAAG,CAACD,EAAQC,EAAMO,CAAS,CAAC,EAE5B,IAAMK,EAAQjJ,GAAoB,IACzB,CACL,CACE,MAAOwC,EAAE,UAAU,EACnB,MAAO,MACP,OAAQ,eACV,EACA,CACE,MAAOA,EAAE,aAAa,EACtB,MAAO,SACP,OAAQ,kBACV,EACA,CACE,MAAO,GAAGA,EAAE,aAAa,CAAC,IAC1B,MAAO,UACP,OAAQ,mBACV,CACF,EACC,CAACA,CAAC,CAAC,EAEA0G,EAAelJ,GAAQ,KACpB,CACJ,IAAcwC,EAAE,UAAU,EAC1B,OAAiBA,EAAE,aAAa,EAChC,UAAqB,GAAGA,EAAE,aAAa,CAAC,GAC3C,GACC,CAACA,CAAC,CAAC,EAEA2G,EAAmBrD,GAAe,EAAE,EA+G1C,MAAO,CACL,KAAAuC,EACA,MAAAY,EACA,aAAAC,EACA,UAtFiB/F,GAIG,CACpB,GAAM,CAAE,GAAAiG,EAAK,CAAE,EAAIjG,EACnB,MAAO,CACL,eAAgB,CACdK,EACAL,KAEAK,EAAQ,GAAGA,CAAK,GAEZd,IAAS,MAAQ2F,IAAS,QAC5B7E,EAAQA,EAAM,WAAW,GAAG,EAAIA,EAAQ,IAAMA,GAG5CA,IAAU,IAAMA,IAAU,IAAY,GAKtC6E,IAAS,UAWJ,GAAG,IAAI9C,GACZ/B,EAAM,QACJ,IAAI,OAAO2F,EAAiB,QAAQ,QAAQ,IAAK,KAAK,EAAI,GAAG,EAC7D,EACF,CACF,EACG,IAAI,GAAG,EACP,KAAK,EAAG,CAAC,EACT,SAAS,CAAC,GAAGA,EAAiB,OAAO,IAE/Bd,IAAS,WAClB7E,EAAQwE,GAAWxE,EAAO4F,CAAE,GAKvB,GAAG5F,CAAK,KAEjB,aAAeA,GAAkB,CAC/B,GAAI,aAAa,KAAKA,CAAK,EACzB,MAAO,IAKT,GAAI6E,IAAS,WACX,GAAI7E,IAAU,GAAI,CAEhBA,EAAQwE,GAAWxE,EAAO,CAAC,EAC3B,IAAM6F,EAAS7F,EAAM,MAAM,WAAW,EAChC6F,EACJF,EAAiB,QAAUE,EAAO,CAAC,EAEnCF,EAAiB,QAAU,GAE7B3F,EAAQ,IAAI+B,GAAQ/B,CAAK,EAAE,IAAI,GAAG,EAAE,SAAS,EAC7CA,EAAQ,GAAGA,CAAK,GAAG2F,EAAiB,OAAO,EAC7C,OAEA3F,EAAQwE,GAAWxE,EAAO4F,CAAE,EAG9B,OAAI5F,IAAU,IAAMA,IAAU,IAAY,GAEnCA,CACT,CACF,CACF,EAOE,aAAe6E,GAAkB,CAC/BC,EAAQD,CAAI,CACd,EACA,QA1Gc,IAAM,CAEpBM,EAAc,EAAI,EAClBE,EAAa,EAAI,CACnB,EAuGE,OAlGa,IAAM,CAEnBF,EAAc,EAAK,EACnBE,EAAa,EAAK,EAClBxG,EAAM,SAASyG,EAAKC,CAAU,CAChC,EA8FE,MAAOA,EACP,cAxHqBvF,GAAkB,CAOvCwF,EAAcxF,CAAK,EACnBnB,EAAM,SAASyG,EAAKtF,CAAK,CAC3B,EAgHE,SAAAiF,EACA,KAAMC,EAAaH,EAAU,MAC/B,CACF,EDnOA,OAAS,kBAAAtH,OAAsB,sBAC/B,OAAS,aAAAlB,GAAW,WAAAC,GAAS,YAAAC,OAAgB,QAkFrC,mBAAAgC,GAEI,OAAAC,GAFJ,QAAAC,OAAA,oBAvED,IAAMmH,GAAYjH,GAAyB,CAChD,GAAM,CACJ,KAAAgG,EACA,MAAAY,EACA,aAAAC,EACA,aAAAK,EACA,cAAAxC,EACA,MAAAyC,EACA,SAAAf,EACA,MAAAjF,EACA,KAAAd,EACA,KAAA+G,EACA,QAAAC,EACA,OAAAC,CACF,EAAItH,EAEE,CAACuH,EAAQC,CAAS,EAAI5J,GAAiBoI,CAAI,EAE3C,CAACyB,EAAaC,CAAc,EAAI9J,GACpCoI,cAA8B,IAAMmB,CACtC,EAEAzJ,GAAU,IAAM,CACd8J,EAAUxB,CAAI,EACd0B,EAAe1B,cAA8B,IAAMmB,CAAK,CAC1D,EAAG,CAACnB,CAAI,CAAC,EAETtI,GAAU,IAAM,CACd8J,EAAYrG,EAAQ,GAAK6E,CAAI,CAC/B,EAAG,CAAC7E,CAAK,CAAC,EAEV,IAAMwG,EAAKhK,GAAQ,IAAM,GAAG0C,EAAK,YAAY,CAAC,IAAI2F,EAAK,YAAY,CAAC,GAAI,CAAC,CAAC,EAE1E,OACEnG,GAAClB,GAAM,QAAN,CACC,OAAQkI,EAAaU,CAAmC,GAAKA,EAC7D,KAAM,KACN,YAAaE,EACb,GAAIE,EACJ,MAAO,QACP,MAAOxG,EACP,QAASiG,EACT,aAAc,CACZ,QAAS,CACP,KAAMpH,EAAM,OAAS,KAAO,MAAQ,QACtC,CACF,EACA,cAAaA,EAAM,SAAS,MAC5B,aAAc,MACd,cAAe0E,EACf,WAAY,CACV1E,EAAM,UAAU,CAAE,GAAIoG,EAAU,KAAAJ,EAAM,KAAA3F,CAAK,CAAC,EAC5CzB,GAAe,iBAEjB,EACA,WAAY,CACV,KAAMyB,IAAS,KAAO,wBAA0B,sBAChD,WAAY,4BACZ,MAAO,kBACT,EACA,QAAS,IAAM,CACbmH,EAAU,EAAE,EACZE,EAAe,EAAE,EACjBL,EAAQ,CACV,EACA,OAAQ,IAAM,CACZG,EAAYrG,EAAQ,GAAK6E,CAAI,EAC7B0B,EAAe1B,cAA8B,IAAMmB,CAAK,EACxDG,EAAO,CACT,EACA,OACExH,GAAAF,GAAA,CACG,UAAAoG,eAA+B,CAAC,CAAC7E,GAChCtB,GAACT,GAAA,CAAK,KAAM,MAAO,MAAM,UAAU,UAAU,eAAe,aAE5D,EAEFS,GAAC+H,GAAA,CACC,KAAM5B,EACN,MAAOY,EACP,aAAe/B,GAASqC,EAAarC,EAAK,KAAgB,EAC1D,OAAQ7E,EAAM,SAAS,SACzB,GACF,EAEJ,CAEJ,EAEM4H,GAAY5H,GAOdH,GAAC6F,GAAA,CACC,aAAc1F,EAAM,KACpB,KAAMA,EAAM,MACZ,MAAO,MACP,KAAM,KACN,UAAW,mBACX,iBAAmB6H,GAAUA,EAAM,eAAe,EAClD,SAAWhD,GAAS7E,EAAM,aAAa6E,CAAgB,EAEvD,SAAAhF,GAAC,UAAO,UAAW,UAAW,cAAaG,EAAM,OAC/C,SAAAH,GAAC4F,GAAA,CAAc,KAAM,GAAI,MAAO,QAAS,EAC3C,EACF,EGnHA,cAAA5F,OAAA,oBAZG,IAAMiI,GACX9H,GAOG,CACH,GAAM,CAAE,QAAA+H,EAAS,MAAAZ,EAAO,GAAGxE,CAAK,EAAI3C,EAC9BS,EAAQ0F,GAAmBxD,CAAI,EACrC,OACE9C,GAACoH,GAAA,CAAU,GAAGxG,EAAO,QAASsH,EAAS,MAAOZ,EAAO,KAAMnH,EAAM,KAAM,CAE3E,EJ4DM,OACE,OAAAH,EADF,QAAAC,OAAA,oBArCC,IAAMkI,GAAahI,GAWpB,CAEJ,IAAMiI,EAAczC,GAAM,OAAuB,IAAI,EAC/C,CAAE,EAAArF,CAAE,EAAIpC,GAAe,EAc7B,OAZAL,GAAU,IAAM,CAEZsC,EAAM,YAAc7B,GAAU,OAC9B6B,EAAM,YAAc7B,GAAU,QAG9B6B,EAAM,gBAAgB,EAAK,CAI/B,EAAG,CAACA,EAAM,SAAS,CAAC,EAGjBA,EAAM,YAAc7B,GAAU,OAC7B6B,EAAM,YAAc7B,GAAU,QAChC6B,EAAM,aAEC,KAGPF,GAAC,OACC,UAAAA,GAACrB,GAAA,CAAK,UAAW,SAAU,KAAM,EAC/B,UAAAoB,EAACV,GAAA,CACC,GAAI,mBACJ,UAAU,eACV,QAASa,EAAM,YACf,SACGA,EAAM,YAAc7B,GAAU,OAC7B6B,EAAM,YAAc7B,GAAU,QAChC6B,EAAM,aAER,gBAAkBM,GAAY,CAE5BN,EAAM,gBAAgBM,CAAO,CAM/B,EACF,EACAT,EAAC,SAAM,QAAS,mBAAoB,UAAW,cAC5C,SAAAM,EAAE,aAAa,EAClB,EACAN,EAACiE,GAAA,CACC,MAAM,QAEN,KAAM,GACN,QAAS,EACT,UAAU,kEACV,QAAS,IAAM,CACbjF,GAAM,OAAO,CACX,MAAOsB,EAAE,aAAa,EACtB,KAAM,KACN,QAASN,EAACT,GAAA,CAAK,UAAW,GAAK,SAAAe,EAAE,sBAAsB,EAAE,CAC3D,CAAC,CACH,EACF,GACF,EACAN,EAAC,OACC,UAAWtB,GACT,qDACAyB,EAAM,aAAe,mBACvB,EACA,gBAAiB,IAAM,CAErBiI,EAAY,SAAS,MAAM,YACzB,UACAjI,EAAM,YAAc,IAAM,GAC5B,CACF,EAEA,SAAAH,EAACqI,GAAA,CACC,IAAKD,EACL,SAAUjI,EAAM,SAChB,OAAQA,EAAM,OACd,OAAQA,EAAM,OACd,SAAUA,EAAM,SAClB,EACF,GACF,CAEJ,EAEMkI,GAAgB1C,GAAM,WAQ1B,CAACxF,EAAOkE,IAAQ,CAChB,GAAM,CAAE,cAAAiE,CAAc,EAAInK,GAA0BgC,EAAM,MAAM,EAEhE,OACEF,GAAC,OACC,IAAKoE,EACL,UAAW,sDAEX,UAAArE,EAACiG,GAAA,CAAiB,OAAQ9F,EAAM,OAAO,GAAI,KAAM,KAC/C,SAAAH,EAACuI,GAAA,CACC,KAAM,KACN,MAAOD,EAAc,kBAAkB,EACvC,SAAUnI,EAAM,SAChB,OAAQA,EAAM,OAAO,GACrB,SAAUA,EAAM,SAChB,QAAS,CACP,MAAO,2CACP,OAAQ,yCACR,SAAU,uDACZ,EACF,EACF,EACAH,EAACiG,GAAA,CAAiB,OAAQ9F,EAAM,OAAO,GAAI,KAAM,KAC/C,SAAAH,EAACuI,GAAA,CACC,KAAM,KACN,MAAOD,EAAc,kBAAkB,EACvC,SAAUnI,EAAM,SAChB,OAAQA,EAAM,OAAO,GACrB,SAAUA,EAAM,SAChB,QAAS,CACP,MAAO,2CACP,OAAQ,yCACR,SAAU,uDACZ,EACF,EACF,GACF,CAEJ,CAAC,EAEDkI,GAAc,YAAc,gBAG5B,IAAMG,GAAyBrI,GAOzB,CACJ,GAAM,CAAE,CAAE,EAAIjC,GAAe,EACvB,CAAE,gBAAAuK,CAAgB,EAAI7K,GAAW8F,EAAiB,EAClD,CAAE,QAAA2C,CAAQ,EAAIL,GAAmB,EACjC,CAAC0B,EAAQC,CAAS,EAAI5J,GAAiB,GAAGoC,EAAM,IAAI,QAAQ,EAC5D,CAACyH,EAAaC,CAAc,EAAI9J,GAAiB,MAAM,EAEvD,CAACyI,EAAYC,CAAa,EAAI1I,GAAS,EAAK,EAC5C,CAAC2I,EAAWC,CAAY,EAAI5I,GAAS,EAAK,EAE1C,CAAC8I,EAAYC,CAAa,EAAI/I,GAClCoC,EAAM,OAAO,eAAiB,EAChC,EAEAtC,GAAU,IAAM,CACV6I,GAGJI,EAAc3G,EAAM,OAAO,eAAiB,EAAE,CAChD,EAAG,CAACA,EAAM,OAAO,cAAeuG,CAAS,CAAC,EAE1C,IAAMgC,EAAyB5K,GAAQ,IACjCqC,EAAM,OAASsI,EAAwBtI,EAAM,MAC7CqG,EAAmBH,EAEhB,KACN,CAAClG,EAAM,MAAOsI,EAAiBjC,EAAYH,CAAO,CAAC,EAEhDsC,EAAkBC,GAA2B,CACjD,IAAIC,EAAU1I,EAAM,OAAS,KAAO,EAAE,cAAc,EAAI,EAAE,cAAc,EAExE,OAAIyI,IACFC,EAAU1I,EAAM,OAAS,KAAO,EAAE,SAAS,EAAI,EAAE,SAAS,GAErD0I,CACT,EAEMhE,EAAiBvD,GAAkB,CACvCwF,EAAcxF,CAAK,EACnBnB,EAAM,SAASmB,CAAK,CACtB,EAIAzD,GAAU,IAAM,CACd8J,EAAUgB,EAAexI,EAAM,OAAO,aAAa,CAAC,EAE/CuG,GACHI,EAAc3G,EAAM,OAAO,eAAiB,EAAE,CAElD,EAAG,CAACA,EAAM,KAAMA,EAAM,OAAO,aAAa,CAAC,EAE3C,IAAMqH,EAAU,IAAM,CACpBG,EAAUxH,EAAM,OAAS,KAAO,EAAE,SAAS,EAAI,EAAE,SAAS,CAAC,EAC3D0H,EAAe,EAAE,EACjBpB,EAAc,EAAI,EAClBE,EAAa,EAAI,CACnB,EAEMc,EAAS,IAAM,CACnBE,EAAUgB,EAAexI,EAAM,OAAO,aAAa,CAAC,EACpD0H,EAAe,MAAM,EACrBpB,EAAc,EAAK,EACnBE,EAAa,EAAK,EAClBxG,EAAM,SAAS0G,CAAU,CAC3B,EAEA,OACE7G,EAAClB,GAAM,QAAN,CACC,cAAaqB,EAAM,OACnB,OAAQuH,EACR,KAAM,KACN,YAAaE,EACb,MAAM,QACN,QAASJ,EACT,OAAQC,EACR,QAASiB,EACT,aAAc,CACZ,QAAS,CACP,KAAMvI,EAAM,OAAS,KAAO,MAAQ,QACtC,CACF,EACA,MAAOA,EAAM,MAAQ,SAAW,OAChC,aAAc,MACd,MAAO0G,EACP,WAAY,CACV,WAAY,4BACZ,KAAM,uBACN,OAAQ,sBACV,EAEA,cAAehC,EACf,WAAY,CACV9F,GAAe,gBACfA,GAAe,YAAYoB,EAAM,UAAY,CAAC,EAC9CpB,GAAe,iBACjB,EACF,CAEJ,EAIMwJ,GAAgBpI,GAWhB,CACJ,IAAM2I,EACJ3I,EAAM,OAAS,KAAO,mBAAqB,mBAE7C,OACEF,GAACpB,GAAA,CAAK,KAAM,EAAG,KAAM,EACnB,UAAAmB,EAACwI,GAAA,CACC,OAAQrI,EAAM,SAAS,MACvB,KAAMA,EAAM,KACZ,MAAOA,EAAM,MACb,OAAQA,EAAM,QAAU,GACxB,SAAW6H,GAAU,CACnB7H,EAAM,SAAS2I,EAAUd,CAAK,CAChC,EACA,SAAU7H,EAAM,SAClB,EAEAH,EAACiI,GAAA,CACC,QAAS,CACP,MAAO9H,EAAM,SAAS,OACtB,SAAUA,EAAM,SAAS,QAC3B,EACA,SAAUA,EAAM,SAChB,MAAO,OACP,SAAUA,EAAM,SAChB,KAAMA,EAAM,KACZ,OAAQ,CACN,IAAKA,EAAM,OAAO,IAClB,OAAQA,EAAM,OAAO,OACrB,UAAWA,EAAM,OAAO,SAAS,EACjC,IAAKA,EAAM,OAAO,GACpB,EACF,GACF,CAEJ,Eb7GU,OAuvBE,YAAAJ,GAjvBA,OAAAC,EANF,QAAAC,MAAA,oBArKH,IAAM8I,GAAyC5I,GAAU,CAC9D,GAAM,CACJ,KAAAuB,EACA,eAAAsH,EACA,cAAAC,EACA,WAAAC,EACA,OAAAC,EACA,eAAAC,EACA,OAAAC,EACA,OAAAC,EACA,UAAAC,EACA,UAAAC,EACA,QAAAlH,EACA,YAAAmH,EACA,UAAAC,CACF,EAAIvJ,EAEE,CAAE,YAAAwJ,CAAY,EAAI3L,GAAY,EAE9B,CAAE,EAAAsC,CAAE,EAAIpC,GAAe,EAEvB,CAAE,SAAAsH,CAAS,EAAI7F,GAAU,EAEzB,CAAE,OAAAiK,EAAQ,UAAAC,CAAU,EAAIN,EACxB,CAACd,EAAiBqB,CAAkB,EAAI/L,GAAS,EAAK,EACtD,CAACgM,EAAa3H,CAAc,EAAInE,GACpC,wBACA,EACF,EACM,CAACmC,EAAQ4J,CAAS,EAAI/L,GAC1B,kCACA,EACF,EACM,CAACgM,EAAQC,EAAS,EAAIjM,GAAgB,uBAAwB,EAAK,EAEnE,CAACkM,GAAUC,EAAW,EAAInM,GAAgB,mBAAoB,IAAK,CACvE,UAAaqD,GACJ,CAACA,GAASA,IAAU,KAAO,IAAM,KAAK,MAAMA,CAAK,CAE5D,CAAC,EAEK+I,GAAcvM,GAAQ,IACnB4D,IAASrD,EAAU,IACtBiC,EAAE,oBAAoB,EACtBA,EAAE,sBAAsB,EAC3B,CAACoB,EAAMpB,CAAC,CAAC,EAEZzC,GAAU,IAAM,CACVgM,GACFC,EAAmB,EAAI,CAE3B,EAAG,CAACD,CAAS,CAAC,EAGdhM,GAAU,IAAM,CACVsM,GACFlB,EAAc,WAAY,OAAOkB,EAAQ,CAAC,EAE1ClB,EAAc,WAAY,MAAS,CAEvC,EAAG,CAACkB,EAAQ,CAAC,EAEbtM,GAAU,IAAM,CACd,IAAMyM,EAAgBtC,GAAsB,CAC3BA,EAAM,OAEZ,QAAQ,4BAA4B,GAK7C8B,EAAoBS,IACdA,IACK,EAGV,CACH,EAEA,OAAI9B,EACF,SAAS,iBAAiB,QAAS6B,CAAY,EAE/C,SAAS,oBAAoB,QAASA,CAAY,EAG7C,IAAM,CACX,SAAS,oBAAoB,QAASA,CAAY,CACpD,CACF,EAAG,CAAC7B,CAAe,CAAC,EAEpB,IAAM+B,GAAW,IAAM,CACrBnB,EACG,SAAS,EACT,KACC,IACMU,EACK/K,GAAM,KAAK+D,GAAsB,CACtC,MAAOiG,EAEP,MAAOE,EAAW,MAClB,KAAMA,EAAW,KAEjB,QAASA,EAAW,SACpB,OAAQA,EAAW,OACrB,CAAC,EAGI,GAERU,GAAW,CACV,GAAIA,EAAO,SAET,OAAAlK,GAAM,MAAMY,EAAE,+BAA+B,CAAC,EACvC,QAAQ,OAAO,QAAQ,EAKhC,GAFAwJ,EAAmB,EAAI,EAEnB,OAAOF,GAAW,WAElBA,EAAO,OAAS,MAChBA,EAAO,gBAAkB,MACzBA,EAAO,aAAe,MACtBA,EAAO,eAAiB,MAExB,OAAO,QAAQ,OAAO,CAG5B,CACF,EACC,KAAK,IACGN,EAAO,CAAE,eAAgB,EAAM,CAAC,EAAE,KAAMmB,GAAgB,CACzDA,EAAO,SAGT/K,GAAM,MAAM+K,EAAO,OAAO,CAE9B,CAAC,CACF,EACA,MAAOhG,GAAU,CACZA,IAAU,UAKV,OAAOA,GAAU,UAAYA,EAAM,SACrC/E,GAAM,MAAM+E,EAAM,OAAO,CAM7B,CAAC,CACL,EAEMiG,GAAkBlF,GAAYrF,EAAM,SAE1C,OACEH,EAAC2D,GAAA,CAAmB,MAAO,CAAE,gBAAA8E,CAAgB,EAC3C,SAAAxI,EAAC,OACC,UAAW,2DACX,IAAKE,EAAM,aAGX,UAAAF,EAACrB,EAAA,CAAK,KAAM,EAAG,UAAU,2CACvB,UAAAqB,EAAC,OACC,UAAWvB,EACT,4EACAgM,GAAkB,kBAAoB,iBACxC,EAEA,UAAA1K,EAACxB,GAAA,CACC,QAAS,IAAM,CACb2B,EAAM,cAAc,OAAQ9B,EAAU,GAAG,CAC3C,EACA,KAAM,KACN,UAAS,GACT,YAAWA,EAAU,IAErB,UAAWK,EACTgD,IAASrD,EAAU,KAAO8B,EAAM,SAC5B,uFACA,kFACN,EACA,cAAY,wCAEX,SAAAG,EAAE,YAAY,EACjB,EACAN,EAACxB,GAAA,CACC,QAAS,IAAM,CACb2B,EAAM,cAAc,OAAQ9B,EAAU,IAAI,CAC5C,EACA,YAAWA,EAAU,KACrB,UAAS,GACT,KAAM,KAEN,UAAWK,EACTgD,IAASrD,EAAU,MAAQ8B,EAAM,SAC7B,oFACA,kFACN,EACA,cAAY,yCAEX,SAAAG,EAAE,aAAa,EAClB,EACCoK,IACC1K,EAACxB,GAAA,CACC,KAAM,KACN,UAAS,GACT,SACEwB,EAACvB,GAAA,CACC,KAAM,GACN,UAAU,4BACZ,EAEF,QAAS,IAAM,CACbO,GAAM,KAAKY,GAA2B,CACpC,gBAAiB+J,CACnB,CAAC,CACH,EACA,UAAWjL,EACT,+EACF,EAEC,SAAAmB,GAAgB8J,EAAa,CAAE,IAAK,CAAE,CAAC,EAAI,IAC9C,GAEJ,EACA3J,EAAC,OAAI,UAAW,2BACd,SAAAA,EAAC2K,GAAA,CACC,KAAM3B,EAAe,WACrB,KAAMtH,EACN,SAAUvB,EAAM,SAChB,SAAWK,GAAS,CAClByI,EAAc,aAAczI,CAAI,CAClC,EACF,EACF,GACF,EAEAP,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAK,KAAM,MAAQ,SAAAe,EAAE,kBAAkB,EAAE,EAC1CN,EAACT,EAAK,QAAL,CACC,KAAM2J,EAAW,MACjB,KAAM,MACN,UAAW,4BACX,cAAe,qCACf,GAAI,EACJ,QAAS,GAER,SAAA/I,EAAM,SAAWiJ,EAAiB,EACrC,GACF,EAEApJ,EAAC4K,GAAA,CACC,KAAMzK,EAAM,KACZ,WAAY+I,EACZ,OAAQ,CACN,SAAUF,EAAe,eACzB,MAAOA,EAAe,YACtB,cAAeA,EAAe,cAC9B,MAAOA,EAAe,MACtB,MAAOA,EAAe,MACtB,KAAMA,EAAe,KACrB,eAAgBA,EAAe,cACjC,EACA,OAAQa,EAAYD,EAAS,KAC7B,SAAU,CAAChD,EAAKtF,IAAU,CACxBnB,EAAM,cAAcyG,EAAKtF,CAAK,CAChC,EACA,eAAgBnB,EAAM,eACtB,KAAMA,EAAM,KACZ,OAAQA,EAAM,OACd,QAASA,EAAM,QACf,IAAK,CACH,UAAAqJ,EACA,QAAAlH,EACA,YAAAmH,EACA,UAAAC,CACF,EACA,yBAA0BvJ,EAAM,yBAClC,EAEAH,EAAC6K,GAAA,CACC,SAAU1K,EAAM,SAChB,OAAQgJ,EACR,qBAAsBhJ,EAAM,qBAC5B,MACG6I,EAAe,eAEZ,OAAOA,EAAe,cAAc,EADpC,EAGN,KAAME,EAAW,UACjB,GAAIA,EAAW,QACf,UAAW/I,EAAM,UACjB,cAAgBmB,GAAU,CACxB2H,EAAc,iBAAkB3H,CAAK,CACvC,EACA,KAAMnB,EAAM,KACd,EAEAH,EAACP,GAAA,CACC,UAAS,GACT,GAAI,4BAEJ,YAAWpB,EAAU,IACrB,UAAWK,EACTgD,IAASrD,EAAU,IACf,6HACA,0HACN,EACA,QAAS,IAAM,CACbmM,GAAS,CACX,EACA,QAASrK,EAAM,WACf,SAAU,CAACA,EAAM,SAEhB,SAAAkK,GACH,EAEArK,EAAC8K,GAAA,CACC,SAAU3K,EAAM,SAChB,MAAO+I,EAAW,MAClB,YAAa/I,EAAM,YACnB,YAAaA,EAAM,YACnB,gBAAiBA,EAAM,gBACvB,SAAUgK,GACV,GAAIjB,EAAW,SACf,YAAakB,GACb,YAAajK,EAAM,YACnB,UAAW6I,EAAe,WAC5B,EAEAhJ,EAACrB,GAAA,CAAQ,UAAU,aAAa,EAEhCqB,EAACmI,GAAA,CAGC,SAAUhI,EAAM,WAAW,SAC3B,YAAaA,EAAM,WACnB,gBAAiBA,EAAM,cACvB,UAAW6I,EAAe,WAC1B,OAAQa,EAAYD,EAAS,KAC7B,aAAcZ,EAAe,YAC7B,OAAQ,CACN,GAAI,CACF,cAAeA,EAAe,kBAAoB,GAClD,IAAKA,EAAe,QAAU,GAC9B,OAAQA,EAAe,WAAa,GACpC,UAAWA,EAAe,sBAAwB,GAClD,IAAKA,EAAe,QAAU,EAChC,EACA,GAAI,CACF,cAAeA,EAAe,kBAAoB,GAClD,IAAKA,EAAe,QAAU,GAC9B,OAAQA,EAAe,WAAa,GACpC,UAAWA,EAAe,sBAAwB,GAClD,IAAKA,EAAe,QAAU,EAChC,CACF,EACA,SAAU,CAACpC,EAAKtF,IAAU,CACxBnB,EAAM,cAAcyG,EAAKtF,CAAK,CAChC,EACF,EAEArB,EAACrB,EAAA,CACC,QAAS,UACT,UAAW,SACX,UAAU,yBAEV,UAAAqB,EAACrB,EAAA,CAAK,UAAW,SAAU,KAAM,EAC/B,UAAAoB,EAACV,GAAA,CACC,cAAY,0CACZ,UAAU,eACV,GAAI,aACJ,QAASa,EAAM,eAAe,YAC9B,gBAAkBM,GAAY,CAC5BN,EAAM,cAAc,cAAeM,CAAO,CAI5C,EACF,EACAT,EAAC,SAAM,QAAS,aAAc,UAAW,cACtC,SAAAM,EAAE,uBAAuB,EAC5B,GACF,EAEC,CAACF,GACAJ,EAAC+K,GAAA,CACC,OAAQ3K,EACR,UAAW4J,EACX,YAAaD,EACb,eAAgB3H,EAChB,cAAe6G,EACf,eAAgBD,EAAe,eAC/B,UACEA,EAAe,aAAkB1K,EAAU,OAC3C,CAAC6B,EAAM,WAET,OAAQ8J,EACR,UAAWC,GACb,GAEJ,EAEC9J,GACCH,EAAC1B,GAAA,CAAI,EAAG,EAAG,EAAG,KAAM,UAAW,IAAK,SAAU,WAC5C,UAAAyB,EAACW,GAAA,CACC,OAAQP,EACR,UAAW4J,EACX,YAAaD,EACb,eAAgB3H,EAChB,cAAe6G,EACf,eAAgBD,EAAe,eAC/B,UACEA,EAAe,aAAkB1K,EAAU,OAC3C,CAAC6B,EAAM,WAET,OAAQ8J,EACR,UAAWC,GACb,EACAlK,EAACgL,GAAA,CACC,QAAS,IAAM,CACbhB,EAAU,EAAK,CACjB,EACA,UAAW,+CACX,cAAY,sCACb,GACH,GAEJ,EACF,CAEJ,EAGMiB,GACJ,gfAEID,GAAa7K,GAA6C,CAC9D,GAAM,CAAC+K,EAAMC,CAAO,EAAIpN,GAASkN,EAAW,EAC5C,OACEjL,EAAC,UAAQ,GAAGG,EACV,SAAAH,EAAC,OACC,MAAO,GACP,OAAQ,GACR,QAAQ,YACR,KAAK,eACL,MAAM,6BACN,aAAc,IAAM,CAClBmL,EACE,60BACF,CACF,EACA,aAAc,IAAM,CAClBA,EAAQF,EAAW,CACrB,EACA,UAAU,2BAEV,SAAAjL,EAAC,QAAK,EAAGkL,EAAM,EACjB,EACF,CAEJ,EAGMN,GAAsBzK,GAiCtB,CACJ,GAAM,CAAE,KAAAK,EAAM,WAAA0I,EAAY,OAAAU,EAAQ,OAAA1D,EAAQ,QAAAsB,EAAS,OAAAC,EAAQ,IAAA2D,CAAI,EAAIjL,EAC7D,CAAE,EAAAG,CAAE,EAAIpC,GAAe,EAEvB,CAAE,cAAAoK,CAAc,EAAInK,GAA0ByL,CAAM,EAEpDyB,EAAWD,EAAI,iBAEfE,EACJ9K,IAASlC,EAAU,MACjB2B,EAACrB,EAAA,CAAK,UAAU,SAAS,UAAU,MAAM,UAAU,eAChD,UAAAsK,EAAW,MACZlJ,EAACpB,EAAA,CACC,OAAQ,GACR,GAAI,EACJ,QAAQ,SACR,UAAU,SACV,EAAE,OACF,UAAWF,EACT,6DACA0M,EAAI,iBACA,qBACA,qBACJA,EAAI,wBAAoC,wBAC1C,EACA,QAAS,IAAM,CACTA,EAAI,uBACNpM,GAAM,OAAO,CACX,MAAOsB,EAAE,aAAa,EACtB,KAAM,KACN,QACEN,EAACT,EAAA,CAAK,UAAW,GACd,SAAAe,EAAE,8BAA8B,EACnC,CAEJ,CAAC,EAED8K,EAAI,UAAU,CAElB,EAEA,SAAApL,EAACT,EAAA,CACC,UAAWb,EACT0M,EAAI,kBAA8B,mBAClCA,EAAI,mBAA+B,4BACnCA,EAAI,wBACF,2BACJ,EAEC,SAAA9K,EAAE,gBAAgB,EACrB,EACF,GACF,EAEA4I,EAAW,MAGf,OACEjJ,EAAC,OAAI,UAAW,gBACb,UAAAO,IAASlC,EAAU,YAAckC,IAASlC,EAAU,YACnD0B,EAAC,OAAI,UAAW,YACd,SAAAA,EAACuL,GAAA,CACC,MAAOjL,EAAE,gBAAgB,EACzB,OAAQ4I,EAAW,MACnB,MAAOZ,EAAc,eAAe,EACpC,GAAI,UACJ,IAAKnI,EAAM,KAAK,qBAChB,MAAO+F,EAAO,cACd,SAAWsF,GAAM,CACfrL,EAAM,SAAS,gBAAiBqL,CAAC,CACnC,EACA,WAAY,CAACzM,GAAe,YAAYmK,EAAW,QAAQ,CAAC,EAC5D,QAAS1B,GAA+B,EACxC,OAAQC,GAA8B,EACxC,EACF,EACE,KAEHjH,IAASlC,EAAU,OAASkC,IAASlC,EAAU,WAC9C2B,EAAC,OACC,IAAKE,EAAM,KAAK,uBAChB,UAAU,oCAEV,UAAAH,EAACuL,GAAA,CACC,MAAOjL,EAAE,cAAc,EACvB,OAAQgL,EACR,GAAI,QACJ,MAAOpF,EAAO,MACd,MAAOoC,EAAc,aAAa,EAClC,IAAKnI,EAAM,KAAK,cAEhB,SAAWqL,GAAM,CACfrL,EAAM,SAAS,cAAeqL,CAAC,CACjC,EACA,WAAY,CAACzM,GAAe,YAAYmK,EAAW,QAAQ,CAAC,EAC5D,QAAS1B,GAAuB,EAChC,OAAQC,GAAsB,EAC9B,SAAU4D,EACV,WAAY,CACV,KAAM3M,EAAG2M,GAAY,uCAAuC,EAC5D,MAAO3M,EAAG2M,GAAY,iBAAiB,CACzC,EACF,EACCD,EAAI,kBACHpL,EAAC,OAAI,UAAWtB,EAAG,sCAAsC,EACvD,SAAAsB,EAACyL,GAAA,CACC,MAAOL,EAAI,QACX,SAAUA,EAAI,YACd,aAAc,CACZ,MAAOjL,EAAM,wBACf,EACF,EACF,GAEJ,EACE,KAEJF,EAACpB,GAAA,CAAK,KAAM,EAAG,UAAW,0BACxB,UAAAmB,EAACuL,GAAA,CACC,MAAOjL,EAAE,YAAY,EACrB,OAAQ4I,EAAW,KACnB,GAAG,uBACH,KAAK,uBACL,UAAW,iBACX,MAAOhD,EAAO,SACd,MAAOoC,EAAc,gBAAgB,EACrC,SAAWkD,GAAM,CACfrL,EAAM,SAAS,iBAAkBqL,CAAC,CACpC,EACA,WAAY,CAACzM,GAAe,YAAYmK,EAAW,OAAO,CAAC,EAC3D,QAAS1B,GAA0B,EACnC,OAAQC,GAAyB,EACnC,EACAzH,EAACuL,GAAA,CACC,MAAO,GAAGjL,EAAE,cAAc,CAAC,SAC3B,OAAQ4I,EAAW,MACnB,GAAI,QACJ,UAAW,iBACX,MAAOhD,EAAO,MACd,MAAOoC,EAAc,OAAO,EAC5B,SAAWkD,GAAM,CACfrL,EAAM,SAAS,QAASqL,CAAC,CAC3B,EACA,QAAShE,GAAuB,EAChC,OAAQC,GAAsB,EAC9B,WAAY,CAAC1I,GAAe,YAAYmK,EAAW,QAAQ,CAAC,EAC9D,GACF,GACF,CAEJ,EAGMqC,GAAc5N,GAoBlB,CAACwC,EAAOkE,IAAQ,CAChB,GAAM,CAAE,gBAAAoE,CAAgB,EAAI7K,GAAW8F,EAAiB,EAClD,CAACkE,EAAaC,CAAc,EAAI9J,GAAiB,GAAG,EAC1D,OACEiC,EAAClB,GAAM,QAAN,CACC,IAAKuF,EACL,QAASoE,EAAkBtI,EAAM,MAAQ,OACzC,aAAc,MACd,UAAWA,EAAM,UACjB,KAAM,KACN,YAAaA,EAAM,SAAW,GAAKyH,EACnC,GAAIzH,EAAM,GACV,KAAMA,EAAM,KACZ,MAAOA,EAAM,MAAQ,SAAW,OAChC,OAAQH,EAAC0L,GAAA,CAAW,GAAIvL,EAAM,GAAK,SAAAA,EAAM,MAAM,EAC/C,OAAQA,EAAM,OACd,MAAOA,EAAM,SAAW,GAAKA,EAAM,OAAS,GAE5C,cAAeA,EAAM,SACrB,QAAU6H,GAAU,CAClBH,EAAe,EAAE,EACjB1H,EAAM,UAAU6H,CAAK,CACvB,EACA,OAASA,GAAU,CACjBH,EAAe,GAAG,EAClB1H,EAAM,SAAS6H,CAAK,CACtB,EACA,WAAY,CACV,GAAI7H,EAAM,YAAc,CAAC,EACzBpB,GAAe,gBACfA,GAAe,kBACfA,GAAe,qBACjB,EACA,WAAY,CACV,KAAML,EACJ,mLACAyB,EAAM,UACNA,EAAM,YAAY,IACpB,EACA,MAAOzB,EAAG,4BAA6ByB,GAAO,YAAY,KAAK,EAC/D,OAAQzB,EACN,kEACAyB,EAAM,YAAY,MACpB,EACA,OAAQzB,EACN,uGACAyB,EAAM,YAAY,MACpB,CACF,EACA,SAAUA,EAAM,SAClB,CAEJ,CAAC,EAEDoL,GAAY,YAAc,cAE1B,IAAMG,GAAcvL,GAEhBH,EAAC,SACC,QAASG,EAAM,GACf,UACE,+EAGD,SAAAA,EAAM,SACT,EAME0K,GAAkB1K,GAUlB,CACJ,GAAM,CAAE,SAAAwL,CAAS,EAAIxL,EACf,CAAE,EAAAG,CAAE,EAAIpC,GAAe,EAEvB0N,EAAQ9N,GACZ,IACE6N,EAAYxL,EAAM,OAAS9B,EAAU,IAAM,MAAQ,OAAU,OAC/D,CAAC8B,EAAM,KAAMwL,CAAQ,CACvB,EAEME,EAAW/N,GAAQ,IAChBqC,EAAM,OAAS9B,EAAU,IAC5BiC,EAAE,mBAAmB,EACrBA,EAAE,oBAAoB,EACzB,CAACH,EAAM,KAAMG,CAAC,CAAC,EAElB,OACEL,EAAC,OACC,UAAAD,EAACX,GAAO,OAAP,CACC,SAAUc,EAAM,SAAW,GAAK,CAACwL,EACjC,MAAOxL,EAAM,MACb,MAAOyL,EACP,UAAW,EACX,QAAO,GACP,IAAKzL,EAAM,OACX,KAAMA,EAAM,KACZ,cAAeA,EAAM,cACvB,EACAF,EAACrB,EAAA,CAAK,QAAS,UAAW,UAAU,uBAClC,UAAAoB,EAACT,EAAK,QAAL,CACC,KAAM,cACN,KAAM,MACN,MAAOqM,EACP,GAAI,EACJ,QAAS,GAER,SAAAD,EAAWxL,EAAM,qBAAuB,EAC3C,EACAF,EAACrB,EAAA,CACC,UAAAoB,EAAC,UACC,UAAWR,GAAa,CACtB,KAAM,MACN,UAAW,UACb,CAAC,EACD,QAAS,IAAMW,EAAM,UAAU,EAC/B,cAAY,4CAEX,SAAA0L,EACH,EACA7L,EAACT,EAAK,QAAL,CACC,KAAM,MACN,MAAOqM,EACP,GAAIzL,EAAM,GACV,QAAS,GACT,cAAY,qCAEX,SAAAwL,EAAWxL,EAAM,OAAS,EAC7B,GACF,GACF,GACF,CAEJ,EAIMwK,GAAmBxK,GAKnB,CACJ,GAAM,CAAE,CAAE,EAAIjC,GAAe,EAEvB+C,EAAU,CACd,CAAE,MAAO,EAAE,iCAAiC,EAAG,MAAO3C,EAAU,KAAM,EACtE,CAAE,MAAO,EAAE,kCAAkC,EAAG,MAAOA,EAAU,MAAO,EACxE,CAAE,MAAO,EAAE,gCAAgC,EAAG,MAAOA,EAAU,UAAW,EAC1E,CACE,MAAO,EAAE,iCAAiC,EAC1C,MAAOA,EAAU,WACnB,CACF,EACA,OACE0B,EAACZ,GAAO,QAAP,CACC,OAAO,yCACP,aAAce,EAAM,KACpB,MAAOA,EAAM,KACb,QAASc,EACT,cAAed,EAAM,SACrB,aAAc,CACZ,UAAW,0BACb,EACA,eAAgB,CAACmB,EAAOwK,IAAW,CAEjC,GAAI,CADS7K,EAAQ,KAAM8K,GAAMA,EAAE,QAAUzK,CAAK,EAEhD,OAAOtB,EAACT,EAAA,CAAK,KAAM,KAAO,SAAAuM,EAAO,YAAY,EAG/C,IAAME,EAAe,CACnB,CAAC1N,EAAU,KAAK,EAAG,EAAE,4BAA4B,EACjD,CAACA,EAAU,MAAM,EAAG,EAAE,oBAAoB,EAC1C,CAACA,EAAU,UAAU,EAAG,EAAE,gCAAgC,EAC1D,CAACA,EAAU,WAAW,EAAG,EAAE,iCAAiC,CAC9D,EAAEgD,CAAK,EAEP,OACEtB,EAACT,EAAA,CACC,KAAM,KACN,MACEY,EAAM,SACFA,EAAM,OAAS9B,EAAU,IACvB,MACA,OACF,OAGL,SAAA2N,EACH,CAEJ,EACA,KAAM,KACR,CAEJ,EAIA,SAASlB,GAAU3K,EAWhB,CACD,GAAM,CAAE,SAAAwL,CAAS,EAAIxL,EACf,CAAE,EAAAG,CAAE,EAAIpC,GAAe,EAE7B,OACE+B,EAAC,OAAI,UAAW,qCACd,UAAAA,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAK,KAAM,MAAQ,SAAAe,EAAE,wBAAwB,EAAE,EAChDN,EAACT,EAAK,QAAL,CACC,KAAMY,EAAM,MACZ,KAAM,MACN,GAAIA,EAAM,GACV,UAAW,4BACX,cAAe,qCAEd,SAAAwL,EAAYxL,EAAM,aAAe,KAAQ,KAC5C,GACF,EACAF,EAACrB,EAAA,CAAK,QAAS,UACb,UAAAoB,EAACT,EAAA,CAAK,KAAM,MAAQ,SAAAe,EAAE,0BAA0B,EAAE,EAClDL,EAACrB,EAAA,CACC,KAAM,EACN,UAAWY,GAAa,CACtB,KAAM,MACN,UAAW,EACb,CAAC,EAED,UAAAQ,EAACT,EAAK,QAAL,CAAa,KAAMoM,EAAW,IAAM,OAClC,SAAAA,EAAYxL,EAAM,iBAAmB,KAAQ,KAChD,EACCA,EAAM,aACLF,EAAAF,GAAA,CACE,UAAAC,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,EAAC,QACC,EAAE,oLACF,KAAK,OACL,YAAY,MACd,EACF,EAEAA,EAAC,QAAM,YAAGG,EAAM,WAAW,IAAI,GACjC,GAEJ,GAIF,EACCA,EAAM,YAAc7B,EAAU,QAC7B0B,EAAC0F,GAAA,CACC,SAAUvF,EAAM,SAChB,YAAaA,EAAM,YACnB,YAAaA,EAAM,YACrB,EAEFH,EAACwD,GAAA,EAAW,GACd,CAEJ,CAEA,SAASuH,GAAuB5K,EAU7B,CACD,GAAM,CAACiF,EAAMC,CAAO,EAAItH,GAAS,EAAK,EAEtC,OACEkC,EAACf,GAAA,CAAY,KAAMkG,EAAM,aAAcC,EACrC,UAAArF,EAACb,GAAA,CAAe,QAAO,GACrB,SAAAa,EAAC,UACC,cAAY,0CACZ,QAAS,IAAM,CACbqF,EAAQ,EAAI,CACd,EAEA,SAAArF,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,eACL,MAAM,6BACN,UAAU,+CAEV,SAAAA,EAAC,QACC,EAAE,wkCAGJ,EACF,EACF,EACF,EACAA,EAACf,GAAA,CAAe,KAAM,MAAO,MAAO,MAAO,UAAW,gBACpD,SAAAe,EAACW,GAAA,CAAsB,GAAGR,EAAO,EACnC,GACF,CAEJ,CAIA,IAAMsL,GAAsBtL,GAItB,CACJ,GAAM,CAAE,CAAE,EAAIjC,GAAe,EAEvB+C,EAAU,CACd,CACE,MAAO,EAAE,8BAA8B,EACvC,MAAO7C,GAAa,aACtB,EACA,CACE,MAAO,EAAE,8BAA8B,EACvC,MAAOA,GAAa,aACtB,EACA,CACE,MAAO,EAAE,uBAAuB,EAChC,MAAOA,GAAa,MACtB,EACA,CACE,MAAO,EAAE,uBAAuB,EAChC,MAAOA,GAAa,MACtB,CACF,EAEA,OACE4B,EAACZ,GAAO,QAAP,CACC,OAAO,6CACP,aAAce,EAAM,MACpB,MAAOA,EAAM,MACb,QAASc,EACT,cAAed,EAAM,SACrB,aAAc,CACZ,UAAW,2BACX,MAAOA,EAAM,YACf,EACA,KAAM,KACN,WAAY,CACV,QAAS,oCACX,EACA,eAAgB,CAACmB,EAAOwK,IAAW,CACjC,IAAM9G,EAAO/D,EAAQ,KAAM+D,GAASA,EAAK,QAAU1D,CAAK,EAExD,OACEtB,EAACzB,GAAA,CACC,SAAAyB,EAACT,EAAA,CAAK,KAAK,KAAM,SAAAyF,GAAM,MAAM,EAC/B,CAEJ,EACF,CAEJ,EkB3mCA,OAAS,aAAAnH,GAAW,UAAA+F,GAAoB,WAAA9F,GAAS,YAAAC,OAAgB,QACjE,OACE,cAAAkO,GACA,mBAAAC,GAEA,mBAAAjO,GACA,kBAAAkO,GACA,iBAAAC,GACA,SAAAC,OACK,yBACP,OAAS,iBAAAC,OAAqB,6BAC9B,OACE,gBAAAlO,GAEA,aAAAC,GACA,aAAAC,MACK,yBACP,OAAS,qBAAAiO,OAAyB,yBAClC,OAAS,4BAAAC,OAAgC,sBACzC,OAAS,WAAAnJ,GAAS,uBAAAoJ,OAA2B,yBAetC,IAAMC,GAAuBC,GAAmC,CACrE,GAAM,CAACC,EAAgBC,CAAiB,EAAI5O,GAC1C,iCACAK,EAAU,KACZ,EACM,CAACwO,EAAgBC,CAAiB,EAAI9O,GAC1C,iCACAI,GAAU,GACZ,EACM,CAAC2O,EAAcC,CAAe,EAAIhP,GAEtC,yBAA0B,MAAS,EAE/BiP,EAActJ,GAAqBoJ,CAAY,EAE/C,CAAE,eAAAhE,EAAgB,SAAA1E,EAAU,UAAA6I,EAAW,WAAAjE,EAAY,GAAGtI,CAAM,EAChEwL,GAAcO,EAAO,OAAQ,CAC3B,aAAc,CACZ,OAAQA,EAAO,OACf,WAAYC,EACZ,KAAME,CACR,CACF,CAAC,EACG,CAACM,EAAYC,CAAa,EAAIpP,GAClC,mCACA,EACF,EAEM,CAAE,MAAOqP,CAAa,EAAIrB,GAAW,EACrC,CAAE,aAAAsB,EAAc,gBAAAC,CAAgB,EAAIlB,GAAc,EAElDX,EAAW7N,GAAQ,IAErB,CAACyP,GACD,CAACC,IACAF,EAAa,SAAWf,GAAkB,eACzCe,EAAa,SAAWf,GAAkB,+BAE7C,CAACe,EAAa,OAAQC,EAAcC,CAAe,CAAC,EAEjD,CAAE,gBAAAC,CAAgB,EAAItB,GAAe,EACrCuB,EAAKxB,GAAgB,EAErByB,EAAoB/J,IAAgC,EACpDgK,EAAuBhK,GAAgC,IAAI,EAC3DiK,EAAgBjK,GAAgC,IAAI,EACpDkK,EAAyBlK,GAA8B,IAAI,EAC3D,CAACmK,EAA0BC,EAA2B,EAAIjQ,GAAS,CAAC,EAEpEkQ,GAAuBnQ,GAAQ,IAC/B,OAAOkL,EAAe,cAAc,GAAK,OAAOpI,EAAM,MAAM,EAAU,EAExE4L,GACE,OAAOxD,EAAe,gBAAkB,CAAC,EACzC,EACApI,EAAM,MACR,EAAI,IAEL,CAACoI,EAAe,eAAgBpI,EAAM,MAAM,CAAC,EAE1CsN,GAAY,IAAM,CACtB,GAAIhF,EAAW,UAAY,EAAG,OAC9B,IAAMiF,EAAW9B,GAAM,aACrBrD,GAAgB,eAChB,IAAI3F,GAAQ6F,GAAY,WAAa,GAAG,EAAE,SAAS,CACrD,EACA5E,EAAS,iBAAkB6J,EAAU,CACnC,6BAA8B,EAChC,CAAC,CACH,EAEM3G,GAAWhH,GAAqB2B,GAAkB,CACtDwL,EAAkB,QAAUnN,CAC9B,EAEMiH,GAAUjH,GAAqB2B,GAAkB,CACrD,WAAW,IAAM,CACXwL,EAAkB,UAAYnN,IAClCmN,EAAkB,QAAU,EAC9B,EAAG,GAAG,EAEFnN,IAAS,GACX0N,GAAU,CAEd,EAGME,GAAc,IAAM,CAExBjB,EAAU,CACR,iBAAkB,GAClB,iBAAkB,EACpB,CAAC,CACH,EAEMkB,EAAc,IAAM,CACxBlB,EAAU,CACR,eAAgB,MAClB,CAAC,CACH,EAEMmB,EAAY,IAAM,CACtBhK,EAAS,iBAAkB1D,EAAM,MAAM,CACzC,EAEMqI,GAAgB,CACpBrC,EACAtF,EACAL,IAGG,CAQH,GAPI2F,IAAQ,cACViG,EAAkBvL,CAAK,EAErBsF,IAAQ,QACVmG,EAAkBzL,CAAK,EAItBsF,IAAQ,eAAiBtF,GACzBsF,IAAQ,eACNtF,IAAUhD,EAAU,YAAcgD,IAAUhD,EAAU,aACzD,CAGA,IAAMiF,EAAO,CACX,iBAAkB,GAClB,iBAAkB,GAClB,CAACqD,CAAG,EAAGtF,CACT,EAEIsF,IAAQ,eACVrD,EAAK,eAA2B,IAGlC4J,EAAU5J,CAAI,EAEd,MACF,CAEA,GAAIqD,IAAQ,cAAgBtF,IAAUhD,EAAU,MAAO,CACrD,IAAMiF,EAAO,CACX,MAAO,OACP,eAAgB,OAChB,CAACqD,CAAG,EAAGtF,CACT,EAEA6L,EAAU5J,CAAI,EAEd,MACF,CAEAe,EAASsC,EAAKtF,EAAOL,CAAO,CAC9B,EAEMsN,GAAuB3N,GAAmB,CAC9CyM,EAAczM,CAAK,EACfA,EACFyN,EAAY,EAEZD,GAAY,CAEhB,EAEM5E,GAAY1L,GAAQ,IAEtBsP,GACA,CAAC9O,EAAU,UAAWA,EAAU,IAAKA,EAAU,GAAG,EAAE,SAClD0K,EAAe,cACjB,aAKKgE,GAAgBhE,EAAe,aAAe1K,EAAU,iBAG9D,CACD0O,EACAI,EACApE,EAAe,WACfA,EAAe,cACjB,CAAC,EAEKU,GAAY,IAAM,CAClBsD,GAEFC,EAAgB,MAAS,EAEzBE,EAAU,CACR,eAAgB,OAChB,MAAO,MACT,CAAC,GAEDF,EAAgBC,EAAY,SAAW9O,GAAa,aAAa,CAErE,EAEMqL,GAAenI,GAAwB,CAC3C2L,EAAgB3L,CAAK,EACrB4L,EAAY,QAAU5L,CACxB,EAEA,OAAAzD,GAAU,IAAM,CACd,GAAI2L,gBAAkC,CACpC,GAAM,CAAE,eAAArI,CAAe,EAAI6H,EAC3BmE,EAAU,CAER,eAAgBnM,GAAW,CAAE,eAAAG,CAAe,CAAC,EACzC,OACAA,EACJ,MAAO,MACT,CAAC,CACH,CACF,EAAG,CAACqI,GAAWR,EAAe,cAAc,CAAC,EAE7CnL,GAAU,IAAM,CACd,GAAI2L,UAA4B,CAC9B,IAAMgF,EAAYnN,GAAkB2L,EAAchE,EAAe,IAAK,EAChEyF,EAAajN,GAAmBwL,CAAY,EAClDG,EAAU,CACR,eAAgBqB,EAChB,MAAOC,CACT,CAAC,CACH,CACF,EAAG,CAACzB,EAAcxD,GAAWR,EAAe,IAAK,CAAC,EAgBlDnL,GAAU,IAAM,CACd,IAAM6Q,EAAoBC,GAAkB,CAC1CrK,EAAS,cAAeqK,CAAK,CAC/B,EACA,OAAAjB,EAAG,GAAG,oBAAqBgB,CAAgB,EAEpC,IAAM,CACXhB,EAAG,IAAI,oBAAqBgB,CAAgB,CAC9C,CACF,EAAG,CAAC,CAAC,EAEL7Q,GAAU,IAAM,CACd,IAAM+Q,EAAqBC,GAAoC,CAC7D,WAAW,IAAM,CACfA,GAAQ,MAAM,CAChB,EAAG,CAAC,CACN,EAGMC,EAA6B9J,GAAmB,CACpD,IAAM2J,EAAQlC,GAAoBzH,EAAK,CAAC,CAAC,EACnC,CAAE,WAAA9D,EAAY,eAAAC,EAAe,EAAI6H,EAGvC,GACE2E,EAAkB,UAAY,IAC7BzM,IAAe5C,EAAU,YACxB4C,IAAe5C,EAAU,aAC3B,CACAgG,EAAS,gBAAiBqK,CAAK,EAC/BC,EAAkBhB,EAAqB,OAAO,EAC9C,MACF,CAGA,GAAI5M,GAAW,CAAE,WAAAE,EAAY,eAAAC,EAAe,CAAC,EAAG,CAC9C8L,EAAgB,MAAS,EAEzBE,EAAU,CACR,eAAgB,OAChB,MAAO,MACT,CAAC,EAED,WAAW,IAAM,CAIfO,EAAG,KAAK,oBAAqBiB,CAAK,CACpC,EAAG,CAAC,EAEJC,EAAkBf,EAAc,OAAO,EACvC,MACF,CAGA,GACE3M,IAAe5C,EAAU,YACzB4C,IAAe5C,EAAU,MACzB,CACAgG,EAAS,cAAeqK,CAAK,EAC7BC,EAAkBf,EAAc,OAAO,EACvC,MACF,CAGA,GAAI3M,IAAe5C,EAAU,YAAa,CACxCgG,EAAS,gBAAiBqK,CAAK,EAC/BC,EAAkBhB,EAAqB,OAAO,EAC9C,MACF,CAGA,GAAI1M,IAAe5C,EAAU,OAAQ,CAEnC2O,EAAgB,MAAS,EAGzBE,EAAU,CACR,WAAY7O,EAAU,MACtB,YAAaqQ,CACf,CAAC,EAEDC,EAAkBf,EAAc,OAAO,EACvC,MACF,CAGAvJ,EAAS,cAAeqK,CAAK,EAC7BC,EAAkBf,EAAc,OAAO,CACzC,EAEA,OAAAH,EAAG,GAAG,uBAAwBoB,CAAyB,EAEhD,IAAM,CACXpB,EAAG,IAAI,uBAAwBoB,CAAyB,CAC1D,CAEF,EAAG,CAAC9F,EAAgBE,CAAU,CAAC,EAE/BrL,GAAU,IAAM,CACd,IAAMkR,EAAUjB,EAAuB,QAEvC,GAAI,CAACiB,EAAS,OAEd,IAAMC,EAAiB,IAAI,eAAgBC,GAAY,CACrD,QAAWC,KAASD,EAAS,CAC3B,IAAME,EAAQD,EAAM,YAAY,MAC5BC,GAEFnB,GAA4BmB,CAAK,CAErC,CACF,CAAC,EAED,OAAAH,EAAe,QAAQD,CAAO,EAEvB,IAAM,CACXC,EAAe,UAAUD,CAAO,CAClC,CACF,EAAG,CAACjB,EAAwB9E,EAAe,cAAc,CAAC,EAE1DnL,GAAU,IAAM,CAEd+C,EAAM,MAAM,EACZA,EAAM,eAAe,CACvB,EAAG,CAAC+L,EAAO,MAAM,CAAC,EAEX,CACL,GAAG/L,EACH,qBAAAqN,GACA,KAAMjF,EAAe,KACrB,KAAMA,EAAe,WACrB,MAAOA,EAAe,MACtB,cAAAC,GACA,eAAgBkE,EAEhB,gBAAAM,EAEA,eAAAzE,EAGA,WAAAoE,EACA,cAAemB,GACf,UAAAD,EACA,WAAApF,EACA,QAAA1B,GACA,OAAAC,GACA,KAAM,CACJ,qBAAAmG,EACA,cAAAC,EACA,uBAAAC,CACF,EAEA,SAAAnC,EAEA,UAAAnC,GACA,QAASwD,EACT,YAAAvD,GACA,UAAAC,GACA,yBAAAqE,CACF,CACF,ECzaS,cAAA/N,OAAA,oBANF,IAAMoP,GACXjP,GAGG,CACH,IAAMS,EAAQ8L,GAAoBvM,CAAK,EACvC,OAAOH,GAAC+I,GAAA,CAAY,GAAGnI,EAAO,aAAcT,EAAM,aAAc,CAClE","sourcesContent":["import React, {\n CSSProperties,\n FocusEventHandler,\n forwardRef,\n HTMLAttributes,\n PropsWithChildren,\n ReactNode,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n OrderValidationResult,\n useLeverage,\n useLocalStorage,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport {\n API,\n BBOOrderType,\n OrderLevel,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport {\n Box,\n Button,\n CaretRightIcon,\n cn,\n Divider,\n Flex,\n Grid,\n 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 useScreen,\n} from \"@orderly.network/ui\";\nimport { LeverageWidgetWithSheetId } from \"@orderly.network/ui-leverage\";\nimport { commifyOptional } from \"@orderly.network/utils\";\n// import { useBalanceScript } from \"../../trading/src/components/mobile/bottomNavBar/balance\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport { FeesWidget } from \"./components/fees\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { SlippageUI } from \"./components/slippage/slippage.ui\";\nimport { OrderTPSL } from \"./components/tpsl\";\nimport { type OrderEntryScriptReturn } from \"./orderEntry.script\";\nimport { InputType } from \"./types\";\nimport { BBOStatus } from \"./utils\";\n\ntype Refs = OrderEntryScriptReturn[\"refs\"];\n\ntype OrderEntryProps = OrderEntryScriptReturn & {\n containerRef: any;\n};\n\nexport const OrderEntry: React.FC<OrderEntryProps> = (props) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n bboStatus,\n bboType,\n onBBOChange,\n toggleBBO,\n } = props;\n\n const { curLeverage } = useLeverage();\n\n const { t } = useTranslation();\n\n const { isMobile } = useScreen();\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true,\n );\n const [pinned, setPinned] = useLocalStorage(\n \"orderly-order-additional-pinned\",\n true,\n );\n const [hidden, setHidden] = useLocalStorage(\"orderly-order-hidden\", false);\n\n const [slippage, setSlippage] = useLocalStorage(\"orderly-slippage\", \"1\", {\n parseJSON: ((value: string | null) => {\n return !value || value === '\"\"' ? \"1\" : JSON.parse(value);\n }) as any,\n });\n\n const buttonLabel = useMemo(() => {\n return side === OrderSide.BUY\n ? t(\"orderEntry.buyLong\")\n : t(\"orderEntry.sellShort\");\n }, [side, t]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n // set slippage\n useEffect(() => {\n if (slippage) {\n setOrderValue(\"slippage\", Number(slippage));\n } else {\n setOrderValue(\"slippage\", undefined);\n }\n }, [slippage]);\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 () => {\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 if (errors.slippage) {\n // toast.error(errors.slippage.message);\n toast.error(t(\"orderEntry.slippage.error.max\"));\n return Promise.reject(\"cancel\");\n }\n\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 )\n .then(() => {\n return submit({ resetOnSuccess: false }).then((result: any) => {\n if (result.success) {\n // setOrderValue(\"order_quantity\", \"\");\n } else {\n toast.error(result.message);\n }\n });\n })\n .catch((error) => {\n if (error === \"cancel\") {\n return;\n }\n // console.log(\"error--->>>>\", error);\n\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 const mergedShowSheet = isMobile && props.canTrade;\n\n return (\n <OrderEntryProvider value={{ errorMsgVisible }}>\n <div\n className={\"oui-space-y-2 oui-text-base-contrast-54 xl:oui-space-y-3\"}\n ref={props.containerRef}\n >\n {/* Buy Sell button */}\n <Flex gapX={2} className=\"oui-flex-col oui-gap-y-3 lg:oui-flex-row\">\n <div\n className={cn(\n \"oui-grid oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\",\n mergedShowSheet ? \"oui-grid-cols-3\" : \"oui-grid-cols-2\",\n )}\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n data-type={OrderSide.BUY}\n // color={side === OrderSide.BUY ? \"buy\" : \"secondary\"}\n className={cn(\n side === OrderSide.BUY && props.canTrade\n ? \"oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-buy-button\"\n >\n {t(\"common.buy\")}\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n data-type={OrderSide.SELL}\n fullWidth\n size={\"md\"}\n // color={side === OrderSide.SELL ? \"sell\" : \"secondary\"}\n className={cn(\n side === OrderSide.SELL && props.canTrade\n ? \"oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\"\n : \"oui-bg-base-7 oui-text-base-contrast-36 hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n data-testid=\"oui-testid-orderEntry-side-sell-button\"\n >\n {t(\"common.sell\")}\n </Button>\n {mergedShowSheet && (\n <Button\n size={\"md\"}\n fullWidth\n trailing={\n <CaretRightIcon\n size={12}\n className=\"oui-text-base-contrast-36\"\n />\n }\n onClick={() => {\n modal.show(LeverageWidgetWithSheetId, {\n currentLeverage: curLeverage,\n });\n }}\n className={cn(\n \"oui-bg-base-7 oui-text-primary-light hover:oui-bg-base-6 active:oui-bg-base-6\",\n )}\n >\n {commifyOptional(curLeverage, { fix: 2 }) + \"x\"}\n </Button>\n )}\n </div>\n <div className={\"oui-w-full lg:oui-flex-1\"}>\n <OrderTypeSelect\n type={formattedOrder.order_type!}\n side={side}\n canTrade={props.canTrade}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n </Flex>\n {/* Available */}\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"common.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 <ThrottledButton\n fullWidth\n id={\"order-entry-submit-button\"}\n // color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n data-type={OrderSide.BUY}\n className={cn(\n side === OrderSide.BUY\n ? \"orderly-order-entry-submit-button-buy oui-bg-success-darken hover:oui-bg-success-darken/80 active:oui-bg-success-darken/80\"\n : \"orderly-order-entry-submit-button-sell oui-bg-danger-darken hover:oui-bg-danger-darken/80 active:oui-bg-danger-darken/80\",\n )}\n onClick={() => {\n onSubmit();\n }}\n loading={props.isMutating}\n disabled={!props.canTrade}\n >\n {buttonLabel}\n </ThrottledButton>\n {/* Asset info */}\n <AssetInfo\n canTrade={props.canTrade}\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n slippage={slippage}\n dp={symbolInfo.quote_dp}\n setSlippage={setSlippage}\n estSlippage={props.estSlippage}\n orderType={formattedOrder.order_type!}\n />\n\n <Divider className=\"oui-w-full\" />\n {/* TP SL switch and content */}\n <OrderTPSL\n // onCancelTPSL={props.cancelTP_SL}\n // onEnableTP_SL={props.enableTP_SL}\n quote_dp={props.symbolInfo.quote_dp}\n switchState={props.tpslSwitch}\n onSwitchChanged={props.setTpslSwitch}\n orderType={formattedOrder.order_type!}\n errors={validated ? errors : null}\n isReduceOnly={formattedOrder.reduce_only}\n values={{\n tp: {\n trigger_price: formattedOrder.tp_trigger_price ?? \"\",\n PnL: formattedOrder.tp_pnl ?? \"\",\n Offset: formattedOrder.tp_offset ?? \"\",\n \"Offset%\": formattedOrder.tp_offset_percentage ?? \"\",\n ROI: formattedOrder.tp_ROI ?? \"\",\n },\n sl: {\n trigger_price: formattedOrder.sl_trigger_price ?? \"\",\n PnL: formattedOrder.sl_pnl ?? \"\",\n Offset: formattedOrder.sl_offset ?? \"\",\n \"Offset%\": formattedOrder.sl_offset_percentage ?? \"\",\n ROI: formattedOrder.sl_ROI ?? \"\",\n },\n }}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n />\n {/* reduce only switch and label */}\n <Flex\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"!oui-mt-0 xl:!oui-mt-3\"\n >\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n data-testid=\"oui-testid-orderEntry-reduceOnly-switch\"\n className=\"oui-h-[14px]\"\n id={\"reduceOnly\"}\n checked={props.formattedOrder.reduce_only}\n onCheckedChange={(checked) => {\n props.setOrderValue(\"reduce_only\", checked);\n // if (checked) {\n // props.setOrderValue(\"order_type_ext\", \"\");\n // }\n }}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n {t(\"orderEntry.reduceOnly\")}\n </label>\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {!pinned && (\n <AdditionalConfigButton\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n )}\n </Flex>\n {/* Additional info (fok,ioc、post only, order confirm hidden) */}\n {pinned && (\n <Box p={2} r={\"md\"} intensity={700} position={\"relative\"}>\n <AdditionalInfoWidget\n pinned={pinned}\n setPinned={setPinned}\n needConfirm={needConfirm}\n setNeedConfirm={setNeedConfirm}\n onValueChange={setOrderValue}\n orderTypeExtra={formattedOrder[\"order_type_ext\"]}\n showExtra={\n formattedOrder[\"order_type\"] === OrderType.LIMIT &&\n !props.tpslSwitch\n }\n hidden={hidden}\n setHidden={setHidden}\n />\n <PinButton\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-group oui-absolute oui-right-2 oui-top-2\"}\n data-testid=\"oui-testid-orderEntry-pinned-button\"\n ></PinButton>\n </Box>\n )}\n </div>\n </OrderEntryProvider>\n );\n};\n\n//------------------- pin button start -------------------\nconst defaultPath =\n \"M10.007 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.852-2.523 1.233.361 1.95.015 2.961-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103 5.35 5.35 0 0 0-2.104-1.312c-.448-.15-.808-.208-1.042-.208\";\n\nconst PinButton = (props: HTMLAttributes<HTMLButtonElement>) => {\n const [path, setPath] = useState(defaultPath);\n return (\n <button {...props}>\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onMouseEnter={() => {\n setPath(\n 'M10.008 1.302a.74.74 0 0 0-.486.214c-1.033.989-1.349 1.815-.972 2.948-.88.675-1.437.84-2.536.84-1.503 0-2.484.182-3.152.85v.02a1.583 1.583 0 0 0 0 2.248l1.867 1.882-3.181 3.18c-.26.26-.28.696-.02.956.261.26.699.26.959 0l3.193-3.194 1.87 1.861a1.585 1.585 0 0 0 2.25 0h.02c.668-.667.854-1.523.854-3.144 0-1.03.212-1.758.853-2.523 1.232.361 1.95.015 2.96-.995a.68.68 0 0 0 .188-.48c0-.234-.06-.593-.209-1.04a5.34 5.34 0 0 0-1.312-2.103A5.35 5.35 0 0 0 11.05 1.51c-.448-.15-.808-.208-1.042-.208m.258 1.37c.708.131 1.421.6 1.93 1.107.507.508.94 1.13 1.119 1.945-.636.61-1.026.658-1.662.323a.67.67 0 0 0-.779.117c-1.214 1.213-1.533 2.314-1.533 3.8 0 1.292-.076 1.773-.48 2.206-.113.123-.27.104-.374 0L3.799 7.486a.24.24 0 0 1-.017-.34c.239-.29.769-.515 2.226-.514 1.742.001 2.668-.448 3.812-1.52a.67.67 0 0 0 .125-.77c-.343-.686-.29-1.047.321-1.67\"',\n );\n }}\n onMouseLeave={() => {\n setPath(defaultPath);\n }}\n className=\"oui-text-primary-darken \"\n >\n <path d={path} />\n </svg>\n </button>\n );\n};\n\n//----------------- Order Quantity Input Component start -----------------\nconst OrderQuantityInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n errors: OrderValidationResult | null;\n values: {\n quantity?: string;\n price?: string;\n trigger_price?: string;\n total?: string;\n side?: OrderSide;\n level?: OrderLevel;\n order_type_ext?: OrderType;\n };\n onChange: (\n key:\n | \"order_quantity\"\n | \"order_price\"\n | \"trigger_price\"\n | \"total\"\n | \"order_type\"\n | \"order_type_ext\"\n | \"level\",\n value: any,\n ) => void;\n onValuesChange: (value: any) => void;\n refs: Refs;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n bbo: Pick<\n OrderEntryScriptReturn,\n \"bboStatus\" | \"bboType\" | \"onBBOChange\" | \"toggleBBO\"\n >;\n priceInputContainerWidth?: number;\n}) => {\n const { type, symbolInfo, errors, values, onFocus, onBlur, bbo } = props;\n const { t } = useTranslation();\n\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(errors);\n\n const readOnly = bbo.bboStatus === BBOStatus.ON;\n\n const priceSuffix =\n type === OrderType.LIMIT ? (\n <Flex direction=\"column\" itemAlign=\"end\" className=\"oui-text-2xs\">\n {symbolInfo.quote}\n <Flex\n height={20}\n px={3}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"base\"\n className={cn(\n \"oui-mt-[2px] oui-cursor-pointer oui-select-none oui-border\",\n bbo.bboStatus === BBOStatus.ON\n ? \"oui-border-primary\"\n : \"oui-border-line-12\",\n bbo.bboStatus === BBOStatus.DISABLED && \"oui-cursor-not-allowed\",\n )}\n onClick={() => {\n if (bbo.bboStatus === BBOStatus.DISABLED) {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: (\n <Text intensity={54}>\n {t(\"orderEntry.bbo.disabled.tips\")}\n </Text>\n ),\n });\n } else {\n bbo.toggleBBO();\n }\n }}\n >\n <Text\n className={cn(\n bbo.bboStatus === BBOStatus.ON && \"oui-text-primary\",\n bbo.bboStatus === BBOStatus.OFF && \"oui-text-base-contrast-54\",\n bbo.bboStatus === BBOStatus.DISABLED &&\n \"oui-text-base-contrast-20\",\n )}\n >\n {t(\"orderEntry.bbo\")}\n </Text>\n </Flex>\n </Flex>\n ) : (\n symbolInfo.quote\n );\n\n return (\n <div className={\"oui-space-y-1\"}>\n {type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET ? (\n <div className={\"oui-group\"}>\n <CustomInput\n label={t(\"common.trigger\")}\n suffix={symbolInfo.quote}\n error={parseErrorMsg(\"trigger_price\")}\n id={\"trigger\"}\n ref={props.refs.triggerPriceInputRef}\n value={values.trigger_price}\n onChange={(e) => {\n props.onChange(\"trigger_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.TRIGGER_PRICE)}\n onBlur={onBlur(InputType.TRIGGER_PRICE)}\n />\n </div>\n ) : null}\n\n {type === OrderType.LIMIT || type === OrderType.STOP_LIMIT ? (\n <div\n ref={props.refs.priceInputContainerRef}\n className=\"oui-group oui-relative oui-w-full\"\n >\n <CustomInput\n label={t(\"common.price\")}\n suffix={priceSuffix}\n id={\"price\"}\n value={values.price}\n error={parseErrorMsg(\"order_price\")}\n ref={props.refs.priceInputRef}\n // helperText=\"Price per unit\"\n onChange={(e) => {\n props.onChange(\"order_price\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n readonly={readOnly}\n classNames={{\n root: cn(readOnly && \"focus-within:oui-outline-transparent \"),\n input: cn(readOnly && \"oui-cursor-auto\"),\n }}\n />\n {bbo.bboStatus === BBOStatus.ON && (\n <div className={cn(\"oui-absolute oui-bottom-1 oui-left-0\")}>\n <BBOOrderTypeSelect\n value={bbo.bboType}\n onChange={bbo.onBBOChange}\n contentStyle={{\n width: props.priceInputContainerWidth,\n }}\n />\n </div>\n )}\n </div>\n ) : null}\n\n <Grid cols={2} className={\"oui-group oui-space-x-1\"}>\n <CustomInput\n label={t(\"common.qty\")}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-r\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e);\n }}\n formatters={[inputFormatter.dpFormatter(symbolInfo.base_dp)]}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={`${t(\"common.total\")}≈`}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-l\"}\n value={values.total}\n error={parseErrorMsg(\"total\")}\n onChange={(e) => {\n props.onChange(\"total\", e);\n }}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n formatters={[inputFormatter.dpFormatter(symbolInfo.quote_dp)]}\n />\n </Grid>\n </div>\n );\n};\n\n// ----------- Custom Input Component start ------------\nconst CustomInput = forwardRef<\n HTMLInputElement,\n {\n label: string;\n suffix: ReactNode;\n 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-h-[54px] oui-rounded oui-border oui-border-solid oui-border-line oui-px-2 oui-py-1 group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className,\n props.classNames?.root,\n ),\n input: cn(\"oui-mb-1 oui-mt-5 oui-h-5\", props?.classNames?.input),\n prefix: cn(\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-justify-start oui-py-2 oui-text-2xs oui-text-base-contrast-36\",\n props.classNames?.suffix,\n ),\n }}\n readOnly={props.readonly}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (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-2xs oui-text-base-contrast-36\"\n }\n >\n {props.children}\n </label>\n );\n};\n\n// ----------- Custom Input Component end ------------\n\nconst QuantitySlider = (props: {\n canTrade: boolean;\n side: OrderSide;\n value: number;\n maxQty: number;\n currentQtyPercentage: number;\n tick: number;\n dp: number;\n setMaxQty: () => void;\n onValueChange: (value: number) => void;\n}) => {\n const { canTrade } = props;\n const { t } = useTranslation();\n\n const color = useMemo(\n () =>\n canTrade ? (props.side === OrderSide.BUY ? \"buy\" : \"sell\") : undefined,\n [props.side, canTrade],\n );\n\n const maxLabel = useMemo(() => {\n return props.side === OrderSide.BUY\n ? t(\"orderEntry.maxBuy\")\n : t(\"orderEntry.maxSell\");\n }, [props.side, t]);\n\n return (\n <div>\n <Slider.single\n disabled={props.maxQty === 0 || !canTrade}\n value={props.value}\n color={color}\n markCount={4}\n showTip\n max={props.maxQty}\n step={props.tick}\n onValueChange={props.onValueChange}\n />\n <Flex justify={\"between\"} className=\"oui-pt-1 xl:oui-pt-2\">\n <Text.numeral\n rule={\"percentages\"}\n size={\"2xs\"}\n color={color}\n dp={2}\n padding={false}\n >\n {canTrade ? props.currentQtyPercentage : 0}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={() => props.setMaxQty()}\n data-testid=\"oui-testid-orderEntry-maxQty-value-button\"\n >\n {maxLabel}\n </button>\n <Text.numeral\n size={\"2xs\"}\n color={color}\n dp={props.dp}\n padding={false}\n data-testid=\"oui-testid-orderEntry-maxQty-value\"\n >\n {canTrade ? props.maxQty : 0}\n </Text.numeral>\n </Flex>\n </Flex>\n </div>\n );\n};\n\n// -----------Order type Select Component start ------------\n\nconst OrderTypeSelect = (props: {\n type: OrderType;\n onChange: (type: OrderType) => void;\n side: OrderSide;\n canTrade: boolean;\n}) => {\n const { t } = useTranslation();\n\n const options = [\n { label: t(\"orderEntry.orderType.limitOrder\"), value: OrderType.LIMIT },\n { label: t(\"orderEntry.orderType.marketOrder\"), value: OrderType.MARKET },\n { label: t(\"orderEntry.orderType.stopLimit\"), value: OrderType.STOP_LIMIT },\n {\n label: t(\"orderEntry.orderType.stopMarket\"),\n value: OrderType.STOP_MARKET,\n },\n ];\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-orderType-button\"\n currentValue={props.type}\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"xs\"}>{option.placeholder}</Text>;\n }\n\n const displayLabel = {\n [OrderType.LIMIT]: t(\"orderEntry.orderType.limit\"),\n [OrderType.MARKET]: t(\"common.marketPrice\"),\n [OrderType.STOP_LIMIT]: t(\"orderEntry.orderType.stopLimit\"),\n [OrderType.STOP_MARKET]: t(\"orderEntry.orderType.stopMarket\"),\n }[value];\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 {displayLabel}\n </Text>\n );\n }}\n size={\"md\"}\n />\n );\n};\n\n// -----------Order type Select Component end ------------\n\nfunction AssetInfo(props: {\n canTrade: boolean;\n quote: string;\n estLiqPrice: number | null;\n estLeverage: number | null;\n currentLeverage: number | null;\n slippage: string;\n dp: number;\n estSlippage: number | null;\n setSlippage: (slippage: string) => void;\n orderType: OrderType;\n}) {\n const { canTrade } = props;\n const { t } = useTranslation();\n\n return (\n <div className={\"oui-space-y-[2px] xl:oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"orderEntry.estLiqPrice\")}</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n dp={props.dp}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {canTrade ? (props.estLiqPrice ?? \"--\") : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>{t(\"leverage.accountLeverage\")}</Text>\n <Flex\n gapX={1}\n className={textVariants({\n size: \"2xs\",\n intensity: 80,\n })}\n >\n <Text.numeral unit={canTrade ? \"x\" : undefined}>\n {canTrade ? (props.currentLeverage ?? \"--\") : \"--\"}\n </Text.numeral>\n {props.estLeverage && (\n <>\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.505 4.997c0-.23.186-.416.416-.416H6.07L4.833 3.332l.586-.585 1.964 1.95a.42.42 0 0 1 .122.3.42.42 0 0 1-.122.3l-1.964 1.95-.586-.585L6.07 5.413H2.921a.416.416 0 0 1-.416-.416\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n\n <span>{`${props.estLeverage}x`}</span>\n </>\n )}\n </Flex>\n {/* <Text.numeral unit={\"x\"} size={\"2xs\"}>\n {props.estLeverage ?? \"--\"}\n </Text.numeral> */}\n </Flex>\n {props.orderType === OrderType.MARKET && (\n <SlippageUI\n slippage={props.slippage}\n setSlippage={props.setSlippage}\n estSlippage={props.estSlippage}\n />\n )}\n <FeesWidget />\n </div>\n );\n}\n\nfunction AdditionalConfigButton(props: {\n pinned: boolean;\n setPinned: (pinned: boolean) => void;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n orderTypeExtra?: OrderType;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n showExtra: boolean;\n hidden: boolean;\n setHidden: (hidden: boolean) => void;\n}) {\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n data-testid=\"oui-testid-orderEntry-additional-button\"\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white/[.36] hover:oui-fill-white/80\"\n >\n <path\n d=\"M3.332 2.665a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V3.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667V7.332a.667.667 0 0 0-.667-.667zm-8 4a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667zm4 0a.667.667 0 0 0-.667.667v1.333c0 .368.299.667.667.667h1.333a.667.667 0 0 0 .667-.667v-1.333a.667.667 0 0 0-.667-.667z\"\n // fill=\"#fff\"\n // fillOpacity={open ? 0.8 : 0.36}\n />\n </svg>\n </button>\n </PopoverTrigger>\n <PopoverContent side={\"top\"} align={\"end\"} className={\"oui-w-[230px]\"}>\n <AdditionalInfoWidget {...props} />\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\n// -----------BBO Select Component start ------------\n\nconst BBOOrderTypeSelect = (props: {\n value?: BBOOrderType;\n onChange: (value: BBOOrderType) => void;\n contentStyle?: CSSProperties;\n}) => {\n const { t } = useTranslation();\n\n const options = [\n {\n label: t(\"orderEntry.bbo.counterparty1\"),\n value: BBOOrderType.COUNTERPARTY1,\n },\n {\n label: t(\"orderEntry.bbo.counterparty5\"),\n value: BBOOrderType.COUNTERPARTY5,\n },\n {\n label: t(\"orderEntry.bbo.queue1\"),\n value: BBOOrderType.QUEUE1,\n },\n {\n label: t(\"orderEntry.bbo.queue5\"),\n value: BBOOrderType.QUEUE5,\n },\n ];\n\n return (\n <Select.options\n testid=\"oui-testid-orderEntry-bbo-orderType-button\"\n currentValue={props.value}\n value={props.value}\n options={options}\n onValueChange={props.onChange}\n contentProps={{\n className: \"oui-bg-base-8 oui-w-full\",\n style: props.contentStyle,\n }}\n size={\"sm\"}\n classNames={{\n trigger: \"oui-border-none oui-bg-transparent\",\n }}\n valueFormatter={(value, option) => {\n const item = options.find((item) => item.value === value);\n\n return (\n <Box>\n <Text size=\"sm\">{item?.label}</Text>\n </Box>\n );\n }}\n />\n );\n};\n\n// -----------BBO type Select Component end ------------\n","import { Checkbox, cn, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\nimport { useEffect } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport type AdditionalInfoProps = {\n pinned: boolean;\n setPinned: (value: boolean) => void;\n needConfirm: boolean;\n setNeedConfirm: (value: boolean) => void;\n orderTypeExtra?: OrderType;\n onValueChange?: (key: keyof OrderlyOrder, value: any) => void;\n showExtra?: boolean;\n hidden: boolean;\n setHidden: (value: boolean) => void;\n};\n\nexport const AdditionalInfo = (props: AdditionalInfoProps) => {\n const { pinned, orderTypeExtra } = props;\n const { t } = useTranslation();\n\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\"\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n\n useEffect(() => {\n props.onValueChange?.(\"visible_quantity\", props.hidden ? 0 : 1);\n }, [props.hidden]);\n\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n {/* {props.showExtra && (\n\n )} */}\n <Flex\n // gapX={3}\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n className=\"oui-gap-x-2 md:oui-gap-x-3\"\n wrap=\"wrap\"\n gapY={1}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-postOnly-checkBox\"\n id={\"toggle_order_post_only\"}\n className=\"oui-peer\"\n color={\"white\"}\n variant={\"radio\"}\n disabled={!props.showExtra}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.postOnly\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-ioc-checkBox\"\n id={\"toggle_order_iov\"}\n color={\"white\"}\n className=\"oui-peer\"\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.ioc\")}\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-fox-checkBox\"\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n className=\"oui-peer\"\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n disabled={!props.showExtra}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={cn(\n \"oui-text-2xs oui-ml-1 peer-data-[disabled]:oui-text-base-contrast-20\",\n \"oui-break-normal oui-whitespace-nowrap\"\n )}\n >\n {t(\"orderEntry.orderType.fok\")}\n </label>\n </Flex>\n </Flex>\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-orderConfirm-checkBox\"\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.orderConfirm\")}\n </label>\n </Flex>\n <Flex>\n <Checkbox\n data-testid=\"oui-testid-orderEntry-hidden-checkBox\"\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n checked={props.hidden}\n onCheckedChange={(checked: boolean) => {\n props.setHidden(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.hidden\")}\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n data-testid=\"oui-testid-orderEntry-additional-keepVisible-switch\"\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n {t(\"orderEntry.keepVisible\")}\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","export const useAdditionalScript = () => {\n // const [needConfirm, setNeedConfirm] = useLocalStorage(\n // \"orderly_order_confirm\",\n // true\n // );\n\n return {\n // needConfirm,\n // setNeedConfirm,\n };\n};\n","import { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo.ui\";\nimport { useAdditionalScript } from \"./additional.script\";\n\nexport const AdditionalInfoWidget = (props: AdditionalInfoProps) => {\n const state = useAdditionalScript();\n return <AdditionalInfo {...state} {...props} />;\n};\n","import {\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 { BBOOrderType, OrderSide, OrderType } from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { getBBOType, isBBOOrder } from \"../../utils\";\nimport { i18n, useTranslation } from \"@orderly.network/i18n\";\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 const { side, order_type, order_type_ext, level } = order;\n const { t } = useTranslation();\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const renderPrice = () => {\n if (\n order_type === OrderType.MARKET ||\n order_type === OrderType.STOP_MARKET\n ) {\n return <Text intensity={80}>{t(\"common.marketPrice\")}</Text>;\n }\n\n if (isBBOOrder({ order_type, order_type_ext })) {\n const bboType = getBBOType({\n type: order_type_ext!,\n side,\n level,\n });\n const label = {\n [BBOOrderType.COUNTERPARTY1]: t(\"orderEntry.bbo.counterparty1\"),\n [BBOOrderType.COUNTERPARTY5]: t(\"orderEntry.bbo.counterparty5\"),\n [BBOOrderType.QUEUE1]: t(\"orderEntry.bbo.queue1\"),\n [BBOOrderType.QUEUE5]: t(\"orderEntry.bbo.queue5\"),\n }[bboType!];\n\n return <Text intensity={80}>{label}</Text>;\n }\n\n return (\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={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 {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n {t(\"common.sell\")}\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n <Flex justify={\"between\"}>\n <Text>{t(\"common.qty\")}</Text>\n <Text.numeral\n rule={\"price\"}\n dp={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>{t(\"common.trigger\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={quoteDP}\n padding={false}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>{t(\"common.price\")}</Text>\n {renderPrice()}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={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>{t(\"orderEntry.tpMarkPrice\")}</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>{t(\"orderEntry.slMarkPrice\")}</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n coloring\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n dp={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 {t(\"orderEntry.disableOrderConfirm\")}\n </label>\n </Flex>\n\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <Box py={3} px={3} className=\"oui-text-center\">\n <Text color=\"warning\" size=\"xs\">\n {t(\"orderEntry.tpsl.trigger.description\")}\n </Text>\n </Box>\n ) : null}\n\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n {t(\"common.cancel\")}\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n {t(\"common.confirm\")}\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const { t } = useTranslation();\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return t(\"orderEntry.orderType.limit\");\n case OrderType.MARKET:\n return t(\"common.marketPrice\");\n case OrderType.STOP_LIMIT:\n return t(\"orderEntry.orderType.stopLimit\");\n case OrderType.STOP_MARKET:\n return t(\"orderEntry.orderType.stopMarket\");\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<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: () => i18n.t(\"orderEntry.orderConfirm\"),\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\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 React from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { Flex, Text } from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { useFeesScript } from \"./fees.script\";\n\nexport const FeesUI: React.FC<ReturnType<typeof useFeesScript>> = (props) => {\n const { t } = useTranslation();\n const { takerFeeRate, makerFeeRate } = props;\n return (\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"common.fees\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"portfolio.feeTier.column.taker\")}: --% /{\" \"}\n {t(\"portfolio.feeTier.column.maker\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text size=\"2xs\">{t(\"portfolio.feeTier.column.taker\")}:</Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {takerFeeRate}\n </Text>\n <Text size=\"2xs\">/</Text>\n <Text size=\"2xs\">{t(\"portfolio.feeTier.column.maker\")}:</Text>\n <Text size=\"2xs\" className=\"oui-text-base-contrast-80\">\n {makerFeeRate}\n </Text>\n </Flex>\n </AuthGuard>\n </Flex>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccountInfo } from \"@orderly.network/hooks\";\nimport { Decimal } from \"@orderly.network/utils\";\n\nexport const useFeesScript = () => {\n const { data } = useAccountInfo();\n\n const takerFeeRate = useMemo(() => {\n const value = data?.futures_taker_fee_rate;\n if (typeof value === \"undefined\") {\n return undefined;\n }\n return `${new Decimal(value).mul(0.01).toString()}%`;\n }, [data]);\n\n const makerFeeRate = useMemo(() => {\n const value = data?.futures_maker_fee_rate;\n if (typeof value === \"undefined\") {\n return undefined;\n }\n return `${new Decimal(value).mul(0.01).toString()}%`;\n }, [data]);\n\n return { takerFeeRate, makerFeeRate } as const;\n};\n","import React from \"react\";\nimport { useFeesScript } from \"./fees.script\";\nimport { FeesUI } from \"./fees.ui\";\n\nexport const FeesWidget: React.FC = () => {\n const state = useFeesScript();\n return <FeesUI {...state} />;\n};\n","import { createContext } from \"react\";\n\nexport type OrderEntryContextState = {\n errorMsgVisible: boolean;\n};\n\nexport const OrderEntryContext = createContext<OrderEntryContextState>(\n {} as OrderEntryContextState\n);\n\nexport const OrderEntryProvider = OrderEntryContext.Provider;\n","import { useRef } from \"react\";\nimport { useBoolean } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n EditIcon,\n Flex,\n Text,\n SimpleDialog,\n useScreen,\n} from \"@orderly.network/ui\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport { SlippageEditor } from \"./slippageEditor\";\n\nexport const SlippageCell = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n const { t } = useTranslation();\n const [open, { setTrue: setOpen, setFalse: setClose, toggle }] =\n useBoolean(false);\n\n const { isMobile } = useScreen();\n const slippageRef = useRef<{ getValue: () => number | undefined }>(null);\n\n const onConfirm = () => {\n const val = slippageRef.current?.getValue();\n\n props.setSlippage(!val ? \"1\" : val.toString());\n setClose();\n return Promise.resolve(true);\n };\n\n return (\n <>\n <SimpleDialog\n open={open}\n onOpenChange={toggle}\n title={t(\"common.settings\")}\n contentProps={{ size: isMobile ? \"xs\" : \"sm\" }}\n actions={{\n primary: {\n disabled: false,\n label: t(\"common.save\"),\n onClick: onConfirm,\n },\n secondary: {\n label: t(\"common.cancel\"),\n onClick: () => setClose(),\n },\n }}\n >\n <SlippageEditor\n ref={slippageRef}\n isMobile={isMobile}\n initialValue={props.slippage ? Number(props.slippage) : undefined}\n />\n </SimpleDialog>\n <Flex justify={\"between\"}>\n <Text size=\"2xs\">{t(\"orderEntry.slippage\")}</Text>\n <AuthGuard\n fallback={() => (\n <Text size=\"2xs\">\n {t(\"orderEntry.slippage.est\")}: -% / {t(\"common.max\")}: --%\n </Text>\n )}\n >\n <Flex gap={1}>\n <Text.numeral\n size=\"2xs\"\n rule=\"percentages\"\n prefix={`${t(\"orderEntry.slippage.est\")}: `}\n suffix={` / ${t(\"common.max\")}: `}\n >\n {props.estSlippage ?? 0}\n </Text.numeral>\n <button className=\"oui-text-2xs\" onClick={() => setOpen()}>\n <Flex className=\"oui-gap-0.5\" as=\"span\">\n <Text size=\"2xs\" className=\"oui-text-primary\">\n {`${props.slippage || \"-\"}%`}\n </Text>\n <EditIcon\n className=\"oui-text-primary oui-hidden md:oui-block\"\n size={12}\n opacity={1}\n />\n </Flex>\n </button>\n </Flex>\n </AuthGuard>\n </Flex>\n </>\n );\n};\n","import {\n FC,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport {\n Box,\n cn,\n ExclamationFillIcon,\n Flex,\n Input,\n inputFormatter,\n modal,\n Text,\n Tooltip,\n TooltipTrigger,\n} from \"@orderly.network/ui\";\nimport { Decimal } from \"@orderly.network/utils\";\n\ninterface SlippageProps {\n initialValue?: number;\n isMobile?: boolean;\n}\n\nconst options = [0.01, 0.05, 0.1];\n\nexport const SlippageEditor = forwardRef<\n { getValue: () => number | undefined },\n SlippageProps\n>((props, ref) => {\n const { t } = useTranslation();\n const [value, setValue] = useState<number>();\n const [customValue, setCustomValue] = useState(\"\");\n const [error, setError] = useState<string | undefined>(undefined);\n\n useImperativeHandle(ref, () => ({\n getValue: () =>\n customValue ? new Decimal(customValue)?.toNumber() : value,\n }));\n\n useEffect(() => {\n if (props.initialValue && !options.includes(props.initialValue!)) {\n setCustomValue(props.initialValue!.toString());\n } else {\n setValue(props.initialValue);\n }\n }, [props.initialValue, open]);\n\n const onClick = (val: number) => {\n setValue(val);\n setCustomValue(\"\");\n setError(undefined);\n };\n\n const onValueChange = (val: string) => {\n if (!val) {\n setCustomValue(val);\n return;\n }\n\n const d = new Decimal(val);\n setValue(undefined);\n if (d.gt(3)) {\n setCustomValue(\"3\");\n setError(t(\"orderEntry.slippage.error.exceed\"));\n } else {\n setCustomValue(val);\n setError(undefined);\n }\n };\n\n const toolTipButton = props.isMobile ? (\n <button\n onClick={() => {\n // setOpen(true)\n modal.alert({\n title: t(\"common.tips\"),\n message: <Text size=\"2xs\">{t(\"orderEntry.slippage.tips\")}</Text>,\n });\n }}\n >\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </button>\n ) : (\n <Tooltip\n // @ts-ignore\n content={\n <Text intensity={80} size=\"2xs\">\n {t(\"orderEntry.slippage.tips\")}\n </Text>\n }\n className=\"oui-w-[260px] oui-bg-base-6\"\n arrow={{ className: \"oui-fill-base-6\" }}\n >\n <TooltipTrigger>\n <ExclamationFillIcon className=\"oui-text-base-contrast-54\" size={16} />\n </TooltipTrigger>\n </Tooltip>\n );\n\n return (\n <div className=\"oui-text-2xs\">\n <Flex mb={2} gapX={1}>\n <Text size=\"xs\">{t(\"orderEntry.slippage\")}</Text>\n {toolTipButton}\n </Flex>\n <Flex gapX={2}>\n {options.map((item) => {\n const isActive = value === item;\n return (\n <SlippageItem\n key={item}\n value={item}\n isActive={isActive}\n onClick={() => {\n onClick(item);\n }}\n />\n );\n })}\n\n <Input\n suffix=\"%\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(2),\n ]}\n value={customValue}\n onValueChange={onValueChange}\n classNames={{\n root: cn(\n \"oui-rounded-md oui-bg-base-6\",\n \"oui-h-[40px] oui-w-[74px]\",\n ),\n input: \"oui-text-base-contrast\",\n additional: \"oui-pl-1\",\n }}\n />\n </Flex>\n {!!error && (\n <Box mt={5} className=\"-oui-mb-5\">\n <Text size=\"2xs\" color=\"danger\">\n {error}\n </Text>\n </Box>\n )}\n </div>\n );\n});\n\ntype SlippageItemProps = {\n value: number;\n isActive: boolean;\n onClick: () => void;\n};\n\nconst SlippageItem: FC<SlippageItemProps> = ({ value, isActive, onClick }) => {\n return (\n <Flex\n intensity={600}\n justify=\"center\"\n itemAlign=\"center\"\n r=\"md\"\n width={74}\n height={40}\n className={cn(\n \"oui-cursor-pointer oui-select-none\",\n isActive && \"oui-bg-primary-light\",\n )}\n onClick={onClick}\n >\n <Text size=\"sm\" intensity={80}>\n {value}%\n </Text>\n </Flex>\n );\n};\n","import { SlippageCell } from \"./components/slippageCell\";\n\nexport const SlippageUI = (props: {\n slippage: string;\n setSlippage: (slippage: string) => void;\n estSlippage: number | null;\n}) => {\n return <SlippageCell {...props} />;\n};\n","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { OrderValidationResult } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { useOrderEntryFormErrorMsg } from \"@orderly.network/react-app\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { OrderType } from \"@orderly.network/types\";\nimport {\n cn,\n Flex,\n Text,\n Input,\n inputFormatter,\n modal,\n Switch,\n} from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { ExclamationFillIcon } from \"@orderly.network/ui\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\n\ntype OrderValueKeys = keyof OrderlyOrder;\n\ntype Est_Values = PNL_Values & {\n trigger_price?: string;\n};\n\ntype TPSL_Values = { tp: Est_Values; sl: Est_Values };\n\nexport const OrderTPSL = (props: {\n // onCancelTPSL: () => void;\n // onEnableTP_SL: () => void;\n switchState: boolean;\n onSwitchChanged: (state: boolean) => void;\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n}) => {\n // const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n const { t } = useTranslation();\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n // setOpen(false);\n props.onSwitchChanged(false);\n\n // props.onCancelTPSL();\n }\n }, [props.orderType]);\n\n if (\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n )\n return null;\n\n return (\n <div>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"order_entry_tpsl\"}\n className=\"oui-h-[14px]\"\n checked={props.switchState}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n // setOpen(checked);\n props.onSwitchChanged(checked);\n // if (!checked) {\n // props.onCancelTPSL();\n // } else {\n // props.onEnableTP_SL();\n // }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n {t(\"common.tpsl\")}\n </label>\n <ExclamationFillIcon\n color=\"white\"\n // opacity={0.36}\n size={14}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-white/[.36] hover:oui-text-white/80\"\n onClick={() => {\n modal.dialog({\n title: t(\"common.tips\"),\n size: \"xs\",\n content: <Text intensity={54}>{t(\"orderEntry.tpsl.tips\")}</Text>,\n });\n }}\n />\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n props.switchState && \"oui-max-h-[100px]\",\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\n \"opacity\",\n props.switchState ? \"1\" : \"0\",\n );\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n quote_dp={props.quote_dp}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: OrderValidationResult | null;\n quote_dp: number | undefined;\n }\n>((props, ref) => {\n const { parseErrorMsg } = useOrderEntryFormErrorMsg(props.errors);\n\n return (\n <div\n ref={ref}\n className={\"oui-space-y-1 oui-px-px oui-py-2 oui-transition-all\"}\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={parseErrorMsg(\"tp_trigger_price\")}\n onChange={props.onChange}\n values={props.values.tp}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-tpPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-tpPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-tp-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={parseErrorMsg(\"sl_trigger_price\")}\n onChange={props.onChange}\n values={props.values.sl}\n quote_dp={props.quote_dp}\n testIds={{\n first: \"oui-testid-orderEntry-tpsl-slPrice-input\",\n second: \"oui-testid-orderEntry-tpsl-slPnl-input\",\n dropDown: \"oui-testid-orderEntry-tpsl-sl-dropDown-trigger-button\",\n }}\n />\n </PnlInputProvider>\n </div>\n );\n});\n\nTPSLInputForm.displayName = \"TPSLInputForm\";\n\n//------- TPSLTriggerPriceInput start -------\nconst TPSLTriggerPriceInput = (props: {\n type: \"TP\" | \"SL\";\n error: string | undefined;\n values: Est_Values;\n onChange: (value: string) => void;\n quote_dp: number | undefined;\n testId?: string;\n}) => {\n const { t } = useTranslation();\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const { tipsEle } = usePnlInputContext();\n const [prefix, setPrefix] = useState<string>(`${props.type} Price`);\n const [placeholder, setPlaceholder] = useState<string>(\"USDC\");\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const [innerValue, setInnerValue] = useState<string>(\n props.values.trigger_price ?? \"\",\n );\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(props.values.trigger_price ?? \"\");\n }, [props.values.trigger_price, isFocused]);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n const getPrefixLabel = (trigger_price?: string) => {\n let _prefix = props.type === \"TP\" ? t(\"tpsl.tpPrice\") : t(\"tpsl.slPrice\");\n\n if (trigger_price) {\n _prefix = props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\");\n }\n return _prefix;\n };\n\n const onValueChange = (value: string) => {\n setInnerValue(value);\n props.onChange(value);\n };\n\n // console.log(\"props.values.trigger_price\", props.values.trigger_price);\n\n useEffect(() => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n\n if (!isFocused) {\n setInnerValue(props.values.trigger_price ?? \"\");\n }\n }, [props.type, props.values.trigger_price]);\n\n const onFocus = () => {\n setPrefix(props.type === \"TP\" ? t(\"tpsl.tp\") : t(\"tpsl.sl\"));\n setPlaceholder(\"\");\n setTipVisible(true);\n setIsFocused(true);\n };\n\n const onBlur = () => {\n setPrefix(getPrefixLabel(props.values.trigger_price));\n setPlaceholder(\"USDC\");\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(innerValue);\n };\n\n return (\n <Input.tooltip\n data-testid={props.testId}\n prefix={prefix}\n size={\"md\"}\n placeholder={placeholder}\n align=\"right\"\n onFocus={onFocus}\n onBlur={onBlur}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={innerValue}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n root: \"oui-pr-2 md:oui-pr-3\",\n prefix: \"oui-pr-1 md:oui-pr-2\",\n }}\n // onChange={props.onChange}\n onValueChange={onValueChange}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(props.quote_dp ?? 2),\n inputFormatter.currencyFormatter,\n ]}\n />\n );\n};\n\n//------- TPSLTriggerPriceInput end -------\n\nconst TPSLInputRow = (props: {\n type: \"TP\" | \"SL\";\n values: Est_Values;\n error?: string;\n onChange: (key: OrderValueKeys, value: any) => void;\n quote_dp: number | undefined;\n testIds?: {\n first?: string;\n second?: string;\n dropDown?: string;\n };\n}) => {\n const priceKey =\n props.type === \"SL\" ? \"sl_trigger_price\" : \"tp_trigger_price\";\n\n return (\n <Grid cols={2} gapX={1}>\n <TPSLTriggerPriceInput\n testId={props.testIds?.first}\n type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(priceKey, event);\n }}\n quote_dp={props.quote_dp}\n />\n\n <PnlInputWidget\n testIds={{\n input: props.testIds?.second,\n dropDown: props.testIds?.dropDown,\n }}\n onChange={props.onChange}\n quote={\"USDC\"}\n quote_dp={props.quote_dp}\n type={props.type}\n values={{\n PnL: props.values.PnL,\n Offset: props.values.Offset,\n \"Offset%\": props.values[\"Offset%\"],\n ROI: props.values.ROI,\n }}\n />\n </Grid>\n );\n};\n","import {\n CaretDownIcon,\n cn,\n Flex,\n Input,\n MenuItem,\n Text,\n SimpleDropdownMenu,\n} from \"@orderly.network/ui\";\nimport { PNLInputState, PnLMode } from \"./useBuilder.script\";\nimport { inputFormatter } from \"@orderly.network/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n modeLabelMap,\n onModeChange,\n onValueChange,\n quote,\n quote_dp,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n } = props;\n\n const [prefix, setPrefix] = useState<string>(mode);\n\n const [placeholder, setPlaceholder] = useState<string>(\n mode === PnLMode.PERCENTAGE ? \"%\" : quote\n );\n\n useEffect(() => {\n setPrefix(mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n }, [mode]);\n\n useEffect(() => {\n setPrefix(!!value ? \"\" : mode);\n }, [value]);\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={modeLabelMap[prefix as keyof typeof modeLabelMap] || prefix}\n size={\"md\"}\n placeholder={placeholder}\n id={id}\n align={\"right\"}\n value={value}\n tooltip={tips}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n data-testid={props.testIds?.input}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_dp, mode, type }),\n inputFormatter.currencyFormatter,\n // inputFormatter.identifierFormatter(),\n ]}\n classNames={{\n root: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n additional: \"oui-text-base-contrast-54\",\n input: \"oui-text-inherit\",\n }}\n onFocus={() => {\n setPrefix(\"\");\n setPlaceholder(\"\");\n onFocus();\n }}\n onBlur={() => {\n setPrefix(!!value ? \"\" : mode);\n setPlaceholder(mode === PnLMode.PERCENTAGE ? \"%\" : quote);\n onBlur();\n }}\n suffix={\n <>\n {mode === PnLMode.PERCENTAGE && !!value && (\n <Text size={\"2xs\"} color=\"inherit\" className=\"oui-ml-[2px]\">\n %\n </Text>\n )}\n <PNLMenus\n mode={mode}\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n testId={props.testIds?.dropDown}\n />\n </>\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n mode?: string;\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n testId?: string;\n}) => {\n return (\n <SimpleDropdownMenu\n currentValue={props.mode}\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"} data-testid={props.testId}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values, quote_dp } = props;\n const { t } = useTranslation();\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const [innerValue, setInnerValue] = useState<string>(\n values[mode as keyof PNL_Values],\n );\n\n // const value = useMemo(() => {\n // // console.log(\"mode\", mode, values);\n // const value = values[mode as keyof PNL_Values];\n // // if (isFocused) {\n // // return value;\n // // }\n // return value;\n // }, [values, mode, isFocused]);\n\n useEffect(() => {\n if (isFocused) {\n return;\n }\n setInnerValue(values[mode as keyof PNL_Values]);\n }, [values, mode, isFocused]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n {\n label: t(\"tpsl.pnl\"),\n value: PnLMode.PnL,\n testId: `${PnLMode.PnL}_menu_item`,\n },\n {\n label: t(\"tpsl.offset\"),\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: `${t(\"tpsl.offset\")}%`,\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, [t]);\n\n const modeLabelMap = useMemo(() => {\n return {\n [PnLMode.PnL]: t(\"tpsl.pnl\"),\n [PnLMode.OFFSET]: t(\"tpsl.offset\"),\n [PnLMode.PERCENTAGE]: `${t(\"tpsl.offset\")}%`,\n };\n }, [t]);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n // console.log(\"onValueChange\", value);\n // if (!isFocused) {\n // props.onChange(key, value);\n // } else {\n // setInnerValue(value);\n // }\n setInnerValue(value);\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n setIsFocused(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n setIsFocused(false);\n props.onChange(key, innerValue);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions,\n ) => {\n value = `${value}`; // convert to string\n\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n // value = new Decimal(\n // value.replace(\n // new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n // \"\"\n // )\n // )\n // .mul(100)\n // .toString();\n\n // return `${todpIfNeed(value, 2)}${percentageSuffix.current}`;\n return `${new Decimal(\n value.replace(\n new RegExp(percentageSuffix.current.replace(\".\", \"\\\\.\") + \"$\"),\n \"\",\n ),\n )\n .mul(100)\n .todp(2, 4)\n .toString()}${percentageSuffix.current}`;\n // return (Number(value) * 100).toFixed(2);\n } else if (mode === PnLMode.OFFSET) {\n value = todpIfNeed(value, dp);\n } else {\n // value = new Decimal(value).todp(2).toString();\n }\n\n return `${value}`;\n },\n onSendBefore: (value: string) => {\n if (/^\\-?0{2,}$/.test(value)) {\n return \"0\";\n }\n\n // console.log(\"onSendBefore\", value);\n\n if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n // percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = todpIfNeed(value, 2);\n const endStr = value.match(/\\.0{0,2}$/);\n if (!!endStr) {\n percentageSuffix.current = endStr[0];\n } else {\n percentageSuffix.current = \"\";\n }\n value = new Decimal(value).div(100).toString();\n value = `${value}${percentageSuffix.current}`;\n }\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n modeLabelMap,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value: innerValue,\n onValueChange,\n quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import {\n createContext,\n PropsWithChildren,\n ReactNode,\n useContext,\n useMemo,\n} from \"react\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype TipType = \"ROI\" | \"PnL\" | \"Error\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n\nexport const PnlInputProvider = (\n props: PropsWithChildren<{\n values: PNL_Values & {\n trigger_price?: string;\n };\n type: \"TP\" | \"SL\";\n }>\n) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n const { t } = useTranslation();\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n \n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {mode === PnLMode.PnL\n ? t(\"orderEntry.estRoi\")\n : t(\"orderEntry.estPnL\")}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, props.values.PnL, props.values.trigger_price]);\n\n return (\n <PnlInputContext.Provider\n value={{\n mode,\n setMode,\n tipsEle,\n }}\n >\n {props.children}\n </PnlInputContext.Provider>\n );\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testIds?: {\n input?: string;\n dropDown?: string;\n };\n quote: string;\n }\n) => {\n const { testIds, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testIds={testIds} quote={quote} type={props.type} />\n );\n};\n","import { useEffect, useRef, FocusEvent, useMemo, useState } from \"react\";\nimport {\n useAccount,\n useEventEmitter,\n useLeverage,\n useLocalStorage,\n useMarginRatio,\n useOrderEntry,\n utils,\n} from \"@orderly.network/hooks\";\nimport { useAppContext } from \"@orderly.network/react-app\";\nimport {\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\nimport { Decimal, removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport {\n BBOStatus,\n getOrderLevelByBBO,\n getOrderTypeByBBO,\n isBBOOrder,\n} from \"./utils\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport type OrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const [localOrderType, setLocalOrderType] = useLocalStorage(\n \"orderly-order-entry-order-type\",\n OrderType.LIMIT,\n );\n const [localOrderSide, setLocalOrderSide] = useLocalStorage(\n \"orderly-order-entry-order-side\",\n OrderSide.BUY,\n );\n const [localBBOType, setLocalBBOType] = useLocalStorage<\n BBOOrderType | undefined\n >(\"orderly_order_bbo_type\", undefined);\n\n const lastBBOType = useRef<BBOOrderType>(localBBOType);\n\n const { formattedOrder, setValue, setValues, symbolInfo, ...state } =\n useOrderEntry(inputs.symbol, {\n initialOrder: {\n symbol: inputs.symbol,\n order_type: localOrderType,\n side: localOrderSide,\n },\n });\n const [tpslSwitch, setTpslSwitch] = useLocalStorage(\n \"orderly-order-entry-tp_sl-switch\",\n false,\n );\n\n const { state: accountState } = useAccount();\n const { wrongNetwork, disabledConnect } = useAppContext();\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (accountState.status === AccountStatusEnum.EnableTrading ||\n accountState.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [accountState.status, wrongNetwork, disabledConnect]);\n\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const 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 // 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 // unselect bbo\n setLocalBBOType(undefined);\n // update formattedOrder values immediately instead of via useEffect\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n } else {\n setLocalBBOType(lastBBOType.current || BBOOrderType.COUNTERPARTY1);\n }\n };\n\n const onBBOChange = (value: BBOOrderType) => {\n setLocalBBOType(value);\n lastBBOType.current = value;\n };\n\n useEffect(() => {\n if (bboStatus === BBOStatus.DISABLED) {\n const { order_type_ext } = formattedOrder;\n setValues({\n // if order_type_ext is not bbo(ask, bid), keep previous value\n order_type_ext: isBBOOrder({ order_type_ext })\n ? undefined\n : order_type_ext,\n level: undefined,\n });\n }\n }, [bboStatus, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n if (bboStatus === BBOStatus.ON) {\n const orderType = getOrderTypeByBBO(localBBOType, formattedOrder.side!);\n const orderLevel = getOrderLevelByBBO(localBBOType)!;\n setValues({\n order_type_ext: orderType,\n level: orderLevel,\n });\n }\n }, [localBBOType, bboStatus, formattedOrder.side!]);\n\n // useEffect(() => {\n // if (\n // priceInputContainerRef.current &&\n // // update BBO select width when is BBO order\n // isBBOOrder({ order_type_ext: formattedOrder.order_type_ext })\n // ) {\n // const width =\n // priceInputContainerRef.current.getBoundingClientRect()?.width;\n // if (width) {\n // setPriceInputContainerWidth(width);\n // }\n // }\n // }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n const updateOrderPrice = (price: string) => {\n setValue(\"order_price\", price);\n };\n ee.on(\"update:orderPrice\", updateOrderPrice);\n\n return () => {\n ee.off(\"update:orderPrice\", updateOrderPrice);\n };\n }, []);\n\n useEffect(() => {\n const focusInputElement = (target: HTMLInputElement | null) => {\n setTimeout(() => {\n target?.focus();\n }, 0);\n };\n\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n const price = removeTrailingZeros(item[0]);\n const { order_type, order_type_ext } = formattedOrder;\n\n // handle trigger price input, focus on trigger price input\n if (\n currentFocusInput.current === InputType.TRIGGER_PRICE &&\n (order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.STOP_MARKET)\n ) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle bbo order, unselect bbo and set order price, focus on order price input\n if (isBBOOrder({ order_type, order_type_ext })) {\n setLocalBBOType(undefined);\n\n setValues({\n order_type_ext: undefined,\n level: undefined,\n });\n\n setTimeout(() => {\n // Since BBO will update the price when unselected, we should set order price in setTimeout\n // We can't call setValue directly here because it's inside a setTimeout, and the formattedOrder accessed inside setValue would be the old value\n // setValue(\"order_price\", price);\n ee.emit(\"update:orderPrice\", price);\n }, 0);\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle limit order and stop limit order, set order price and focus on order price input\n if (\n order_type === OrderType.STOP_LIMIT ||\n order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // handle stop market order, set trigger price and focus on trigger price input\n if (order_type === OrderType.STOP_MARKET) {\n setValue(\"trigger_price\", price);\n focusInputElement(triggerPriceInputRef.current);\n return;\n }\n\n // handle market order, set order type to limit\n if (order_type === OrderType.MARKET) {\n // unselect bbo\n setLocalBBOType(undefined);\n\n // You can't call setValue twice here , the second value will override the first, so you need to combine them into a single setValues call\n setValues({\n order_type: OrderType.LIMIT,\n order_price: price,\n });\n\n focusInputElement(priceInputRef.current);\n return;\n }\n\n // default, set order price and focus on order price input\n setValue(\"order_price\", price);\n focusInputElement(priceInputRef.current);\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n // Please do not modify this deps lightly, because `setValue` also relies on these state internally\n }, [formattedOrder, symbolInfo]);\n\n useEffect(() => {\n const element = priceInputContainerRef.current;\n\n if (!element) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const width = entry.contentRect.width;\n if (width) {\n // update BBO order select dropdown width when priceInputContainerRef width changed\n setPriceInputContainerWidth(width);\n }\n }\n });\n\n resizeObserver.observe(element);\n\n return () => {\n resizeObserver.unobserve(element);\n };\n }, [priceInputContainerRef, formattedOrder.order_type_ext]);\n\n useEffect(() => {\n // after switching symbol, all the input number should be cleared (price, qty, TP/SL, etc)\n state.reset();\n state.resetMetaState();\n }, [inputs.symbol]);\n\n 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","import { OrderEntry } from \"./orderEntry.ui\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./orderEntry.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"]}
|