@orderly.network/react-app 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,71 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ComponentType, ReactNode, PropsWithChildren } from 'react';
3
+ import { ConfigProviderProps, WalletState } from '@orderly.network/hooks';
4
+ import { ExtensionPosition } from '@orderly.network/ui';
5
+ import { AccountStatusEnum } from '@orderly.network/types';
6
+
7
+ type Logo = {
8
+ img?: string;
9
+ component?: ReactNode;
10
+ className?: string;
11
+ };
12
+ type AppLogos = Partial<{
13
+ main: Logo;
14
+ secondary: Logo;
15
+ }>;
16
+ interface OrderlyAppConfig extends ConfigProviderProps {
17
+ appIcons?: AppLogos;
18
+ dateFormatting?: string;
19
+ components?: {
20
+ [position in ExtensionPosition]: ComponentType;
21
+ };
22
+ }
23
+
24
+ declare const useWalletStateHandle: (options: {}) => {
25
+ connectWallet: () => Promise<{
26
+ wallet?: WalletState;
27
+ status?: AccountStatusEnum;
28
+ wrongNetwork?: boolean;
29
+ } | null>;
30
+ wrongNetwork: boolean;
31
+ };
32
+
33
+ type AppContextState = {
34
+ connectWallet: ReturnType<typeof useWalletStateHandle>["connectWallet"];
35
+ /**
36
+ * Whether the current network is not supported
37
+ */
38
+ wrongNetwork: boolean;
39
+ onChainChanged?: (chainId: number, state: {
40
+ isTestnet: boolean;
41
+ isWalletConnected: boolean;
42
+ }) => void;
43
+ };
44
+ declare const useAppContext: () => AppContextState;
45
+ type AppStateProviderProps = {
46
+ onChainChanged?: (chainId: number, state: {
47
+ isTestnet: boolean;
48
+ isWalletConnected: boolean;
49
+ }) => void;
50
+ };
51
+
52
+ type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
53
+ type OptionalConfig = Optional<OrderlyAppConfig, "walletAdapters">;
54
+ declare const OrderlyApp: {
55
+ (props: PropsWithChildren<OptionalConfig & AppStateProviderProps>): react_jsx_runtime.JSX.Element;
56
+ displayName: string;
57
+ };
58
+
59
+ type ThemeContextState = {
60
+ appIcons?: AppLogos;
61
+ brokerName: string;
62
+ };
63
+ declare const useAppConfig: () => ThemeContextState;
64
+
65
+ declare const useDataTap: <T = any>(data: T, options?: {
66
+ skip?: false | undefined;
67
+ fallbackData?: T | undefined;
68
+ accountStatus?: AccountStatusEnum | undefined;
69
+ } | undefined) => T | null;
70
+
71
+ export { OrderlyApp, useAppConfig, useAppContext, useDataTap };
@@ -0,0 +1,71 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ComponentType, ReactNode, PropsWithChildren } from 'react';
3
+ import { ConfigProviderProps, WalletState } from '@orderly.network/hooks';
4
+ import { ExtensionPosition } from '@orderly.network/ui';
5
+ import { AccountStatusEnum } from '@orderly.network/types';
6
+
7
+ type Logo = {
8
+ img?: string;
9
+ component?: ReactNode;
10
+ className?: string;
11
+ };
12
+ type AppLogos = Partial<{
13
+ main: Logo;
14
+ secondary: Logo;
15
+ }>;
16
+ interface OrderlyAppConfig extends ConfigProviderProps {
17
+ appIcons?: AppLogos;
18
+ dateFormatting?: string;
19
+ components?: {
20
+ [position in ExtensionPosition]: ComponentType;
21
+ };
22
+ }
23
+
24
+ declare const useWalletStateHandle: (options: {}) => {
25
+ connectWallet: () => Promise<{
26
+ wallet?: WalletState;
27
+ status?: AccountStatusEnum;
28
+ wrongNetwork?: boolean;
29
+ } | null>;
30
+ wrongNetwork: boolean;
31
+ };
32
+
33
+ type AppContextState = {
34
+ connectWallet: ReturnType<typeof useWalletStateHandle>["connectWallet"];
35
+ /**
36
+ * Whether the current network is not supported
37
+ */
38
+ wrongNetwork: boolean;
39
+ onChainChanged?: (chainId: number, state: {
40
+ isTestnet: boolean;
41
+ isWalletConnected: boolean;
42
+ }) => void;
43
+ };
44
+ declare const useAppContext: () => AppContextState;
45
+ type AppStateProviderProps = {
46
+ onChainChanged?: (chainId: number, state: {
47
+ isTestnet: boolean;
48
+ isWalletConnected: boolean;
49
+ }) => void;
50
+ };
51
+
52
+ type Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;
53
+ type OptionalConfig = Optional<OrderlyAppConfig, "walletAdapters">;
54
+ declare const OrderlyApp: {
55
+ (props: PropsWithChildren<OptionalConfig & AppStateProviderProps>): react_jsx_runtime.JSX.Element;
56
+ displayName: string;
57
+ };
58
+
59
+ type ThemeContextState = {
60
+ appIcons?: AppLogos;
61
+ brokerName: string;
62
+ };
63
+ declare const useAppConfig: () => ThemeContextState;
64
+
65
+ declare const useDataTap: <T = any>(data: T, options?: {
66
+ skip?: false | undefined;
67
+ fallbackData?: T | undefined;
68
+ accountStatus?: AccountStatusEnum | undefined;
69
+ } | undefined) => T | null;
70
+
71
+ export { OrderlyApp, useAppConfig, useAppContext, useDataTap };
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var ui = require('@orderly.network/ui');
4
+ var react = require('react');
5
+ var hooks = require('@orderly.network/hooks');
6
+ var utils = require('@orderly.network/utils');
7
+ var types = require('@orderly.network/types');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+ var defaultEvmAdapter = require('@orderly.network/default-evm-adapter');
10
+ var defaultSolanaAdapter = require('@orderly.network/default-solana-adapter');
11
+ var web3ProviderEthers = require('@orderly.network/web3-provider-ethers');
12
+
13
+ var A=()=>{react.useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var y="orderly:wallet-info";var v=t=>{let{wallet:e,connect:r,connectedChain:n}=hooks.useWalletConnector();if(typeof r!="function")throw new types.SDKError("Please provide a wallet connector provider");let i=react.useRef(!1),{account:a}=hooks.useAccount(),D=hooks.useKeyStore(),{networkId:d}=react.useContext(hooks.OrderlyContext),[M,{checkChainSupport:u}]=hooks.useChains(),[m,L]=react.useState(!1),p=react.useMemo(()=>e?.accounts?.[0]?.address,[e]),c=react.useMemo(()=>{let o=e?.chains?.[0]?.id,s=e?.chains?.[0]?.namespace;if(!(typeof o>"u"))return {id:utils.parseChainIdToNumber(o),namespace:s}},[e]);return react.useEffect(()=>{if(!n)return;let o=u(n.id,d);L(!o);},[n,M,u,d]),react.useEffect(()=>{utils.windowGuard(()=>{let o=D.getAddress(),s=JSON.parse(localStorage.getItem(y)??"{}");o&&a.address!==o&&s.label&&r({autoSelect:{label:s.label,disableModals:!0}}).then(f=>{},f=>{});});},[e,a.address]),react.useEffect(()=>{m||!n||i.current||(p&&p!==a.address&&(a.setAddress(p,{provider:e?.provider,chain:c,wallet:{name:e.label}}),utils.windowGuard(()=>{localStorage.setItem(y,JSON.stringify({label:e.label}));})),c?.id!==a.chainId&&a.switchChainId(c?.id));},[e,n,p,c,a.address,a.chainId,m]),{connectWallet:async()=>(i.current=!0,r().then(async o=>{if(Array.isArray(o)&&o.length>0&&o[0]&&o[0].accounts.length>0){let s=o[0],f=utils.praseChainIdToNumber(s.chains[0].id);if(!u(f,d))return {wrongNetwork:!0};if(!a)throw new Error("account is not initialized");let F=await a.setAddress(s.accounts[0].address,{provider:s.provider,chain:{id:utils.praseChainIdToNumber(s.chains[0].id),namespace:s.chains[0].namespace},wallet:{name:s.label}});return {wallet:s,status:F,wrongNetwork:!1}}return null}).finally(()=>{i.current=!1;})),wrongNetwork:m}};function x(){let t=hooks.useEventEmitter();hooks.useWalletSubscription({onMessage:e=>{let{side:r,transStatus:n}=e;if(n==="COMPLETED"){let i=`${utils.capitalizeString(r)} completed`;ui.toast.success(i);}else if(n==="FAILED"){let i=`${utils.capitalizeString(r)} failed`;ui.toast.error(i);}t.emit("wallet:changed",e);}});}function E(){hooks.useSettleSubscription({onMessage:t=>{let{status:e}=t;switch(e){case"COMPLETED":ui.toast.success("Settlement completed");break;case"FAILED":ui.toast.error("Settlement failed");break;}}});}var k=react.createContext({}),C=()=>react.useContext(k),T=t=>{let{connectWallet:e,wrongNetwork:r}=v();return x(),E(),jsxRuntime.jsx(k.Provider,{value:{connectWallet:e,wrongNetwork:r,onChainChanged:t.onChainChanged},children:t.children})};var I=react.createContext({}),oe=()=>react.useContext(I),N=t=>jsxRuntime.jsx(I.Provider,{value:t,children:t.children});var ue=new defaultEvmAdapter.DefaultEVMAdapterWalletAdapter(new web3ProviderEthers.EthersProvider),me=new defaultSolanaAdapter.DefaultSolanaWalletAdapter,O=t=>{let{onChainChanged:e,dateFormatting:r,components:n,appIcons:i,...a}=t;return A(),jsxRuntime.jsx(N,{appIcons:i,brokerName:t.brokerName,children:jsxRuntime.jsx(ui.OrderlyThemeProvider,{dateFormatting:r,components:n,children:jsxRuntime.jsxs(hooks.OrderlyConfigProvider,{...a,walletAdapters:[ue,me],children:[jsxRuntime.jsx(T,{onChainChanged:e,children:jsxRuntime.jsx(ui.TooltipProvider,{children:jsxRuntime.jsx(ui.ModalProvider,{children:t.children})})}),jsxRuntime.jsx(ui.Toaster,{})]})})})};O.displayName="OrderlyApp";var Ce=(t,e)=>{let{wrongNetwork:r}=C(),{state:n}=hooks.useAccount();return e?.skip?t:r||typeof e?.accountStatus<"u"&&n.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:t};
14
+
15
+ exports.OrderlyApp = O;
16
+ exports.useAppConfig = oe;
17
+ exports.useAppContext = C;
18
+ exports.useDataTap = Ce;
19
+ //# sourceMappingURL=out.js.map
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/orderlyApp.tsx","../src/hooks/useBootstrap.ts","../src/provider/appContext.tsx","../src/hooks/useWalletStateHandle.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/provider/configContext.tsx","../src/hooks/useDataTap.ts"],"names":["ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","createContext","useContext","useMemo","useRef","useState","OrderlyContext","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","SDKError","WALLET_KEY","useWalletStateHandle","options","connectedWallet","connect","connectedChain","isManualConnect","account","keyStore","networkId","chains","checkChainSupport","unsupported","setUnsupported","currentWalletAddress","currentChain","id","namespace","isSupported","localAddress","walletInfo","res","error","walletState","wallet","chainId","status","toast","capitalizeString","useEventEmitter","useWalletSubscription","useWalletEvent","ee","data","side","transStatus","msg","useSettleSubscription","useSettleEvent","jsx","AppContext","useAppContext","AppStateProvider","props","connectWallet","wrongNetwork","AppConfigContext","useAppConfig","AppConfigProvider","DefaultEVMAdapterWalletAdapter","DefaultSolanaWalletAdapter","EthersProvider","jsxs","evmWalletAdapter","solanaWalletAdapter","OrderlyApp","onChainChanged","dateFormatting","components","appIcons","configProps","useDataTap","state"],"mappings":"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","sourcesContent":["import { PropsWithChildren, useEffect } from \"react\";\nimport { OrderlyAppConfig } from \"./types\";\nimport {\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"./hooks/useBootstrap\";\nimport { OrderlyConfigProvider } from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./provider/appContext\";\nimport { AppConfigProvider } from \"./provider/configContext\";\nimport { DefaultEVMAdapterWalletAdapter } from \"@orderly.network/default-evm-adapter\";\nimport {DefaultSolanaWalletAdapter} from \"@orderly.network/default-solana-adapter\";\nimport { EthersProvider } from \"@orderly.network/web3-provider-ethers\";\n\ntype Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;\ntype OptionalConfig = Optional<OrderlyAppConfig, \"walletAdapters\">;\n\nconst evmWalletAdapter = new DefaultEVMAdapterWalletAdapter(\n new EthersProvider()\n);\nconst solanaWalletAdapter = new DefaultSolanaWalletAdapter();\n\nconst OrderlyApp = (\n props: PropsWithChildren<OptionalConfig & AppStateProviderProps>\n) => {\n const {\n onChainChanged,\n dateFormatting,\n components,\n appIcons,\n ...configProps\n } = props;\n\n useBootstrap();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName}>\n <OrderlyThemeProvider\n dateFormatting={dateFormatting}\n components={components}\n >\n <OrderlyConfigProvider\n {...configProps}\n walletAdapters={[evmWalletAdapter, solanaWalletAdapter]}\n >\n <AppStateProvider onChainChanged={onChainChanged}>\n <TooltipProvider>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyApp.displayName = \"OrderlyApp\";\n\nexport { OrderlyApp };\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 { FC, createContext, PropsWithChildren, useContext } from \"react\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { useAppState } from \"../hooks/useAppState\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n};\n\nconst AppContext = createContext<AppContextState>({} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n};\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n });\n\n useWalletEvent();\n useSettleEvent();\n\n // const { networkStatus } = useAppState();\n\n return (\n <AppContext.Provider\n value={{\n connectWallet,\n wrongNetwork,\n onChainChanged: props.onChainChanged,\n }}\n >\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n OrderlyContext,\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport { AccountStatusEnum, SDKError } from \"@orderly.network/types\";\nimport type { WalletState } from \"@orderly.network/hooks\";\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}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n } = useWalletConnector();\n\n // console.log(\"🔗 wallet state handle\", connectedWallet);\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const isManualConnect = useRef<boolean>(false);\n\n const { account } = useAccount();\n const keyStore = useKeyStore();\n const { networkId } = useContext<any>(OrderlyContext);\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\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;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (!connectedChain) return;\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId]);\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 (\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 // console.log(\"🔗 wallet state changed\", connectedWallet);\n //\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (!!currentWalletAddress && currentWalletAddress !== account.address) {\n account.setAddress(currentWalletAddress, {\n provider: connectedWallet?.provider,\n chain: currentChain as any,\n wallet: {\n name: connectedWallet.label,\n },\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 account.chainId,\n unsupported,\n ]);\n\n // console.log(\"🔗 wallet state handle\", connectedWallet);\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()\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 //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // console.info(\"🤝 connect wallet\", wallet);\n // account.address = wallet.accounts[0].address;\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: wallet.chains[0].namespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\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 { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport { useEventEmitter, useWalletSubscription } from \"@orderly.network/hooks\";\n\nexport function useWalletEvent() {\n const ee = useEventEmitter();\n\n useWalletSubscription({\n onMessage: (data: any) => {\n const { side, transStatus } = data;\n\n if (transStatus === \"COMPLETED\") {\n let msg = `${capitalizeString(side)} completed`;\n toast.success(msg);\n } else if (transStatus === \"FAILED\") {\n let msg = `${capitalizeString(side)} failed`;\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useSettleEvent() {\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(\"Settlement completed\");\n break;\n case \"FAILED\":\n toast.error(\"Settlement failed\");\n break;\n default:\n break;\n }\n },\n });\n}\n","import { ExtensionPosition } from \"@orderly.network/ui\";\nimport { createContext, PropsWithChildren, ReactNode, 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 // const { appIcons } = props;\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\nimport { useAccount } from \"@orderly.network/hooks\";\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 } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) return data;\n\n if (wrongNetwork) {\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"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,15 @@
1
+ import { OrderlyThemeProvider, TooltipProvider, ModalProvider, Toaster, toast } from '@orderly.network/ui';
2
+ import { createContext, useContext, useEffect, useRef, useState, useMemo } from 'react';
3
+ import { OrderlyConfigProvider, useAccount, useWalletConnector, useKeyStore, OrderlyContext, useChains, useEventEmitter, useWalletSubscription, useSettleSubscription } from '@orderly.network/hooks';
4
+ import { parseChainIdToNumber, windowGuard, praseChainIdToNumber, capitalizeString } from '@orderly.network/utils';
5
+ import { SDKError } from '@orderly.network/types';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+ import { DefaultEVMAdapterWalletAdapter } from '@orderly.network/default-evm-adapter';
8
+ import { DefaultSolanaWalletAdapter } from '@orderly.network/default-solana-adapter';
9
+ import { EthersProvider } from '@orderly.network/web3-provider-ethers';
10
+
11
+ var A=()=>{useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var y="orderly:wallet-info";var v=t=>{let{wallet:e,connect:r,connectedChain:n}=useWalletConnector();if(typeof r!="function")throw new SDKError("Please provide a wallet connector provider");let i=useRef(!1),{account:a}=useAccount(),D=useKeyStore(),{networkId:d}=useContext(OrderlyContext),[M,{checkChainSupport:u}]=useChains(),[m,L]=useState(!1),p=useMemo(()=>e?.accounts?.[0]?.address,[e]),c=useMemo(()=>{let o=e?.chains?.[0]?.id,s=e?.chains?.[0]?.namespace;if(!(typeof o>"u"))return {id:parseChainIdToNumber(o),namespace:s}},[e]);return useEffect(()=>{if(!n)return;let o=u(n.id,d);L(!o);},[n,M,u,d]),useEffect(()=>{windowGuard(()=>{let o=D.getAddress(),s=JSON.parse(localStorage.getItem(y)??"{}");o&&a.address!==o&&s.label&&r({autoSelect:{label:s.label,disableModals:!0}}).then(f=>{},f=>{});});},[e,a.address]),useEffect(()=>{m||!n||i.current||(p&&p!==a.address&&(a.setAddress(p,{provider:e?.provider,chain:c,wallet:{name:e.label}}),windowGuard(()=>{localStorage.setItem(y,JSON.stringify({label:e.label}));})),c?.id!==a.chainId&&a.switchChainId(c?.id));},[e,n,p,c,a.address,a.chainId,m]),{connectWallet:async()=>(i.current=!0,r().then(async o=>{if(Array.isArray(o)&&o.length>0&&o[0]&&o[0].accounts.length>0){let s=o[0],f=praseChainIdToNumber(s.chains[0].id);if(!u(f,d))return {wrongNetwork:!0};if(!a)throw new Error("account is not initialized");let F=await a.setAddress(s.accounts[0].address,{provider:s.provider,chain:{id:praseChainIdToNumber(s.chains[0].id),namespace:s.chains[0].namespace},wallet:{name:s.label}});return {wallet:s,status:F,wrongNetwork:!1}}return null}).finally(()=>{i.current=!1;})),wrongNetwork:m}};function x(){let t=useEventEmitter();useWalletSubscription({onMessage:e=>{let{side:r,transStatus:n}=e;if(n==="COMPLETED"){let i=`${capitalizeString(r)} completed`;toast.success(i);}else if(n==="FAILED"){let i=`${capitalizeString(r)} failed`;toast.error(i);}t.emit("wallet:changed",e);}});}function E(){useSettleSubscription({onMessage:t=>{let{status:e}=t;switch(e){case"COMPLETED":toast.success("Settlement completed");break;case"FAILED":toast.error("Settlement failed");break;}}});}var k=createContext({}),C=()=>useContext(k),T=t=>{let{connectWallet:e,wrongNetwork:r}=v();return x(),E(),jsx(k.Provider,{value:{connectWallet:e,wrongNetwork:r,onChainChanged:t.onChainChanged},children:t.children})};var I=createContext({}),oe=()=>useContext(I),N=t=>jsx(I.Provider,{value:t,children:t.children});var ue=new DefaultEVMAdapterWalletAdapter(new EthersProvider),me=new DefaultSolanaWalletAdapter,O=t=>{let{onChainChanged:e,dateFormatting:r,components:n,appIcons:i,...a}=t;return A(),jsx(N,{appIcons:i,brokerName:t.brokerName,children:jsx(OrderlyThemeProvider,{dateFormatting:r,components:n,children:jsxs(OrderlyConfigProvider,{...a,walletAdapters:[ue,me],children:[jsx(T,{onChainChanged:e,children:jsx(TooltipProvider,{children:jsx(ModalProvider,{children:t.children})})}),jsx(Toaster,{})]})})})};O.displayName="OrderlyApp";var Ce=(t,e)=>{let{wrongNetwork:r}=C(),{state:n}=useAccount();return e?.skip?t:r||typeof e?.accountStatus<"u"&&n.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:t};
12
+
13
+ export { O as OrderlyApp, oe as useAppConfig, C as useAppContext, Ce as useDataTap };
14
+ //# sourceMappingURL=out.js.map
15
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/orderlyApp.tsx","../src/hooks/useBootstrap.ts","../src/provider/appContext.tsx","../src/hooks/useWalletStateHandle.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/provider/configContext.tsx","../src/hooks/useDataTap.ts"],"names":["ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","createContext","useContext","useMemo","useRef","useState","OrderlyContext","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","SDKError","WALLET_KEY","useWalletStateHandle","options","connectedWallet","connect","connectedChain","isManualConnect","account","keyStore","networkId","chains","checkChainSupport","unsupported","setUnsupported","currentWalletAddress","currentChain","id","namespace","isSupported","localAddress","walletInfo","res","error","walletState","wallet","chainId","status","toast","capitalizeString","useEventEmitter","useWalletSubscription","useWalletEvent","ee","data","side","transStatus","msg","useSettleSubscription","useSettleEvent","jsx","AppContext","useAppContext","AppStateProvider","props","connectWallet","wrongNetwork","AppConfigContext","useAppConfig","AppConfigProvider","DefaultEVMAdapterWalletAdapter","DefaultSolanaWalletAdapter","EthersProvider","jsxs","evmWalletAdapter","solanaWalletAdapter","OrderlyApp","onChainChanged","dateFormatting","components","appIcons","configProps","useDataTap","state"],"mappings":"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","sourcesContent":["import { PropsWithChildren, useEffect } from \"react\";\nimport { OrderlyAppConfig } from \"./types\";\nimport {\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"./hooks/useBootstrap\";\nimport { OrderlyConfigProvider } from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./provider/appContext\";\nimport { AppConfigProvider } from \"./provider/configContext\";\nimport { DefaultEVMAdapterWalletAdapter } from \"@orderly.network/default-evm-adapter\";\nimport {DefaultSolanaWalletAdapter} from \"@orderly.network/default-solana-adapter\";\nimport { EthersProvider } from \"@orderly.network/web3-provider-ethers\";\n\ntype Optional<T, K extends keyof T> = Omit<T, K> & Partial<T>;\ntype OptionalConfig = Optional<OrderlyAppConfig, \"walletAdapters\">;\n\nconst evmWalletAdapter = new DefaultEVMAdapterWalletAdapter(\n new EthersProvider()\n);\nconst solanaWalletAdapter = new DefaultSolanaWalletAdapter();\n\nconst OrderlyApp = (\n props: PropsWithChildren<OptionalConfig & AppStateProviderProps>\n) => {\n const {\n onChainChanged,\n dateFormatting,\n components,\n appIcons,\n ...configProps\n } = props;\n\n useBootstrap();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName}>\n <OrderlyThemeProvider\n dateFormatting={dateFormatting}\n components={components}\n >\n <OrderlyConfigProvider\n {...configProps}\n walletAdapters={[evmWalletAdapter, solanaWalletAdapter]}\n >\n <AppStateProvider onChainChanged={onChainChanged}>\n <TooltipProvider>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyApp.displayName = \"OrderlyApp\";\n\nexport { OrderlyApp };\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 { FC, createContext, PropsWithChildren, useContext } from \"react\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { useAppState } from \"../hooks/useAppState\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n};\n\nconst AppContext = createContext<AppContextState>({} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n};\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n });\n\n useWalletEvent();\n useSettleEvent();\n\n // const { networkStatus } = useAppState();\n\n return (\n <AppContext.Provider\n value={{\n connectWallet,\n wrongNetwork,\n onChainChanged: props.onChainChanged,\n }}\n >\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n OrderlyContext,\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport { AccountStatusEnum, SDKError } from \"@orderly.network/types\";\nimport type { WalletState } from \"@orderly.network/hooks\";\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}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n } = useWalletConnector();\n\n // console.log(\"🔗 wallet state handle\", connectedWallet);\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const isManualConnect = useRef<boolean>(false);\n\n const { account } = useAccount();\n const keyStore = useKeyStore();\n const { networkId } = useContext<any>(OrderlyContext);\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\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;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (!connectedChain) return;\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId]);\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 (\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 // console.log(\"🔗 wallet state changed\", connectedWallet);\n //\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (!!currentWalletAddress && currentWalletAddress !== account.address) {\n account.setAddress(currentWalletAddress, {\n provider: connectedWallet?.provider,\n chain: currentChain as any,\n wallet: {\n name: connectedWallet.label,\n },\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 account.chainId,\n unsupported,\n ]);\n\n // console.log(\"🔗 wallet state handle\", connectedWallet);\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()\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 //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // console.info(\"🤝 connect wallet\", wallet);\n // account.address = wallet.accounts[0].address;\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: wallet.chains[0].namespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\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 { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport { useEventEmitter, useWalletSubscription } from \"@orderly.network/hooks\";\n\nexport function useWalletEvent() {\n const ee = useEventEmitter();\n\n useWalletSubscription({\n onMessage: (data: any) => {\n const { side, transStatus } = data;\n\n if (transStatus === \"COMPLETED\") {\n let msg = `${capitalizeString(side)} completed`;\n toast.success(msg);\n } else if (transStatus === \"FAILED\") {\n let msg = `${capitalizeString(side)} failed`;\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useSettleEvent() {\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(\"Settlement completed\");\n break;\n case \"FAILED\":\n toast.error(\"Settlement failed\");\n break;\n default:\n break;\n }\n },\n });\n}\n","import { ExtensionPosition } from \"@orderly.network/ui\";\nimport { createContext, PropsWithChildren, ReactNode, 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 // const { appIcons } = props;\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\nimport { useAccount } from \"@orderly.network/hooks\";\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 } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) return data;\n\n if (wrongNetwork) {\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"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@orderly.network/react-app",
3
+ "version": "2.0.0-alpha.1",
4
+ "description": "Create React App with Orderly Network components",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "keywords": [
8
+ "Orderly",
9
+ "Exchange",
10
+ "React",
11
+ "DApp"
12
+ ],
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "dependencies": {
20
+ "@orderly.network/hooks": "2.0.0-alpha.1",
21
+ "@orderly.network/utils": "2.0.0-alpha.1",
22
+ "@orderly.network/types": "2.0.0-alpha.1",
23
+ "@orderly.network/ui": "2.0.0-alpha.1",
24
+ "@orderly.network/default-solana-adapter": "2.0.0-alpha.1",
25
+ "@orderly.network/default-evm-adapter": "2.0.0-alpha.1",
26
+ "@orderly.network/web3-provider-ethers": "2.0.0-alpha.1"
27
+ },
28
+ "devDependencies": {
29
+ "@types/react": "^18.3.2",
30
+ "@types/react-dom": "^18.3.0",
31
+ "react": "^18.3.1",
32
+ "react-dom": "^18.2.0",
33
+ "tailwindcss": "^3.4.4",
34
+ "tsup": "^7.3.0",
35
+ "tsconfig": "0.3.12"
36
+ },
37
+ "peerDependencies": {
38
+ "react": "^18.3.1",
39
+ "react-dom": "^18.2.0"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "test": "echo \"Error: no test specified\" && exit 1"
44
+ }
45
+ }