Skip to content

Commit 2c96ac1

Browse files
committed
Merge branch 'main' of github.com:thirdweb-dev/js into mariano/cli-auth-flow
2 parents 91f28ec + b29ec67 commit 2c96ac1

File tree

5 files changed

+140
-43
lines changed

5 files changed

+140
-43
lines changed

.changeset/olive-zebras-live.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@thirdweb-dev/react": patch
3+
---
4+
5+
Export ConnectModalInline component

packages/react/src/components/Modal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ const DialogContent = styled.div<{ theme?: Theme }>`
152152
}
153153
`;
154154

155-
const DialogTitle = /* @__PURE__ */ styled(/* @__PURE__ */ Dialog.Title)<{
155+
const DialogTitle = /* @__PURE__ */ styled.h2<{
156156
theme?: Theme;
157157
}>`
158158
margin: 0;

packages/react/src/components/modalElements.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import { type Theme, fontSize, media } from "../design-system";
22
import { iconSize } from "../design-system";
33
import { IconButton } from "./buttons";
44
import styled from "@emotion/styled";
5-
import { Title } from "@radix-ui/react-dialog";
65
import { ChevronLeftIcon } from "@radix-ui/react-icons";
76

8-
export const ModalTitle = /* @__PURE__ */ styled(Title)<{
7+
export const ModalTitle = /* @__PURE__ */ styled.h2<{
98
theme?: Theme;
109
centerOnMobile?: boolean;
1110
}>`

packages/react/src/evm/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export { useSafe } from "./connectors/gnosis";
77
export { useMagic } from "./connectors/magic";
88

99
export { ConnectWallet } from "../wallet/ConnectWallet/ConnectWallet";
10+
export { ConnectModalInline } from "../wallet/ConnectWallet/ConnectModal";
11+
1012
export { NetworkSelector } from "../wallet/ConnectWallet/NetworkSelector";
1113
export type { NetworkSelectorProps } from "../wallet/ConnectWallet/NetworkSelector";
1214

packages/react/src/wallet/ConnectWallet/ConnectModal.tsx

Lines changed: 131 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,41 @@ import {
1010
import {
1111
ModalConfigCtx,
1212
SetModalConfigCtx,
13+
WalletUIStatesProvider,
1314
useIsWalletModalOpen,
1415
useSetIsWalletModalOpen,
1516
} from "../../evm/providers/wallet-ui-states-provider";
1617
import { 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";
1825
import { useState, useCallback, useEffect, useRef, useContext } from "react";
1926
import { GetStartedWithWallets } from "./screens/GetStartedWithWallets";
2027
import { reservedScreens } from "./constants";
2128
import { 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

Comments
 (0)