Skip to content

Commit 0c4ce4a

Browse files
authored
Merge pull request #13 from magiclabs/add-solana
Add solana
2 parents 87a078d + 6590718 commit 0c4ce4a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1881
-1025
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,5 @@ yarn-error.log*
4040
# typescript
4141
*.tsbuildinfo
4242
next-env.d.ts
43+
44+
/.idea

package.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,18 @@
99
"lint": "eslint"
1010
},
1111
"dependencies": {
12-
"@magic-ext/evm": "1.0.0-canary.915.17279636506.0",
13-
"@magic-ext/hedera": "^1.0.4",
14-
"@magic-ext/oauth2": "^12.0.0",
15-
"@magic-ext/solana": "^27.0.0",
12+
"@magic-ext/evm": "1.0.0",
13+
"@magic-ext/hedera": "^2.0.0",
14+
"@magic-ext/oauth2": "^13.0.0",
15+
"@magic-ext/solana": "^28.0.0",
1616
"@metamask/eth-sig-util": "^8.2.0",
1717
"@radix-ui/react-tabs": "^1.1.13",
18+
"@solana/web3.js": "^1.98.4",
1819
"@types/prismjs": "^1.26.5",
1920
"@types/react-syntax-highlighter": "^15.5.13",
2021
"clsx": "^2.1.1",
2122
"ethers": "^6.15.0",
22-
"magic-sdk": "^30.0.0",
23+
"magic-sdk": "^31.0.0",
2324
"next": "15.5.2",
2425
"next-auth": "^4.24.11",
2526
"prismjs": "^1.30.0",

pnpm-lock.yaml

Lines changed: 32 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,37 @@
1+
"use client";
2+
13
import "../../globals.css";
24
import SessionProviderComponent from "../../../providers/SessionProvider";
5+
import { ApiWalletProvider } from "@/contexts/ApiWalletContext";
6+
import { ConsoleProvider } from "@/contexts/ConsoleContext";
7+
import { MobileMenu } from "@/components/MobileMenu";
8+
import { TeeDocsButton } from "@/components/TeeDocsButton";
39

410
export default function Layout({
511
children,
612
}: Readonly<{
713
children: React.ReactNode;
814
}>) {
915
return (
10-
<SessionProviderComponent>{children}</SessionProviderComponent>
16+
<SessionProviderComponent>
17+
<ConsoleProvider>
18+
<ApiWalletProvider>
19+
<div className="relative">
20+
{/* Mobile: Hamburger Menu */}
21+
<MobileMenu hasConsole={true}>
22+
<div onClick={() => {}}>
23+
<TeeDocsButton className="w-full" />
24+
</div>
25+
</MobileMenu>
26+
27+
{/* Desktop: Top Right Buttons */}
28+
<div className="absolute top-8 right-8 z-20 gap-3 hidden sm:flex">
29+
<TeeDocsButton className="" />
30+
</div>
31+
{children}
32+
</div>
33+
</ApiWalletProvider>
34+
</ConsoleProvider>
35+
</SessionProviderComponent>
1136
);
1237
}

src/app/(demo)/api-wallet/page.tsx

Lines changed: 35 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,46 @@
11
"use client";
22

3-
import { signOut, useSession } from "next-auth/react";
4-
import {
5-
SignInButton,
6-
SignOutButton,
7-
} from "../../../components/api-wallet/AuthButtons";
8-
import { SignMethods } from "@/components/api-wallet/SignMethods";
9-
import { useEffect, useState } from "react";
10-
import { teeService } from "../../../lib/tee-service";
11-
import { UserInfo } from "@/components/api-wallet/UserInfo";
3+
import { useEffect } from "react";
4+
import { useRouter } from "next/navigation";
5+
import { SignInButton } from "../../../components/api-wallet/AuthButtons";
126
import { BackButton } from "@/components/BackButton";
13-
import { MobileMenu } from "@/components/MobileMenu";
14-
import { TeeDocsButton } from "@/components/TeeDocsButton";
7+
import { useApiWallet } from "@/contexts/ApiWalletContext";
158

169
export default function Home() {
17-
const { status } = useSession();
18-
const [publicAddress, setPublicAddress] = useState<string | null>(null);
10+
const router = useRouter();
11+
const { isAuthenticated, isLoading } = useApiWallet();
1912

2013
useEffect(() => {
21-
if (!publicAddress && status === "authenticated") {
22-
teeService
23-
.getOrCreateWallet()
24-
.then((address) => {
25-
setPublicAddress(address);
26-
})
27-
.catch((error) => {
28-
console.error("Failed to get or create wallet:", error);
29-
// Only sign out if it's an auth-related error
30-
if (error.requiresReauth) {
31-
console.log("Auth error detected, signing out...");
32-
signOut();
33-
}
34-
});
14+
if (isAuthenticated) {
15+
router.push('/api-wallet/wallet');
3516
}
36-
}, [publicAddress, status]);
17+
}, [isAuthenticated, router]);
3718

38-
if (status === "loading") {
19+
// Show loading state while checking authentication
20+
if (isLoading) {
3921
return (
40-
<div className="flex flex-col items-center justify-center min-h-[500px]">
41-
<div className="text-2xl font-bold">Loading...</div>
22+
<div className="relative min-h-screen flex items-center justify-center">
23+
<div className="text-center">
24+
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4"></div>
25+
<p className="text-muted-foreground">Checking authentication...</p>
26+
</div>
4227
</div>
4328
);
4429
}
4530

31+
// Don't render the auth form if user is authenticated (redirect will happen)
32+
if (isAuthenticated) {
33+
return null;
34+
}
35+
4636
return (
4737
<div className="relative min-h-screen">
48-
<div className="relative z-10 flex flex-col items-center min-h-screen p-8 pb-20 pt-16 sm:pt-20 gap-8 sm:gap-16 sm:p-20">
49-
{/* Mobile: Hamburger Menu */}
50-
<MobileMenu>
51-
<div onClick={() => {}}>
52-
<TeeDocsButton className="w-full" />
53-
</div>
54-
{status === "authenticated" && (
55-
<div onClick={() => {}}>
56-
<SignOutButton className="h-12" />
57-
</div>
58-
)}
59-
</MobileMenu>
60-
61-
{/* Desktop: Positioned buttons */}
62-
<div className="hidden sm:block">
63-
<BackButton />
64-
<TeeDocsButton />
65-
</div>
38+
<div className="relative z-10 flex flex-col items-center min-h-screen p-8 pt-12 pb-20 gap-2 sm:gap-16 sm:p-20">
39+
<BackButton className="hidden sm:block" />
6640

6741
{/* Header */}
6842
<div className="flex flex-col items-center gap-6 text-center">
69-
<div className="relative py-4">
43+
<div className="relative py-8 sm:py-4">
7044
<h1 className="text-6xl font-bold gradient-text mb-4 leading-tight">
7145
Magic API Wallets
7246
</h1>
@@ -75,27 +49,19 @@ export default function Home() {
7549
</div>
7650

7751
{/* Main Content */}
78-
{status === "authenticated" && (
79-
<div className="flex flex-col items-center gap-12 w-full max-w-4xl">
80-
<UserInfo publicAddress={publicAddress} />
81-
<SignMethods publicAddress={publicAddress} />
82-
<div className="hidden sm:block">
83-
<SignOutButton />
84-
</div>
52+
<div className="flex flex-col items-center gap-8 w-full max-w-2xl">
53+
<div className="text-center">
54+
<h2 className="text-2xl font-semibold mb-4 text-foreground">
55+
Get Started
56+
</h2>
57+
<p className="text-muted-foreground mb-8">
58+
Connect your account to access your secure TEE wallet
59+
</p>
8560
</div>
86-
)}
8761

88-
{status === "unauthenticated" && (
89-
<div className="flex flex-col items-center gap-8">
90-
<div className="text-center">
91-
<h2 className="text-2xl font-semibold mb-4">Get Started</h2>
92-
<p className="text-muted-foreground mb-8">
93-
Connect your account to access your secure TEE wallet
94-
</p>
95-
</div>
96-
<SignInButton />
97-
</div>
98-
)}
62+
{/* Sign In Button */}
63+
<SignInButton />
64+
</div>
9965
</div>
10066
</div>
10167
);

0 commit comments

Comments
 (0)