Skip to content

Commit e1f78ff

Browse files
committed
feat: use canvas wallet adapter
1 parent ad8edb0 commit e1f78ff

File tree

7 files changed

+405
-327
lines changed

7 files changed

+405
-327
lines changed

package-lock.json

Lines changed: 174 additions & 141 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
},
1313
"dependencies": {
1414
"@dialectlabs/blinks": "^0.5.0",
15-
"@dscvr-one/canvas-client-sdk": "^1.0.7",
15+
"@dscvr-one/canvas-client-sdk": "^1.1.0",
16+
"@dscvr-one/canvas-wallet-adapter": "^1.0.1",
17+
"@solana/wallet-adapter-base": "^0.9.23",
18+
"@solana/wallet-adapter-react": "^0.15.35",
1619
"@solana/web3.js": "^1.95.2",
1720
"base58": "^2.0.1",
1821
"react": "^18.3.1",

src/App.tsx

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,53 @@
1-
import { useEffect, useRef, useState } from "react";
2-
import "./App.css";
3-
import {
4-
Action,
5-
ActionContainer,
6-
} from "@dialectlabs/blinks";
1+
import { useEffect, useRef, useState } from 'react';
2+
import './App.css';
3+
import { Action, ActionContainer } from '@dialectlabs/blinks';
74
import '@dialectlabs/blinks/index.css';
8-
import './blink.css'
9-
import { CanvasAdapter, isIframe } from "./canvas-adapter";
10-
import { CanvasClient } from "@dscvr-one/canvas-client-sdk";
5+
import './blink.css';
6+
import { canvasClient } from './canvas-client';
7+
import { useCanvasAdapter } from './use-canvas-adapter';
118

129
const App = () => {
1310
const [action, setAction] = useState<Action | null>(null);
14-
const [_, setIsInIframe] = useState(false);
15-
const [websiteUrl, setWebsiteUrl] = useState("");
16-
const [websiteText, setWebsiteText] = useState("");
11+
const [websiteUrl, setWebsiteUrl] = useState('');
12+
const [websiteText, setWebsiteText] = useState('');
1713
const containerRef = useRef<HTMLDivElement>(null);
18-
const canvasClientRef = useRef<CanvasClient | undefined>();
19-
20-
useEffect(() => {
21-
const iframe = isIframe();
22-
23-
if(iframe) {
24-
canvasClientRef.current = new CanvasClient();
25-
};
14+
const { initialize, canvasAdapterRef } = useCanvasAdapter();
2615

27-
setIsInIframe(iframe);
28-
const adapter = iframe ? new CanvasAdapter() : undefined;
16+
useEffect(() => {
17+
if (canvasClient) {
18+
initialize();
19+
}
2920

3021
const fetchAction = async () => {
3122
const url = new URL(window.location.href);
32-
33-
const actionParam = url.searchParams.get('action') ?? 'https://blink-chat.xyz/api/actions/chat';
34-
23+
24+
const actionParam =
25+
url.searchParams.get('action') ??
26+
'https://blink-chat.xyz/api/actions/chat';
27+
3528
if (actionParam) {
3629
try {
3730
const actionUrl = new URL(actionParam);
38-
31+
3932
setWebsiteUrl(actionUrl.toString());
4033
setWebsiteText(actionUrl.host);
4134

4235
const action = await Action.fetch(
4336
actionParam,
44-
adapter
37+
canvasAdapterRef.current
4538
);
4639
setAction(action);
4740
} catch (error) {
48-
console.error("Invalid action URL:", error);
41+
console.error('Invalid action URL:', error);
4942
}
5043
} else {
51-
console.error("No action parameter provided in URL");
44+
console.error('No action parameter provided in URL');
5245
}
5346
};
5447
fetchAction();
5548

5649
const resizeObserver = new ResizeObserver((_) => {
57-
canvasClientRef?.current?.resize();
50+
canvasClient.resize();
5851
});
5952

6053
if (containerRef.current) {
@@ -70,16 +63,16 @@ const App = () => {
7063

7164
const exampleCallbacks = {
7265
onActionMount: (action: any, url: any, actionState: any) => {
73-
console.log("Action mounted:", action, url, actionState);
66+
console.log('Action mounted:', action, url, actionState);
7467
},
7568
};
7669

77-
const exampleSecurityLevel = "only-trusted";
70+
const exampleSecurityLevel = 'only-trusted';
7871

7972
const containerStyle = {
8073
maxWidth: '450px',
8174
margin: '0 auto',
82-
width: '100%'
75+
width: '100%',
8376
};
8477

8578
return (
@@ -98,4 +91,4 @@ const App = () => {
9891
);
9992
};
10093

101-
export default App;
94+
export default App;

src/canvas-adapter.ts

Lines changed: 0 additions & 144 deletions
This file was deleted.

src/canvas-client.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { CanvasClient } from '@dscvr-one/canvas-client-sdk';
2+
import { registerCanvasWallet } from '@dscvr-one/canvas-wallet-adapter';
3+
import type { WalletName } from '@solana/wallet-adapter-base';
4+
5+
export const checkIframe = () => {
6+
try {
7+
return window.self !== window.top;
8+
} catch (e) {
9+
return true;
10+
}
11+
};
12+
13+
export const isIframe = checkIframe();
14+
export const canvasClient = isIframe ? new CanvasClient() : undefined;
15+
const canvasWallet = canvasClient
16+
? registerCanvasWallet(canvasClient)
17+
: undefined;
18+
19+
export const CANVAS_WALLET_NAME = canvasWallet
20+
? (canvasWallet.name as WalletName)
21+
: undefined;

src/main.tsx

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1-
import React from 'react'
2-
import ReactDOM from 'react-dom/client'
3-
import App from './App.tsx'
4-
import './index.css'
1+
import React from 'react';
2+
import ReactDOM from 'react-dom/client';
3+
import {
4+
WalletProvider,
5+
ConnectionProvider,
6+
} from '@solana/wallet-adapter-react';
7+
import App from './App.tsx';
8+
import './index.css';
9+
10+
const RPC_ENDPOINT = 'https://api.mainnet-beta.solana.com';
511

612
ReactDOM.createRoot(document.getElementById('root')!).render(
713
<React.StrictMode>
8-
<App />
9-
</React.StrictMode>,
10-
)
14+
<WalletProvider wallets={[]}>
15+
<ConnectionProvider endpoint={RPC_ENDPOINT}>
16+
<App />
17+
</ConnectionProvider>
18+
</WalletProvider>
19+
</React.StrictMode>
20+
);

0 commit comments

Comments
 (0)