@orderly.network/react-app 2.5.3-alpha.0 → 2.5.3-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.
package/dist/index.d.mts CHANGED
@@ -1,7 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode, ComponentType, PropsWithChildren } from 'react';
3
- import { ConfigProviderProps, ExclusiveConfigProviderProps, Chains, WalletState, RestrictedInfoOptions, RestrictedInfoReturns, OrderValidationResult } from '@orderly.network/hooks';
1
+ import react, { ReactNode, ComponentType, PropsWithChildren } from 'react';
4
2
  import { ExtensionPosition, OrderlyThemeProviderProps } from '@orderly.network/ui';
3
+ import { ConfigProviderProps, ExclusiveConfigProviderProps, Chains, WalletState, RestrictedInfoOptions, RestrictedInfoReturns, OrderValidationResult } from '@orderly.network/hooks';
5
4
  import { Chain, NetworkId, AccountStatusEnum } from '@orderly.network/types';
6
5
 
7
6
  type Logo = {
@@ -38,6 +37,10 @@ declare const useWalletStateHandle: (options: {
38
37
  wrongNetwork: boolean;
39
38
  };
40
39
 
40
+ type RouteOption = {
41
+ href: "/portfolio" | "/portfolio/history";
42
+ name: string;
43
+ };
41
44
  type AppContextState = {
42
45
  connectWallet: ReturnType<typeof useWalletStateHandle>["connectWallet"];
43
46
  /**
@@ -54,18 +57,16 @@ type AppContextState = {
54
57
  restrictedInfo: RestrictedInfoReturns;
55
58
  showAnnouncement: boolean;
56
59
  setShowAnnouncement: (show: boolean) => void;
60
+ onRouteChange?: (option: RouteOption) => void;
57
61
  };
58
62
  declare const useAppContext: () => AppContextState;
59
63
  type AppStateProviderProps = {
60
64
  defaultChain?: DefaultChain;
61
65
  restrictedInfo?: RestrictedInfoOptions;
62
- } & Pick<AppContextState, "onChainChanged">;
66
+ } & Pick<AppContextState, "onChainChanged" | "onRouteChange">;
63
67
 
64
68
  type OrderlyAppProviderProps = PropsWithChildren<OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps>;
65
- declare const OrderlyAppProvider: {
66
- (props: OrderlyAppProviderProps): react_jsx_runtime.JSX.Element;
67
- displayName: string;
68
- };
69
+ declare const OrderlyAppProvider: react.FC<OrderlyAppProviderProps>;
69
70
 
70
71
  type ThemeContextState = {
71
72
  appIcons?: AppLogos;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode, ComponentType, PropsWithChildren } from 'react';
3
- import { ConfigProviderProps, ExclusiveConfigProviderProps, Chains, WalletState, RestrictedInfoOptions, RestrictedInfoReturns, OrderValidationResult } from '@orderly.network/hooks';
1
+ import react, { ReactNode, ComponentType, PropsWithChildren } from 'react';
4
2
  import { ExtensionPosition, OrderlyThemeProviderProps } from '@orderly.network/ui';
3
+ import { ConfigProviderProps, ExclusiveConfigProviderProps, Chains, WalletState, RestrictedInfoOptions, RestrictedInfoReturns, OrderValidationResult } from '@orderly.network/hooks';
5
4
  import { Chain, NetworkId, AccountStatusEnum } from '@orderly.network/types';
6
5
 
7
6
  type Logo = {
@@ -38,6 +37,10 @@ declare const useWalletStateHandle: (options: {
38
37
  wrongNetwork: boolean;
39
38
  };
40
39
 
40
+ type RouteOption = {
41
+ href: "/portfolio" | "/portfolio/history";
42
+ name: string;
43
+ };
41
44
  type AppContextState = {
42
45
  connectWallet: ReturnType<typeof useWalletStateHandle>["connectWallet"];
43
46
  /**
@@ -54,18 +57,16 @@ type AppContextState = {
54
57
  restrictedInfo: RestrictedInfoReturns;
55
58
  showAnnouncement: boolean;
56
59
  setShowAnnouncement: (show: boolean) => void;
60
+ onRouteChange?: (option: RouteOption) => void;
57
61
  };
58
62
  declare const useAppContext: () => AppContextState;
59
63
  type AppStateProviderProps = {
60
64
  defaultChain?: DefaultChain;
61
65
  restrictedInfo?: RestrictedInfoOptions;
62
- } & Pick<AppContextState, "onChainChanged">;
66
+ } & Pick<AppContextState, "onChainChanged" | "onRouteChange">;
63
67
 
64
68
  type OrderlyAppProviderProps = PropsWithChildren<OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps>;
65
- declare const OrderlyAppProvider: {
66
- (props: OrderlyAppProviderProps): react_jsx_runtime.JSX.Element;
67
- displayName: string;
68
- };
69
+ declare const OrderlyAppProvider: react.FC<OrderlyAppProviderProps>;
69
70
 
70
71
  type ThemeContextState = {
71
72
  appIcons?: AppLogos;
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  'use strict';
2
2
 
3
+ var hooks = require('@orderly.network/hooks');
3
4
  var ui = require('@orderly.network/ui');
4
5
  var react = require('react');
5
- var hooks = require('@orderly.network/hooks');
6
6
  var i18n = require('@orderly.network/i18n');
7
- var utils = require('@orderly.network/utils');
8
7
  var types = require('@orderly.network/types');
8
+ var utils = require('@orderly.network/utils');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
  var locale = require('date-fns/locale');
11
11
 
12
- var O=()=>{react.useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var N=()=>{let r=hooks.useWS(),{t:e}=i18n.useTranslation();react.useEffect(()=>{let s=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:utils.getTimestamp()},{onMessage(t){t.convertId&&ui.toast.success(e("transfer.convert.completed"));}});return ()=>s()},[]);};function _(r){let{storageChain:e,setStorageChain:s}=hooks.useStorageChain(),[t,n]=react.useState(),[c]=hooks.useChains(),o=hooks.useConfig("networkId"),{connectedChain:d}=hooks.useWalletConnector();return react.useEffect(()=>{if(d)n?.(typeof d.id=="number"?d.id:parseInt(d.id));else {if(t)return;let l,i=o==="mainnet"?c.mainnet?.[0]:c.testnet?.[0];typeof r=="function"?l=r(o,c):typeof r=="object"&&(l=o==="mainnet"?r?.mainnet:r?.testnet);let a=l?.id||i?.network_infos?.chain_id;if(!a)return;e?n?.(e.chainId):(s(a),n?.(a));}},[d,c,t,o,n,r]),[t,n]}var W="orderly:wallet-info";function R(){let{connectedChain:r,disconnect:e}=hooks.useWalletConnector(),[s,t]=hooks.useLocalStorage("orderly_link_device",{}),{account:n}=hooks.useAccount(),{isMobile:c}=ui.useScreen(),o=hooks.useConfig(),d=async a=>{localStorage.removeItem(W),await n.disconnect(),await e({label:a});};react.useEffect(()=>{let a=b(),u=JSON.parse(localStorage.getItem(W)??"{}");a&&u&&d(u.label);},[]);let l=async()=>{let a=b();if(!a)return;let{address:u,secretKey:g,chainId:y,chainNamespace:m}=a;if(!await n.importOrderlyKey({address:u,secretKey:g,chainNamespace:m}))return;t({chainId:y,chainNamespace:m});let C=new URL(window.location.href);C.searchParams.delete("link"),C.searchParams.append("utm_medium","qrcode");let k=decodeURIComponent(C.toString());history.replaceState(null,"",k);};react.useEffect(()=>{c&&!r&&l();},[n,r,c]);let i=async()=>{let{chainId:a,chainNamespace:u}=ve()||{};if(c&&!r&&a&&u){let g=n.keyStore.getAddress(),y=n.keyStore.getOrderlyKey(),m=n.keyStore.getAccountId(g);await n.checkOrderlyKey(g,y,m)&&o.set("chainNamespace",u);}};return react.useEffect(()=>{i();},[n,c,r]),{linkDevice:l}}function ve(){try{let r=localStorage.getItem("orderly_link_device");return r?hooks.parseJSON(r):null}catch{}}function b(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:s,k:t,i:n,n:c}=Te(e)||{};if(s&&t&&n&&c)return {address:s,secretKey:t,chainId:n,chainNamespace:c}}function Te(r){try{let e=JSON.parse(window.atob(r)),s=Math.floor(Date.now()/1e3),t=e.t;return !t||s>t?void 0:e}catch{}}function q(){let{t:r}=i18n.useTranslation();hooks.useSettleSubscription({onMessage:e=>{let{status:s}=e;switch(s){case "COMPLETED":ui.toast.success(r("settle.settlement.completed"));break;case "FAILED":ui.toast.error(r("settle.settlement.failed"));break;}}});}function U(){let{t:r}=i18n.useTranslation(),e=hooks.useEventEmitter(),{setLedgerAddress:s}=hooks.useStorageLedgerAddress();return react.useEffect(()=>{e.on("wallet:connect-error",t=>{ui.toast.error(t.message);}),e.on("wallet:sign-message-with-ledger-error",t=>{window.setTimeout(()=>{ui.modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(s(t.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(ui.toast.error(t.message),Promise.resolve()),cancelLabel:r("common.no")}).then(n=>{});});});},[e,r]),{}}function H(){let{t:r}=i18n.useTranslation(),e=hooks.useEventEmitter(),s=react.useRef({}),[t,n]=hooks.useSessionStorage("orderly_wallet_change_id",{});s.current=t,hooks.useWalletSubscription({onMessage:c=>{let{id:o,side:d,transStatus:l}=c,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(l)){let a=s.current[o];n({...t,[o]:a?void 0:true}),i=!a;}if(l==="COMPLETED"&&i){let a=`${utils.capitalizeString(d)} completed`;d==="DEPOSIT"?a=r("transfer.deposit.completed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.completed")),ui.toast.success(a);}else if(l==="FAILED"&&i){let a=`${utils.capitalizeString(d)} failed`;d==="DEPOSIT"?a=r("transfer.deposit.failed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.failed")),ui.toast.error(a);}e.emit("wallet:changed",c);}});}var J="orderly:wallet-info";var Y=r=>{let{wallet:e,connect:s,connectedChain:t,disconnect:n,namespace:c}=hooks.useWalletConnector();if(typeof s!="function")throw new types.SDKError("Please provide a wallet connector provider");hooks.useEventEmitter();let d=react.useRef(false);hooks.useConfig("brokerId");let {account:i,state:a}=hooks.useAccount(),u=hooks.useKeyStore(),g=hooks.useConfig("networkId"),[y,{checkChainSupport:m}]=hooks.useChains(),[I,C]=react.useState(false),{track:k,setTrackUserId:ce}=hooks.useTrack(),w=react.useMemo(()=>e?.accounts?.[0]?.address,[e]),E=react.useMemo(()=>{let p=e?.chains?.[0]?.id,f=e?.chains?.[0]?.namespace;if(!(typeof p>"u"))return {id:utils.parseChainIdToNumber(p),namespace:f}},[e]);return react.useEffect(()=>{a.status>=types.AccountStatusEnum.EnableTrading&&i.accountId&&ce(i.accountId);},[i,a]),react.useEffect(()=>{if(!t){C(false);return}let p=m(t.id,g);types.ABSTRACT_CHAIN_ID_MAP.has(parseInt(t.id))&&e?.label!=="AGW"&&(p=false),C(!p);},[t,y,m,g,e]),react.useEffect(()=>{utils.windowGuard(()=>{let p=u.getAddress(),f=JSON.parse(localStorage.getItem(J)??"{}");t?.namespace!==types.ChainNamespace.solana&&p&&i.address!==p&&f.label&&s({autoSelect:{label:f.label,disableModals:true}}).then(x=>{},x=>{});});},[e,i.address]),react.useEffect(()=>{if(e===null&&a.status>types.AccountStatusEnum.NotConnected&&!a.validating){i.disconnect();return}if(I||!t||d.current)return;let p=b();w&&w!==i.address&&!p&&(i.setAddress(w,{provider:e?.provider,chain:{id:utils.praseChainIdToNumber(E.id),namespace:E.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}},{validateOrderlyKeyScope:f=>f.includes("asset")}),k(types.TrackerEventName.walletConnect,{wallet:e?.label??"",network:E.namespace.toUpperCase()}),utils.windowGuard(()=>{localStorage.setItem(J,JSON.stringify({label:e?.label??""}));})),E?.id!==i.chainId&&i.switchChainId(E?.id);},[e,t,w,E,i.address,a,i.chainId,I]),{connectWallet:async()=>(d.current=true,s({chainId:r.currentChainId}).then(async p=>{if(Array.isArray(p)&&p.length>0&&p[0]&&p[0].accounts.length>0){let f=p[0],x=utils.praseChainIdToNumber(f.chains[0].id);if(!m(x,g))return {wrongNetwork:true};if(!i)throw new Error("account is not initialized");a.status===types.AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await i.disconnect());let de=await i.setAddress(f.accounts[0].address,{provider:f.provider,chain:{id:utils.praseChainIdToNumber(f.chains[0].id),namespace:f.chains[0].namespace.toUpperCase()},wallet:{name:f.label}});return k(types.TrackerEventName.walletConnect,{wallet:f.label,network:f.chains[0].namespace.toUpperCase()}),{wallet:f,status:de,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:I}};var G=react.createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),L=()=>react.useContext(G),j=r=>{let[e,s]=react.useState(false),[t,n]=_(r.defaultChain);R(),hooks.useTrackingInstance();let{connectWallet:c,wrongNetwork:o}=Y({currentChainId:t});H(),q(),N(),U();let d=hooks.useRestrictedInfo(r.restrictedInfo),l=d.restrictedOpen,i=react.useMemo(()=>({connectWallet:c,wrongNetwork:o,currentChainId:t,setCurrentChainId:n,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:d,showAnnouncement:e,setShowAnnouncement:s}),[c,t,l,r.onChainChanged,d,n,e,o]);return jsxRuntime.jsx(G.Provider,{value:i,children:r.children})};var X=react.createContext({}),dr=()=>react.useContext(X),Z=r=>jsxRuntime.jsx(X.Provider,{value:r,children:r.children});function fr(r){return r==="BUY"?i18n.i18n.t("common.buy"):r==="SELL"?i18n.i18n.t("common.sell"):utils.capitalizeString(r)}function re(r,e){let{symbol:s,side:t,quantity:n,client_order_id:c}=r,o="total_executed_quantity"in r?r.total_executed_quantity:0,d="status"in r?r.status:r.algo_status,l=e[s],i=l("base_dp"),a=fr(t),u=utils.transSymbolformString(s),g="algo_type"in r&&r.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?i18n.i18n.t("tpsl.entirePosition"):i===void 0?n:ui.parseNumber(n,{dp:i}),y="",m="";switch(d){case types.OrderStatus.NEW:c?.startsWith("scaled_")?(y=i18n.i18n.t("orders.status.scaledSubOrderOpened.toast.title"),m=`${a} ${u} ${g}`):(y=i18n.i18n.t("orders.status.opened.toast.title"),m=`${a} ${u} ${g}`);break;case types.OrderStatus.FILLED:case types.OrderStatus.PARTIAL_FILLED:let C=i===void 0?o:ui.parseNumber(o,{dp:i});y=i18n.i18n.t("orders.status.filled.toast.title"),m=`${a} ${u} ${C} / ${g}`;break;case types.OrderStatus.CANCELLED:y=i18n.i18n.t("orders.status.canceled.toast.title"),m=`${a} ${u} ${g}`;break;case types.OrderStatus.REJECTED:y=i18n.i18n.t("orders.status.rejected.toast.title"),m=`${a} ${u} ${g}`;break;case types.OrderStatus.REPLACED:y=i18n.i18n.t("orders.status.replaced.toast.title"),m=`${t} ${u} ${o} / ${g}`;break;}return {title:y,msg:m}}function ne(){let r=hooks.useEventEmitter(),e=hooks.useSymbolsInfo(),s=react.useRef({});react.useEffect(()=>{s.current=e;},[e]);let t=hooks.useDebouncedCallback(n=>{(o=>{let{title:d,msg:l}=re(o,s.current),i=o.algo_type||o.type;d&&l&&ui.toast.success(jsxRuntime.jsxs("div",{children:[d,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:l})]}),{id:i});})(n);},100);react.useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t);}),[]);}function ae(){let{t:r}=i18n.useTranslation(),e=i18n.useLocaleCode();return react.useMemo(()=>{let s={[i18n.LocaleEnum.en]:locale.enUS,[i18n.LocaleEnum.zh]:locale.zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:s[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var ie=r=>{let{components:e,appIcons:s,onChainChanged:t,defaultChain:n,...c}=r;hooks.useTrack(),O(),ne();let o=ae();return jsxRuntime.jsx(Z,{appIcons:s,brokerName:r.brokerName,children:jsxRuntime.jsx(ui.OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxRuntime.jsxs(hooks.OrderlyConfigProvider,{...c,children:[jsxRuntime.jsx(j,{onChainChanged:t,defaultChain:n,restrictedInfo:r.restrictedInfo,children:jsxRuntime.jsx(ui.LocaleProvider,{locale:o,children:jsxRuntime.jsx(ui.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(ui.ModalProvider,{children:r.children})})})}),jsxRuntime.jsx(ui.Toaster,{})]})})})};ie.displayName="OrderlyAppProvider";var Wr=(r,e)=>{let{wrongNetwork:s,disabledConnect:t}=L(),{state:n}=hooks.useAccount();return e?.skip?r:s||t||typeof e?.accountStatus<"u"&&n.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Mr(r){let{t:e}=i18n.useTranslation(),s=(n,c,o)=>({quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:o}),max:e("orderEntry.orderPrice.error.max",{value:o})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:o}),max:e("orderEntry.triggerPrice.error.max",{value:o})},tp_trigger_price:{min:e("orderEntry.tpTriggerPrice.error.min",{value:o}),max:e("orderEntry.tpTriggerPrice.error.max",{value:o})},sl_trigger_price:{min:e("orderEntry.slTriggerPrice.error.min",{value:o}),max:e("orderEntry.slTriggerPrice.error.max",{value:o})},total:{min:e("orderEntry.total.error.min",{value:o})},max_price:{required:e("orderEntry.upperPrice.error.required"),min:e("orderEntry.upperPrice.error.min",{value:o}),max:e("orderEntry.upperPrice.error.max",{value:o})},min_price:{required:e("orderEntry.lowerPrice.error.required"),min:e("orderEntry.lowerPrice.error.min",{value:o}),max:e("orderEntry.lowerPrice.error.max")},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:o}),max:e("orderEntry.skew.error.max",{value:o})}})[n]?.[c]||"";return {parseErrorMsg:n=>{let{type:c,value:o}=r?.[n]||{};return c?s(n,c,o):""}}}
12
+ var L=()=>{react.useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};function fe(r){return r==="BUY"?i18n.i18n.t("common.buy"):r==="SELL"?i18n.i18n.t("common.sell"):utils.capitalizeString(r)}function N(r,e){let{symbol:s,side:t,quantity:n,client_order_id:c}=r,o="total_executed_quantity"in r?r.total_executed_quantity:0,d="status"in r?r.status:r.algo_status,l=e[s],i=l("base_dp"),a=fe(t),u=utils.transSymbolformString(s),g="algo_type"in r&&r.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?i18n.i18n.t("tpsl.entirePosition"):i===void 0?n:ui.parseNumber(n,{dp:i}),h="",m="";switch(d){case types.OrderStatus.NEW:c?.startsWith("scaled_")?(h=i18n.i18n.t("orders.status.scaledSubOrderOpened.toast.title"),m=`${a} ${u} ${g}`):(h=i18n.i18n.t("orders.status.opened.toast.title"),m=`${a} ${u} ${g}`);break;case types.OrderStatus.FILLED:case types.OrderStatus.PARTIAL_FILLED:let C=i===void 0?o:ui.parseNumber(o,{dp:i});h=i18n.i18n.t("orders.status.filled.toast.title"),m=`${a} ${u} ${C} / ${g}`;break;case types.OrderStatus.CANCELLED:h=i18n.i18n.t("orders.status.canceled.toast.title"),m=`${a} ${u} ${g}`;break;case types.OrderStatus.REJECTED:h=i18n.i18n.t("orders.status.rejected.toast.title"),m=`${a} ${u} ${g}`;break;case types.OrderStatus.REPLACED:h=i18n.i18n.t("orders.status.replaced.toast.title"),m=`${t} ${u} ${o} / ${g}`;break;}return {title:h,msg:m}}function M(){let r=hooks.useEventEmitter(),e=hooks.useSymbolsInfo(),s=react.useRef({});react.useEffect(()=>{s.current=e;},[e]);let t=hooks.useDebouncedCallback(n=>{(o=>{let{title:d,msg:l}=N(o,s.current),i=o.algo_type||o.type;d&&l&&ui.toast.success(jsxRuntime.jsxs("div",{children:[d,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:l})]}),{id:i});})(n);},100);react.useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t);}),[]);}function $(){let{t:r}=i18n.useTranslation(),e=i18n.useLocaleCode();return react.useMemo(()=>{let s={[i18n.LocaleEnum.en]:locale.enUS,[i18n.LocaleEnum.zh]:locale.zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:s[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var U=()=>{let r=hooks.useWS(),{t:e}=i18n.useTranslation();react.useEffect(()=>{let s=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:utils.getTimestamp()},{onMessage(t){t.convertId&&ui.toast.success(e("transfer.convert.completed"));}});return ()=>s()},[]);};function K(r){let{storageChain:e,setStorageChain:s}=hooks.useStorageChain(),[t,n]=react.useState(),[c]=hooks.useChains(),o=hooks.useConfig("networkId"),{connectedChain:d}=hooks.useWalletConnector();return react.useEffect(()=>{if(d)n?.(typeof d.id=="number"?d.id:parseInt(d.id));else {if(t)return;let l,i=o==="mainnet"?c.mainnet?.[0]:c.testnet?.[0];typeof r=="function"?l=r(o,c):typeof r=="object"&&(l=o==="mainnet"?r?.mainnet:r?.testnet);let a=l?.id||i?.network_infos?.chain_id;if(!a)return;e?n?.(e.chainId):(s(a),n?.(a));}},[d,c,t,o,n,r]),[t,n]}var F="orderly:wallet-info";function H(){let{connectedChain:r,disconnect:e}=hooks.useWalletConnector(),[s,t]=hooks.useLocalStorage("orderly_link_device",{}),{account:n}=hooks.useAccount(),{isMobile:c}=ui.useScreen(),o=hooks.useConfig(),d=async a=>{localStorage.removeItem(F),await n.disconnect(),await e({label:a});};react.useEffect(()=>{let a=b(),u=JSON.parse(localStorage.getItem(F)??"{}");a&&u&&d(u.label);},[]);let l=async()=>{let a=b();if(!a)return;let{address:u,secretKey:g,chainId:h,chainNamespace:m}=a;if(!await n.importOrderlyKey({address:u,secretKey:g,chainNamespace:m}))return;t({chainId:h,chainNamespace:m});let C=new URL(window.location.href);C.searchParams.delete("link"),C.searchParams.append("utm_medium","qrcode");let k=decodeURIComponent(C.toString());history.replaceState(null,"",k);};react.useEffect(()=>{c&&!r&&l();},[n,r,c]);let i=async()=>{let{chainId:a,chainNamespace:u}=He()||{};if(c&&!r&&a&&u){let g=n.keyStore.getAddress(),h=n.keyStore.getOrderlyKey(),m=n.keyStore.getAccountId(g);await n.checkOrderlyKey(g,h,m)&&o.set("chainNamespace",u);}};return react.useEffect(()=>{i();},[n,c,r]),{linkDevice:l}}function He(){try{let r=localStorage.getItem("orderly_link_device");return r?hooks.parseJSON(r):null}catch{}}function b(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:s,k:t,i:n,n:c}=Qe(e)||{};if(s&&t&&n&&c)return {address:s,secretKey:t,chainId:n,chainNamespace:c}}function Qe(r){try{let e=JSON.parse(window.atob(r)),s=Math.floor(Date.now()/1e3),t=e.t;return !t||s>t?void 0:e}catch{}}function z(){let{t:r}=i18n.useTranslation();hooks.useSettleSubscription({onMessage:e=>{let{status:s}=e;switch(s){case "COMPLETED":ui.toast.success(r("settle.settlement.completed"));break;case "FAILED":ui.toast.error(r("settle.settlement.failed"));break;}}});}function B(){let{t:r}=i18n.useTranslation(),e=hooks.useEventEmitter(),{setLedgerAddress:s}=hooks.useStorageLedgerAddress();return react.useEffect(()=>{e.on("wallet:connect-error",t=>{ui.toast.error(t.message);}),e.on("wallet:sign-message-with-ledger-error",t=>{window.setTimeout(()=>{ui.modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(s(t.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(ui.toast.error(t.message),Promise.resolve()),cancelLabel:r("common.no")}).then(n=>{});});});},[e,r]),{}}function G(){let{t:r}=i18n.useTranslation(),e=hooks.useEventEmitter(),s=react.useRef({}),[t,n]=hooks.useSessionStorage("orderly_wallet_change_id",{});s.current=t,hooks.useWalletSubscription({onMessage:c=>{let{id:o,side:d,transStatus:l}=c,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(l)){let a=s.current[o];n({...t,[o]:a?void 0:true}),i=!a;}if(l==="COMPLETED"&&i){let a=`${utils.capitalizeString(d)} completed`;d==="DEPOSIT"?a=r("transfer.deposit.completed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.completed")),ui.toast.success(a);}else if(l==="FAILED"&&i){let a=`${utils.capitalizeString(d)} failed`;d==="DEPOSIT"?a=r("transfer.deposit.failed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.failed")),ui.toast.error(a);}e.emit("wallet:changed",c);}});}var re="orderly:wallet-info";var te=r=>{let{wallet:e,connect:s,connectedChain:t,disconnect:n,namespace:c}=hooks.useWalletConnector();if(typeof s!="function")throw new types.SDKError("Please provide a wallet connector provider");hooks.useEventEmitter();let d=react.useRef(false);hooks.useConfig("brokerId");let {account:i,state:a}=hooks.useAccount(),u=hooks.useKeyStore(),g=hooks.useConfig("networkId"),[h,{checkChainSupport:m}]=hooks.useChains(),[P,C]=react.useState(false),{track:k,setTrackUserId:ce}=hooks.useTrack(),w=react.useMemo(()=>e?.accounts?.[0]?.address,[e]),E=react.useMemo(()=>{let p=e?.chains?.[0]?.id,f=e?.chains?.[0]?.namespace;if(!(typeof p>"u"))return {id:utils.parseChainIdToNumber(p),namespace:f}},[e]);return react.useEffect(()=>{a.status>=types.AccountStatusEnum.EnableTrading&&i.accountId&&ce(i.accountId);},[i,a]),react.useEffect(()=>{if(!t){C(false);return}let p=m(t.id,g);types.ABSTRACT_CHAIN_ID_MAP.has(parseInt(t.id))&&e?.label!=="AGW"&&(p=false),C(!p);},[t,h,m,g,e]),react.useEffect(()=>{utils.windowGuard(()=>{let p=u.getAddress(),f=JSON.parse(localStorage.getItem(re)??"{}");t?.namespace!==types.ChainNamespace.solana&&p&&i.address!==p&&f.label&&s({autoSelect:{label:f.label,disableModals:true}}).then(x=>{},x=>{});});},[e,i.address]),react.useEffect(()=>{if(e===null&&a.status>types.AccountStatusEnum.NotConnected&&!a.validating){i.disconnect();return}if(P||!t||d.current)return;let p=b();w&&w!==i.address&&!p&&(i.setAddress(w,{provider:e?.provider,chain:{id:utils.praseChainIdToNumber(E.id),namespace:E.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}},{validateOrderlyKeyScope:f=>f.includes("asset")}),k(types.TrackerEventName.walletConnect,{wallet:e?.label??"",network:E.namespace.toUpperCase()}),utils.windowGuard(()=>{localStorage.setItem(re,JSON.stringify({label:e?.label??""}));})),E?.id!==i.chainId&&i.switchChainId(E?.id);},[e,t,w,E,i.address,a,i.chainId,P]),{connectWallet:async()=>(d.current=true,s({chainId:r.currentChainId}).then(async p=>{if(Array.isArray(p)&&p.length>0&&p[0]&&p[0].accounts.length>0){let f=p[0],x=utils.praseChainIdToNumber(f.chains[0].id);if(!m(x,g))return {wrongNetwork:true};if(!i)throw new Error("account is not initialized");a.status===types.AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await i.disconnect());let de=await i.setAddress(f.accounts[0].address,{provider:f.provider,chain:{id:utils.praseChainIdToNumber(f.chains[0].id),namespace:f.chains[0].namespace.toUpperCase()},wallet:{name:f.label}});return k(types.TrackerEventName.walletConnect,{wallet:f.label,network:f.chains[0].namespace.toUpperCase()}),{wallet:f,status:de,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:P}};var oe=react.createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),D=()=>react.useContext(oe),ne=r=>{let[e,s]=react.useState(false),[t,n]=K(r.defaultChain);H(),hooks.useTrackingInstance();let{connectWallet:c,wrongNetwork:o}=te({currentChainId:t});G(),z(),U(),B();let d=hooks.useRestrictedInfo(r.restrictedInfo),l=d.restrictedOpen,i=react.useMemo(()=>({connectWallet:c,wrongNetwork:o,currentChainId:t,setCurrentChainId:n,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:d,showAnnouncement:e,setShowAnnouncement:s,onRouteChange:r.onRouteChange}),[c,t,l,r.onChainChanged,d,n,e,o,r.onRouteChange]);return jsxRuntime.jsx(oe.Provider,{value:i,children:r.children})};var se=react.createContext({}),wr=()=>react.useContext(se),ae=r=>jsxRuntime.jsx(se.Provider,{value:r,children:r.children});var ie=r=>{let{components:e,appIcons:s,onChainChanged:t,defaultChain:n,...c}=r;hooks.useTrack(),L(),M();let o=$();return jsxRuntime.jsx(ae,{appIcons:s,brokerName:r.brokerName,children:jsxRuntime.jsx(ui.OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxRuntime.jsxs(hooks.OrderlyConfigProvider,{...c,children:[jsxRuntime.jsx(ne,{onChainChanged:t,defaultChain:n,restrictedInfo:r.restrictedInfo,onRouteChange:r.onRouteChange,children:jsxRuntime.jsx(ui.LocaleProvider,{locale:o,children:jsxRuntime.jsx(ui.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(ui.ModalProvider,{children:r.children})})})}),jsxRuntime.jsx(ui.Toaster,{})]})})})};ie.displayName="OrderlyAppProvider";var _r=(r,e)=>{let{wrongNetwork:s,disabledConnect:t}=D(),{state:n}=hooks.useAccount();return e?.skip?r:s||t||typeof e?.accountStatus<"u"&&n.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Mr(r){let{t:e}=i18n.useTranslation(),s=(n,c,o)=>({quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:o}),max:e("orderEntry.orderPrice.error.max",{value:o})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:o}),max:e("orderEntry.triggerPrice.error.max",{value:o})},tp_trigger_price:{min:e("orderEntry.tpTriggerPrice.error.min",{value:o}),max:e("orderEntry.tpTriggerPrice.error.max",{value:o})},sl_trigger_price:{min:e("orderEntry.slTriggerPrice.error.min",{value:o}),max:e("orderEntry.slTriggerPrice.error.max",{value:o})},total:{min:e("orderEntry.total.error.min",{value:o})},max_price:{required:e("orderEntry.upperPrice.error.required"),min:e("orderEntry.upperPrice.error.min",{value:o}),max:e("orderEntry.upperPrice.error.max",{value:o})},min_price:{required:e("orderEntry.lowerPrice.error.required"),min:e("orderEntry.lowerPrice.error.min",{value:o}),max:e("orderEntry.lowerPrice.error.max")},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:o}),max:e("orderEntry.skew.error.max",{value:o})}})[n]?.[c]||"";return {parseErrorMsg:n=>{let{type:c,value:o}=r?.[n]||{};return c?s(n,c,o):""}}}
13
13
 
14
14
  exports.OrderlyAppProvider = ie;
15
- exports.useAppConfig = dr;
16
- exports.useAppContext = L;
17
- exports.useDataTap = Wr;
15
+ exports.useAppConfig = wr;
16
+ exports.useAppContext = D;
17
+ exports.useDataTap = _r;
18
18
  exports.useOrderEntryFormErrorMsg = Mr;
19
19
  //# sourceMappingURL=out.js.map
20
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/provider/appContext.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/configContext.tsx","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts"],"names":["UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","useTrack","createContext","useContext","useState","useMemo","useRestrictedInfo","useTrackingInstance","useWS","useTranslation","toast","getTimestamp","useAssetconvertEvent","ws","t","unsubscribe","data","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","status","useEventEmitter","modal","useStorageLedgerAddress","useWalletConnectError","ee","setLedgerAddress","res","useRef","capitalizeString","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","side","transStatus","showToast","isPushOnce","msg","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","scope","walletState","wallet","jsx","AppContext","show","useAppContext","AppStateProvider","props","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","AppConfigContext","useAppConfig","AppConfigProvider","useSymbolsInfo","useDebouncedCallback","i18n","OrderStatus","AlgoOrderRootType","parseNumber","transSymbolformString","getDisplaySide","getOrderExecutionReportMsg","symbolsInfo","symbol","quantity","client_order_id","total_executed_quantity","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","displayTotalExecutedQuantity","jsxs","useExecutionReport","symbolsInfoRef","handler","orderType","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","localeCode","calendarLocale","OrderlyAppProvider","components","appIcons","onChainChanged","configProps","uiLocale","useDataTap","state","useOrderEntryFormErrorMsg","errors","getMessage","key","type","value"],"mappings":"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","sourcesContent":["import { PropsWithChildren } from \"react\";\nimport { OrderlyAppConfig } from \"../types\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport {\n ConfigProviderProps,\n OrderlyConfigProvider,\n useTrack,\n} from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider = (props: OrderlyAppProviderProps) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n useExecutionReport();\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...(configProps as ConfigProviderProps)}>\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","import {\n FC,\n createContext,\n PropsWithChildren,\n useContext,\n useState,\n useMemo,\n} from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n RestrictedInfoReturns,\n useTrackingInstance,\n} from \"@orderly.network/hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n};\n\nconst AppContext = createContext<AppContextState>({\n setCurrentChainId: (chainId: number | undefined) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<AppContextState, \"onChainChanged\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n ],\n );\n\n return (\n <AppContext.Provider value={memoizedValue}>\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getTimestamp } from \"@orderly.network/utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useCallback, useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n url.searchParams.append(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\nimport { useStorageLedgerAddress } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@orderly.network/types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(\n currentWalletAddress,\n {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n },\n {\n // TODO: remove this when default orderly key scope includes asset\n validateOrderlyKeyScope: (scope: string) => {\n return scope.includes(\"asset\");\n },\n },\n );\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import { createContext, PropsWithChildren, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider = (\n props: PropsWithChildren<{\n appIcons?: AppLogos;\n brokerName: string;\n }>\n) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n </div>,\n {\n id: orderType,\n },\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import { i18n } from \"@orderly.network/i18n\";\nimport { API, OrderStatus } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@orderly.network/i18n\";\nimport { Locale } from \"@orderly.network/ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import { useAccount } from \"@orderly.network/hooks\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (key: Keys, type: ErrorType, value?: number | string) => {\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n },\n sl_trigger_price: {\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n max_price: {\n required: t(\"orderEntry.upperPrice.error.required\"),\n min: t(\"orderEntry.upperPrice.error.min\", { value }),\n max: t(\"orderEntry.upperPrice.error.max\", { value }),\n },\n min_price: {\n required: t(\"orderEntry.lowerPrice.error.required\"),\n min: t(\"orderEntry.lowerPrice.error.min\", { value }),\n // not use value\n max: t(\"orderEntry.lowerPrice.error.max\"),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const parseErrorMsg = (key: Keys) => {\n const { type, value } = errors?.[key] || ({} as OrderValidationItem);\n if (type) {\n return getMessage(key, type, value);\n }\n return \"\";\n };\n\n return {\n parseErrorMsg,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/provider/appContext.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/configContext.tsx","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts"],"names":["OrderlyConfigProvider","useTrack","UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","useRef","useSymbolsInfo","useEventEmitter","useDebouncedCallback","toast","i18n","OrderStatus","AlgoOrderRootType","parseNumber","capitalizeString","transSymbolformString","getDisplaySide","side","getOrderExecutionReportMsg","data","symbolsInfo","symbol","quantity","client_order_id","total_executed_quantity","status","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","msg","displayTotalExecutedQuantity","jsx","jsxs","useExecutionReport","ee","symbolsInfoRef","handler","orderType","useMemo","useTranslation","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","t","localeCode","calendarLocale","createContext","useContext","useState","useRestrictedInfo","useTrackingInstance","useWS","getTimestamp","useAssetconvertEvent","ws","unsubscribe","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","res","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","transStatus","showToast","isPushOnce","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","scope","walletState","wallet","AppContext","show","useAppContext","AppStateProvider","props","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","AppConfigContext","useAppConfig","AppConfigProvider","OrderlyAppProvider","components","appIcons","onChainChanged","configProps","uiLocale","useDataTap","state","useOrderEntryFormErrorMsg","errors","getMessage","key","type","value"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { OrderlyConfigProvider, useTrack } from \"@orderly.network/hooks\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyAppConfig } from \"../types\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider: React.FC<OrderlyAppProviderProps> = (props) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n useExecutionReport();\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...configProps}>\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n onRouteChange={props.onRouteChange}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","import { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n </div>,\n {\n id: orderType,\n },\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import { i18n } from \"@orderly.network/i18n\";\nimport { API, OrderStatus } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@orderly.network/i18n\";\nimport { Locale } from \"@orderly.network/ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import {\n FC,\n createContext,\n PropsWithChildren,\n useContext,\n useState,\n useMemo,\n} from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n RestrictedInfoReturns,\n useTrackingInstance,\n} from \"@orderly.network/hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n onRouteChange?: (option: RouteOption) => void;\n};\n\nconst AppContext = createContext<AppContextState>({\n setCurrentChainId: (chainId?: number) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<AppContextState, \"onChainChanged\" | \"onRouteChange\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n onRouteChange: props.onRouteChange,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n props.onRouteChange,\n ],\n );\n\n return (\n <AppContext.Provider value={memoizedValue}>\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getTimestamp } from \"@orderly.network/utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useCallback, useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n url.searchParams.append(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\nimport { useStorageLedgerAddress } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@orderly.network/types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(\n currentWalletAddress,\n {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n },\n {\n // TODO: remove this when default orderly key scope includes asset\n validateOrderlyKeyScope: (scope: string) => {\n return scope.includes(\"asset\");\n },\n },\n );\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import React, { createContext, PropsWithChildren, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState,\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider: React.FC<\n PropsWithChildren<{ appIcons?: AppLogos; brokerName: string }>\n> = (props) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useAccount } from \"@orderly.network/hooks\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (key: Keys, type: ErrorType, value?: number | string) => {\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n },\n sl_trigger_price: {\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n max_price: {\n required: t(\"orderEntry.upperPrice.error.required\"),\n min: t(\"orderEntry.upperPrice.error.min\", { value }),\n max: t(\"orderEntry.upperPrice.error.max\", { value }),\n },\n min_price: {\n required: t(\"orderEntry.lowerPrice.error.required\"),\n min: t(\"orderEntry.lowerPrice.error.min\", { value }),\n // not use value\n max: t(\"orderEntry.lowerPrice.error.max\"),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const parseErrorMsg = (key: Keys) => {\n const { type, value } = errors?.[key] || ({} as OrderValidationItem);\n if (type) {\n return getMessage(key, type, value);\n }\n return \"\";\n };\n\n return {\n parseErrorMsg,\n };\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,14 +1,14 @@
1
+ import { useTrack, OrderlyConfigProvider, useAccount, useEventEmitter, useSymbolsInfo, useDebouncedCallback, useTrackingInstance, useRestrictedInfo, useStorageChain, useChains, useConfig, useWalletConnector, useLocalStorage, useKeyStore, useSessionStorage, useWalletSubscription, useSettleSubscription, useWS, useStorageLedgerAddress, parseJSON } from '@orderly.network/hooks';
1
2
  import { OrderlyThemeProvider, LocaleProvider, TooltipProvider, ModalProvider, Toaster, toast, parseNumber, useScreen, modal } from '@orderly.network/ui';
2
3
  import { createContext, useContext, useEffect, useRef, useMemo, useState } from 'react';
3
- import { useTrack, OrderlyConfigProvider, useAccount, useEventEmitter, useSymbolsInfo, useDebouncedCallback, useTrackingInstance, useRestrictedInfo, useStorageChain, useChains, useConfig, useWalletConnector, useLocalStorage, useKeyStore, useSessionStorage, useWalletSubscription, useSettleSubscription, useWS, useStorageLedgerAddress, parseJSON } from '@orderly.network/hooks';
4
4
  import { useTranslation, useLocaleCode, LocaleEnum, i18n } from '@orderly.network/i18n';
5
- import { transSymbolformString, parseChainIdToNumber, windowGuard, praseChainIdToNumber, capitalizeString, getTimestamp } from '@orderly.network/utils';
6
5
  import { AlgoOrderRootType, OrderStatus, SDKError, AccountStatusEnum, ABSTRACT_CHAIN_ID_MAP, ChainNamespace, TrackerEventName } from '@orderly.network/types';
6
+ import { transSymbolformString, parseChainIdToNumber, windowGuard, praseChainIdToNumber, capitalizeString, getTimestamp } from '@orderly.network/utils';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
8
8
  import { zhCN, enUS } from 'date-fns/locale';
9
9
 
10
- var O=()=>{useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var N=()=>{let r=useWS(),{t:e}=useTranslation();useEffect(()=>{let s=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:getTimestamp()},{onMessage(t){t.convertId&&toast.success(e("transfer.convert.completed"));}});return ()=>s()},[]);};function _(r){let{storageChain:e,setStorageChain:s}=useStorageChain(),[t,n]=useState(),[c]=useChains(),o=useConfig("networkId"),{connectedChain:d}=useWalletConnector();return useEffect(()=>{if(d)n?.(typeof d.id=="number"?d.id:parseInt(d.id));else {if(t)return;let l,i=o==="mainnet"?c.mainnet?.[0]:c.testnet?.[0];typeof r=="function"?l=r(o,c):typeof r=="object"&&(l=o==="mainnet"?r?.mainnet:r?.testnet);let a=l?.id||i?.network_infos?.chain_id;if(!a)return;e?n?.(e.chainId):(s(a),n?.(a));}},[d,c,t,o,n,r]),[t,n]}var W="orderly:wallet-info";function R(){let{connectedChain:r,disconnect:e}=useWalletConnector(),[s,t]=useLocalStorage("orderly_link_device",{}),{account:n}=useAccount(),{isMobile:c}=useScreen(),o=useConfig(),d=async a=>{localStorage.removeItem(W),await n.disconnect(),await e({label:a});};useEffect(()=>{let a=b(),u=JSON.parse(localStorage.getItem(W)??"{}");a&&u&&d(u.label);},[]);let l=async()=>{let a=b();if(!a)return;let{address:u,secretKey:g,chainId:y,chainNamespace:m}=a;if(!await n.importOrderlyKey({address:u,secretKey:g,chainNamespace:m}))return;t({chainId:y,chainNamespace:m});let C=new URL(window.location.href);C.searchParams.delete("link"),C.searchParams.append("utm_medium","qrcode");let k=decodeURIComponent(C.toString());history.replaceState(null,"",k);};useEffect(()=>{c&&!r&&l();},[n,r,c]);let i=async()=>{let{chainId:a,chainNamespace:u}=ve()||{};if(c&&!r&&a&&u){let g=n.keyStore.getAddress(),y=n.keyStore.getOrderlyKey(),m=n.keyStore.getAccountId(g);await n.checkOrderlyKey(g,y,m)&&o.set("chainNamespace",u);}};return useEffect(()=>{i();},[n,c,r]),{linkDevice:l}}function ve(){try{let r=localStorage.getItem("orderly_link_device");return r?parseJSON(r):null}catch{}}function b(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:s,k:t,i:n,n:c}=Te(e)||{};if(s&&t&&n&&c)return {address:s,secretKey:t,chainId:n,chainNamespace:c}}function Te(r){try{let e=JSON.parse(window.atob(r)),s=Math.floor(Date.now()/1e3),t=e.t;return !t||s>t?void 0:e}catch{}}function q(){let{t:r}=useTranslation();useSettleSubscription({onMessage:e=>{let{status:s}=e;switch(s){case "COMPLETED":toast.success(r("settle.settlement.completed"));break;case "FAILED":toast.error(r("settle.settlement.failed"));break;}}});}function U(){let{t:r}=useTranslation(),e=useEventEmitter(),{setLedgerAddress:s}=useStorageLedgerAddress();return useEffect(()=>{e.on("wallet:connect-error",t=>{toast.error(t.message);}),e.on("wallet:sign-message-with-ledger-error",t=>{window.setTimeout(()=>{modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(s(t.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(toast.error(t.message),Promise.resolve()),cancelLabel:r("common.no")}).then(n=>{});});});},[e,r]),{}}function H(){let{t:r}=useTranslation(),e=useEventEmitter(),s=useRef({}),[t,n]=useSessionStorage("orderly_wallet_change_id",{});s.current=t,useWalletSubscription({onMessage:c=>{let{id:o,side:d,transStatus:l}=c,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(l)){let a=s.current[o];n({...t,[o]:a?void 0:true}),i=!a;}if(l==="COMPLETED"&&i){let a=`${capitalizeString(d)} completed`;d==="DEPOSIT"?a=r("transfer.deposit.completed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.completed")),toast.success(a);}else if(l==="FAILED"&&i){let a=`${capitalizeString(d)} failed`;d==="DEPOSIT"?a=r("transfer.deposit.failed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.failed")),toast.error(a);}e.emit("wallet:changed",c);}});}var J="orderly:wallet-info";var Y=r=>{let{wallet:e,connect:s,connectedChain:t,disconnect:n,namespace:c}=useWalletConnector();if(typeof s!="function")throw new SDKError("Please provide a wallet connector provider");useEventEmitter();let d=useRef(false);useConfig("brokerId");let {account:i,state:a}=useAccount(),u=useKeyStore(),g=useConfig("networkId"),[y,{checkChainSupport:m}]=useChains(),[I,C]=useState(false),{track:k,setTrackUserId:ce}=useTrack(),w=useMemo(()=>e?.accounts?.[0]?.address,[e]),E=useMemo(()=>{let p=e?.chains?.[0]?.id,f=e?.chains?.[0]?.namespace;if(!(typeof p>"u"))return {id:parseChainIdToNumber(p),namespace:f}},[e]);return useEffect(()=>{a.status>=AccountStatusEnum.EnableTrading&&i.accountId&&ce(i.accountId);},[i,a]),useEffect(()=>{if(!t){C(false);return}let p=m(t.id,g);ABSTRACT_CHAIN_ID_MAP.has(parseInt(t.id))&&e?.label!=="AGW"&&(p=false),C(!p);},[t,y,m,g,e]),useEffect(()=>{windowGuard(()=>{let p=u.getAddress(),f=JSON.parse(localStorage.getItem(J)??"{}");t?.namespace!==ChainNamespace.solana&&p&&i.address!==p&&f.label&&s({autoSelect:{label:f.label,disableModals:true}}).then(x=>{},x=>{});});},[e,i.address]),useEffect(()=>{if(e===null&&a.status>AccountStatusEnum.NotConnected&&!a.validating){i.disconnect();return}if(I||!t||d.current)return;let p=b();w&&w!==i.address&&!p&&(i.setAddress(w,{provider:e?.provider,chain:{id:praseChainIdToNumber(E.id),namespace:E.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}},{validateOrderlyKeyScope:f=>f.includes("asset")}),k(TrackerEventName.walletConnect,{wallet:e?.label??"",network:E.namespace.toUpperCase()}),windowGuard(()=>{localStorage.setItem(J,JSON.stringify({label:e?.label??""}));})),E?.id!==i.chainId&&i.switchChainId(E?.id);},[e,t,w,E,i.address,a,i.chainId,I]),{connectWallet:async()=>(d.current=true,s({chainId:r.currentChainId}).then(async p=>{if(Array.isArray(p)&&p.length>0&&p[0]&&p[0].accounts.length>0){let f=p[0],x=praseChainIdToNumber(f.chains[0].id);if(!m(x,g))return {wrongNetwork:true};if(!i)throw new Error("account is not initialized");a.status===AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await i.disconnect());let de=await i.setAddress(f.accounts[0].address,{provider:f.provider,chain:{id:praseChainIdToNumber(f.chains[0].id),namespace:f.chains[0].namespace.toUpperCase()},wallet:{name:f.label}});return k(TrackerEventName.walletConnect,{wallet:f.label,network:f.chains[0].namespace.toUpperCase()}),{wallet:f,status:de,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:I}};var G=createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),L=()=>useContext(G),j=r=>{let[e,s]=useState(false),[t,n]=_(r.defaultChain);R(),useTrackingInstance();let{connectWallet:c,wrongNetwork:o}=Y({currentChainId:t});H(),q(),N(),U();let d=useRestrictedInfo(r.restrictedInfo),l=d.restrictedOpen,i=useMemo(()=>({connectWallet:c,wrongNetwork:o,currentChainId:t,setCurrentChainId:n,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:d,showAnnouncement:e,setShowAnnouncement:s}),[c,t,l,r.onChainChanged,d,n,e,o]);return jsx(G.Provider,{value:i,children:r.children})};var X=createContext({}),dr=()=>useContext(X),Z=r=>jsx(X.Provider,{value:r,children:r.children});function fr(r){return r==="BUY"?i18n.t("common.buy"):r==="SELL"?i18n.t("common.sell"):capitalizeString(r)}function re(r,e){let{symbol:s,side:t,quantity:n,client_order_id:c}=r,o="total_executed_quantity"in r?r.total_executed_quantity:0,d="status"in r?r.status:r.algo_status,l=e[s],i=l("base_dp"),a=fr(t),u=transSymbolformString(s),g="algo_type"in r&&r.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?i18n.t("tpsl.entirePosition"):i===void 0?n:parseNumber(n,{dp:i}),y="",m="";switch(d){case OrderStatus.NEW:c?.startsWith("scaled_")?(y=i18n.t("orders.status.scaledSubOrderOpened.toast.title"),m=`${a} ${u} ${g}`):(y=i18n.t("orders.status.opened.toast.title"),m=`${a} ${u} ${g}`);break;case OrderStatus.FILLED:case OrderStatus.PARTIAL_FILLED:let C=i===void 0?o:parseNumber(o,{dp:i});y=i18n.t("orders.status.filled.toast.title"),m=`${a} ${u} ${C} / ${g}`;break;case OrderStatus.CANCELLED:y=i18n.t("orders.status.canceled.toast.title"),m=`${a} ${u} ${g}`;break;case OrderStatus.REJECTED:y=i18n.t("orders.status.rejected.toast.title"),m=`${a} ${u} ${g}`;break;case OrderStatus.REPLACED:y=i18n.t("orders.status.replaced.toast.title"),m=`${t} ${u} ${o} / ${g}`;break;}return {title:y,msg:m}}function ne(){let r=useEventEmitter(),e=useSymbolsInfo(),s=useRef({});useEffect(()=>{s.current=e;},[e]);let t=useDebouncedCallback(n=>{(o=>{let{title:d,msg:l}=re(o,s.current),i=o.algo_type||o.type;d&&l&&toast.success(jsxs("div",{children:[d,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:l})]}),{id:i});})(n);},100);useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t);}),[]);}function ae(){let{t:r}=useTranslation(),e=useLocaleCode();return useMemo(()=>{let s={[LocaleEnum.en]:enUS,[LocaleEnum.zh]:zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:s[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var ie=r=>{let{components:e,appIcons:s,onChainChanged:t,defaultChain:n,...c}=r;useTrack(),O(),ne();let o=ae();return jsx(Z,{appIcons:s,brokerName:r.brokerName,children:jsx(OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxs(OrderlyConfigProvider,{...c,children:[jsx(j,{onChainChanged:t,defaultChain:n,restrictedInfo:r.restrictedInfo,children:jsx(LocaleProvider,{locale:o,children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:r.children})})})}),jsx(Toaster,{})]})})})};ie.displayName="OrderlyAppProvider";var Wr=(r,e)=>{let{wrongNetwork:s,disabledConnect:t}=L(),{state:n}=useAccount();return e?.skip?r:s||t||typeof e?.accountStatus<"u"&&n.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Mr(r){let{t:e}=useTranslation(),s=(n,c,o)=>({quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:o}),max:e("orderEntry.orderPrice.error.max",{value:o})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:o}),max:e("orderEntry.triggerPrice.error.max",{value:o})},tp_trigger_price:{min:e("orderEntry.tpTriggerPrice.error.min",{value:o}),max:e("orderEntry.tpTriggerPrice.error.max",{value:o})},sl_trigger_price:{min:e("orderEntry.slTriggerPrice.error.min",{value:o}),max:e("orderEntry.slTriggerPrice.error.max",{value:o})},total:{min:e("orderEntry.total.error.min",{value:o})},max_price:{required:e("orderEntry.upperPrice.error.required"),min:e("orderEntry.upperPrice.error.min",{value:o}),max:e("orderEntry.upperPrice.error.max",{value:o})},min_price:{required:e("orderEntry.lowerPrice.error.required"),min:e("orderEntry.lowerPrice.error.min",{value:o}),max:e("orderEntry.lowerPrice.error.max")},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:o}),max:e("orderEntry.skew.error.max",{value:o})}})[n]?.[c]||"";return {parseErrorMsg:n=>{let{type:c,value:o}=r?.[n]||{};return c?s(n,c,o):""}}}
10
+ var L=()=>{useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};function fe(r){return r==="BUY"?i18n.t("common.buy"):r==="SELL"?i18n.t("common.sell"):capitalizeString(r)}function N(r,e){let{symbol:s,side:t,quantity:n,client_order_id:c}=r,o="total_executed_quantity"in r?r.total_executed_quantity:0,d="status"in r?r.status:r.algo_status,l=e[s],i=l("base_dp"),a=fe(t),u=transSymbolformString(s),g="algo_type"in r&&r.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?i18n.t("tpsl.entirePosition"):i===void 0?n:parseNumber(n,{dp:i}),h="",m="";switch(d){case OrderStatus.NEW:c?.startsWith("scaled_")?(h=i18n.t("orders.status.scaledSubOrderOpened.toast.title"),m=`${a} ${u} ${g}`):(h=i18n.t("orders.status.opened.toast.title"),m=`${a} ${u} ${g}`);break;case OrderStatus.FILLED:case OrderStatus.PARTIAL_FILLED:let C=i===void 0?o:parseNumber(o,{dp:i});h=i18n.t("orders.status.filled.toast.title"),m=`${a} ${u} ${C} / ${g}`;break;case OrderStatus.CANCELLED:h=i18n.t("orders.status.canceled.toast.title"),m=`${a} ${u} ${g}`;break;case OrderStatus.REJECTED:h=i18n.t("orders.status.rejected.toast.title"),m=`${a} ${u} ${g}`;break;case OrderStatus.REPLACED:h=i18n.t("orders.status.replaced.toast.title"),m=`${t} ${u} ${o} / ${g}`;break;}return {title:h,msg:m}}function M(){let r=useEventEmitter(),e=useSymbolsInfo(),s=useRef({});useEffect(()=>{s.current=e;},[e]);let t=useDebouncedCallback(n=>{(o=>{let{title:d,msg:l}=N(o,s.current),i=o.algo_type||o.type;d&&l&&toast.success(jsxs("div",{children:[d,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:l})]}),{id:i});})(n);},100);useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t);}),[]);}function $(){let{t:r}=useTranslation(),e=useLocaleCode();return useMemo(()=>{let s={[LocaleEnum.en]:enUS,[LocaleEnum.zh]:zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:s[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var U=()=>{let r=useWS(),{t:e}=useTranslation();useEffect(()=>{let s=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:getTimestamp()},{onMessage(t){t.convertId&&toast.success(e("transfer.convert.completed"));}});return ()=>s()},[]);};function K(r){let{storageChain:e,setStorageChain:s}=useStorageChain(),[t,n]=useState(),[c]=useChains(),o=useConfig("networkId"),{connectedChain:d}=useWalletConnector();return useEffect(()=>{if(d)n?.(typeof d.id=="number"?d.id:parseInt(d.id));else {if(t)return;let l,i=o==="mainnet"?c.mainnet?.[0]:c.testnet?.[0];typeof r=="function"?l=r(o,c):typeof r=="object"&&(l=o==="mainnet"?r?.mainnet:r?.testnet);let a=l?.id||i?.network_infos?.chain_id;if(!a)return;e?n?.(e.chainId):(s(a),n?.(a));}},[d,c,t,o,n,r]),[t,n]}var F="orderly:wallet-info";function H(){let{connectedChain:r,disconnect:e}=useWalletConnector(),[s,t]=useLocalStorage("orderly_link_device",{}),{account:n}=useAccount(),{isMobile:c}=useScreen(),o=useConfig(),d=async a=>{localStorage.removeItem(F),await n.disconnect(),await e({label:a});};useEffect(()=>{let a=b(),u=JSON.parse(localStorage.getItem(F)??"{}");a&&u&&d(u.label);},[]);let l=async()=>{let a=b();if(!a)return;let{address:u,secretKey:g,chainId:h,chainNamespace:m}=a;if(!await n.importOrderlyKey({address:u,secretKey:g,chainNamespace:m}))return;t({chainId:h,chainNamespace:m});let C=new URL(window.location.href);C.searchParams.delete("link"),C.searchParams.append("utm_medium","qrcode");let k=decodeURIComponent(C.toString());history.replaceState(null,"",k);};useEffect(()=>{c&&!r&&l();},[n,r,c]);let i=async()=>{let{chainId:a,chainNamespace:u}=He()||{};if(c&&!r&&a&&u){let g=n.keyStore.getAddress(),h=n.keyStore.getOrderlyKey(),m=n.keyStore.getAccountId(g);await n.checkOrderlyKey(g,h,m)&&o.set("chainNamespace",u);}};return useEffect(()=>{i();},[n,c,r]),{linkDevice:l}}function He(){try{let r=localStorage.getItem("orderly_link_device");return r?parseJSON(r):null}catch{}}function b(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:s,k:t,i:n,n:c}=Qe(e)||{};if(s&&t&&n&&c)return {address:s,secretKey:t,chainId:n,chainNamespace:c}}function Qe(r){try{let e=JSON.parse(window.atob(r)),s=Math.floor(Date.now()/1e3),t=e.t;return !t||s>t?void 0:e}catch{}}function z(){let{t:r}=useTranslation();useSettleSubscription({onMessage:e=>{let{status:s}=e;switch(s){case "COMPLETED":toast.success(r("settle.settlement.completed"));break;case "FAILED":toast.error(r("settle.settlement.failed"));break;}}});}function B(){let{t:r}=useTranslation(),e=useEventEmitter(),{setLedgerAddress:s}=useStorageLedgerAddress();return useEffect(()=>{e.on("wallet:connect-error",t=>{toast.error(t.message);}),e.on("wallet:sign-message-with-ledger-error",t=>{window.setTimeout(()=>{modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(s(t.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(toast.error(t.message),Promise.resolve()),cancelLabel:r("common.no")}).then(n=>{});});});},[e,r]),{}}function G(){let{t:r}=useTranslation(),e=useEventEmitter(),s=useRef({}),[t,n]=useSessionStorage("orderly_wallet_change_id",{});s.current=t,useWalletSubscription({onMessage:c=>{let{id:o,side:d,transStatus:l}=c,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(l)){let a=s.current[o];n({...t,[o]:a?void 0:true}),i=!a;}if(l==="COMPLETED"&&i){let a=`${capitalizeString(d)} completed`;d==="DEPOSIT"?a=r("transfer.deposit.completed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.completed")),toast.success(a);}else if(l==="FAILED"&&i){let a=`${capitalizeString(d)} failed`;d==="DEPOSIT"?a=r("transfer.deposit.failed"):d==="WITHDRAW"&&(a=r("transfer.withdraw.failed")),toast.error(a);}e.emit("wallet:changed",c);}});}var re="orderly:wallet-info";var te=r=>{let{wallet:e,connect:s,connectedChain:t,disconnect:n,namespace:c}=useWalletConnector();if(typeof s!="function")throw new SDKError("Please provide a wallet connector provider");useEventEmitter();let d=useRef(false);useConfig("brokerId");let {account:i,state:a}=useAccount(),u=useKeyStore(),g=useConfig("networkId"),[h,{checkChainSupport:m}]=useChains(),[P,C]=useState(false),{track:k,setTrackUserId:ce}=useTrack(),w=useMemo(()=>e?.accounts?.[0]?.address,[e]),E=useMemo(()=>{let p=e?.chains?.[0]?.id,f=e?.chains?.[0]?.namespace;if(!(typeof p>"u"))return {id:parseChainIdToNumber(p),namespace:f}},[e]);return useEffect(()=>{a.status>=AccountStatusEnum.EnableTrading&&i.accountId&&ce(i.accountId);},[i,a]),useEffect(()=>{if(!t){C(false);return}let p=m(t.id,g);ABSTRACT_CHAIN_ID_MAP.has(parseInt(t.id))&&e?.label!=="AGW"&&(p=false),C(!p);},[t,h,m,g,e]),useEffect(()=>{windowGuard(()=>{let p=u.getAddress(),f=JSON.parse(localStorage.getItem(re)??"{}");t?.namespace!==ChainNamespace.solana&&p&&i.address!==p&&f.label&&s({autoSelect:{label:f.label,disableModals:true}}).then(x=>{},x=>{});});},[e,i.address]),useEffect(()=>{if(e===null&&a.status>AccountStatusEnum.NotConnected&&!a.validating){i.disconnect();return}if(P||!t||d.current)return;let p=b();w&&w!==i.address&&!p&&(i.setAddress(w,{provider:e?.provider,chain:{id:praseChainIdToNumber(E.id),namespace:E.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}},{validateOrderlyKeyScope:f=>f.includes("asset")}),k(TrackerEventName.walletConnect,{wallet:e?.label??"",network:E.namespace.toUpperCase()}),windowGuard(()=>{localStorage.setItem(re,JSON.stringify({label:e?.label??""}));})),E?.id!==i.chainId&&i.switchChainId(E?.id);},[e,t,w,E,i.address,a,i.chainId,P]),{connectWallet:async()=>(d.current=true,s({chainId:r.currentChainId}).then(async p=>{if(Array.isArray(p)&&p.length>0&&p[0]&&p[0].accounts.length>0){let f=p[0],x=praseChainIdToNumber(f.chains[0].id);if(!m(x,g))return {wrongNetwork:true};if(!i)throw new Error("account is not initialized");a.status===AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await i.disconnect());let de=await i.setAddress(f.accounts[0].address,{provider:f.provider,chain:{id:praseChainIdToNumber(f.chains[0].id),namespace:f.chains[0].namespace.toUpperCase()},wallet:{name:f.label}});return k(TrackerEventName.walletConnect,{wallet:f.label,network:f.chains[0].namespace.toUpperCase()}),{wallet:f,status:de,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:P}};var oe=createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),D=()=>useContext(oe),ne=r=>{let[e,s]=useState(false),[t,n]=K(r.defaultChain);H(),useTrackingInstance();let{connectWallet:c,wrongNetwork:o}=te({currentChainId:t});G(),z(),U(),B();let d=useRestrictedInfo(r.restrictedInfo),l=d.restrictedOpen,i=useMemo(()=>({connectWallet:c,wrongNetwork:o,currentChainId:t,setCurrentChainId:n,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:d,showAnnouncement:e,setShowAnnouncement:s,onRouteChange:r.onRouteChange}),[c,t,l,r.onChainChanged,d,n,e,o,r.onRouteChange]);return jsx(oe.Provider,{value:i,children:r.children})};var se=createContext({}),wr=()=>useContext(se),ae=r=>jsx(se.Provider,{value:r,children:r.children});var ie=r=>{let{components:e,appIcons:s,onChainChanged:t,defaultChain:n,...c}=r;useTrack(),L(),M();let o=$();return jsx(ae,{appIcons:s,brokerName:r.brokerName,children:jsx(OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxs(OrderlyConfigProvider,{...c,children:[jsx(ne,{onChainChanged:t,defaultChain:n,restrictedInfo:r.restrictedInfo,onRouteChange:r.onRouteChange,children:jsx(LocaleProvider,{locale:o,children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:r.children})})})}),jsx(Toaster,{})]})})})};ie.displayName="OrderlyAppProvider";var _r=(r,e)=>{let{wrongNetwork:s,disabledConnect:t}=D(),{state:n}=useAccount();return e?.skip?r:s||t||typeof e?.accountStatus<"u"&&n.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Mr(r){let{t:e}=useTranslation(),s=(n,c,o)=>({quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:o}),max:e("orderEntry.orderQuantity.error.max",{value:o})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:o}),max:e("orderEntry.orderPrice.error.max",{value:o})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:o}),max:e("orderEntry.triggerPrice.error.max",{value:o})},tp_trigger_price:{min:e("orderEntry.tpTriggerPrice.error.min",{value:o}),max:e("orderEntry.tpTriggerPrice.error.max",{value:o})},sl_trigger_price:{min:e("orderEntry.slTriggerPrice.error.min",{value:o}),max:e("orderEntry.slTriggerPrice.error.max",{value:o})},total:{min:e("orderEntry.total.error.min",{value:o})},max_price:{required:e("orderEntry.upperPrice.error.required"),min:e("orderEntry.upperPrice.error.min",{value:o}),max:e("orderEntry.upperPrice.error.max",{value:o})},min_price:{required:e("orderEntry.lowerPrice.error.required"),min:e("orderEntry.lowerPrice.error.min",{value:o}),max:e("orderEntry.lowerPrice.error.max")},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:o}),max:e("orderEntry.skew.error.max",{value:o})}})[n]?.[c]||"";return {parseErrorMsg:n=>{let{type:c,value:o}=r?.[n]||{};return c?s(n,c,o):""}}}
11
11
 
12
- export { ie as OrderlyAppProvider, dr as useAppConfig, L as useAppContext, Wr as useDataTap, Mr as useOrderEntryFormErrorMsg };
12
+ export { ie as OrderlyAppProvider, wr as useAppConfig, D as useAppContext, _r as useDataTap, Mr as useOrderEntryFormErrorMsg };
13
13
  //# sourceMappingURL=out.js.map
14
14
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/provider/appContext.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/configContext.tsx","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts"],"names":["UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","useTrack","createContext","useContext","useState","useMemo","useRestrictedInfo","useTrackingInstance","useWS","useTranslation","toast","getTimestamp","useAssetconvertEvent","ws","t","unsubscribe","data","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","status","useEventEmitter","modal","useStorageLedgerAddress","useWalletConnectError","ee","setLedgerAddress","res","useRef","capitalizeString","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","side","transStatus","showToast","isPushOnce","msg","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","scope","walletState","wallet","jsx","AppContext","show","useAppContext","AppStateProvider","props","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","AppConfigContext","useAppConfig","AppConfigProvider","useSymbolsInfo","useDebouncedCallback","i18n","OrderStatus","AlgoOrderRootType","parseNumber","transSymbolformString","getDisplaySide","getOrderExecutionReportMsg","symbolsInfo","symbol","quantity","client_order_id","total_executed_quantity","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","displayTotalExecutedQuantity","jsxs","useExecutionReport","symbolsInfoRef","handler","orderType","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","localeCode","calendarLocale","OrderlyAppProvider","components","appIcons","onChainChanged","configProps","uiLocale","useDataTap","state","useOrderEntryFormErrorMsg","errors","getMessage","key","type","value"],"mappings":"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","sourcesContent":["import { PropsWithChildren } from \"react\";\nimport { OrderlyAppConfig } from \"../types\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport {\n ConfigProviderProps,\n OrderlyConfigProvider,\n useTrack,\n} from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider = (props: OrderlyAppProviderProps) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n useExecutionReport();\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...(configProps as ConfigProviderProps)}>\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","import {\n FC,\n createContext,\n PropsWithChildren,\n useContext,\n useState,\n useMemo,\n} from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n RestrictedInfoReturns,\n useTrackingInstance,\n} from \"@orderly.network/hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n};\n\nconst AppContext = createContext<AppContextState>({\n setCurrentChainId: (chainId: number | undefined) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<AppContextState, \"onChainChanged\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n ],\n );\n\n return (\n <AppContext.Provider value={memoizedValue}>\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getTimestamp } from \"@orderly.network/utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useCallback, useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n url.searchParams.append(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\nimport { useStorageLedgerAddress } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@orderly.network/types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(\n currentWalletAddress,\n {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n },\n {\n // TODO: remove this when default orderly key scope includes asset\n validateOrderlyKeyScope: (scope: string) => {\n return scope.includes(\"asset\");\n },\n },\n );\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import { createContext, PropsWithChildren, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider = (\n props: PropsWithChildren<{\n appIcons?: AppLogos;\n brokerName: string;\n }>\n) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n </div>,\n {\n id: orderType,\n },\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import { i18n } from \"@orderly.network/i18n\";\nimport { API, OrderStatus } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@orderly.network/i18n\";\nimport { Locale } from \"@orderly.network/ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import { useAccount } from \"@orderly.network/hooks\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (key: Keys, type: ErrorType, value?: number | string) => {\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n },\n sl_trigger_price: {\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n max_price: {\n required: t(\"orderEntry.upperPrice.error.required\"),\n min: t(\"orderEntry.upperPrice.error.min\", { value }),\n max: t(\"orderEntry.upperPrice.error.max\", { value }),\n },\n min_price: {\n required: t(\"orderEntry.lowerPrice.error.required\"),\n min: t(\"orderEntry.lowerPrice.error.min\", { value }),\n // not use value\n max: t(\"orderEntry.lowerPrice.error.max\"),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const parseErrorMsg = (key: Keys) => {\n const { type, value } = errors?.[key] || ({} as OrderValidationItem);\n if (type) {\n return getMessage(key, type, value);\n }\n return \"\";\n };\n\n return {\n parseErrorMsg,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/provider/appContext.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/configContext.tsx","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts"],"names":["OrderlyConfigProvider","useTrack","UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","useRef","useSymbolsInfo","useEventEmitter","useDebouncedCallback","toast","i18n","OrderStatus","AlgoOrderRootType","parseNumber","capitalizeString","transSymbolformString","getDisplaySide","side","getOrderExecutionReportMsg","data","symbolsInfo","symbol","quantity","client_order_id","total_executed_quantity","status","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","msg","displayTotalExecutedQuantity","jsx","jsxs","useExecutionReport","ee","symbolsInfoRef","handler","orderType","useMemo","useTranslation","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","t","localeCode","calendarLocale","createContext","useContext","useState","useRestrictedInfo","useTrackingInstance","useWS","getTimestamp","useAssetconvertEvent","ws","unsubscribe","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","res","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","transStatus","showToast","isPushOnce","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","scope","walletState","wallet","AppContext","show","useAppContext","AppStateProvider","props","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","AppConfigContext","useAppConfig","AppConfigProvider","OrderlyAppProvider","components","appIcons","onChainChanged","configProps","uiLocale","useDataTap","state","useOrderEntryFormErrorMsg","errors","getMessage","key","type","value"],"mappings":"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","sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { OrderlyConfigProvider, useTrack } from \"@orderly.network/hooks\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyAppConfig } from \"../types\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider: React.FC<OrderlyAppProviderProps> = (props) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n useExecutionReport();\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...configProps}>\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n onRouteChange={props.onRouteChange}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","import { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n </div>,\n {\n id: orderType,\n },\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import { i18n } from \"@orderly.network/i18n\";\nimport { API, OrderStatus } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@orderly.network/i18n\";\nimport { Locale } from \"@orderly.network/ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import {\n FC,\n createContext,\n PropsWithChildren,\n useContext,\n useState,\n useMemo,\n} from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n RestrictedInfoReturns,\n useTrackingInstance,\n} from \"@orderly.network/hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n onRouteChange?: (option: RouteOption) => void;\n};\n\nconst AppContext = createContext<AppContextState>({\n setCurrentChainId: (chainId?: number) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<AppContextState, \"onChainChanged\" | \"onRouteChange\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n onRouteChange: props.onRouteChange,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n props.onRouteChange,\n ],\n );\n\n return (\n <AppContext.Provider value={memoizedValue}>\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\nimport { toast } from \"@orderly.network/ui\";\nimport { getTimestamp } from \"@orderly.network/utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useCallback, useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n url.searchParams.append(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\nimport { useStorageLedgerAddress } from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@orderly.network/types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(\n currentWalletAddress,\n {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n },\n {\n // TODO: remove this when default orderly key scope includes asset\n validateOrderlyKeyScope: (scope: string) => {\n return scope.includes(\"asset\");\n },\n },\n );\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import React, { createContext, PropsWithChildren, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState,\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider: React.FC<\n PropsWithChildren<{ appIcons?: AppLogos; brokerName: string }>\n> = (props) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useAccount } from \"@orderly.network/hooks\";\nimport { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@orderly.network/hooks\";\nimport { useTranslation } from \"@orderly.network/i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (key: Keys, type: ErrorType, value?: number | string) => {\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n },\n sl_trigger_price: {\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n max_price: {\n required: t(\"orderEntry.upperPrice.error.required\"),\n min: t(\"orderEntry.upperPrice.error.min\", { value }),\n max: t(\"orderEntry.upperPrice.error.max\", { value }),\n },\n min_price: {\n required: t(\"orderEntry.lowerPrice.error.required\"),\n min: t(\"orderEntry.lowerPrice.error.min\", { value }),\n // not use value\n max: t(\"orderEntry.lowerPrice.error.max\"),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const parseErrorMsg = (key: Keys) => {\n const { type, value } = errors?.[key] || ({} as OrderValidationItem);\n if (type) {\n return getMessage(key, type, value);\n }\n return \"\";\n };\n\n return {\n parseErrorMsg,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/react-app",
3
- "version": "2.5.3-alpha.0",
3
+ "version": "2.5.3-alpha.1",
4
4
  "description": "Create React App with Orderly Network components",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -18,11 +18,11 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "date-fns": "^3.6.0",
21
- "@orderly.network/ui": "2.5.3-alpha.0",
22
- "@orderly.network/hooks": "2.5.3-alpha.0",
23
- "@orderly.network/i18n": "2.5.3-alpha.0",
24
- "@orderly.network/types": "2.5.3-alpha.0",
25
- "@orderly.network/utils": "2.5.3-alpha.0"
21
+ "@orderly.network/ui": "2.5.3-alpha.1",
22
+ "@orderly.network/utils": "2.5.3-alpha.1",
23
+ "@orderly.network/hooks": "2.5.3-alpha.1",
24
+ "@orderly.network/i18n": "2.5.3-alpha.1",
25
+ "@orderly.network/types": "2.5.3-alpha.1"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/react": "^18.3.2",
@@ -31,7 +31,7 @@
31
31
  "react-dom": "^18.2.0",
32
32
  "tailwindcss": "^3.4.4",
33
33
  "tsup": "^7.3.0",
34
- "tsconfig": "0.8.3-alpha.0"
34
+ "tsconfig": "0.8.3-alpha.1"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "react": ">=18",