Skip to content

Commit

Permalink
feat: throw error if useWallet is being used outside the WalletProvid…
Browse files Browse the repository at this point in the history
…er (#125)

* chore: import zustand/shallow from named export

This resolves the deprecated warning that started appearing in the console after upgrading to zustand@^4.3.8

* feat: useWallet throws error if used outside WalletProvider

This also renames the context provider to match the exported "WalletProvider", and the context object itself is imported via a `useWalletContext` hook.
  • Loading branch information
drichar authored Dec 15, 2023
1 parent f825a1b commit 3ccc5e0
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 38 deletions.
21 changes: 21 additions & 0 deletions src/context/WalletContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import React, { createContext, useContext } from 'react'
import type { SupportedProviders } from 'src/types/providers'

const WalletContext = createContext<SupportedProviders | null>(null)

export const useWalletContext = (): SupportedProviders | null => {
const context = useContext(WalletContext)
if (context === undefined) {
throw new Error('useWallet must be used within the WalletProvider')
}
return context
}

export interface WalletProviderProps {
children: React.ReactNode
value: SupportedProviders | null
}

export const WalletProvider = ({ children, value }: WalletProviderProps) => {
return <WalletContext.Provider value={value}>{children}</WalletContext.Provider>
}
23 changes: 15 additions & 8 deletions src/hooks/useWallet.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import React from 'react'
import useWallet from './useWallet'
import DeflyWalletClient from '../clients/defly'
import PeraWalletClient from '../clients/pera'
import { default as ClientProvider } from '../store/state/clientStore'
import { WalletProvider, type WalletProviderProps } from '../context/WalletContext'
import { useHydratedWalletStore } from '../store/state/walletStore'
import { createWrapper } from '../testUtils/createWrapper'
import { mockAccounts } from '../testUtils/mockAccounts'
import { createDeflyMockInstance, createPeraMockInstance } from '../testUtils/mockClients'
import { clearAccounts } from '../utils/clearAccounts'
Expand All @@ -36,7 +35,7 @@ jest.mock('../store/state/walletStore', () => ({
}))

jest.mock('../', () => ({
ClientProvider: ({ children }: { children: React.ReactNode }) => <div>{children}</div>
WalletProvider: ({ children }: WalletProviderProps) => <div>{children}</div>
}))

jest.mock('../utils/clearAccounts')
Expand All @@ -59,7 +58,7 @@ describe('useWallet', () => {
jest.spyOn(peraMockInstance, 'disconnect')
jest.spyOn(peraMockInstance, 'getAccountInfo')

// Passed to `ClientProvider` in renderHook wrapper
// Passed to `WalletProvider` in renderHook wrapper
mockClientProviders = {
pera: peraMockInstance,
defly: deflyMockInstance
Expand All @@ -72,7 +71,9 @@ describe('useWallet', () => {

it('should return active and connected accounts', () => {
const { result } = renderHook(() => useWallet(), {
wrapper: createWrapper(ClientProvider, { value: mockClientProviders })
wrapper: ({ children }) => (
<WalletProvider value={mockClientProviders}>{children}</WalletProvider>
)
})

// Active account
Expand All @@ -87,7 +88,9 @@ describe('useWallet', () => {

it('should return `providers` array', async () => {
const { result } = renderHook(() => useWallet(), {
wrapper: createWrapper(ClientProvider, { value: mockClientProviders })
wrapper: ({ children }) => (
<WalletProvider value={mockClientProviders}>{children}</WalletProvider>
)
})

const providers = result.current.providers
Expand Down Expand Up @@ -134,7 +137,9 @@ describe('useWallet', () => {

it('should return status flags', () => {
const { result } = renderHook(() => useWallet(), {
wrapper: createWrapper(ClientProvider, { value: mockClientProviders })
wrapper: ({ children }) => (
<WalletProvider value={mockClientProviders}>{children}</WalletProvider>
)
})

expect(result.current.isActive).toBe(true)
Expand All @@ -143,7 +148,9 @@ describe('useWallet', () => {

it('should return `getAccountInfo`', async () => {
const { result } = renderHook(() => useWallet(), {
wrapper: createWrapper(ClientProvider, { value: mockClientProviders })
wrapper: ({ children }) => (
<WalletProvider value={mockClientProviders}>{children}</WalletProvider>
)
})

await act(async () => {
Expand Down
8 changes: 4 additions & 4 deletions src/hooks/useWallet.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import { useState, useMemo, useContext, useEffect } from 'react'
import { useState, useMemo, useEffect } from 'react'
import type algosdk from 'algosdk'
import { getAlgosdk } from '../algod'
import { useHydratedWalletStore, walletStoreSelector } from '../store/index'
import { TransactionsArray, WalletClient, Provider } from '../types'
import { PROVIDER_ID } from '../constants'
import { ClientContext } from '../store/state/clientStore'
import { useWalletContext } from '../context/WalletContext'
import allClients from '../clients'
import { clearAccounts } from '../utils/clearAccounts'
import shallow from 'zustand/shallow'
import { shallow } from 'zustand/shallow'

export default function useWallet() {
const [providers, setProviders] = useState<Provider[] | null>(null)
const clients = useContext(ClientContext)
const clients = useWalletContext()

const {
activeAccount,
Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export { reconnectProviders, encodeNFDTransactionsArray } from './utils'
export { WalletProvider } from './store'
export { WalletProvider } from './context/WalletContext'
export * from './constants'
export * from './types'
export * from './clients'
Expand Down
1 change: 0 additions & 1 deletion src/store/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export * from './state/walletStore'
export * from './state/debugStore'
export { default as WalletProvider } from './state/clientStore'
8 changes: 0 additions & 8 deletions src/store/state/clientStore.ts

This file was deleted.

16 changes: 0 additions & 16 deletions src/testUtils/createWrapper.tsx

This file was deleted.

0 comments on commit 3ccc5e0

Please sign in to comment.