Skip to content

Commit

Permalink
Merge pull request #301 from skip-mev/switch-to-widget
Browse files Browse the repository at this point in the history
Switch to widget
  • Loading branch information
codingki authored Jun 19, 2024
2 parents 8032a6c + 9797554 commit b63261f
Show file tree
Hide file tree
Showing 9 changed files with 1,143 additions and 5,207 deletions.
2 changes: 1 addition & 1 deletion chain-registry
Submodule chain-registry updated 134 files
2 changes: 1 addition & 1 deletion initia-registry
6,133 changes: 956 additions & 5,177 deletions package-lock.json

Large diffs are not rendered by default.

13 changes: 1 addition & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,16 @@
"@cosmjs/amino": "0.31.x",
"@cosmjs/cosmwasm-stargate": "0.31.x",
"@cosmjs/encoding": "0.31.x",
"@cosmjs/ledger-amino": "0.31.x",
"@cosmjs/math": "0.31.x",
"@cosmjs/proto-signing": "0.31.x",
"@cosmjs/stargate": "0.31.x",
"@cosmjs/tendermint-rpc": "0.31.x",
"cosmjs-types": "0.8.x"
},
"dependencies": {
"@cosmjs/amino": "0.31.x",
"@cosmjs/cosmwasm-stargate": "0.31.x",
"@cosmjs/encoding": "0.31.x",
"@cosmjs/ledger-amino": "0.31.x",
"@cosmjs/math": "0.31.x",
"@cosmjs/proto-signing": "0.31.x",
"@cosmjs/stargate": "0.31.x",
"@cosmjs/tendermint-rpc": "0.31.x",
"@cosmos-kit/core": "2.8.x",
"@cosmos-kit/cosmostation": "2.6.x",
"@cosmos-kit/cosmostation-extension": "^2.7.10",
Expand All @@ -53,19 +47,16 @@
"@fontsource/jost": "^5.0.16",
"@graz-sh/types": "^0.0.14",
"@heroicons/react": "^2.1.1",
"@initia/initia-registry-types": "^0.0.17",
"@injectivelabs/sdk-ts": "^1.14.5",
"@injectivelabs/utils": "^1.14.5",
"@keplr-wallet/types": "^0.12.66",
"@radix-ui/colors": "^3.0.0",
"@radix-ui/react-accordion": "^1.1.2",
"@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-scroll-area": "^1.0.5",
"@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-tooltip": "^1.0.7",
"@sentry/nextjs": "^7.99.0",
"@skip-router/core": "5.0.4",
"@skip-go/widget": "0.0.1-alpha.16",
"@solana/spl-token": "^0.4.1",
"@solana/wallet-adapter-react": "^0.15.35",
"@solana/wallet-adapter-wallets": "^0.19.31",
Expand Down Expand Up @@ -96,8 +87,6 @@
"react-dom": "^18.2.0",
"react-hot-toast": "^2.4.1",
"react-icons": "^5.1.0",
"resend": "^3.1.0",
"stridejs": "^0.8.0-alpha.5",
"tailwind-merge": "^2.2.1",
"tailwindcss": "^3.4.1",
"tailwindcss-animate": "^1.0.7",
Expand Down
122 changes: 122 additions & 0 deletions src/hooks/useURLQueryParams.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import { useAssets, useChains } from "@skip-go/widget";
import { useQueryState } from "nuqs";
import { useEffect, useState } from "react";
import toast from "react-hot-toast";

export const useURLQueryParams = () => {
const { data: chains } = useChains();
const { isReady, assetsByChainID } = useAssets();
const [state, setState] = useState<{
srcChain?: string;
srcAssetDenom?: string;
destChain?: string;
destAssetDenom?: string;
amountIn?: string;
amountOut?: string;
}>();

const toastId = "url-params-toast";

const [srcChainQP, setSrcChainQP] = useQueryState("src_chain");
const [srcAssetQP, setSrcAssetQP] = useQueryState("src_asset");
useEffect(() => {
if (!chains || !isReady) return;
if (srcChainQP) {
const findChain = chains.find((x) => x.chainID.toLowerCase() === decodeURI(srcChainQP).toLowerCase());
if (findChain) {
if (srcAssetQP) {
const assets = assetsByChainID(findChain.chainID);
const findAsset = assets.find((x) => x.denom.toLowerCase() === decodeURI(srcAssetQP).toLowerCase());
if (findAsset) {
setState((prev) => ({ ...prev, srcChain: findChain.chainID, srcAssetDenom: findAsset.denom }));
setSrcChainQP(null);
setSrcAssetQP(null);
toast.success("URL parameters processed successfully", {
id: toastId,
duration: 5000,
});
return;
}
}
setState((prev) => ({ ...prev, srcChain: findChain.chainID }));
}
toast.success("URL parameters processed successfully", {
id: toastId,
duration: 5000,
});
setSrcChainQP(null);
setSrcAssetQP(null);
}
}, [assetsByChainID, chains, isReady, setSrcAssetQP, setSrcChainQP, srcAssetQP, srcChainQP]);

const [destChainQP, setDestChainQP] = useQueryState("dest_chain");
const [destAssetQP, setDestAssetQP] = useQueryState("dest_asset");
useEffect(() => {
if (!chains || !isReady) return;
if (destChainQP) {
const findChain = chains.find((x) => x.chainID.toLowerCase() === decodeURI(destChainQP).toLowerCase());
if (findChain) {
if (destAssetQP) {
const assets = assetsByChainID(findChain.chainID);
const findAsset = assets.find((x) => x.denom.toLowerCase() === decodeURI(destAssetQP).toLowerCase());
if (findAsset) {
setState((prev) => ({ ...prev, destChain: findChain.chainID, destAssetDenom: findAsset.denom }));
setDestChainQP(null);
setDestAssetQP(null);
toast.success("URL parameters processed successfully", {
id: toastId,
duration: 5000,
});
return;
}
}
setState((prev) => ({ ...prev, destChain: findChain.chainID }));
}
toast.success("URL parameters processed successfully", {
id: toastId,
duration: 5000,
});
setDestChainQP(null);
setDestAssetQP(null);
}
}, [assetsByChainID, chains, setDestAssetQP, setDestChainQP, destAssetQP, destChainQP, isReady]);

const [amountInQP, setAmountInQP] = useQueryState("amount_in");
const [amountOutQP, setAmountOutQP] = useQueryState("amount_out");

useEffect(() => {
if (amountInQP) {
setState((prev) => ({ ...prev, amountIn: amountInQP }));
setAmountOutQP(null);
setAmountInQP(null);
toast.success("URL parameters processed successfully", {
id: toastId,
duration: 5000,
});
return;
}
if (amountOutQP) {
setState((prev) => ({ ...prev, amountOut: amountOutQP }));
setAmountOutQP(null);
setAmountInQP(null);
toast.success("URL parameters processed successfully", {
id: toastId,
duration: 5000,
});
}
}, [amountInQP, amountOutQP, setAmountInQP, setAmountOutQP]);

useEffect(() => {
// this is a loading state when we are waiting for chains and assets to load when query params are present
if (
(!chains || !isReady) &&
(srcChainQP || srcAssetQP || destChainQP || destAssetQP || amountInQP || amountOutQP)
) {
toast.loading("URL parameters are being processed...", {
id: toastId,
duration: Infinity,
});
}
}, [amountInQP, amountOutQP, chains, destAssetQP, destChainQP, isReady, srcAssetQP, srcChainQP]);
return state;
};
14 changes: 14 additions & 0 deletions src/lib/skip-go-widget.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { SwapWidgetProviderProps } from "@skip-go/widget/build/provider";

import { appUrl } from "@/constants/api";

export const endpointOptions: SwapWidgetProviderProps["endpointOptions"] = {
getRpcEndpointForChain: async (chainID) => {
return `${appUrl}/api/rpc/${chainID}`;
},
getRestEndpointForChain: async (chainID) => {
return `${appUrl}/api/rest/${chainID}`;
},
};

export const apiURL = `${appUrl}/api/skip`;
10 changes: 7 additions & 3 deletions src/pages/_app.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import "@/styles/globals.css";

import { SwapWidgetProvider } from "@skip-go/widget";
import { Analytics } from "@vercel/analytics/react";
import { AppProps } from "next/app";

import { DefaultSeo } from "@/components/DefaultSeo";
import { Provider } from "@/widget";
import { apiURL, endpointOptions } from "@/lib/skip-go-widget";

export default function App({ Component, pageProps }: AppProps) {
return (
<>
<DefaultSeo />
<Analytics />
<Provider>
<SwapWidgetProvider
endpointOptions={endpointOptions}
apiURL={apiURL}
>
<Component {...pageProps} />
</Provider>
</SwapWidgetProvider>
</>
);
}
28 changes: 22 additions & 6 deletions src/pages/index.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import Footer from "@/components/Footer";
import { SwapWidget } from "@skip-go/widget";

import Header from "@/components/Header";
import { Help } from "@/components/Help";
import SkipBanner from "@/components/SkipBanner";
import { VersionCheck } from "@/components/VersionCheck";
import { useURLQueryParams } from "@/hooks/useURLQueryParams";
import { cn } from "@/utils/ui";
import { Widget } from "@/widget";

export default function Home() {
const defaultRoute = useURLQueryParams();
return (
<div
className={cn(
Expand All @@ -17,13 +19,27 @@ export default function Home() {
)}
>
<main className="relative flex min-h-screen flex-col items-center sm:pt-11">
<SkipBanner className="inset-x-0 top-0 z-50 w-screen sm:fixed" />
<SkipBanner className="z-9 inset-x-0 top-0 w-screen sm:fixed" />
<Header />
<div className="flex flex-grow flex-col items-center">
<div className="relative w-screen overflow-hidden bg-white p-6 shadow-xl sm:max-w-[450px] sm:rounded-3xl">
<Widget />
<div className="relative w-screen overflow-hidden bg-white p-2 shadow-xl sm:max-w-[450px] sm:rounded-3xl">
<SwapWidget
className=""
defaultRoute={{
srcChainID: defaultRoute?.srcChain || "cosmoshub-4",
srcAssetDenom: defaultRoute?.srcAssetDenom,
destChainID: defaultRoute?.destChain,
destAssetDenom: defaultRoute?.destAssetDenom,
amountIn: Number(defaultRoute?.amountIn),
amountOut: Number(defaultRoute?.amountOut),
}}
settings={{
customGasAmount: 200_000,
slippage: 3,
}}
onlyTestnet={process.env.NEXT_PUBLIC_IS_TESTNET ? true : false}
/>
</div>
<Footer />
</div>
</main>
<VersionCheck />
Expand Down
26 changes: 19 additions & 7 deletions src/pages/widget.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
import { useLayoutEffect } from "react";
import { SwapWidget } from "@skip-go/widget";

import { defaultValues, useSwapWidgetStore } from "@/components/SwapWidget/useSwapWidget";
import { Widget } from "@/widget";
import { useURLQueryParams } from "@/hooks/useURLQueryParams";

export default function WidgetPage() {
useLayoutEffect(() => {
useSwapWidgetStore.setState(defaultValues);
}, []);
const defaultRoute = useURLQueryParams();
return (
<div className="relative bg-white p-6 scrollbar-hide">
<Widget />
<SwapWidget
className=""
defaultRoute={{
srcChainID: defaultRoute?.srcChain || "cosmoshub-4",
srcAssetDenom: defaultRoute?.srcAssetDenom,
destChainID: defaultRoute?.destChain,
destAssetDenom: defaultRoute?.destAssetDenom,
amountIn: Number(defaultRoute?.amountIn),
amountOut: Number(defaultRoute?.amountOut),
}}
settings={{
customGasAmount: 200_000,
slippage: 3,
}}
onlyTestnet={process.env.NEXT_PUBLIC_IS_TESTNET ? true : false}
/>
</div>
);
}

0 comments on commit b63261f

Please sign in to comment.