Skip to content

Commit 2125a66

Browse files
committed
feat: sidebar
1 parent dc29188 commit 2125a66

File tree

13 files changed

+59
-213
lines changed

13 files changed

+59
-213
lines changed

bun.lockb

0 Bytes
Binary file not shown.

manifest.config.ts

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ export const getManifest = ({ dev }: { dev?: boolean }) =>
2525
all_frames: true,
2626
},
2727
],
28+
side_panel: {
29+
default_path: 'src/entries/iframe/index.html',
30+
},
2831
icons: {
2932
'16': `icons/icon${dev ? '-dev' : ''}@16w.png`,
3033
'32': `icons/icon${dev ? '-dev' : ''}@32w.png`,
@@ -36,6 +39,7 @@ export const getManifest = ({ dev }: { dev?: boolean }) =>
3639
'contextMenus',
3740
'declarativeNetRequest',
3841
'scripting',
42+
'sidePanel',
3943
'storage',
4044
'tabs',
4145
'unlimitedStorage',

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
"@biomejs/biome": "1.0.0",
7878
"@samrum/vite-plugin-web-extension": "^5.1.0",
7979
"@types/chroma-js": "^2.4.0",
80-
"@types/chrome": "^0.0.244",
80+
"@types/chrome": "^0.0.266",
8181
"@types/opentype.js": "^1.3.4",
8282
"@types/qs": "^6.9.7",
8383
"@types/react": "^18.2.33",

src/components/Header.tsx

+2-36
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type ReactNode, useCallback, useMemo } from 'react'
1+
import { type ReactNode, useMemo } from 'react'
22
import { Link } from 'react-router-dom'
33
import { type Hex, formatGwei } from 'viem'
44

@@ -24,15 +24,12 @@ import { useHost } from '~/hooks/useHost'
2424
import { useMine } from '~/hooks/useMine'
2525
import { useNetworkStatus } from '~/hooks/useNetworkStatus'
2626
import { usePendingBlock } from '~/hooks/usePendingBlock'
27-
import { getMessenger } from '~/messengers'
2827
import { useAccountStore, useNetworkStore, useSessionsStore } from '~/zustand'
2928

3029
import { useRevert } from '../hooks/useRevert'
3130
import { useSnapshot } from '../hooks/useSnapshot'
3231
import * as styles from './Header.css'
3332

34-
const contentMessenger = getMessenger('wallet:contentScript')
35-
3633
export function Header({ isNetworkOffline }: { isNetworkOffline?: boolean }) {
3734
const { type } = useAppMeta()
3835
return (
@@ -62,12 +59,6 @@ export function Header({ isNetworkOffline }: { isNetworkOffline?: boolean }) {
6259
<Column width="content">
6360
<SettingsButton />
6461
</Column>
65-
<Column width="content">
66-
<Separator orientation="vertical" />
67-
</Column>
68-
<Column width="content">
69-
<CollapseButton />
70-
</Column>
7162
</>
7263
)}
7364
</Columns>
@@ -194,31 +185,6 @@ function DappConnection() {
194185
)
195186
}
196187

