Skip to content

Commit

Permalink
feat: connect to session in URL
Browse files Browse the repository at this point in the history
  • Loading branch information
iamacook committed Oct 4, 2023
1 parent 4384e68 commit 460205d
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/components/walletconnect/HeaderWidget/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ import useWalletConnectSessions from '@/services/walletconnect/useWalletConnectS
import Icon from './Icon'
import SessionManager from '../SessionManager'
import Popup from '../Popup'
import { useWalletConnectSearchParamUri } from '@/services/walletconnect/useWalletConnectSearchParamUri'

const WalletConnectHeaderWidget = () => {
const { error } = useContext(WalletConnectContext)
const [popupOpen, setPopupOpen] = useState(false)
const [wcUri] = useWalletConnectSearchParamUri()
const iconRef = useRef<HTMLDivElement>(null)
const sessions = useWalletConnectSessions()

Expand All @@ -31,7 +33,7 @@ const WalletConnectHeaderWidget = () => {
<Badge color="error" variant="dot" invisible={!error} />
</div>

<Popup anchorEl={iconRef.current} open={popupOpen} onClose={onClose}>
<Popup anchorEl={iconRef.current} open={popupOpen || !!wcUri} onClose={onClose} keepMounted>
<SessionManager sessions={sessions} />
</Popup>
</Box>
Expand Down
12 changes: 11 additions & 1 deletion src/components/walletconnect/SessionManager/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import ProposalForm from '../ProposalForm'
import WcInput from '../WcInput'
import ErrorMessage from '@/components/tx/ErrorMessage'
import SessionList from '../SessionList'
import { useWalletConnectSearchParamUri } from '@/services/walletconnect/useWalletConnectSearchParamUri'

const SessionManager = ({ sessions }: { sessions: SessionTypes.Struct[] }) => {
const { safe, safeAddress } = useSafeInfo()
const { chainId } = safe
const { walletConnect, error: walletConnectError } = useContext(WalletConnectContext)
const [wcUri, setWcUri] = useWalletConnectSearchParamUri()
const [proposal, setProposal] = useState<Web3WalletTypes.SessionProposal>()
const [error, setError] = useState<Error>()

Expand All @@ -28,8 +30,9 @@ const SessionManager = ({ sessions }: { sessions: SessionTypes.Struct[] }) => {
return
}

setWcUri(null)
setProposal(undefined)
}, [proposal, walletConnect, chainId, safeAddress])
}, [walletConnect, chainId, safeAddress, proposal, setWcUri])

