Prerequisites
Before you begin, make sure you have the following installed on your system.
Node.js and npm : Download and install from nodejs.org
Step 1: Create a New React Project
Head to your preferred directory and create a new React project using create-react-app
with TypeScript template (you can use other templates or methods to start your project too):
npx create-react-app plugin-demo --template typescript
cd plugin-demo
npm start
Step 2: Add TypeScript Support
Create a type declaration file plugin.d.ts
in your project’s /src/types
folder:
declare global {
interface Window {
Jupiter: JupiterPlugin ;
}
};
export {};
Full TypeScript Declaration
declare global {
interface Window {
Jupiter: JupiterPlugin ;
}
}
export type WidgetPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right' ;
export type WidgetSize = 'sm' | 'default' ;
export type SwapMode = "ExactInOrOut" | "ExactIn" | "ExactOut" ;
export type DEFAULT_EXPLORER = 'Solana Explorer' | 'Solscan' | 'Solana Beach' | 'SolanaFM' ;
export interface FormProps {
swapMode?: SwapMode ;
initialAmount?: string ;
initialInputMint?: string ;
initialOutputMint?: string ;
fixedAmount?: boolean ;
fixedMint?: string ;
referralAccount?: string ;
referralFee?: number ;
}
export interface IInit {
localStoragePrefix?: string ;
formProps?: FormProps ;
defaultExplorer?: DEFAULT_EXPLORER ;
autoConnect?: boolean ;
displayMode?: 'modal' | 'integrated' | 'widget' ;
integratedTargetId?: string ;
widgetStyle?: {
position?: WidgetPosition ;
size?: WidgetSize ;
};
containerStyles?: CSSProperties ;
containerClassName?: string ;
enableWalletPassthrough?: boolean ;
passthroughWalletContextState?: WalletContextState ;
onRequestConnectWallet?: () = > void | Promise <void>;
onSwapError?: ({
error,
quoteResponseMeta,
} : {
error?: TransactionError ;
quoteResponseMeta: QuoteResponse | null ;
}) = > void;
onSuccess?: ({
txid,
swapResult,
quoteResponseMeta,
}: {
txid: string ;
swapResult: SwapResult ;
quoteResponseMeta: QuoteResponse | null ;
}) = > void;
onFormUpdate?: (form: IForm ) = > void;
onScreenUpdate?: (screen: IScreen ) = > void;
}
export interface JupiterPlugin {
_instance: JSX.Element | null ;
init: (props: IInit ) = > void;
resume: () = > void;
close: () = > void;
root: Root | null ;
enableWalletPassthrough: boolean ;
onRequestConnectWallet: IInit['onRequestConnectWallet'] ;
store: ReturnType < typeof createStor e > ;
syncProps: (props: { passthroughWalletContextState?: IInit['passthroughWalletContextState'] } ) = > void;
onSwapError: IInit['onSwapError'] ;
onSuccess: IInit['onSuccess'] ;
onFormUpdate: IInit['onFormUpdate'] ;
onScreenUpdate: IInit['onScreenUpdate'] ;
localStoragePrefix: string ;
}
export { };
Step 3: Embed the Plugin Script
In your /public/index.html
, add the Jupiter Plugin script:
< head >
< script src="https://plugin.jup.ag/plugin-v1.js" data-preload defe r>< /scrip t >
< /head >
Step 4: Initialize Plugin
There are two ways to initialize Jupiter Plugin in a React application:
Method 1: Using Window Object
In your /src/App.tsx
, use the following code to initialize the plugin.
import React, { useEffect } from 'react' ;
import './App.css' ;
import './types/plugin.d' ;
export default function App () {
useEffect(( ) => {
// Initialize plugin
window.Jupiter.init( {
displayMode: "widget",
integratedTargetId: "jupiter-plugin",
});
}, []);
return (
< div className="App" >
< h1 > Jupiter Plugin Demo < /h 1>
< div id="jupiter-plugin" / >
< /div >
);
}
Method 2: Using @jup-ag/plugin Package
WARNING Do note that using this method will require you to maintain its dependencies.
Install the package: npm install @jup-ag/plugin
Initialize the plugin: import React, { useEffect } from "react" ;
import "@jup-ag/plugin/css" ;
import "./App.css" ;
import "./types/plugin.d" ;
export default function App () {
useEffect(( ) => {
import( "@jup-ag/plugin" ).then(( mod ) => {
const { init } = mod;
init( {
displayMode: "widget",
integratedTargetId: "jupiter-plugin",
});
});
}, []);
return (
< div >
< h1 > Jupiter Plugin Demo < /h 1>
< div id="jupiter-plugin" / >
< /div >
);
}
There you have it! You’ve successfully integrated Jupiter Plugin into your Next.js application.
Please test the swap functionality and check the transaction.
If you require more customizations, check out the Plugin Playground or the Customization documentation.
If you have any questions or issues, please refer to the FAQ or contact us on Discord .