197-
function CollapseButton() {
198-
const handleClose = useCallback(() => {
199-
contentMessenger.send('toggleWallet', undefined)
200-
}, [])
201-
202-
return (
203-
<Tooltip label="Hide Wallet" height="full">
204-
<Box
205-
alignItems="center"
206-
as="button"
207-
backgroundColor={{
208-
hover: 'surface/fill/quarternary',
209-
}}
210-
display="flex"
211-
justifyContent="center"
212-
height="full"
213-
onClick={handleClose}
214-
style={{ width: '28px' }}
215-
>
216-
<SFSymbol size="12px" symbol="chevron.right.2" weight="medium" />
217-
</Box>
218-
</Tooltip>
219-
)
220-
}
221-
222188
function SettingsButton() {
223189
return (
224190
<Tooltip label="Settings" height="full">
@@ -232,7 +198,7 @@ function SettingsButton() {
232198
display="flex"
233199
justifyContent="center"
234200
height="full"
235-
style={{ width: '28px' }}
201+
style={{ width: '32px' }}
236202
>
237203
<SFSymbol size="14px" symbol="gear" weight="medium" />
238204
</Box>

src/design-system/components/Text.tsx

+9-4
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,15 @@ export const TextTruncated = forwardRef<HTMLDivElement, TextTruncatedProps>(
185185
}, [])
186186

187187
useLayoutEffect(() => {
188-
setWidth(
189-
((wrapperRef.current as any).getBoundingClientRect() as DOMRectReadOnly)
190-
.width,
191-
)
188+
setTimeout(() => {
189+
setWidth(
190+
(
191+
(
192+
wrapperRef.current as any
193+
).getBoundingClientRect() as DOMRectReadOnly
194+
).width,
195+
)
196+
}, 16)
192197
}, [])
193198
useResizeObserver(wrapperRef, (entry) =>
194199
mounted ? setWidth(entry.contentRect.width) : undefined,

src/entries/background/context-menu.ts

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
import { getMessenger } from '~/messengers'
2-
3-
const inpageMessenger = getMessenger('background:inpage')
4-
51
export function setupContextMenu() {
6-
chrome.action.onClicked.addListener(() => {
7-
inpageMessenger.send('toggleWallet', undefined)
8-
})
2+
chrome.sidePanel
3+
.setPanelBehavior({ openPanelOnActionClick: true })
4+
.catch((error) => console.error(error))
95

106
// TODO: Only create context menu if selected text is "openable" in Rivet.
117
// chrome.contextMenus.create({

src/entries/background/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { setupExtensionId } from './extension-id'
77
import { setupInpage } from './inpage'
88
import { interceptJsonRpcRequests } from './intercept-requests'
99
import { setupRpcHandler } from './rpc'
10+
import { setupWalletSidebarHandler } from './wallet-sidebar'
1011

1112
const contentMessenger = getMessenger('background:contentScript')
1213
const inpageMessenger = getMessenger('background:inpage')
@@ -21,4 +22,5 @@ setupExtensionId()
2122
setupInpage()
2223
setupRpcHandler({ messenger: inpageMessenger })
2324
setupRpcHandler({ messenger: walletMessenger })
25+
setupWalletSidebarHandler()
2426
syncStores()

src/entries/background/rpc.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export function getRpcClient({
7575
export function setupRpcHandler({ messenger }: { messenger: Messenger }) {
7676
messenger.reply('request', async ({ request, rpcUrl }, meta) => {
7777
const isInpage =
78+
meta.sender.tab &&
7879
!meta.sender.tab?.url?.includes('extension://') &&
7980
(!meta.sender.frameId || meta.sender.frameId === 0)
8081
const rpcClient = getRpcClient({ rpcUrl })
@@ -104,8 +105,6 @@ export function setupRpcHandler({ messenger }: { messenger: Messenger }) {
104105

105106
addPendingRequest({ ...request, sender: meta.sender })
106107

107-
inpageMessenger.send('toggleWallet', { open: true })
108-
109108
try {
110109
const response = await new Promise((resolve, reject) => {
111110
walletMessenger.reply(
@@ -137,7 +136,6 @@ export function setupRpcHandler({ messenger }: { messenger: Messenger }) {
137136
})
138137
return response as RpcResponse
139138
} finally {
140-
inpageMessenger.send('toggleWallet', { useStorage: true })
141139
removePendingRequest(request.id)
142140
}
143141
}
@@ -176,8 +174,6 @@ export function setupRpcHandler({ messenger }: { messenger: Messenger }) {
176174

177175
addPendingRequest({ ...request, sender: meta.sender })
178176

179-
inpageMessenger.send('toggleWallet', { open: true })
180-
181177
try {
182178
const response = await new Promise((resolve) => {
183179
walletMessenger.reply(
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { settingsStore } from '../../zustand'
2+
3+
export function setupWalletSidebarHandler() {
4+
chrome.runtime.onMessage.addListener((message, sender) => {
5+
if (message.type === 'openWallet') {
6+
const { bypassSignatureAuth, bypassTransactionAuth } =
7+
settingsStore.getState()
8+
const { method } = message.payload
9+
if (
10+
method === 'eth_requestAccounts' ||
11+
(method === 'eth_sendTransaction' && !bypassTransactionAuth) ||
12+
(method === 'eth_sign' && !bypassSignatureAuth) ||
13+
(method === 'eth_signTypedData_v4' && !bypassSignatureAuth) ||
14+
(method === 'personal_sign' && !bypassSignatureAuth)
15+
) {
16+
chrome.sidePanel.open({ tabId: sender.tab!.id! })
17+
}
18+
}
19+
})
20+
}

src/entries/content/index.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1+
import { getMessenger } from '~/messengers'
12
import { setupBridgeTransportRelay } from '~/messengers/transports/bridge'
23

3-
import { injectWallet } from './injectWallet'
4-
54
setupBridgeTransportRelay()
6-
injectWallet()
5+
6+
const backgroundMessenger = getMessenger('background:contentScript')
7+
backgroundMessenger.send('ping', undefined)
8+
setInterval(() => {
9+
backgroundMessenger.send('ping', undefined)
10+
}, 5000)
11+
12+
window.addEventListener('message', ({ data }) => {
13+
if (data.type === 'openWallet') chrome.runtime.sendMessage(data)
14+
})

src/entries/content/injectWallet.ts

-148
This file was deleted.

src/messengers/schema.ts

-9
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,5 @@ export type Schema = {
2929
response: RpcResponse,
3030
]
3131
toggleTheme: [payload: void, response: void]
32-
toggleWallet: [
33-
payload:
34-
| ({ route?: string } & (
35-
| { open: boolean; useStorage?: never }
36-
| { open?: never; useStorage?: true }
37-
))
38-
| undefined,
39-
response: void,
40-
]
4132
transactionExecuted: [payload: void, response: void]
4233
}

0 commit comments

Comments
 (0)