@@ -10,25 +10,41 @@ import {
1010import {
1111 ModalConfigCtx ,
1212 SetModalConfigCtx ,
13+ WalletUIStatesProvider ,
1314 useIsWalletModalOpen ,
1415 useSetIsWalletModalOpen ,
1516} from "../../evm/providers/wallet-ui-states-provider" ;
1617import { ThemeProvider } from "@emotion/react" ;
17- import { darkTheme , lightTheme } from "../../design-system" ;
18+ import {
19+ Theme ,
20+ darkTheme ,
21+ lightTheme ,
22+ radius ,
23+ spacing ,
24+ } from "../../design-system" ;
1825import { useState , useCallback , useEffect , useRef , useContext } from "react" ;
1926import { GetStartedWithWallets } from "./screens/GetStartedWithWallets" ;
2027import { reservedScreens } from "./constants" ;
2128import { HeadlessConnectUI } from "../wallets/headlessConnectUI" ;
29+ import styled from "@emotion/styled" ;
30+ import { scrollbar } from "../../design-system/styles" ;
2231
23- export const ConnectModal = ( ) => {
24- const { theme, title } = useContext ( ModalConfigCtx ) ;
32+ export const ConnectModalContent = ( props : {
33+ screen : string | WalletConfig ;
34+ setScreen : ( screen : string | WalletConfig ) => void ;
35+ theme ?: "light" | "dark" ;
36+ title ?: string ;
37+ } ) => {
38+ const { screen, setScreen } = props ;
39+ const modalConfig = useContext ( ModalConfigCtx ) ;
40+ const title = props . title || modalConfig . title ;
41+ const theme = props . theme || modalConfig . theme ;
2542 const walletConfigs = useWallets ( ) ;
2643 const initialScreen =
2744 walletConfigs . length === 1 && ! walletConfigs [ 0 ] . selectUI
2845 ? walletConfigs [ 0 ]
2946 : reservedScreens . main ;
3047
31- const [ screen , setScreen ] = useState < string | WalletConfig > ( initialScreen ) ;
3248 const isWalletModalOpen = useIsWalletModalOpen ( ) ;
3349 const setIsWalletModalOpen = useSetIsWalletModalOpen ( ) ;
3450 const connectionStatus = useConnectionStatus ( ) ;
@@ -47,7 +63,13 @@ export const ConnectModal = () => {
4763 }
4864 setIsWalletModalOpen ( false ) ;
4965 } ,
50- [ setIsWalletModalOpen , initialScreen , connectionStatus , disconnect ] ,
66+ [
67+ connectionStatus ,
68+ setIsWalletModalOpen ,
69+ setScreen ,
70+ initialScreen ,
71+ disconnect ,
72+ ] ,
5173 ) ;
5274
5375 const handleBack = useCallback ( ( ) => {
@@ -95,6 +117,55 @@ export const ConnectModal = () => {
95117 : darkTheme
96118 }
97119 >
120+ { screen === reservedScreens . main && (
121+ < WalletSelector
122+ title = { title }
123+ walletConfigs = { walletConfigs }
124+ onGetStarted = { ( ) => {
125+ setScreen ( reservedScreens . getStarted ) ;
126+ } }
127+ selectWallet = { setScreen }
128+ />
129+ ) }
130+
131+ { screen === reservedScreens . getStarted && (
132+ < GetStartedWithWallets onBack = { handleBack } />
133+ ) }
134+
135+ { WalletConnectUI && (
136+ < WalletConnectUI
137+ supportedWallets = { walletConfigs }
138+ theme = { theme }
139+ goBack = { handleBack }
140+ close = { handleClose }
141+ isOpen = { isWalletModalOpen }
142+ open = { ( ) => {
143+ setIsWalletModalOpen ( true ) ;
144+ } }
145+ walletConfig = { screen }
146+ selectionData = { walletModalConfig . data }
147+ setSelectionData = { ( data ) => {
148+ setWalletModalConfig ( ( config ) => ( {
149+ ...config ,
150+ data,
151+ } ) ) ;
152+ } }
153+ />
154+ ) }
155+ </ ThemeProvider >
156+ ) ;
157+ } ;
158+
159+ export const ConnectModal = ( ) => {
160+ const { theme } = useContext ( ModalConfigCtx ) ;
161+ const { screen, setScreen, initialScreen } = useScreen ( ) ;
162+ const isWalletModalOpen = useIsWalletModalOpen ( ) ;
163+ const setIsWalletModalOpen = useSetIsWalletModalOpen ( ) ;
164+ const connectionStatus = useConnectionStatus ( ) ;
165+ const disconnect = useDisconnect ( ) ;
166+
167+ return (
168+ < ThemeProvider theme = { theme === "light" ? lightTheme : darkTheme } >
98169 < Modal
99170 style = { {
100171 maxWidth : "450px" ,
@@ -111,42 +182,62 @@ export const ConnectModal = () => {
111182 }
112183 } }
113184 >
114- { screen === reservedScreens . main && (
115- < WalletSelector
116- title = { title }
117- walletConfigs = { walletConfigs }
118- onGetStarted = { ( ) => {
119- setScreen ( reservedScreens . getStarted ) ;
120- } }
121- selectWallet = { setScreen }
122- />
123- ) }
124-
125- { screen === reservedScreens . getStarted && (
126- < GetStartedWithWallets onBack = { handleBack } />
127- ) }
128-
129- { WalletConnectUI && (
130- < WalletConnectUI
131- supportedWallets = { walletConfigs }
132- theme = { theme }
133- goBack = { handleBack }
134- close = { handleClose }
135- isOpen = { isWalletModalOpen }
136- open = { ( ) => {
137- setIsWalletModalOpen ( true ) ;
138- } }
139- walletConfig = { screen }
140- selectionData = { walletModalConfig . data }
141- setSelectionData = { ( data ) => {
142- setWalletModalConfig ( ( config ) => ( {
143- ...config ,
144- data,
145- } ) ) ;
146- } }
147- />
148- ) }
185+ < ConnectModalContent screen = { screen } setScreen = { setScreen } />
149186 </ Modal >
150187 </ ThemeProvider >
151188 ) ;
152189} ;
190+
191+ export const ConnectModalInline = ( props : {
192+ theme ?: "light" | "dark" ;
193+ title ?: string ;
194+ className ?: string ;
195+ } ) => {
196+ const { screen, setScreen } = useScreen ( ) ;
197+ return (
198+ < WalletUIStatesProvider theme = { props . theme } >
199+ < ThemeProvider theme = { props . theme === "light" ? lightTheme : darkTheme } >
200+ < ConnectModalInlineContainer className = { props . className } >
201+ < ConnectModalContent
202+ screen = { screen }
203+ setScreen = { setScreen }
204+ theme = { props . theme }
205+ title = { props . title }
206+ />
207+ </ ConnectModalInlineContainer >
208+ </ ThemeProvider >
209+ </ WalletUIStatesProvider >
210+ ) ;
211+ } ;
212+
213+ function useScreen ( ) {
214+ const walletConfigs = useWallets ( ) ;
215+ const initialScreen =
216+ walletConfigs . length === 1 && ! walletConfigs [ 0 ] . selectUI
217+ ? walletConfigs [ 0 ]
218+ : reservedScreens . main ;
219+
220+ const [ screen , setScreen ] = useState < string | WalletConfig > ( initialScreen ) ;
221+ return {
222+ screen,
223+ setScreen,
224+ initialScreen,
225+ } ;
226+ }
227+
228+ const ConnectModalInlineContainer = styled . div < { theme ?: Theme } > `
229+ background: ${ ( p ) => p . theme . bg . base } ;
230+ padding: ${ spacing . lg } ;
231+ border-radius: ${ radius . xl } ;
232+ max-width: 450px;
233+ width: 100%;
234+ box-sizing: border-box;
235+ max-height: 70vh;
236+ overflow-y: auto;
237+ ${ ( p ) =>
238+ scrollbar ( {
239+ track : "transparent" ,
240+ thumb : p . theme . bg . elevated ,
241+ hover : p . theme . bg . highlighted ,
242+ } ) }
243+ ` ;
0 commit comments