Skip to content

Commit c3a26b9

Browse files
authored
Merge pull request #64 from macalinao/igm/preloaded-token-info
Add way to preload token info
2 parents 32f7057 + f13e383 commit c3a26b9

File tree

9 files changed

+378
-5
lines changed

9 files changed

+378
-5
lines changed

.changeset/slick-memes-lick.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"example-dapp": patch
3+
"@macalinao/grill": patch
4+
---
5+
6+
Add staticTokenInfo prop

apps/example-dapp/src/App.tsx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import type { TokenInfo } from "@macalinao/grill";
12
import type * as React from "react";
23
import { SolanaProvider } from "@gillsdk/react";
34
import { GrillProvider, getSolscanExplorerLink } from "@macalinao/grill";
45
import { WalletAdapterCompatProvider } from "@macalinao/wallet-adapter-compat";
6+
import { address } from "@solana/kit";
57
import {
68
ConnectionProvider,
79
WalletProvider as WalletAdapterProvider,
@@ -33,13 +35,33 @@ declare module "@tanstack/react-router" {
3335
import "@solana/wallet-adapter-react-ui/styles.css";
3436

3537
const endpoint =
36-
import.meta.env.VITE_SOLANA_RPC_URL ?? getPublicSolanaRpcUrl("mainnet-beta");
38+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
39+
import.meta.env.VITE_SOLANA_RPC_URL || getPublicSolanaRpcUrl("mainnet-beta");
3740

3841
const queryClient = new QueryClient();
3942
const solanaClient = createSolanaClient({
4043
urlOrMoniker: endpoint,
4144
});
4245

46+
// Example static token info - in production, this could come from a config file
47+
// or be fetched once at startup and cached
48+
const STATIC_TOKEN_INFO: TokenInfo[] = [
49+
{
50+
mint: address("AZzE3wPJtVZ8H7nHyBxB4Wq4e17bEz7W3Eb1v4C4pX8D"),
51+
name: "Static Test Token",
52+
symbol: "STT",
53+
decimals: 9,
54+
iconURL:
55+
"https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/So11111111111111111111111111111111111111112/logo.png",
56+
},
57+
{
58+
mint: address("AZzE3wPJtVZ8H7nHyBxB4Wq4e17bEz7W3Eb1v4C4pX8E"),
59+
name: "Another Static Token",
60+
symbol: "AST",
61+
decimals: 6,
62+
},
63+
];
64+
4365
export const App: React.FC = () => {
4466
const wallets = useMemo(
4567
() => [new PhantomWalletAdapter(), new SolflareWalletAdapter()],
@@ -54,7 +76,10 @@ export const App: React.FC = () => {
5476
<WalletModalProvider>
5577
<WalletAdapterCompatProvider>
5678
<SolanaProvider client={solanaClient}>
57-
<GrillProvider getExplorerLink={getSolscanExplorerLink}>
79+
<GrillProvider
80+
getExplorerLink={getSolscanExplorerLink}
81+
staticTokenInfo={STATIC_TOKEN_INFO}
82+
>
5883
<div className="min-h-screen bg-background">
5984
<RouterProvider router={router} />
6085
<Toaster richColors position="bottom-right" />
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import type { VariantProps } from "class-variance-authority";
2+
import { cva } from "class-variance-authority";
3+
import * as React from "react";
4+
import { cn } from "@/lib/utils";
5+
6+
const alertVariants = cva(
7+
"relative w-full rounded-lg border p-4 [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
8+
{
9+
variants: {
10+
variant: {
11+
default: "bg-background text-foreground",
12+
destructive:
13+
"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
14+
},
15+
},
16+
defaultVariants: {
17+
variant: "default",
18+
},
19+
},
20+
);
21+
22+
const Alert = React.forwardRef<
23+
HTMLDivElement,
24+
React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
25+
>(({ className, variant, ...props }, ref) => (
26+
<div
27+
ref={ref}
28+
role="alert"
29+
className={cn(alertVariants({ variant }), className)}
30+
{...props}
31+
/>
32+
));
33+
Alert.displayName = "Alert";
34+
35+
const AlertTitle = React.forwardRef<
36+
HTMLParagraphElement,
37+
React.HTMLAttributes<HTMLHeadingElement>
38+
>(({ className, ...props }, ref) => (
39+
<h5
40+
ref={ref}
41+
className={cn("mb-1 font-medium leading-none tracking-tight", className)}
42+
{...props}
43+
/>
44+
));
45+
AlertTitle.displayName = "AlertTitle";
46+
47+
const AlertDescription = React.forwardRef<
48+
HTMLParagraphElement,
49+
React.HTMLAttributes<HTMLParagraphElement>
50+
>(({ className, ...props }, ref) => (
51+
<div
52+
ref={ref}
53+
className={cn("text-sm [&_p]:leading-relaxed", className)}
54+
{...props}
55+
/>
56+
));
57+
AlertDescription.displayName = "AlertDescription";
58+
59+
export { Alert, AlertTitle, AlertDescription };

apps/example-dapp/src/routeTree.gen.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { Route as ExamplesWrappedSolRouteImport } from "./routes/examples/wrappe
1616
import { Route as ExamplesTransferSolRouteImport } from "./routes/examples/transfer-sol.tsx"
1717
import { Route as ExamplesTokensRouteImport } from "./routes/examples/tokens.tsx"
1818
import { Route as ExamplesTokenBalancesRouteImport } from "./routes/examples/token-balances.tsx"
19+
import { Route as ExamplesStaticTokensRouteImport } from "./routes/examples/static-tokens.tsx"
1920
import { Route as ExamplesDashboardRouteImport } from "./routes/examples/dashboard.tsx"
2021
import { Route as ExamplesBatchAccountsRouteImport } from "./routes/examples/batch-accounts.tsx"
2122

@@ -54,6 +55,11 @@ const ExamplesTokenBalancesRoute = ExamplesTokenBalancesRouteImport.update({
5455
path: "/token-balances",
5556
getParentRoute: () => ExamplesRoute,
5657
} as any)
58+
const ExamplesStaticTokensRoute = ExamplesStaticTokensRouteImport.update({
59+
id: "/static-tokens",
60+
path: "/static-tokens",
61+
getParentRoute: () => ExamplesRoute,
62+
} as any)
5763
const ExamplesDashboardRoute = ExamplesDashboardRouteImport.update({
5864
id: "/dashboard",
5965
path: "/dashboard",
@@ -70,6 +76,7 @@ export interface FileRoutesByFullPath {
7076
"/examples": typeof ExamplesRouteWithChildren
7177
"/examples/batch-accounts": typeof ExamplesBatchAccountsRoute
7278
"/examples/dashboard": typeof ExamplesDashboardRoute
79+
"/examples/static-tokens": typeof ExamplesStaticTokensRoute
7380
"/examples/token-balances": typeof ExamplesTokenBalancesRoute
7481
"/examples/tokens": typeof ExamplesTokensRoute
7582
"/examples/transfer-sol": typeof ExamplesTransferSolRoute
@@ -80,6 +87,7 @@ export interface FileRoutesByTo {
8087
"/": typeof IndexRoute
8188
"/examples/batch-accounts": typeof ExamplesBatchAccountsRoute
8289
"/examples/dashboard": typeof ExamplesDashboardRoute
90+
"/examples/static-tokens": typeof ExamplesStaticTokensRoute
8391
"/examples/token-balances": typeof ExamplesTokenBalancesRoute
8492
"/examples/tokens": typeof ExamplesTokensRoute
8593
"/examples/transfer-sol": typeof ExamplesTransferSolRoute
@@ -92,6 +100,7 @@ export interface FileRoutesById {
92100
"/examples": typeof ExamplesRouteWithChildren
93101
"/examples/batch-accounts": typeof ExamplesBatchAccountsRoute
94102
"/examples/dashboard": typeof ExamplesDashboardRoute
103+
"/examples/static-tokens": typeof ExamplesStaticTokensRoute
95104
"/examples/token-balances": typeof ExamplesTokenBalancesRoute
96105
"/examples/tokens": typeof ExamplesTokensRoute
97106
"/examples/transfer-sol": typeof ExamplesTransferSolRoute
@@ -105,6 +114,7 @@ export interface FileRouteTypes {
105114
| "/examples"
106115
| "/examples/batch-accounts"
107116
| "/examples/dashboard"
117+
| "/examples/static-tokens"
108118
| "/examples/token-balances"
109119
| "/examples/tokens"
110120
| "/examples/transfer-sol"
@@ -115,6 +125,7 @@ export interface FileRouteTypes {
115125
| "/"
116126
| "/examples/batch-accounts"
117127
| "/examples/dashboard"
128+
| "/examples/static-tokens"
118129
| "/examples/token-balances"
119130
| "/examples/tokens"
120131
| "/examples/transfer-sol"
@@ -126,6 +137,7 @@ export interface FileRouteTypes {
126137
| "/examples"
127138
| "/examples/batch-accounts"
128139
| "/examples/dashboard"
140+
| "/examples/static-tokens"
129141
| "/examples/token-balances"
130142
| "/examples/tokens"
131143
| "/examples/transfer-sol"
@@ -189,6 +201,13 @@ declare module "@tanstack/react-router" {
189201
preLoaderRoute: typeof ExamplesTokenBalancesRouteImport
190202
parentRoute: typeof ExamplesRoute
191203
}
204+
"/examples/static-tokens": {
205+
id: "/examples/static-tokens"
206+
path: "/static-tokens"
207+
fullPath: "/examples/static-tokens"
208+
preLoaderRoute: typeof ExamplesStaticTokensRouteImport
209+
parentRoute: typeof ExamplesRoute
210+
}
192211
"/examples/dashboard": {
193212
id: "/examples/dashboard"
194213
path: "/dashboard"
@@ -209,6 +228,7 @@ declare module "@tanstack/react-router" {
209228
interface ExamplesRouteChildren {
210229
ExamplesBatchAccountsRoute: typeof ExamplesBatchAccountsRoute
211230
ExamplesDashboardRoute: typeof ExamplesDashboardRoute
231+
ExamplesStaticTokensRoute: typeof ExamplesStaticTokensRoute
212232
ExamplesTokenBalancesRoute: typeof ExamplesTokenBalancesRoute
213233
ExamplesTokensRoute: typeof ExamplesTokensRoute
214234
ExamplesTransferSolRoute: typeof ExamplesTransferSolRoute
@@ -219,6 +239,7 @@ interface ExamplesRouteChildren {
219239
const ExamplesRouteChildren: ExamplesRouteChildren = {
220240
ExamplesBatchAccountsRoute: ExamplesBatchAccountsRoute,
221241
ExamplesDashboardRoute: ExamplesDashboardRoute,
242+
ExamplesStaticTokensRoute: ExamplesStaticTokensRoute,
222243
ExamplesTokenBalancesRoute: ExamplesTokenBalancesRoute,
223244
ExamplesTokensRoute: ExamplesTokensRoute,
224245
ExamplesTransferSolRoute: ExamplesTransferSolRoute,

apps/example-dapp/src/routes/examples/index.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,20 @@ const ExamplesIndexPage: React.FC = () => {
4848
</Link>
4949
</CardContent>
5050
</Card>
51+
52+
<Card>
53+
<CardHeader>
54+
<CardTitle>Static Token Info</CardTitle>
55+
<CardDescription>
56+
Preload token metadata for instant display without chain fetching
57+
</CardDescription>
58+
</CardHeader>
59+
<CardContent>
60+
<Link to="/examples/static-tokens">
61+
<Button className="w-full">View Example</Button>
62+
</Link>
63+
</CardContent>
64+
</Card>
5165
</div>
5266
</div>
5367
);

0 commit comments

Comments
 (0)