// On session reject
const onReject = useCallback(async () => {
Expand Down Expand Up @@ -61,6 +64,13 @@ const SessionManager = ({ sessions }: { sessions: SessionTypes.Struct[] }) => {
return walletConnect.onSessionPropose(setProposal)
}, [walletConnect])

// Connect to session present in URL
useEffect(() => {
if (!walletConnect || !wcUri) return

walletConnect.connect(wcUri).catch(setError)
}, [walletConnect, wcUri])

return (
<>
{error && (
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import * as router from 'next/router'

import { renderHook, act } from '@/tests/test-utils'
import { useWalletConnectSearchParamUri } from '../useWalletConnectSearchParamUri'

describe('useWalletConnectSearchParamUri', () => {
const mockRouter = {
query: {},
replace: jest.fn(),
} as unknown as router.NextRouter

beforeEach(() => {
jest.spyOn(router, 'useRouter').mockReturnValue(mockRouter)
})

afterEach(() => {
jest.clearAllMocks()
})

it('should return null when wc uri search param is not present', () => {
const { result } = renderHook(() => useWalletConnectSearchParamUri())
const [wcUri] = result.current

expect(wcUri).toBeNull()
})

it('should return the wc uri search param value when present', () => {
mockRouter.query = { wc: 'wc:123' }

const { result } = renderHook(() => useWalletConnectSearchParamUri())
const [wcUri] = result.current

expect(wcUri).toBe('wc:123')
})

it('should update the wc uri search param value when setWcUri is called', () => {

Check failure on line 36 in src/services/walletconnect/__tests__/useWalletConnectSearchParamUri.test.ts

View workflow job for this annotation

GitHub Actions / jest-github-action

useWalletConnectSearchParamUri > should update the wc uri search param value when setWcUri is called

Error: expect(received).toBe(expected) // Object.is equality Expected: "wc:456" Received: "wc:123" at Object.toBe (/home/runner/work/safe-wallet-web/safe-wallet-web/src/services/walletconnect/__tests__/useWalletConnectSearchParamUri.test.ts:51:19) at Promise.then.completed (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/utils.js:298:28) at new Promise (<anonymous>) at callAsyncCircusFn (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/utils.js:231:10) at _callCircusTest (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:316:40) at _runTest (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:252:3) at _runTestsForDescribeBlock (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:126:9) at _runTestsForDescribeBlock (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:121:9) at run (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:71:3) at runAndTransformResultsToJestFormat (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21) at jestAdapter (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19) at runTestInternal (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-runner/build/runTest.js:367:16) at runTest (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-runner/build/runTest.js:444:34)
const { result } = renderHook(() => useWalletConnectSearchParamUri())
const [wcUri, setWcUri] = result.current

expect(wcUri).toBe('wc:123')

act(() => {
setWcUri('wc:456')
})

expect(mockRouter.replace).toHaveBeenCalledWith({
pathname: mockRouter.pathname,
query: { wc: 'wc:456' },
})

expect(wcUri).toBe('wc:456')
})

it('should remove the wc uri search param when setWcUri is called with null', () => {

Check failure on line 54 in src/services/walletconnect/__tests__/useWalletConnectSearchParamUri.test.ts

View workflow job for this annotation

GitHub Actions / jest-github-action

useWalletConnectSearchParamUri > should remove the wc uri search param when setWcUri is called with null

Error: expect(received).toBeNull() Received: "wc:123" at Object.toBeNull (/home/runner/work/safe-wallet-web/safe-wallet-web/src/services/walletconnect/__tests__/useWalletConnectSearchParamUri.test.ts:71:19) at Promise.then.completed (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/utils.js:298:28) at new Promise (<anonymous>) at callAsyncCircusFn (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/utils.js:231:10) at _callCircusTest (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:316:40) at _runTest (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:252:3) at _runTestsForDescribeBlock (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:126:9) at _runTestsForDescribeBlock (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:121:9) at run (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/run.js:71:3) at runAndTransformResultsToJestFormat (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21) at jestAdapter (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19) at runTestInternal (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-runner/build/runTest.js:367:16) at runTest (/home/runner/work/safe-wallet-web/safe-wallet-web/node_modules/jest-runner/build/runTest.js:444:34)
mockRouter.query = { wc: 'wc:123' }

const { result } = renderHook(() => useWalletConnectSearchParamUri())
const [wcUri, setWcUri] = result.current

expect(wcUri).toBe('wc:123')

act(() => {
setWcUri(null)
})

expect(mockRouter.replace).toHaveBeenCalledWith({
pathname: mockRouter.pathname,
query: {},
})

expect(wcUri).toBeNull()
})
})
27 changes: 27 additions & 0 deletions src/services/walletconnect/useWalletConnectSearchParamUri.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { useRouter } from 'next/router'

const WC_URI_SEARCH_PARAM = 'wc'

export function useWalletConnectSearchParamUri(): [string | null, (wcUri: string | null) => void] {
const router = useRouter()

const wcUriQuery = router.query[WC_URI_SEARCH_PARAM]
const wcUri = wcUriQuery ? (Array.isArray(wcUriQuery) ? wcUriQuery[0] : wcUriQuery) : null

const setWcUri = (wcUri: string | null) => {
const newQuery = { ...router.query }

if (!wcUri) {
delete newQuery[WC_URI_SEARCH_PARAM]
} else {
newQuery[WC_URI_SEARCH_PARAM] = wcUri
}

router.replace({
pathname: router.pathname,
query: newQuery,
})
}

return [wcUri, setWcUri]
}

0 comments on commit 460205d

Please sign in to comment.