@orderly.network/ui-order-entry 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/orderEntry.ui.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/components/orderEntryContext.tsx","../src/components/dialog/confirm.ui.tsx","../src/components/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/useOrderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["AuthGuard","Box","Button","cn","Divider","Flex","Grid","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","toast","forwardRef","useContext","useEffect","useMemo","useState","OrderSide","OrderType","React","CaretDownIcon","SimpleDropdownMenu","useRef","Decimal","todpIfNeed","createContext","useLocalStorage","jsx","jsxs","PnlInputContext","usePnlInputContext","PnlInputProvider","props","type","values","mode","setMode","tipsEle","usePNLInputBuilder","tipVisible","setTipVisible","key","value","modes","percentageSuffix","options","dp","PNLInput","onModeChange","onValueChange","quote","quote_db","tips","onFocus","onBlur","id","PNLMenus","item","event","PnlInputWidget","testId","rest","state","OrderEntryContext","OrderEntryProvider","OrderTPSL","open","setOpen","tpslFormRef","checked","TPSLInputForm","ref","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","priceKey","Badge","Checkbox","registerSimpleDialog","Fragment","OrderConfirmDialog","baseDP","quoteDP","order","onConfirm","onCancel","side","order_type","symbol","_","setNeedConfirm","OrderTypeTag","typeStr","Dialog","close","resolve","reject","orderConfirmDialogId","AdditionalInfo","pinned","orderTypeExtra","onTypeToggle","useAdditionalScript","AdditionalInfoWidget","SDKError","OrderEntry","formattedOrder","setOrderValue","symbolInfo","maxQty","freeCollateral","helper","submit","metaState","refs","errors","validated","setErrorMsgVisible","needConfirm","setPinned","buttonLabel","clickHandler","visible","onSubmit","error","OrderTypeSelect","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","parseErrorMsg","CustomInput","e","InputLabel","color","option","o","useEventEmitter","useMarginRatio","useOrderEntryNext","removeTrailingZeros","convertValueToPercentage","useOrderEntryScript","inputs","setValue","setValues","currentLeverage","ee","currentFocusInput","triggerPriceInputRef","priceInputRef","currentQtyPercentage","orderBookItemClickHandler","focusInputElement","newType","target","cancelTP_SL","setMaxQty","OrderEntryWidget"],"mappings":"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","sourcesContent":["import { type uesOrderEntryScriptReturn } from \"./useOrderEntry.script\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport {\n Box,\n Button,\n cn,\n Divider,\n Flex,\n Grid,\n Input,\n inputFormatter,\n InputProps,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n Select,\n SelectItem,\n Slider,\n Switch,\n Text,\n textVariants,\n toast,\n} from \"@orderly.network/ui\";\nimport {\n FocusEventHandler,\n forwardRef,\n PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n API,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { OrderTPSL } from \"./components/tpsl\";\n\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { InputType } from \"./types\";\nimport { SDKError } from \"@orderly.network/types\";\n\ntype Refs = uesOrderEntryScriptReturn[\"refs\"];\n\nexport const OrderEntry = (\n props: uesOrderEntryScriptReturn & {\n containerRef: any;\n }\n) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n refs,\n } = props;\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n const [pinned, setPinned] = useLocalStorage(\n \"orderly-order-additional-pinned\",\n true\n );\n\n const buttonLabel = useMemo(() => {\n return side === OrderSide.BUY ? \"Buy / Long\" : \"Sell / Short\";\n }, [side]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n useEffect(() => {\n const clickHandler = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest(\"#order-entry-submit-button\")) {\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 = (): void => {\n helper\n .validate()\n .then(\n (order: any) => {\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n\n quote: symbolInfo.quote,\n base: symbolInfo.base,\n\n quoteDP: symbolInfo.quote_dp,\n baseDP: symbolInfo.base_dp,\n });\n }\n\n return true;\n },\n (errors) => {\n setErrorMsgVisible(true);\n }\n )\n .then(() => {\n return submit();\n })\n .catch((error) => {\n console.log(\"catch:\", error);\n if (error instanceof SDKError) {\n toast.error(`Error:${error.message}`);\n }\n });\n };\n\n return (\n <OrderEntryProvider\n value={{\n errorMsgVisible,\n }}\n >\n <div\n className={\"oui-space-y-3 oui-text-base-contrast-54\"}\n ref={props.containerRef}\n >\n <Flex gapX={2} className=\"oui-flex-col lg:oui-flex-row oui-gap-y-2\">\n <div\n className={\n \"oui-grid oui-grid-cols-2 oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\"\n }\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n color={side === OrderSide.BUY ? \"buy\" : \"secondary\"}\n >\n Buy\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n fullWidth\n size={\"md\"}\n color={side === OrderSide.SELL ? \"sell\" : \"secondary\"}\n >\n Sell\n </Button>\n </div>\n <div className={\"oui-w-full lg:oui-flex-1\"}>\n <OrderTypeSelect\n type={formattedOrder.order_type}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Available</Text>\n <Text.numeral\n unit={symbolInfo.quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-54\"}\n >\n {freeCollateral}\n </Text.numeral>\n </Flex>\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 }}\n errors={validated ? errors : null}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n refs={props.refs}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n />\n <QuantitySlider\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 <AuthGuard buttonProps={{ fullWidth: true }}>\n <Button\n fullWidth\n id={\"order-entry-submit-button\"}\n color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n onClick={() => {\n onSubmit();\n }}\n loading={props.isMutating}\n >\n {buttonLabel}\n </Button>\n </AuthGuard>\n <AssetInfo\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n />\n <Divider />\n <OrderTPSL\n onCancelTPSL={props.cancelTP_SL}\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 <Flex justify={\"between\"} itemAlign={\"center\"}>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"reduceOnly\"}\n checked={props.formattedOrder.reduce_only}\n onCheckedChange={(checked) => {\n props.setOrderValue(\"reduce_only\", checked);\n }}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n Reduce only\n </label>\n </Flex>\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={formattedOrder[\"order_type\"] === OrderType.LIMIT}\n />\n )}\n </Flex>\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={formattedOrder[\"order_type\"] === OrderType.LIMIT}\n />\n <button\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-absolute oui-top-2 oui-right-2\"}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.67 1.953A2.667 2.667 0 0 0 2.005 4.62v6.667a2.667 2.667 0 0 0 2.667 2.666h6.666a2.667 2.667 0 0 0 2.667-2.666V4.62a2.667 2.667 0 0 0-2.667-2.667zm1.334 3.334c.17 0 .349.057.48.187l1.52 1.52 1.52-1.52a.68.68 0 0 1 .48-.187c.17 0 .349.057.48.187.26.26.26.698 0 .958L8.962 7.954l1.52 1.52c.26.262.26.699 0 .96a.687.687 0 0 1-.958 0l-1.52-1.522-1.52 1.52a.687.687 0 0 1-.96 0 .687.687 0 0 1 0-.958l1.521-1.52-1.52-1.521a.687.687 0 0 1 0-.96.68.68 0 0 1 .479-.186\"\n fill=\"#fff\"\n fillOpacity=\".2\"\n />\n </svg>\n </button>\n </Box>\n )}\n </div>\n </OrderEntryProvider>\n );\n};\n\n//----------------- Order Quantity Input Component start -----------------\nconst OrderQuantityInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n errors: any;\n values: {\n quantity?: string;\n price?: string;\n trigger_price?: string;\n total?: string;\n };\n onChange: (\n key: \"order_quantity\" | \"order_price\" | \"trigger_price\" | \"total\",\n value: any\n ) => void;\n refs: Refs;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n}) => {\n const { type, symbolInfo, errors, values, onFocus, onBlur } = props;\n\n const parseErrorMsg = (key: string) => {\n if (errors && errors[key]) {\n return errors[key].message;\n }\n return \"\";\n };\n return (\n <div className={\"oui-space-y-1\"}>\n {type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET ? (\n <div className={\"oui-group\"}>\n <CustomInput\n label={\"Trigger\"}\n suffix={symbolInfo.quote}\n error={parseErrorMsg(\"trigger_price\")}\n id={\"trigger\"}\n ref={props.refs.triggerPriceInputRef}\n value={values.trigger_price}\n onChange={(e) => {\n props.onChange(\"trigger_price\", e.target.value);\n }}\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 className={\"oui-group\"}>\n <CustomInput\n label={\"Price\"}\n suffix={symbolInfo.quote}\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.target.value);\n }}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n />\n </div>\n ) : null}\n\n <Grid cols={2} className={\"oui-space-x-1 oui-group\"}>\n <CustomInput\n label={\"Quantity\"}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-br !oui-rounded-tr\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e.target.value);\n }}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={\"Total≈\"}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-bl !oui-rounded-tl\"}\n value={values.total}\n onChange={(e) => {\n props.onChange(\"total\", e.target.value);\n }}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n />\n </Grid>\n </div>\n );\n};\n\n// ----------- Custom Input Component start ------------\nconst CustomInput = forwardRef<\n HTMLInputElement,\n {\n label: string;\n suffix: string;\n id: string;\n className?: string;\n name?: string;\n onChange?: InputProps[\"onChange\"];\n value?: InputProps[\"value\"];\n autoFocus?: InputProps[\"autoFocus\"];\n error?: string;\n onFocus: InputProps[\"onFocus\"];\n onBlur: InputProps[\"onBlur\"];\n // helperText?: InputProps[\"helperText\"];\n }\n>((props, ref) => {\n const { errorMsgVisible } = useContext(OrderEntryContext);\n return (\n <Input.tooltip\n ref={ref}\n tooltip={errorMsgVisible ? props.error : undefined}\n autoComplete={\"off\"}\n autoFocus={props.autoFocus}\n size={\"lg\"}\n placeholder={\"0\"}\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.value}\n onChange={props.onChange}\n onFocus={props.onFocus}\n onBlur={props.onBlur}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n classNames={{\n root: cn(\n \"oui-relative oui-pt-8 oui-h-[54px] oui-px-2 oui-py-1 oui-pr-10 oui-border oui-border-solid oui-border-line oui-rounded group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className\n ),\n input: \"oui-mt-5 oui-mb-1 oui-h-5\",\n prefix:\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36\",\n suffix:\n \"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-36 oui-text-2xs\",\n }}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (props: PropsWithChildren<{ id: string }>) => {\n return (\n <label\n htmlFor={props.id}\n className={\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36 oui-text-2xs\"\n }\n >\n {props.children}\n </label>\n );\n};\n\n// ----------- Custom Input Component end ------------\n\nconst QuantitySlider = (props: {\n 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 color = useMemo(\n () => (props.side === OrderSide.BUY ? \"buy\" : \"sell\"),\n [props.side]\n );\n\n return (\n <div>\n <Slider.single\n disabled={props.maxQty === 0}\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\"} pt={2}>\n <Text.numeral rule={\"percentages\"} size={\"2xs\"} color={color}>\n {props.currentQtyPercentage}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={() => props.setMaxQty()}\n >\n Max buy\n </button>\n <Text.numeral size={\"2xs\"} color={color} dp={props.dp}>\n {props.maxQty}\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}) => {\n const options = [\n { label: \"Limit order\", value: OrderType.LIMIT },\n { label: \"Market order\", value: OrderType.MARKET },\n { label: \"Stop limit\", value: OrderType.STOP_LIMIT },\n { label: \"Stop market\", value: OrderType.STOP_MARKET },\n ];\n return (\n <Select.options\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"2xs\"}>{option.placeholder}</Text>;\n }\n return <Text size={\"2xs\"}>{item?.label.replace(\" order\", \"\")}</Text>;\n }}\n size={\"md\"}\n />\n );\n};\n\n// -----------Order type Select Component end ------------\n\nfunction AssetInfo(props: {\n quote: string;\n estLiqPrice: number | null;\n estLeverage: number | null;\n currentLeverage: number;\n}) {\n return (\n <div className={\"oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Est. Liq. price</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {props.estLiqPrice ?? \"--\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Account leverage</Text>\n <Flex\n gapX={1}\n className={textVariants({\n size: \"2xs\",\n intensity: 80,\n })}\n >\n <Text.numeral unit=\"x\">{props.currentLeverage}</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}) {\n // const []\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn, Flex, Input, Switch } from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\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 onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: any;\n}) => {\n const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n setOpen(false);\n\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 checked={open}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n setOpen(checked);\n if (!checked) {\n props.onCancelTPSL();\n }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n TP/SL\n </label>\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n open && \"oui-max-h-[100px]\"\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\"opacity\", open ? \"1\" : \"0\");\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: Record<string, { message: string }> | null;\n }\n>((props, ref) => {\n return (\n <div\n ref={ref}\n className={\"oui-transition-all oui-pt-2 oui-pb-2 oui-px-1 oui-space-y-1\"}\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={props.errors ? props.errors[\"tp_trigger_price\"]?.message : \"\"}\n onChange={props.onChange}\n values={props.values.tp}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={props.errors ? props.errors[\"sl_trigger_price\"]?.message : \"\"}\n onChange={props.onChange}\n values={props.values.sl}\n />\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: React.ChangeEventHandler<HTMLInputElement>;\n}) => {\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const { tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n return (\n <Input.tooltip\n prefix={\"TP Price\"}\n size={\"md\"}\n placeholder=\"USDC\"\n align=\"right\"\n onFocus={() => {\n setTipVisible(true);\n }}\n onBlur={() => {\n setTipVisible(false);\n }}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={props.values.trigger_price}\n classNames={{ additional: \"oui-text-base-contrast-54\" }}\n onChange={props.onChange}\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}) => {\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 type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(priceKey, event.target.value);\n }}\n />\n\n <PnlInputWidget\n onChange={props.onChange}\n quote={\"USDC\"}\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 { useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & {\n testId?: string;\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n onModeChange,\n onValueChange,\n quote,\n quote_db,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n } = props;\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={mode}\n size={\"md\"}\n placeholder={mode === PnLMode.PERCENTAGE ? \"%\" : quote}\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.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_db, mode, type }),\n inputFormatter.currencyFormatter,\n ]}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n input: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n }}\n onFocus={onFocus}\n onBlur={onBlur}\n suffix={\n <PNLMenus\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { commify, Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values } = props;\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const value = useMemo(() => {\n // console.log(\"mode\", mode, values);\n return values[mode as keyof PNL_Values];\n }, [values, mode]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions\n ) => {\n value = `${value}`; // convert to string\n\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(value).mul(100).todp(2, 4).toString()}${\n percentageSuffix.current\n }`;\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 if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = new Decimal(value).div(100).todp(4, 4).toString();\n }\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value,\n onValueChange,\n quote_db: props.quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import {\n createContext,\n PropsWithChildren,\n ReactNode,\n useContext,\n useMemo,\n} from \"react\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\n\ntype TipType = \"ROI\" | \"PnL\" | \"Error\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n\nexport const PnlInputProvider = (\n props: PropsWithChildren<{\n values: PNL_Values & {\n trigger_price?: string;\n };\n type: \"TP\" | \"SL\";\n }>\n) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {`Est.${mode === PnLMode.PnL ? \"ROI\" : \"PNL\"}:`}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, props.values.PnL, props.values.trigger_price]);\n\n return (\n <PnlInputContext.Provider\n value={{\n mode,\n setMode,\n tipsEle,\n }}\n >\n {props.children}\n </PnlInputContext.Provider>\n );\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testId?: string;\n quote: string;\n }\n) => {\n const { testId, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testId={testId} quote={quote} type={props.type} />\n );\n};\n","import { createContext } from \"react\";\n\nexport type OrderEntryContextState = {\n errorMsgVisible: boolean;\n};\n\nexport const OrderEntryContext = createContext<OrderEntryContextState>(\n {} as OrderEntryContextState\n);\n\nexport const OrderEntryProvider = OrderEntryContext.Provider;\n","import {\n Badge,\n Button,\n Checkbox,\n Divider,\n Flex,\n Grid,\n registerSimpleDialog,\n Text,\n textVariants,\n} from \"@orderly.network/ui\";\nimport { OrderSide, OrderType } from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\n\ntype Props = {\n order: OrderlyOrder;\n quoteDP: number;\n baseDP: number;\n\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: Props) => {\n const { baseDP, quoteDP, order, onConfirm, onCancel } = props;\n\n const { side, order_type, symbol } = order;\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\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.order_type} />\n {side === OrderSide.BUY ? (\n <Badge color={\"buy\"} size={\"sm\"}>\n Buy\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n <Flex justify={\"between\"}>\n <Text>Qty.</Text>\n <Text.numeral\n rule={\"price\"}\n dp={baseDP}\n className=\"oui-text-base-contrast\"\n >\n {order.order_quantity}\n </Text.numeral>\n </Flex>\n {!order.trigger_price ? null : (\n <Flex justify={\"between\"}>\n <Text>Trigger</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>Price</Text>\n {order.order_type === OrderType.MARKET ? (\n <Text intensity={80}>Market</Text>\n ) : (\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 >\n {order.order_price}\n </Text.numeral>\n )}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>Est. Total</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={quoteDP}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.total}\n </Text.numeral>\n </Flex>\n </div>\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n {order.tp_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>TP Price</Text>\n <Text.numeral\n unit={\"ETH\"}\n rule={\"price\"}\n coloring\n dp={quoteDP}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.tp_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n {order.sl_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>SL Price</Text>\n <Text.numeral\n unit={\"ETH\"}\n rule={\"price\"}\n coloring\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.sl_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n </div>\n </>\n ) : null}\n\n <Flex gapX={1} pt={8} pb={3}>\n <Checkbox\n id=\"orderConfirm\"\n color={\"white\"}\n onCheckedChange={(checked) => {\n setNeedConfirm(!!!checked);\n }}\n />\n <label\n htmlFor=\"orderConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n })}\n >\n Disable order confirmation\n </label>\n </Flex>\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n Cancel\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n Confirm\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return \"Limit\";\n case OrderType.MARKET:\n return \"Market\";\n case OrderType.STOP_LIMIT:\n return \"Stop Limit\";\n case OrderType.STOP_MARKET:\n return \"Stop Market\";\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<Props, \"onCancel\" | \"onConfirm\"> & {\n close: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n }\n) => {\n const { close, resolve, reject, ...rest } = props;\n\n return (\n <OrderConfirmDialog\n {...rest}\n onCancel={close}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: \"Order confirm\",\n});\n","import { Checkbox, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\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};\n\nexport const AdditionalInfo = (props: AdditionalInfoProps) => {\n const { pinned, orderTypeExtra } = props;\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\"\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n {props.showExtra && (\n <Flex\n gapX={5}\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n id={\"toggle_order_post_only\"}\n color={\"white\"}\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Post only\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n id={\"toggle_order_iov\"}\n color={\"white\"}\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n IOC\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n FOK\n </label>\n </Flex>\n </Flex>\n )}\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Order confirm\n </label>\n </Flex>\n <Flex>\n <Checkbox\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n onCheckedChange={(checked) => {\n props.onValueChange?.(\"visible_quantity\", checked ? 0 : 1);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Hidden\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Keep visible\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","export const useAdditionalScript = () => {\n // const [needConfirm, setNeedConfirm] = useLocalStorage(\n // \"orderly_order_confirm\",\n // true\n // );\n\n return {\n // needConfirm,\n // setNeedConfirm,\n };\n};\n","import { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo.ui\";\nimport { useAdditionalScript } from \"./additional.script\";\n\nexport const AdditionalInfoWidget = (props: AdditionalInfoProps) => {\n const state = useAdditionalScript();\n return <AdditionalInfo {...state} {...props} />;\n};\n","import { OrderSide, OrderType } from \"@orderly.network/types\";\nimport {\n useEventEmitter,\n useMarginRatio,\n useOrderEntryNext,\n} from \"@orderly.network/hooks\";\nimport { useEffect, useRef, FocusEvent, useMemo } from \"react\";\nimport { removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const { formattedOrder, setValue, setValues, symbolInfo, ...state } =\n useOrderEntryNext(inputs.symbol, {});\n\n // const [maxLeverage] = useLeverage();\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const triggerPriceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputRef = useRef<HTMLInputElement | null>(null);\n\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 onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\n };\n\n const onBlur = (type: InputType) => (_: FocusEvent) => {\n setTimeout(() => {\n if (currentFocusInput.current !== type) return;\n currentFocusInput.current = InputType.NONE;\n }, 300);\n\n // if (type === InputType.QUANTITY) {\n // formatQty();\n // }\n };\n\n useEffect(() => {\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n if (currentFocusInput.current === InputType.TRIGGER_PRICE) {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.STOP_MARKET\n ) {\n setValue(\"trigger_price\", removeTrailingZeros(item[0]));\n focusInputElement(triggerPriceInputRef.current);\n }\n } else {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n } else {\n let newType;\n\n if (formattedOrder.order_type === OrderType.STOP_MARKET) {\n newType = OrderType.STOP_LIMIT;\n } else if (formattedOrder.order_type === OrderType.MARKET) {\n newType = OrderType.LIMIT;\n }\n\n if (typeof newType !== \"undefined\") {\n setValue(\"order_type\", newType);\n }\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n }\n }\n\n function focusInputElement(target: HTMLInputElement | null) {\n setTimeout(() => {\n target?.focus();\n }, 0);\n }\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n console.log(\"useOrderEntry: removeListener\");\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n }, [formattedOrder.order_type]);\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 setMaxQty = () => {\n setValue(\"order_quantity\", state.maxQty);\n };\n\n return {\n ...state,\n currentQtyPercentage,\n side: formattedOrder.side as OrderSide,\n type: formattedOrder.order_type as OrderType,\n setOrderValue: setValue,\n\n currentLeverage,\n\n formattedOrder,\n cancelTP_SL,\n setMaxQty,\n symbolInfo,\n onFocus,\n onBlur,\n refs: {\n triggerPriceInputRef,\n priceInputRef,\n },\n };\n};\n\nexport type uesOrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n","import { OrderEntry } from \"./orderEntry.ui\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./useOrderEntry.script\";\n\nexport const OrderEntryWidget = (props: OrderEntryScriptInputs & {\n containerRef?: any;\n}) => {\n const state = useOrderEntryScript(props);\n return <OrderEntry {...state} containerRef={props.containerRef}/>;\n};\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,13 @@
1
+ import { AuthGuard } from '@orderly.network/ui-connector';
2
+ import { Grid, registerSimpleDialog, Input, inputFormatter, cn, Flex, Text, Badge, Divider, textVariants, Checkbox, Button, Switch, Box, Slider, Select, PopoverRoot, PopoverTrigger, PopoverContent, SimpleDropdownMenu, CaretDownIcon, modal, toast, convertValueToPercentage } from '@orderly.network/ui';
3
+ import pe, { createContext, forwardRef, useContext, useMemo, useState, useEffect, useRef } from 'react';
4
+ import { OrderSide, OrderType, SDKError } from '@orderly.network/types';
5
+ import { Decimal, todpIfNeed, removeTrailingZeros } from '@orderly.network/utils';
6
+ import { useLocalStorage, useOrderEntryNext, useMarginRatio, useEventEmitter } from '@orderly.network/hooks';
7
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
8
+
9
+ var le=createContext({}),H=()=>useContext(le),U=e=>{let{type:t,values:r}=e,[o,i]=useLocalStorage("TP/SL_Mode","Offset%"),l=useMemo(()=>!r.PnL||!e.values.trigger_price?null:jsxs(Flex,{children:[jsx("span",{className:"oui-text-xs oui-text-base-contrast-54",children:`Est.${o==="PnL"?"ROI":"PNL"}:`}),o==="PnL"?jsx(Text.numeral,{rule:"percentages",className:cn("oui-text-xs oui-ml-1",t==="TP"?"oui-text-trade-profit":"oui-text-trade-loss"),children:r.ROI}):jsx(Text.numeral,{rule:"price",className:cn("oui-text-xs oui-ml-1",t==="TP"?"oui-text-trade-profit":"oui-text-trade-loss"),children:r.PnL})]}),[o,e.values.PnL,e.values.trigger_price]);return jsx(le.Provider,{value:{mode:o,setMode:i,tipsEle:l},children:e.children})};var de=e=>{let{type:t,values:r}=e,{mode:o,setMode:i,tipsEle:l}=H(),[f,g]=useState(!1),u=useMemo(()=>{switch(o){case"Offset":return `${t.toLowerCase()}_offset`;case"Offset%":return `${t.toLowerCase()}_offset_percentage`;default:return `${t.toLowerCase()}_pnl`}},[o]),L=useMemo(()=>r[o],[r,o]),T=useMemo(()=>[{label:"PnL",value:"PnL",testId:"PnL_menu_item"},{label:"Offset",value:"Offset",testId:"Offset_mneu_item"},{label:"Offset%",value:"Offset%",testId:"Offset%_menu_item"}],[]),_=useRef("");return {mode:o,modes:T,formatter:m=>{let{dp:x=2}=m;return {onRenderBefore:(a,I)=>(a=`${a}`,t==="SL"&&o==="PnL"&&(a=a.startsWith("-")?a:"-"+a),a===""||a==="-"?"":o==="Offset%"?`${new Decimal(a).mul(100).todp(2,4).toString()}${_.current}`:(o==="Offset"&&(a=todpIfNeed(a,x)),`${a}`)),onSendBefore:a=>/^\-?0{2,}$/.test(a)?"0":(o==="Offset%"?a!==""&&(_.current=a.endsWith(".")?".":"",a=new Decimal(a).div(100).todp(4,4).toString()):a=todpIfNeed(a,x),a===""||a==="-"?"":a)}},onModeChange:m=>{i(m);},onFocus:()=>{g(!0);},onBlur:()=>{g(!1);},value:L,onValueChange:m=>{e.onChange(u,m);},quote_db:e.quote_dp,tips:f?l:void 0}};var ce=e=>{let{mode:t,modes:r,onModeChange:o,onValueChange:i,quote:l,quote_db:f,value:g,type:u,tips:L,onFocus:T,onBlur:_}=e,O=useMemo(()=>`${u.toLowerCase()}_${t.toLowerCase()}`,[]);return jsx(Input.tooltip,{prefix:t,size:"md",placeholder:t==="Offset%"?"%":l,id:O,align:"right",value:g,tooltip:L,tooltipProps:{content:{side:e.type==="TP"?"top":"bottom"}},"data-testid":e.testId,autoComplete:"off",onValueChange:i,formatters:[e.formatter({dp:f,mode:t,type:u}),inputFormatter.currencyFormatter],classNames:{additional:"oui-text-base-contrast-54",input:u==="TP"?"oui-text-trade-profit":"oui-text-trade-loss"},onFocus:T,onBlur:_,suffix:jsx(We,{modes:r,onModeChange:S=>o(S.value)})})},We=e=>jsx(SimpleDropdownMenu,{menu:e.modes,align:"end",size:"xs",className:"oui-min-w-[80px]",onCloseAutoFocus:t=>t.preventDefault(),onSelect:t=>e.onModeChange(t),children:jsx("button",{className:"oui-p-2",children:jsx(CaretDownIcon,{size:12,color:"white"})})});var me=e=>{let{testId:t,quote:r,...o}=e,i=de(o);return jsx(ce,{...i,testId:t,quote:r,type:e.type})};var z=createContext({}),fe=z.Provider;var xe=e=>{let[t,r]=useState(!1),o=pe.useRef(null);return useEffect(()=>{e.orderType!==OrderType.LIMIT&&e.orderType!==OrderType.MARKET&&(r(!1),e.onCancelTPSL());},[e.orderType]),e.orderType!==OrderType.LIMIT&&e.orderType!==OrderType.MARKET||e.isReduceOnly?null:jsxs("div",{children:[jsxs(Flex,{itemAlign:"center",gapX:1,children:[jsx(Switch,{id:"order_entry_tpsl",checked:t,disabled:e.orderType!==OrderType.LIMIT&&e.orderType!==OrderType.MARKET||e.isReduceOnly,onCheckedChange:i=>{r(i),i||e.onCancelTPSL();}}),jsx("label",{htmlFor:"order_entry_tpsl",className:"oui-text-xs",children:"TP/SL"})]}),jsx("div",{className:cn("oui-max-h-0 oui-overflow-hidden oui-transition-all",t&&"oui-max-h-[100px]"),onTransitionEnd:()=>{o.current?.style.setProperty("opacity",t?"1":"0");},children:jsx(Pe,{ref:o,onChange:e.onChange,values:e.values,errors:e.errors})})]})},Pe=pe.forwardRef((e,t)=>jsxs("div",{ref:t,className:"oui-transition-all oui-pt-2 oui-pb-2 oui-px-1 oui-space-y-1",children:[jsx(U,{values:e.values.tp,type:"TP",children:jsx(ge,{type:"TP",error:e.errors?e.errors.tp_trigger_price?.message:"",onChange:e.onChange,values:e.values.tp})}),jsx(U,{values:e.values.sl,type:"SL",children:jsx(ge,{type:"SL",error:e.errors?e.errors.sl_trigger_price?.message:"",onChange:e.onChange,values:e.values.sl})})]}));Pe.displayName="TPSLInputForm";var ot=e=>{let{errorMsgVisible:t}=useContext(z),{tipsEle:r}=H(),[o,i]=useState(!1),l=useMemo(()=>e.error&&t?e.error:o?r:null,[e.error,t,o,r]);return jsx(Input.tooltip,{prefix:"TP Price",size:"md",placeholder:"USDC",align:"right",onFocus:()=>{i(!0);},onBlur:()=>{i(!1);},tooltip:l,tooltipProps:{content:{side:e.type==="TP"?"top":"bottom"}},color:e.error?"danger":void 0,autoComplete:"off",value:e.values.trigger_price,classNames:{additional:"oui-text-base-contrast-54"},onChange:e.onChange})},ge=e=>{let t=e.type==="SL"?"sl_trigger_price":"tp_trigger_price";return jsxs(Grid,{cols:2,gapX:1,children:[jsx(ot,{type:e.type,error:e.error,values:e.values??"",onChange:r=>{e.onChange(t,r.target.value);}}),jsx(me,{onChange:e.onChange,quote:"USDC",type:e.type,values:{PnL:e.values.PnL,Offset:e.values.Offset,"Offset%":e.values["Offset%"],ROI:e.values.ROI}})]})};var Z=e=>{let{baseDP:t,quoteDP:r,order:o,onConfirm:i,onCancel:l}=e,{side:f,order_type:g,symbol:u}=o,[L,T]=useLocalStorage("orderly_order_confirm",!0);return jsxs(Fragment,{children:[jsxs(Flex,{justify:"between",children:[jsx(Text.formatted,{rule:"symbol",showIcon:!0,children:o.symbol}),jsxs(Flex,{justify:"end",gapX:1,children:[jsx(dt,{type:o.order_type}),f===OrderSide.BUY?jsx(Badge,{color:"buy",size:"sm",children:"Buy"}):jsx(Badge,{color:"sell",size:"sm",children:"Sell"})]})]}),jsx(Divider,{className:"oui-my-4"}),jsxs("div",{className:textVariants({size:"sm",intensity:54,className:"oui-space-y-1"}),children:[jsxs(Flex,{justify:"between",children:[jsx(Text,{children:"Qty."}),jsx(Text.numeral,{rule:"price",dp:t,className:"oui-text-base-contrast",children:o.order_quantity})]}),o.trigger_price?jsxs(Flex,{justify:"between",children:[jsx(Text,{children:"Trigger"}),jsx(Text.numeral,{unit:"USDC",rule:"price",className:"oui-text-base-contrast",unitClassName:"oui-text-base-contrast-36 oui-ml-1",children:o.trigger_price})]}):null,jsxs(Flex,{justify:"between",children:[jsx(Text,{children:"Price"}),o.order_type===OrderType.MARKET?jsx(Text,{intensity:80,children:"Market"}):jsx(Text.numeral,{unit:"USDC",rule:"price",className:"oui-text-base-contrast",unitClassName:"oui-text-base-contrast-36 oui-ml-1",children:o.order_price})]}),jsxs(Flex,{justify:"between",children:[jsx(Text,{children:"Est. Total"}),jsx(Text.numeral,{unit:"USDC",rule:"price",dp:r,className:"oui-text-base-contrast",unitClassName:"oui-text-base-contrast-36 oui-ml-1",children:o.total})]})]}),o.tp_trigger_price||o.sl_trigger_price?jsxs(Fragment,{children:[jsx(Divider,{className:"oui-my-4"}),jsxs("div",{className:textVariants({size:"sm",intensity:54,className:"oui-space-y-1"}),children:[o.tp_trigger_price&&jsxs(Flex,{justify:"between",children:[jsx(Text,{children:"TP Price"}),jsx(Text.numeral,{unit:"ETH",rule:"price",coloring:!0,dp:r,unitClassName:"oui-text-base-contrast-36 oui-ml-1",children:o.tp_trigger_price})]}),o.sl_trigger_price&&jsxs(Flex,{justify:"between",children:[jsx(Text,{children:"SL Price"}),jsx(Text.numeral,{unit:"ETH",rule:"price",coloring:!0,className:"oui-text-trade-loss",unitClassName:"oui-text-base-contrast-36 oui-ml-1",children:o.sl_trigger_price})]})]})]}):null,jsxs(Flex,{gapX:1,pt:8,pb:3,children:[jsx(Checkbox,{id:"orderConfirm",color:"white",onCheckedChange:_=>{T(!_);}}),jsx("label",{htmlFor:"orderConfirm",className:textVariants({size:"xs",intensity:54}),children:"Disable order confirmation"})]}),jsxs(Grid,{cols:2,gapX:3,children:[jsx(Button,{color:"secondary",size:"md",onClick:()=>l(),children:"Cancel"}),jsx(Button,{size:"md",onClick:()=>i(),children:"Confirm"})]})]})};Z.displayName="OrderConfirmDialog";var dt=e=>{let t=useMemo(()=>{switch(e.type){case OrderType.LIMIT:return "Limit";case OrderType.MARKET:return "Market";case OrderType.STOP_LIMIT:return "Stop Limit";case OrderType.STOP_MARKET:return "Stop Market";default:return ""}},[e.type]);return jsx(Badge,{color:"neutral",size:"sm",children:t})},ct=e=>{let{close:t,resolve:r,reject:o,...i}=e;return jsx(Z,{...i,onCancel:t,onConfirm:()=>{r(),t();}})},J="orderConfirm";registerSimpleDialog(J,ct,{size:"sm",title:"Order confirm"});var Ce=e=>{let{pinned:t,orderTypeExtra:r}=e,o=i=>l=>{e.onValueChange&&e.onValueChange("order_type_ext",l?i:"");};return jsxs("div",{className:"oui-text-base-contrast-54",children:[e.showExtra&&jsxs(Flex,{gapX:5,justify:t?"start":"between",mb:3,width:t?"unset":"100%",children:[jsxs(Flex,{itemAlign:"center",children:[jsx(Checkbox,{id:"toggle_order_post_only",color:"white",variant:"radio",checked:r===OrderType.POST_ONLY,onCheckedChange:o(OrderType.POST_ONLY)}),jsx("label",{htmlFor:"toggle_order_post_only",className:"oui-text-2xs oui-ml-1",children:"Post only"})]}),jsxs(Flex,{itemAlign:"center",children:[jsx(Checkbox,{id:"toggle_order_iov",color:"white",variant:"radio",checked:r===OrderType.IOC,onCheckedChange:o(OrderType.IOC)}),jsx("label",{htmlFor:"toggle_order_iov",className:"oui-text-2xs oui-ml-1",children:"IOC"})]}),jsxs(Flex,{itemAlign:"center",children:[jsx(Checkbox,{id:"toggle_order_fok",color:"white",variant:"radio",checked:r===OrderType.FOK,onCheckedChange:o(OrderType.FOK)}),jsx("label",{htmlFor:"toggle_order_fok",className:"oui-text-2xs oui-ml-1",children:"FOK"})]})]}),jsxs(Flex,{gapX:6,children:[jsxs(Flex,{children:[jsx(Checkbox,{id:"toggle_order_confirm",color:"white",checked:e.needConfirm,onCheckedChange:i=>{e.setNeedConfirm(!!i);}}),jsx("label",{htmlFor:"toggle_order_confirm",className:"oui-text-2xs oui-ml-1",children:"Order confirm"})]}),jsxs(Flex,{children:[jsx(Checkbox,{id:"toggle_order_hidden",color:"white",onCheckedChange:i=>{e.onValueChange?.("visible_quantity",i?0:1);}}),jsx("label",{htmlFor:"toggle_order_hidden",className:"oui-text-2xs oui-ml-1",children:"Hidden"})]})]}),!t&&jsxs(Fragment,{children:[jsx(Divider,{className:"oui-my-3"}),jsxs(Flex,{children:[jsx(Switch,{id:"toggle_order_keep_visible",onCheckedChange:i=>{e.setPinned(i);}}),jsx("label",{htmlFor:"toggle_order_keep_visible",className:"oui-text-2xs oui-ml-1",children:"Keep visible"})]})]})]})};var be=()=>({});var $=e=>{let t=be();return jsx(Ce,{...t,...e})};var te=e=>{let{side:t,formattedOrder:r,setOrderValue:o,symbolInfo:i,maxQty:l,freeCollateral:f,helper:g,submit:u,metaState:L,refs:T}=e,{errors:_,validated:O}=L,[S,w]=useState(!1),[V,m]=useLocalStorage("orderly_order_confirm",!0),[x,a]=useLocalStorage("orderly-order-additional-pinned",!0),I=useMemo(()=>t===OrderSide.BUY?"Buy / Long":"Sell / Short",[t]);useEffect(()=>{O&&w(!0);},[O]),useEffect(()=>{let d=A=>{A.target.closest("#order-entry-submit-button")||w(ne=>ne&&!1);};return S?document.addEventListener("click",d):document.removeEventListener("click",d),()=>{document.removeEventListener("click",d);}},[S]);let Me=()=>{g.validate().then(d=>V?modal.show(J,{order:r,quote:i.quote,base:i.base,quoteDP:i.quote_dp,baseDP:i.base_dp}):!0,d=>{w(!0);}).then(()=>u()).catch(d=>{d instanceof SDKError&&toast.error(`Error:${d.message}`);});};return jsx(fe,{value:{errorMsgVisible:S},children:jsxs("div",{className:"oui-space-y-3 oui-text-base-contrast-54",ref:e.containerRef,children:[jsxs(Flex,{gapX:2,className:"oui-flex-col lg:oui-flex-row oui-gap-y-2",children:[jsxs("div",{className:"oui-grid oui-grid-cols-2 oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]",children:[jsx(Button,{onClick:()=>{e.setOrderValue("side",OrderSide.BUY);},size:"md",fullWidth:!0,color:t===OrderSide.BUY?"buy":"secondary",children:"Buy"}),jsx(Button,{onClick:()=>{e.setOrderValue("side",OrderSide.SELL);},fullWidth:!0,size:"md",color:t===OrderSide.SELL?"sell":"secondary",children:"Sell"})]}),jsx("div",{className:"oui-w-full lg:oui-flex-1",children:jsx(Bt,{type:r.order_type,onChange:d=>{o("order_type",d);}})})]}),jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"2xs",children:"Available"}),jsx(Text.numeral,{unit:i.quote,size:"2xs",className:"oui-text-base-contrast-80",unitClassName:"oui-ml-1 oui-text-base-contrast-54",children:f})]}),jsx(wt,{type:e.type,symbolInfo:i,values:{quantity:r.order_quantity,price:r.order_price,trigger_price:r.trigger_price,total:r.total},errors:O?_:null,onChange:(d,A)=>{e.setOrderValue(d,A);},refs:e.refs,onBlur:e.onBlur,onFocus:e.onFocus}),jsx(kt,{maxQty:l,currentQtyPercentage:e.currentQtyPercentage,value:r.order_quantity?Number(r.order_quantity):0,tick:i.base_tick,dp:i.base_dp,setMaxQty:e.setMaxQty,onValueChange:d=>{o("order_quantity",d);},side:e.side}),jsx(AuthGuard,{buttonProps:{fullWidth:!0},children:jsx(Button,{fullWidth:!0,id:"order-entry-submit-button",color:t===OrderSide.BUY?"buy":"sell",onClick:()=>{Me();},loading:e.isMutating,children:I})}),jsx(At,{quote:i.quote,estLiqPrice:e.estLiqPrice,estLeverage:e.estLeverage,currentLeverage:e.currentLeverage}),jsx(Divider,{}),jsx(xe,{onCancelTPSL:e.cancelTP_SL,orderType:r.order_type,errors:O?_:null,isReduceOnly:r.reduce_only,values:{tp:{trigger_price:r.tp_trigger_price??"",PnL:r.tp_pnl??"",Offset:r.tp_offset??"","Offset%":r.tp_offset_percentage??"",ROI:r.tp_ROI??""},sl:{trigger_price:r.sl_trigger_price??"",PnL:r.sl_pnl??"",Offset:r.sl_offset??"","Offset%":r.sl_offset_percentage??"",ROI:r.sl_ROI??""}},onChange:(d,A)=>{e.setOrderValue(d,A);}}),jsxs(Flex,{justify:"between",itemAlign:"center",children:[jsxs(Flex,{itemAlign:"center",gapX:1,children:[jsx(Switch,{id:"reduceOnly",checked:e.formattedOrder.reduce_only,onCheckedChange:d=>{e.setOrderValue("reduce_only",d);}}),jsx("label",{htmlFor:"reduceOnly",className:"oui-text-xs",children:"Reduce only"})]}),!x&&jsx(qt,{pinned:x,setPinned:a,needConfirm:V,setNeedConfirm:m,onValueChange:o,orderTypeExtra:r.order_type_ext,showExtra:r.order_type===OrderType.LIMIT})]}),x&&jsxs(Box,{p:2,r:"md",intensity:700,position:"relative",children:[jsx($,{pinned:x,setPinned:a,needConfirm:V,setNeedConfirm:m,onValueChange:o,orderTypeExtra:r.order_type_ext,showExtra:r.order_type===OrderType.LIMIT}),jsx("button",{onClick:()=>{a(!1);},className:"oui-absolute oui-top-2 oui-right-2",children:jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:jsx("path",{d:"M4.67 1.953A2.667 2.667 0 0 0 2.005 4.62v6.667a2.667 2.667 0 0 0 2.667 2.666h6.666a2.667 2.667 0 0 0 2.667-2.666V4.62a2.667 2.667 0 0 0-2.667-2.667zm1.334 3.334c.17 0 .349.057.48.187l1.52 1.52 1.52-1.52a.68.68 0 0 1 .48-.187c.17 0 .349.057.48.187.26.26.26.698 0 .958L8.962 7.954l1.52 1.52c.26.262.26.699 0 .96a.687.687 0 0 1-.958 0l-1.52-1.522-1.52 1.52a.687.687 0 0 1-.96 0 .687.687 0 0 1 0-.958l1.521-1.52-1.52-1.521a.687.687 0 0 1 0-.96.68.68 0 0 1 .479-.186",fill:"#fff",fillOpacity:".2"})})})]})]})})},wt=e=>{let{type:t,symbolInfo:r,errors:o,values:i,onFocus:l,onBlur:f}=e,g=u=>o&&o[u]?o[u].message:"";return jsxs("div",{className:"oui-space-y-1",children:[t===OrderType.STOP_LIMIT||t===OrderType.STOP_MARKET?jsx("div",{className:"oui-group",children:jsx(Q,{label:"Trigger",suffix:r.quote,error:g("trigger_price"),id:"trigger",ref:e.refs.triggerPriceInputRef,value:i.trigger_price,onChange:u=>{e.onChange("trigger_price",u.target.value);},onFocus:l(1),onBlur:f(1)})}):null,t===OrderType.LIMIT||t===OrderType.STOP_LIMIT?jsx("div",{className:"oui-group",children:jsx(Q,{label:"Price",suffix:r.quote,id:"price",value:i.price,error:g("order_price"),ref:e.refs.priceInputRef,onChange:u=>{e.onChange("order_price",u.target.value);},onFocus:l(0),onBlur:f(0)})}):null,jsxs(Grid,{cols:2,className:"oui-space-x-1 oui-group",children:[jsx(Q,{label:"Quantity",suffix:r.base,id:"order_quantity_input",name:"order_quantity_input",className:"!oui-rounded-br !oui-rounded-tr",value:i.quantity,error:g("order_quantity"),onChange:u=>{e.onChange("order_quantity",u.target.value);},onFocus:l(2),onBlur:f(2)}),jsx(Q,{label:"Total\u2248",suffix:r.quote,id:"total",className:"!oui-rounded-bl !oui-rounded-tl",value:i.total,onChange:u=>{e.onChange("total",u.target.value);},onFocus:l(3),onBlur:f(3)})]})]})},Q=forwardRef((e,t)=>{let{errorMsgVisible:r}=useContext(z);return jsx(Input.tooltip,{ref:t,tooltip:r?e.error:void 0,autoComplete:"off",autoFocus:e.autoFocus,size:"lg",placeholder:"0",id:e.id,name:e.name,color:e.error?"danger":void 0,prefix:jsx(Vt,{id:e.id,children:e.label}),suffix:e.suffix,value:e.value,onChange:e.onChange,onFocus:e.onFocus,onBlur:e.onBlur,formatters:[inputFormatter.numberFormatter,inputFormatter.currencyFormatter],classNames:{root:cn("oui-relative oui-pt-8 oui-h-[54px] oui-px-2 oui-py-1 oui-pr-10 oui-border oui-border-solid oui-border-line oui-rounded group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl",e.className),input:"oui-mt-5 oui-mb-1 oui-h-5",prefix:"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36",suffix:"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-36 oui-text-2xs"}})});Q.displayName="CustomInput";var Vt=e=>jsx("label",{htmlFor:e.id,className:"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36 oui-text-2xs",children:e.children}),kt=e=>{let t=useMemo(()=>e.side===OrderSide.BUY?"buy":"sell",[e.side]);return jsxs("div",{children:[jsx(Slider.single,{disabled:e.maxQty===0,value:e.value,color:t,markCount:4,showTip:!0,max:e.maxQty,step:e.tick,onValueChange:e.onValueChange}),jsxs(Flex,{justify:"between",pt:2,children:[jsx(Text.numeral,{rule:"percentages",size:"2xs",color:t,children:e.currentQtyPercentage}),jsxs(Flex,{children:[jsx("button",{className:textVariants({size:"2xs",className:"oui-mr-1"}),onClick:()=>e.setMaxQty(),children:"Max buy"}),jsx(Text.numeral,{size:"2xs",color:t,dp:e.dp,children:e.maxQty})]})]})]})},Bt=e=>{let t=[{label:"Limit order",value:OrderType.LIMIT},{label:"Market order",value:OrderType.MARKET},{label:"Stop limit",value:OrderType.STOP_LIMIT},{label:"Stop market",value:OrderType.STOP_MARKET}];return jsx(Select.options,{value:e.type,options:t,onValueChange:e.onChange,valueFormatter:(r,o)=>{let i=t.find(l=>l.value===r);return i?jsx(Text,{size:"2xs",children:i?.label.replace(" order","")}):jsx(Text,{size:"2xs",children:o.placeholder})},size:"md"})};function At(e){return jsxs("div",{className:"oui-space-y-1",children:[jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"2xs",children:"Est. Liq. price"}),jsx(Text.numeral,{unit:e.quote,size:"2xs",className:"oui-text-base-contrast-80",unitClassName:"oui-ml-1 oui-text-base-contrast-36",children:e.estLiqPrice??"--"})]}),jsxs(Flex,{justify:"between",children:[jsx(Text,{size:"2xs",children:"Account leverage"}),jsxs(Flex,{gapX:1,className:textVariants({size:"2xs",intensity:80}),children:[jsx(Text.numeral,{unit:"x",children:e.currentLeverage}),e.estLeverage&&jsxs(Fragment,{children:[jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:jsx("path",{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",fill:"#fff",fillOpacity:".54"})}),jsx("span",{children:`${e.estLeverage}x`})]})]})]})]})}function qt(e){let[t,r]=useState(!1);return jsxs(PopoverRoot,{open:t,onOpenChange:r,children:[jsx(PopoverTrigger,{asChild:!0,children:jsx("button",{onClick:()=>{r(!0);},children:jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:jsx("path",{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",fill:"#fff",fillOpacity:t?.8:.36})})})}),jsx(PopoverContent,{side:"top",align:"end",className:"oui-w-[230px]",children:jsx($,{...e})})]})}var Se=e=>{let{formattedOrder:t,setValue:r,setValues:o,symbolInfo:i,...l}=useOrderEntryNext(e.symbol,{}),{currentLeverage:f}=useMarginRatio(),g=useEventEmitter(),u=useRef(4),L=useRef(null),T=useRef(null),_=useMemo(()=>Number(t.order_quantity)>=Number(l.maxQty)?1:convertValueToPercentage(Number(t.order_quantity??0),0,l.maxQty)/100,[t.order_quantity,l.maxQty]),O=m=>x=>{u.current=m;},S=m=>x=>{setTimeout(()=>{u.current===m&&(u.current=4);},300);};useEffect(()=>{let m=x=>{if(u.current===1)(t.order_type===OrderType.STOP_LIMIT||t.order_type===OrderType.STOP_MARKET)&&(r("trigger_price",removeTrailingZeros(x[0])),a(L.current));else if(t.order_type===OrderType.STOP_LIMIT||t.order_type===OrderType.LIMIT)r("order_price",removeTrailingZeros(x[0])),a(T.current);else {let I;t.order_type===OrderType.STOP_MARKET?I=OrderType.STOP_LIMIT:t.order_type===OrderType.MARKET&&(I=OrderType.LIMIT),typeof I<"u"&&r("order_type",I),r("order_price",removeTrailingZeros(x[0])),a(T.current);}function a(I){setTimeout(()=>{I?.focus();},0);}};return g.on("orderbook:item:click",m),()=>{g.off("orderbook:item:click",m);}},[t.order_type]);let w=()=>{o({tp_trigger_price:"",sl_trigger_price:""});},V=()=>{r("order_quantity",l.maxQty);};return {...l,currentQtyPercentage:_,side:t.side,type:t.order_type,setOrderValue:r,currentLeverage:f,formattedOrder:t,cancelTP_SL:w,setMaxQty:V,symbolInfo:i,onFocus:O,onBlur:S,refs:{triggerPriceInputRef:L,priceInputRef:T}}};var $t=e=>{let t=Se(e);return jsx(te,{...t,containerRef:e.containerRef})};
10
+
11
+ export { $ as AdditionalInfoWidget, Z as OrderConfirmDialog, te as OrderEntry, $t as OrderEntryWidget };
12
+ //# sourceMappingURL=out.js.map
13
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/orderEntry.ui.tsx","../src/components/tpsl.tsx","../src/components/pnlInput/pnlInput.ui.tsx","../src/components/pnlInput/useBuilder.script.ts","../src/components/pnlInput/pnlInputContext.tsx","../src/components/pnlInput/pnlInput.widget.tsx","../src/components/orderEntryContext.tsx","../src/components/dialog/confirm.ui.tsx","../src/components/additional/additionalInfo.ui.tsx","../src/components/additional/additional.script.ts","../src/components/additional/additionnalInfo.widget.tsx","../src/useOrderEntry.script.ts","../src/orderEntry.widget.tsx"],"names":["AuthGuard","Box","Button","cn","Divider","Flex","Grid","Input","inputFormatter","modal","PopoverContent","PopoverRoot","PopoverTrigger","Select","Slider","Switch","Text","textVariants","toast","forwardRef","useContext","useEffect","useMemo","useState","OrderSide","OrderType","React","CaretDownIcon","SimpleDropdownMenu","useRef","Decimal","todpIfNeed","createContext","useLocalStorage","jsx","jsxs","PnlInputContext","usePnlInputContext","PnlInputProvider","props","type","values","mode","setMode","tipsEle","usePNLInputBuilder","tipVisible","setTipVisible","key","value","modes","percentageSuffix","options","dp","PNLInput","onModeChange","onValueChange","quote","quote_db","tips","onFocus","onBlur","id","PNLMenus","item","event","PnlInputWidget","testId","rest","state","OrderEntryContext","OrderEntryProvider","OrderTPSL","open","setOpen","tpslFormRef","checked","TPSLInputForm","ref","TPSLInputRow","TPSLTriggerPriceInput","errorMsgVisible","triggerPriceToolTipEle","priceKey","Badge","Checkbox","registerSimpleDialog","Fragment","OrderConfirmDialog","baseDP","quoteDP","order","onConfirm","onCancel","side","order_type","symbol","_","setNeedConfirm","OrderTypeTag","typeStr","Dialog","close","resolve","reject","orderConfirmDialogId","AdditionalInfo","pinned","orderTypeExtra","onTypeToggle","useAdditionalScript","AdditionalInfoWidget","SDKError","OrderEntry","formattedOrder","setOrderValue","symbolInfo","maxQty","freeCollateral","helper","submit","metaState","refs","errors","validated","setErrorMsgVisible","needConfirm","setPinned","buttonLabel","clickHandler","visible","onSubmit","error","OrderTypeSelect","OrderQuantityInput","QuantitySlider","AssetInfo","AdditionalConfigButton","parseErrorMsg","CustomInput","e","InputLabel","color","option","o","useEventEmitter","useMarginRatio","useOrderEntryNext","removeTrailingZeros","convertValueToPercentage","useOrderEntryScript","inputs","setValue","setValues","currentLeverage","ee","currentFocusInput","triggerPriceInputRef","priceInputRef","currentQtyPercentage","orderBookItemClickHandler","focusInputElement","newType","target","cancelTP_SL","setMaxQty","OrderEntryWidget"],"mappings":"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","sourcesContent":["import { type uesOrderEntryScriptReturn } from \"./useOrderEntry.script\";\nimport { AuthGuard } from \"@orderly.network/ui-connector\";\nimport {\n Box,\n Button,\n cn,\n Divider,\n Flex,\n Grid,\n Input,\n inputFormatter,\n InputProps,\n modal,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n Select,\n SelectItem,\n Slider,\n Switch,\n Text,\n textVariants,\n toast,\n} from \"@orderly.network/ui\";\nimport {\n FocusEventHandler,\n forwardRef,\n PropsWithChildren,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n API,\n OrderlyOrder,\n OrderSide,\n OrderType,\n} from \"@orderly.network/types\";\nimport { OrderTPSL } from \"./components/tpsl\";\n\nimport { orderConfirmDialogId } from \"./components/dialog/confirm.ui\";\nimport {\n OrderEntryContext,\n OrderEntryProvider,\n} from \"./components/orderEntryContext\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { AdditionalInfoWidget } from \"./components/additional/additionnalInfo.widget\";\nimport { InputType } from \"./types\";\nimport { SDKError } from \"@orderly.network/types\";\n\ntype Refs = uesOrderEntryScriptReturn[\"refs\"];\n\nexport const OrderEntry = (\n props: uesOrderEntryScriptReturn & {\n containerRef: any;\n }\n) => {\n const {\n side,\n formattedOrder,\n setOrderValue,\n symbolInfo,\n maxQty,\n freeCollateral,\n helper,\n submit,\n metaState,\n refs,\n } = props;\n\n const { errors, validated } = metaState;\n const [errorMsgVisible, setErrorMsgVisible] = useState(false);\n const [needConfirm, setNeedConfirm] = useLocalStorage(\n \"orderly_order_confirm\",\n true\n );\n const [pinned, setPinned] = useLocalStorage(\n \"orderly-order-additional-pinned\",\n true\n );\n\n const buttonLabel = useMemo(() => {\n return side === OrderSide.BUY ? \"Buy / Long\" : \"Sell / Short\";\n }, [side]);\n\n useEffect(() => {\n if (validated) {\n setErrorMsgVisible(true);\n }\n }, [validated]);\n\n useEffect(() => {\n const clickHandler = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest(\"#order-entry-submit-button\")) {\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 = (): void => {\n helper\n .validate()\n .then(\n (order: any) => {\n if (needConfirm) {\n return modal.show(orderConfirmDialogId, {\n order: formattedOrder,\n\n quote: symbolInfo.quote,\n base: symbolInfo.base,\n\n quoteDP: symbolInfo.quote_dp,\n baseDP: symbolInfo.base_dp,\n });\n }\n\n return true;\n },\n (errors) => {\n setErrorMsgVisible(true);\n }\n )\n .then(() => {\n return submit();\n })\n .catch((error) => {\n console.log(\"catch:\", error);\n if (error instanceof SDKError) {\n toast.error(`Error:${error.message}`);\n }\n });\n };\n\n return (\n <OrderEntryProvider\n value={{\n errorMsgVisible,\n }}\n >\n <div\n className={\"oui-space-y-3 oui-text-base-contrast-54\"}\n ref={props.containerRef}\n >\n <Flex gapX={2} className=\"oui-flex-col lg:oui-flex-row oui-gap-y-2\">\n <div\n className={\n \"oui-grid oui-grid-cols-2 oui-w-full oui-flex-1 oui-gap-x-2 lg:oui-flex lg:oui-gap-x-[6px]\"\n }\n >\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.BUY);\n }}\n size={\"md\"}\n fullWidth\n color={side === OrderSide.BUY ? \"buy\" : \"secondary\"}\n >\n Buy\n </Button>\n <Button\n onClick={() => {\n props.setOrderValue(\"side\", OrderSide.SELL);\n }}\n fullWidth\n size={\"md\"}\n color={side === OrderSide.SELL ? \"sell\" : \"secondary\"}\n >\n Sell\n </Button>\n </div>\n <div className={\"oui-w-full lg:oui-flex-1\"}>\n <OrderTypeSelect\n type={formattedOrder.order_type}\n onChange={(type) => {\n setOrderValue(\"order_type\", type);\n }}\n />\n </div>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Available</Text>\n <Text.numeral\n unit={symbolInfo.quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-54\"}\n >\n {freeCollateral}\n </Text.numeral>\n </Flex>\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 }}\n errors={validated ? errors : null}\n onChange={(key, value) => {\n props.setOrderValue(key, value);\n }}\n refs={props.refs}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n />\n <QuantitySlider\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 <AuthGuard buttonProps={{ fullWidth: true }}>\n <Button\n fullWidth\n id={\"order-entry-submit-button\"}\n color={side === OrderSide.BUY ? \"buy\" : \"sell\"}\n onClick={() => {\n onSubmit();\n }}\n loading={props.isMutating}\n >\n {buttonLabel}\n </Button>\n </AuthGuard>\n <AssetInfo\n quote={symbolInfo.quote}\n estLiqPrice={props.estLiqPrice}\n estLeverage={props.estLeverage}\n currentLeverage={props.currentLeverage}\n />\n <Divider />\n <OrderTPSL\n onCancelTPSL={props.cancelTP_SL}\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 <Flex justify={\"between\"} itemAlign={\"center\"}>\n <Flex itemAlign={\"center\"} gapX={1}>\n <Switch\n id={\"reduceOnly\"}\n checked={props.formattedOrder.reduce_only}\n onCheckedChange={(checked) => {\n props.setOrderValue(\"reduce_only\", checked);\n }}\n />\n <label htmlFor={\"reduceOnly\"} className={\"oui-text-xs\"}>\n Reduce only\n </label>\n </Flex>\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={formattedOrder[\"order_type\"] === OrderType.LIMIT}\n />\n )}\n </Flex>\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={formattedOrder[\"order_type\"] === OrderType.LIMIT}\n />\n <button\n onClick={() => {\n setPinned(false);\n }}\n className={\"oui-absolute oui-top-2 oui-right-2\"}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.67 1.953A2.667 2.667 0 0 0 2.005 4.62v6.667a2.667 2.667 0 0 0 2.667 2.666h6.666a2.667 2.667 0 0 0 2.667-2.666V4.62a2.667 2.667 0 0 0-2.667-2.667zm1.334 3.334c.17 0 .349.057.48.187l1.52 1.52 1.52-1.52a.68.68 0 0 1 .48-.187c.17 0 .349.057.48.187.26.26.26.698 0 .958L8.962 7.954l1.52 1.52c.26.262.26.699 0 .96a.687.687 0 0 1-.958 0l-1.52-1.522-1.52 1.52a.687.687 0 0 1-.96 0 .687.687 0 0 1 0-.958l1.521-1.52-1.52-1.521a.687.687 0 0 1 0-.96.68.68 0 0 1 .479-.186\"\n fill=\"#fff\"\n fillOpacity=\".2\"\n />\n </svg>\n </button>\n </Box>\n )}\n </div>\n </OrderEntryProvider>\n );\n};\n\n//----------------- Order Quantity Input Component start -----------------\nconst OrderQuantityInput = (props: {\n type: OrderType;\n symbolInfo: API.SymbolExt;\n errors: any;\n values: {\n quantity?: string;\n price?: string;\n trigger_price?: string;\n total?: string;\n };\n onChange: (\n key: \"order_quantity\" | \"order_price\" | \"trigger_price\" | \"total\",\n value: any\n ) => void;\n refs: Refs;\n onFocus: (type: InputType) => FocusEventHandler;\n onBlur: (type: InputType) => FocusEventHandler;\n}) => {\n const { type, symbolInfo, errors, values, onFocus, onBlur } = props;\n\n const parseErrorMsg = (key: string) => {\n if (errors && errors[key]) {\n return errors[key].message;\n }\n return \"\";\n };\n return (\n <div className={\"oui-space-y-1\"}>\n {type === OrderType.STOP_LIMIT || type === OrderType.STOP_MARKET ? (\n <div className={\"oui-group\"}>\n <CustomInput\n label={\"Trigger\"}\n suffix={symbolInfo.quote}\n error={parseErrorMsg(\"trigger_price\")}\n id={\"trigger\"}\n ref={props.refs.triggerPriceInputRef}\n value={values.trigger_price}\n onChange={(e) => {\n props.onChange(\"trigger_price\", e.target.value);\n }}\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 className={\"oui-group\"}>\n <CustomInput\n label={\"Price\"}\n suffix={symbolInfo.quote}\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.target.value);\n }}\n onFocus={onFocus(InputType.PRICE)}\n onBlur={onBlur(InputType.PRICE)}\n />\n </div>\n ) : null}\n\n <Grid cols={2} className={\"oui-space-x-1 oui-group\"}>\n <CustomInput\n label={\"Quantity\"}\n suffix={symbolInfo.base}\n id=\"order_quantity_input\"\n name=\"order_quantity_input\"\n className={\"!oui-rounded-br !oui-rounded-tr\"}\n value={values.quantity}\n error={parseErrorMsg(\"order_quantity\")}\n onChange={(e) => {\n props.onChange(\"order_quantity\", e.target.value);\n }}\n onFocus={onFocus(InputType.QUANTITY)}\n onBlur={onBlur(InputType.QUANTITY)}\n />\n <CustomInput\n label={\"Total≈\"}\n suffix={symbolInfo.quote}\n id={\"total\"}\n className={\"!oui-rounded-bl !oui-rounded-tl\"}\n value={values.total}\n onChange={(e) => {\n props.onChange(\"total\", e.target.value);\n }}\n onFocus={onFocus(InputType.TOTAL)}\n onBlur={onBlur(InputType.TOTAL)}\n />\n </Grid>\n </div>\n );\n};\n\n// ----------- Custom Input Component start ------------\nconst CustomInput = forwardRef<\n HTMLInputElement,\n {\n label: string;\n suffix: string;\n id: string;\n className?: string;\n name?: string;\n onChange?: InputProps[\"onChange\"];\n value?: InputProps[\"value\"];\n autoFocus?: InputProps[\"autoFocus\"];\n error?: string;\n onFocus: InputProps[\"onFocus\"];\n onBlur: InputProps[\"onBlur\"];\n // helperText?: InputProps[\"helperText\"];\n }\n>((props, ref) => {\n const { errorMsgVisible } = useContext(OrderEntryContext);\n return (\n <Input.tooltip\n ref={ref}\n tooltip={errorMsgVisible ? props.error : undefined}\n autoComplete={\"off\"}\n autoFocus={props.autoFocus}\n size={\"lg\"}\n placeholder={\"0\"}\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.value}\n onChange={props.onChange}\n onFocus={props.onFocus}\n onBlur={props.onBlur}\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.currencyFormatter,\n ]}\n classNames={{\n root: cn(\n \"oui-relative oui-pt-8 oui-h-[54px] oui-px-2 oui-py-1 oui-pr-10 oui-border oui-border-solid oui-border-line oui-rounded group-first:oui-rounded-t-xl group-last:oui-rounded-b-xl\",\n props.className\n ),\n input: \"oui-mt-5 oui-mb-1 oui-h-5\",\n prefix:\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36\",\n suffix:\n \"oui-absolute oui-right-0 oui-top-0 oui-text-base-contrast-36 oui-text-2xs\",\n }}\n />\n );\n});\n\nCustomInput.displayName = \"CustomInput\";\n\nconst InputLabel = (props: PropsWithChildren<{ id: string }>) => {\n return (\n <label\n htmlFor={props.id}\n className={\n \"oui-absolute oui-left-2 oui-top-[7px] oui-text-base-contrast-36 oui-text-2xs\"\n }\n >\n {props.children}\n </label>\n );\n};\n\n// ----------- Custom Input Component end ------------\n\nconst QuantitySlider = (props: {\n 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 color = useMemo(\n () => (props.side === OrderSide.BUY ? \"buy\" : \"sell\"),\n [props.side]\n );\n\n return (\n <div>\n <Slider.single\n disabled={props.maxQty === 0}\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\"} pt={2}>\n <Text.numeral rule={\"percentages\"} size={\"2xs\"} color={color}>\n {props.currentQtyPercentage}\n </Text.numeral>\n <Flex>\n <button\n className={textVariants({\n size: \"2xs\",\n className: \"oui-mr-1\",\n })}\n onClick={() => props.setMaxQty()}\n >\n Max buy\n </button>\n <Text.numeral size={\"2xs\"} color={color} dp={props.dp}>\n {props.maxQty}\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}) => {\n const options = [\n { label: \"Limit order\", value: OrderType.LIMIT },\n { label: \"Market order\", value: OrderType.MARKET },\n { label: \"Stop limit\", value: OrderType.STOP_LIMIT },\n { label: \"Stop market\", value: OrderType.STOP_MARKET },\n ];\n return (\n <Select.options\n value={props.type}\n options={options}\n onValueChange={props.onChange}\n valueFormatter={(value, option) => {\n const item = options.find((o) => o.value === value);\n if (!item) {\n return <Text size={\"2xs\"}>{option.placeholder}</Text>;\n }\n return <Text size={\"2xs\"}>{item?.label.replace(\" order\", \"\")}</Text>;\n }}\n size={\"md\"}\n />\n );\n};\n\n// -----------Order type Select Component end ------------\n\nfunction AssetInfo(props: {\n quote: string;\n estLiqPrice: number | null;\n estLeverage: number | null;\n currentLeverage: number;\n}) {\n return (\n <div className={\"oui-space-y-1\"}>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Est. Liq. price</Text>\n <Text.numeral\n unit={props.quote}\n size={\"2xs\"}\n className={\"oui-text-base-contrast-80\"}\n unitClassName={\"oui-ml-1 oui-text-base-contrast-36\"}\n >\n {props.estLiqPrice ?? \"--\"}\n </Text.numeral>\n </Flex>\n <Flex justify={\"between\"}>\n <Text size={\"2xs\"}>Account leverage</Text>\n <Flex\n gapX={1}\n className={textVariants({\n size: \"2xs\",\n intensity: 80,\n })}\n >\n <Text.numeral unit=\"x\">{props.currentLeverage}</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}) {\n // const []\n const [open, setOpen] = useState(false);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n onClick={() => {\n setOpen(true);\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\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","import React, {\n ChangeEventHandler,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn, Flex, Input, Switch } from \"@orderly.network/ui\";\nimport { Grid } from \"@orderly.network/ui\";\nimport { PnlInputWidget } from \"./pnlInput/pnlInput.widget\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { PNL_Values, PnLMode } from \"./pnlInput/useBuilder.script\";\nimport { OrderType } from \"@orderly.network/types\";\nimport { OrderEntryContext } from \"./orderEntryContext\";\nimport {\n PnlInputProvider,\n usePnlInputContext,\n} from \"./pnlInput/pnlInputContext\";\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 onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n orderType: OrderType;\n isReduceOnly?: boolean;\n errors: any;\n}) => {\n const [open, setOpen] = useState(false);\n const tpslFormRef = React.useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (\n props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET\n ) {\n setOpen(false);\n\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 checked={open}\n disabled={\n (props.orderType !== OrderType.LIMIT &&\n props.orderType !== OrderType.MARKET) ||\n props.isReduceOnly\n }\n onCheckedChange={(checked) => {\n setOpen(checked);\n if (!checked) {\n props.onCancelTPSL();\n }\n }}\n />\n <label htmlFor={\"order_entry_tpsl\"} className={\"oui-text-xs\"}>\n TP/SL\n </label>\n </Flex>\n <div\n className={cn(\n \"oui-max-h-0 oui-overflow-hidden oui-transition-all\",\n open && \"oui-max-h-[100px]\"\n )}\n onTransitionEnd={() => {\n console.log(\"transition end\");\n tpslFormRef.current?.style.setProperty(\"opacity\", open ? \"1\" : \"0\");\n }}\n >\n <TPSLInputForm\n ref={tpslFormRef}\n onChange={props.onChange}\n values={props.values}\n errors={props.errors}\n />\n </div>\n </div>\n );\n};\n\nconst TPSLInputForm = React.forwardRef<\n HTMLDivElement,\n {\n onChange: (key: OrderValueKeys, value: any) => void;\n values: TPSL_Values;\n errors: Record<string, { message: string }> | null;\n }\n>((props, ref) => {\n return (\n <div\n ref={ref}\n className={\"oui-transition-all oui-pt-2 oui-pb-2 oui-px-1 oui-space-y-1\"}\n >\n <PnlInputProvider values={props.values.tp} type={\"TP\"}>\n <TPSLInputRow\n type={\"TP\"}\n error={props.errors ? props.errors[\"tp_trigger_price\"]?.message : \"\"}\n onChange={props.onChange}\n values={props.values.tp}\n />\n </PnlInputProvider>\n <PnlInputProvider values={props.values.sl} type={\"SL\"}>\n <TPSLInputRow\n type={\"SL\"}\n error={props.errors ? props.errors[\"sl_trigger_price\"]?.message : \"\"}\n onChange={props.onChange}\n values={props.values.sl}\n />\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: React.ChangeEventHandler<HTMLInputElement>;\n}) => {\n const { errorMsgVisible } = useContext(OrderEntryContext);\n const { tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n\n const triggerPriceToolTipEle = useMemo(() => {\n if (props.error && errorMsgVisible) return props.error;\n if (tipVisible) return tipsEle;\n\n return null;\n }, [props.error, errorMsgVisible, tipVisible, tipsEle]);\n\n return (\n <Input.tooltip\n prefix={\"TP Price\"}\n size={\"md\"}\n placeholder=\"USDC\"\n align=\"right\"\n onFocus={() => {\n setTipVisible(true);\n }}\n onBlur={() => {\n setTipVisible(false);\n }}\n tooltip={triggerPriceToolTipEle}\n tooltipProps={{\n content: {\n side: props.type === \"TP\" ? \"top\" : \"bottom\",\n },\n }}\n color={props.error ? \"danger\" : undefined}\n autoComplete={\"off\"}\n value={props.values.trigger_price}\n classNames={{ additional: \"oui-text-base-contrast-54\" }}\n onChange={props.onChange}\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}) => {\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 type={props.type}\n error={props.error}\n values={props.values ?? \"\"}\n onChange={(event) => {\n props.onChange(priceKey, event.target.value);\n }}\n />\n\n <PnlInputWidget\n onChange={props.onChange}\n quote={\"USDC\"}\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 { useMemo, useState } from \"react\";\n\nexport type PNLInputProps = PNLInputState & {\n testId?: string;\n quote: string;\n type: \"TP\" | \"SL\";\n};\n\nexport const PNLInput = (props: PNLInputProps) => {\n const {\n mode,\n modes,\n onModeChange,\n onValueChange,\n quote,\n quote_db,\n value,\n type,\n tips,\n onFocus,\n onBlur,\n } = props;\n\n const id = useMemo(() => `${type.toLowerCase()}_${mode.toLowerCase()}`, []);\n\n return (\n <Input.tooltip\n prefix={mode}\n size={\"md\"}\n placeholder={mode === PnLMode.PERCENTAGE ? \"%\" : quote}\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.testId}\n autoComplete={\"off\"}\n onValueChange={onValueChange}\n formatters={[\n props.formatter({ dp: quote_db, mode, type }),\n inputFormatter.currencyFormatter,\n ]}\n classNames={{\n additional: \"oui-text-base-contrast-54\",\n input: type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\",\n }}\n onFocus={onFocus}\n onBlur={onBlur}\n suffix={\n <PNLMenus\n modes={modes}\n onModeChange={(item) => onModeChange(item.value as PnLMode)}\n />\n }\n />\n );\n};\n\nconst PNLMenus = (props: {\n modes: MenuItem[];\n onModeChange: (value: MenuItem) => void;\n}) => {\n return (\n <SimpleDropdownMenu\n menu={props.modes}\n align={\"end\"}\n size={\"xs\"}\n className={\"oui-min-w-[80px]\"}\n onCloseAutoFocus={(event) => event.preventDefault()}\n onSelect={(item) => props.onModeChange(item as MenuItem)}\n >\n <button className={\"oui-p-2\"}>\n <CaretDownIcon size={12} color={\"white\"} />\n </button>\n </SimpleDropdownMenu>\n );\n};\n","import { ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { MenuItem } from \"@orderly.network/ui\";\nimport { commify, Decimal, todpIfNeed } from \"@orderly.network/utils\";\nimport type {\n InputFormatter,\n InputFormatterOptions,\n} from \"@orderly.network/ui\";\nimport { usePnlInputContext } from \"./pnlInputContext\";\n\nexport enum PnLMode {\n PnL = \"PnL\",\n OFFSET = \"Offset\",\n PERCENTAGE = \"Offset%\",\n}\n\nexport type PNL_Values = {\n PnL: string;\n Offset: string;\n \"Offset%\": string;\n ROI: string;\n};\n\ntype PNL_Keys =\n | \"tp_offset\"\n | \"tp_offset_percentage\"\n | \"tp_pnl\"\n | \"sl_offset\"\n | \"sl_offset_percentage\"\n | \"sl_pnl\";\n\nexport type BuilderProps = {\n type: \"TP\" | \"SL\";\n\n quote_dp?: number;\n onChange: (key: PNL_Keys, value: number | string) => void;\n\n values: PNL_Values;\n};\n\nexport const usePNLInputBuilder = (props: BuilderProps) => {\n const { type, values } = props;\n // const [mode, setMode] = useLocalStorage<PnLMode>(\n // \"TP/SL_Mode\",\n // PnLMode.PERCENTAGE\n // );\n const { mode, setMode, tipsEle } = usePnlInputContext();\n\n const [tipVisible, setTipVisible] = useState(false);\n\n const key = useMemo<PNL_Keys>(() => {\n switch (mode) {\n case PnLMode.OFFSET:\n return `${type.toLowerCase()}_offset` as PNL_Keys;\n case PnLMode.PERCENTAGE:\n return `${type.toLowerCase()}_offset_percentage` as PNL_Keys;\n default:\n return `${type.toLowerCase()}_pnl` as PNL_Keys;\n }\n }, [mode]);\n\n const value = useMemo(() => {\n // console.log(\"mode\", mode, values);\n return values[mode as keyof PNL_Values];\n }, [values, mode]);\n\n const modes = useMemo<MenuItem[]>(() => {\n return [\n { label: \"PnL\", value: PnLMode.PnL, testId: `${PnLMode.PnL}_menu_item` },\n {\n label: \"Offset\",\n value: PnLMode.OFFSET,\n testId: `${PnLMode.OFFSET}_mneu_item`,\n },\n {\n label: \"Offset%\",\n value: PnLMode.PERCENTAGE,\n testId: `${PnLMode.PERCENTAGE}_menu_item`,\n },\n ];\n }, []);\n\n const percentageSuffix = useRef<string>(\"\");\n\n const onValueChange = (value: string) => {\n props.onChange(key, value);\n };\n\n const onFocus = () => {\n // updateTips();\n setTipVisible(true);\n };\n\n /**\n * hide tips when input is blurred\n */\n const onBlur = () => {\n // setTips(undefined);\n setTipVisible(false);\n };\n\n const formatter = (options: {\n dp?: number;\n mode: PnLMode;\n type: \"TP\" | \"SL\";\n }): InputFormatter => {\n const { dp = 2 } = options;\n return {\n onRenderBefore: (\n value: string | number,\n options: InputFormatterOptions\n ) => {\n value = `${value}`; // convert to string\n\n if (type === \"SL\" && mode === PnLMode.PnL) {\n value = value.startsWith(\"-\") ? value : \"-\" + value;\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n // if (mode === PnLMode.PnL || mode === PnLMode.OFFSET) {\n // return commify(value);\n // }\n\n if (mode === PnLMode.PERCENTAGE) {\n return `${new Decimal(value).mul(100).todp(2, 4).toString()}${\n percentageSuffix.current\n }`;\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 if (mode === PnLMode.PERCENTAGE) {\n if (value !== \"\") {\n percentageSuffix.current = value.endsWith(\".\") ? \".\" : \"\";\n value = new Decimal(value).div(100).todp(4, 4).toString();\n }\n } else {\n value = todpIfNeed(value, dp);\n }\n\n if (value === \"\" || value === \"-\") return \"\";\n\n return value;\n },\n };\n };\n\n return {\n mode,\n modes,\n formatter,\n onModeChange: (mode: PnLMode) => {\n setMode(mode);\n },\n onFocus,\n onBlur,\n value,\n onValueChange,\n quote_db: props.quote_dp,\n tips: tipVisible ? tipsEle : undefined,\n };\n};\n\nexport type PNLInputState = ReturnType<typeof usePNLInputBuilder>;\n","import {\n createContext,\n PropsWithChildren,\n ReactNode,\n useContext,\n useMemo,\n} from \"react\";\nimport { PNL_Values, PnLMode } from \"./useBuilder.script\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\nimport { cn, Flex, Text } from \"@orderly.network/ui\";\n\ntype TipType = \"ROI\" | \"PnL\" | \"Error\";\n\nexport type PnlInputContextState = {\n mode: PnLMode;\n setMode: (mode: PnLMode) => void;\n tipsEle: ReactNode | null;\n};\n\nexport const PnlInputContext = createContext<PnlInputContextState>(\n {} as PnlInputContextState\n);\n\nexport const usePnlInputContext = () => {\n return useContext(PnlInputContext);\n};\n\nexport const PnlInputProvider = (\n props: PropsWithChildren<{\n values: PNL_Values & {\n trigger_price?: string;\n };\n type: \"TP\" | \"SL\";\n }>\n) => {\n const { type, values } = props;\n const [mode, setMode] = useLocalStorage<PnLMode>(\n \"TP/SL_Mode\",\n PnLMode.PERCENTAGE\n );\n\n const tipsEle = useMemo(() => {\n if (!values.PnL || !props.values.trigger_price) return null;\n return (\n <Flex>\n <span className={\"oui-text-xs oui-text-base-contrast-54\"}>\n {`Est.${mode === PnLMode.PnL ? \"ROI\" : \"PNL\"}:`}\n </span>\n {mode === PnLMode.PnL ? (\n <Text.numeral\n rule={\"percentages\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.ROI}\n </Text.numeral>\n ) : (\n <Text.numeral\n rule={\"price\"}\n className={cn(\n \"oui-text-xs oui-ml-1\",\n type === \"TP\" ? \"oui-text-trade-profit\" : \"oui-text-trade-loss\"\n )}\n >\n {values.PnL}\n </Text.numeral>\n )}\n </Flex>\n );\n }, [mode, props.values.PnL, props.values.trigger_price]);\n\n return (\n <PnlInputContext.Provider\n value={{\n mode,\n setMode,\n tipsEle,\n }}\n >\n {props.children}\n </PnlInputContext.Provider>\n );\n};\n","import { PNLInput } from \"./pnlInput.ui\";\nimport { BuilderProps, PnLMode, usePNLInputBuilder } from \"./useBuilder.script\";\n\nexport const PnlInputWidget = (\n props: BuilderProps & {\n testId?: string;\n quote: string;\n }\n) => {\n const { testId, quote, ...rest } = props;\n const state = usePNLInputBuilder(rest);\n return (\n <PNLInput {...state} testId={testId} quote={quote} type={props.type} />\n );\n};\n","import { createContext } from \"react\";\n\nexport type OrderEntryContextState = {\n errorMsgVisible: boolean;\n};\n\nexport const OrderEntryContext = createContext<OrderEntryContextState>(\n {} as OrderEntryContextState\n);\n\nexport const OrderEntryProvider = OrderEntryContext.Provider;\n","import {\n Badge,\n Button,\n Checkbox,\n Divider,\n Flex,\n Grid,\n registerSimpleDialog,\n Text,\n textVariants,\n} from \"@orderly.network/ui\";\nimport { OrderSide, OrderType } from \"@orderly.network/types\";\nimport { OrderlyOrder } from \"@orderly.network/types\";\nimport { useMemo } from \"react\";\nimport { useLocalStorage } from \"@orderly.network/hooks\";\n\ntype Props = {\n order: OrderlyOrder;\n quoteDP: number;\n baseDP: number;\n\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const OrderConfirmDialog = (props: Props) => {\n const { baseDP, quoteDP, order, onConfirm, onCancel } = props;\n\n const { side, order_type, symbol } = order;\n\n const [_, setNeedConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\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.order_type} />\n {side === OrderSide.BUY ? (\n <Badge color={\"buy\"} size={\"sm\"}>\n Buy\n </Badge>\n ) : (\n <Badge color={\"sell\"} size={\"sm\"}>\n Sell\n </Badge>\n )}\n </Flex>\n </Flex>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n <Flex justify={\"between\"}>\n <Text>Qty.</Text>\n <Text.numeral\n rule={\"price\"}\n dp={baseDP}\n className=\"oui-text-base-contrast\"\n >\n {order.order_quantity}\n </Text.numeral>\n </Flex>\n {!order.trigger_price ? null : (\n <Flex justify={\"between\"}>\n <Text>Trigger</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.trigger_price}\n </Text.numeral>\n </Flex>\n )}\n <Flex justify={\"between\"}>\n <Text>Price</Text>\n {order.order_type === OrderType.MARKET ? (\n <Text intensity={80}>Market</Text>\n ) : (\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 >\n {order.order_price}\n </Text.numeral>\n )}\n </Flex>\n <Flex justify={\"between\"}>\n <Text>Est. Total</Text>\n <Text.numeral\n unit={\"USDC\"}\n rule={\"price\"}\n dp={quoteDP}\n className={\"oui-text-base-contrast\"}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.total}\n </Text.numeral>\n </Flex>\n </div>\n {order.tp_trigger_price || order.sl_trigger_price ? (\n <>\n <Divider className=\"oui-my-4\" />\n <div\n className={textVariants({\n size: \"sm\",\n intensity: 54,\n className: \"oui-space-y-1\",\n })}\n >\n {order.tp_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>TP Price</Text>\n <Text.numeral\n unit={\"ETH\"}\n rule={\"price\"}\n coloring\n dp={quoteDP}\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.tp_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n {order.sl_trigger_price && (\n <Flex justify={\"between\"}>\n <Text>SL Price</Text>\n <Text.numeral\n unit={\"ETH\"}\n rule={\"price\"}\n coloring\n className=\"oui-text-trade-loss\"\n unitClassName={\"oui-text-base-contrast-36 oui-ml-1\"}\n >\n {order.sl_trigger_price}\n </Text.numeral>\n </Flex>\n )}\n </div>\n </>\n ) : null}\n\n <Flex gapX={1} pt={8} pb={3}>\n <Checkbox\n id=\"orderConfirm\"\n color={\"white\"}\n onCheckedChange={(checked) => {\n setNeedConfirm(!!!checked);\n }}\n />\n <label\n htmlFor=\"orderConfirm\"\n className={textVariants({\n size: \"xs\",\n intensity: 54,\n })}\n >\n Disable order confirmation\n </label>\n </Flex>\n <Grid cols={2} gapX={3}>\n <Button color={\"secondary\"} size={\"md\"} onClick={() => onCancel()}>\n Cancel\n </Button>\n <Button size={\"md\"} onClick={() => onConfirm()}>\n Confirm\n </Button>\n </Grid>\n </>\n );\n};\n\nOrderConfirmDialog.displayName = \"OrderConfirmDialog\";\n\nconst OrderTypeTag = (props: { type: OrderType }) => {\n const typeStr = useMemo(() => {\n switch (props.type) {\n case OrderType.LIMIT:\n return \"Limit\";\n case OrderType.MARKET:\n return \"Market\";\n case OrderType.STOP_LIMIT:\n return \"Stop Limit\";\n case OrderType.STOP_MARKET:\n return \"Stop Market\";\n default:\n return \"\";\n }\n }, [props.type]);\n\n return (\n <Badge color={\"neutral\"} size={\"sm\"}>\n {typeStr}\n </Badge>\n );\n};\n\nconst Dialog = (\n props: Omit<Props, \"onCancel\" | \"onConfirm\"> & {\n close: () => void;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n }\n) => {\n const { close, resolve, reject, ...rest } = props;\n\n return (\n <OrderConfirmDialog\n {...rest}\n onCancel={close}\n onConfirm={() => {\n resolve();\n close();\n }}\n />\n );\n};\n\nexport const orderConfirmDialogId = \"orderConfirm\";\n\nregisterSimpleDialog(orderConfirmDialogId, Dialog, {\n size: \"sm\",\n title: \"Order confirm\",\n});\n","import { Checkbox, Divider, Flex, Grid, Switch } from \"@orderly.network/ui\";\nimport { OrderlyOrder, OrderType } from \"@orderly.network/types\";\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};\n\nexport const AdditionalInfo = (props: AdditionalInfoProps) => {\n const { pinned, orderTypeExtra } = props;\n const onTypeToggle = (type: OrderType) => (checked: boolean) => {\n if (props.onValueChange) {\n props.onValueChange(\n \"order_type_ext\" as keyof OrderlyOrder,\n checked ? type : \"\"\n // orderTypeExtra === type ? \"\" : type\n );\n }\n };\n return (\n <div className={\"oui-text-base-contrast-54\"}>\n {props.showExtra && (\n <Flex\n gapX={5}\n justify={pinned ? \"start\" : \"between\"}\n mb={3}\n width={pinned ? \"unset\" : \"100%\"}\n >\n <Flex itemAlign={\"center\"}>\n <Checkbox\n id={\"toggle_order_post_only\"}\n color={\"white\"}\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.POST_ONLY}\n onCheckedChange={onTypeToggle(OrderType.POST_ONLY)}\n />\n <label\n htmlFor={\"toggle_order_post_only\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Post only\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n id={\"toggle_order_iov\"}\n color={\"white\"}\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.IOC}\n onCheckedChange={onTypeToggle(OrderType.IOC)}\n />\n <label\n htmlFor={\"toggle_order_iov\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n IOC\n </label>\n </Flex>\n <Flex itemAlign={\"center\"}>\n <Checkbox\n id={\"toggle_order_fok\"}\n color={\"white\"}\n variant={\"radio\"}\n checked={orderTypeExtra === OrderType.FOK}\n onCheckedChange={onTypeToggle(OrderType.FOK)}\n />\n <label\n htmlFor={\"toggle_order_fok\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n FOK\n </label>\n </Flex>\n </Flex>\n )}\n\n <Flex gapX={6}>\n <Flex>\n <Checkbox\n id={\"toggle_order_confirm\"}\n color={\"white\"}\n checked={props.needConfirm}\n onCheckedChange={(checked) => {\n props.setNeedConfirm(!!checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_confirm\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Order confirm\n </label>\n </Flex>\n <Flex>\n <Checkbox\n id={\"toggle_order_hidden\"}\n color={\"white\"}\n onCheckedChange={(checked) => {\n props.onValueChange?.(\"visible_quantity\", checked ? 0 : 1);\n }}\n />\n <label\n htmlFor={\"toggle_order_hidden\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Hidden\n </label>\n </Flex>\n </Flex>\n {!pinned && (\n <>\n <Divider className={\"oui-my-3\"} />\n <Flex>\n <Switch\n id={\"toggle_order_keep_visible\"}\n onCheckedChange={(checked) => {\n props.setPinned(checked);\n }}\n />\n <label\n htmlFor={\"toggle_order_keep_visible\"}\n className={\"oui-text-2xs oui-ml-1\"}\n >\n Keep visible\n </label>\n </Flex>\n </>\n )}\n </div>\n );\n};\n","export const useAdditionalScript = () => {\n // const [needConfirm, setNeedConfirm] = useLocalStorage(\n // \"orderly_order_confirm\",\n // true\n // );\n\n return {\n // needConfirm,\n // setNeedConfirm,\n };\n};\n","import { AdditionalInfo, AdditionalInfoProps } from \"./additionalInfo.ui\";\nimport { useAdditionalScript } from \"./additional.script\";\n\nexport const AdditionalInfoWidget = (props: AdditionalInfoProps) => {\n const state = useAdditionalScript();\n return <AdditionalInfo {...state} {...props} />;\n};\n","import { OrderSide, OrderType } from \"@orderly.network/types\";\nimport {\n useEventEmitter,\n useMarginRatio,\n useOrderEntryNext,\n} from \"@orderly.network/hooks\";\nimport { useEffect, useRef, FocusEvent, useMemo } from \"react\";\nimport { removeTrailingZeros } from \"@orderly.network/utils\";\nimport { InputType } from \"./types\";\nimport { convertValueToPercentage } from \"@orderly.network/ui\";\n\nexport type OrderEntryScriptInputs = {\n symbol: string;\n};\n\nexport const useOrderEntryScript = (inputs: OrderEntryScriptInputs) => {\n const { formattedOrder, setValue, setValues, symbolInfo, ...state } =\n useOrderEntryNext(inputs.symbol, {});\n\n // const [maxLeverage] = useLeverage();\n const { currentLeverage } = useMarginRatio();\n const ee = useEventEmitter();\n\n const currentFocusInput = useRef<InputType>(InputType.NONE);\n const triggerPriceInputRef = useRef<HTMLInputElement | null>(null);\n const priceInputRef = useRef<HTMLInputElement | null>(null);\n\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 onFocus = (type: InputType) => (_: FocusEvent) => {\n currentFocusInput.current = type;\n };\n\n const onBlur = (type: InputType) => (_: FocusEvent) => {\n setTimeout(() => {\n if (currentFocusInput.current !== type) return;\n currentFocusInput.current = InputType.NONE;\n }, 300);\n\n // if (type === InputType.QUANTITY) {\n // formatQty();\n // }\n };\n\n useEffect(() => {\n // handle orderbook item click event\n const orderBookItemClickHandler = (item: number[]) => {\n if (currentFocusInput.current === InputType.TRIGGER_PRICE) {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.STOP_MARKET\n ) {\n setValue(\"trigger_price\", removeTrailingZeros(item[0]));\n focusInputElement(triggerPriceInputRef.current);\n }\n } else {\n if (\n formattedOrder.order_type === OrderType.STOP_LIMIT ||\n formattedOrder.order_type === OrderType.LIMIT\n ) {\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n } else {\n let newType;\n\n if (formattedOrder.order_type === OrderType.STOP_MARKET) {\n newType = OrderType.STOP_LIMIT;\n } else if (formattedOrder.order_type === OrderType.MARKET) {\n newType = OrderType.LIMIT;\n }\n\n if (typeof newType !== \"undefined\") {\n setValue(\"order_type\", newType);\n }\n setValue(\"order_price\", removeTrailingZeros(item[0]));\n focusInputElement(priceInputRef.current);\n }\n }\n\n function focusInputElement(target: HTMLInputElement | null) {\n setTimeout(() => {\n target?.focus();\n }, 0);\n }\n };\n\n ee.on(\"orderbook:item:click\", orderBookItemClickHandler);\n\n return () => {\n console.log(\"useOrderEntry: removeListener\");\n ee.off(\"orderbook:item:click\", orderBookItemClickHandler);\n };\n }, [formattedOrder.order_type]);\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 setMaxQty = () => {\n setValue(\"order_quantity\", state.maxQty);\n };\n\n return {\n ...state,\n currentQtyPercentage,\n side: formattedOrder.side as OrderSide,\n type: formattedOrder.order_type as OrderType,\n setOrderValue: setValue,\n\n currentLeverage,\n\n formattedOrder,\n cancelTP_SL,\n setMaxQty,\n symbolInfo,\n onFocus,\n onBlur,\n refs: {\n triggerPriceInputRef,\n priceInputRef,\n },\n };\n};\n\nexport type uesOrderEntryScriptReturn = ReturnType<typeof useOrderEntryScript>;\n","import { OrderEntry } from \"./orderEntry.ui\";\nimport {\n OrderEntryScriptInputs,\n useOrderEntryScript,\n} from \"./useOrderEntry.script\";\n\nexport const OrderEntryWidget = (props: OrderEntryScriptInputs & {\n containerRef?: any;\n}) => {\n const state = useOrderEntryScript(props);\n return <OrderEntry {...state} containerRef={props.containerRef}/>;\n};\n"]}
@@ -0,0 +1 @@
1
+ .oui-absolute{position:absolute}.oui-relative{position:relative}.oui-left-2{left:.5rem}.oui-right-0{right:0}.oui-right-2{right:.5rem}.oui-top-0{top:0}.oui-top-2{top:.5rem}.oui-top-\[7px\]{top:7px}.oui-my-3{margin-bottom:.75rem;margin-top:.75rem}.oui-my-4{margin-bottom:1rem;margin-top:1rem}.oui-mb-1{margin-bottom:.25rem}.oui-ml-1{margin-left:.25rem}.oui-mr-1{margin-right:.25rem}.oui-mt-5{margin-top:1.25rem}.oui-grid{display:grid}.oui-h-5{height:1.25rem}.oui-h-\[54px\]{height:54px}.oui-max-h-0{max-height:0}.oui-max-h-\[100px\]{max-height:100px}.oui-w-\[230px\]{width:230px}.oui-w-full{width:100%}.oui-min-w-\[80px\]{min-width:80px}.oui-flex-1{flex:1 1 0%}.oui-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.oui-flex-col{flex-direction:column}.oui-gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.oui-gap-y-2{row-gap:.5rem}.oui-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.oui-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.oui-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.oui-overflow-hidden{overflow:hidden}.oui-rounded{border-radius:.25rem}.\!oui-rounded-bl{border-bottom-left-radius:.25rem!important}.\!oui-rounded-br{border-bottom-right-radius:.25rem!important}.\!oui-rounded-tl{border-top-left-radius:.25rem!important}.\!oui-rounded-tr{border-top-right-radius:.25rem!important}.oui-border{border-width:1px}.oui-border-solid{border-style:solid}.oui-border-line{border-color:rgb(var(--oui-color-line,255 255 255)/.08)}.oui-p-2{padding:.5rem}.oui-px-1{padding-left:.25rem;padding-right:.25rem}.oui-px-2{padding-left:.5rem;padding-right:.5rem}.oui-py-1{padding-bottom:.25rem;padding-top:.25rem}.oui-pb-2{padding-bottom:.5rem}.oui-pr-10{padding-right:2.5rem}.oui-pt-2{padding-top:.5rem}.oui-pt-8{padding-top:2rem}.oui-text-2xs{font-size:var(--oui-font-size-2xs,.75rem);line-height:1.125rem}.oui-text-xs{font-size:var(--oui-font-size-xs,calc(.875rem - 1px));line-height:1.25rem}.oui-text-base-contrast{color:rgb(var(--oui-color-base-foreground)/.98)}.oui-text-base-contrast-36{color:rgb(var(--oui-color-base-foreground)/.36)}.oui-text-base-contrast-54{color:rgb(var(--oui-color-base-foreground)/.54)}.oui-text-base-contrast-80{color:rgb(var(--oui-color-base-foreground)/.8)}.oui-text-trade-loss{--tw-text-opacity:1;color:rgb(var(--oui-color-trading-loss)/var(--tw-text-opacity))}.oui-text-trade-profit{--tw-text-opacity:1;color:rgb(var(--oui-color-trading-profit)/var(--tw-text-opacity))}.oui-transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0) scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0) scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.oui-group:first-child .group-first\:oui-rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.oui-group:last-child .group-last\:oui-rounded-b-xl{border-bottom-left-radius:.75rem;border-bottom-right-radius:.75rem}@media (min-width:768px){.lg\:oui-flex{display:flex}.lg\:oui-flex-1{flex:1 1 0%}.lg\:oui-flex-row{flex-direction:row}.lg\:oui-gap-x-\[6px\]{-moz-column-gap:6px;column-gap:6px}}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@orderly.network/ui-order-entry",
3
+ "version": "2.0.0-alpha.1",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "keywords": [],
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "dependencies": {
14
+ "@orderly.network/ui": "2.0.0-alpha.1",
15
+ "@orderly.network/hooks": "2.0.0-alpha.1",
16
+ "@orderly.network/types": "2.0.0-alpha.1",
17
+ "@orderly.network/utils": "2.0.0-alpha.1"
18
+ },
19
+ "devDependencies": {
20
+ "@types/react": "^18.3.2",
21
+ "@types/react-dom": "^18.3.0",
22
+ "react": "^18.3.1",
23
+ "react-dom": "^18.2.0",
24
+ "tailwindcss": "^3.4.4",
25
+ "tsup": "^7.1.0",
26
+ "typescript": "^5.1.6",
27
+ "tsconfig": "0.3.12"
28
+ },
29
+ "scripts": {
30
+ "test": "echo \"Error: no test specified\" && exit 1"
31
+ }
32
+ }