Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions src/components/Create/Link/Confirm.view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
saveCreatedLinkToLocalStorage,
shareToEmail,
shareToSms,
updatePeanutPreferences,
updateUserPreferences,
ErrorHandler,
printableAddress,
formatTokenAmount,
Expand Down Expand Up @@ -210,11 +210,15 @@ export const CreateLinkConfirmView = ({
if (createType === 'sms_link') shareToSms(recipient.name ?? '', link[0], usdValue)
}

updatePeanutPreferences({
chainId: selectedChainID,
tokenAddress: selectedTokenAddress,
decimals: selectedTokenDecimals,
})
if (selectedChainID && selectedTokenAddress && selectedTokenDecimals) {
updateUserPreferences({
lastUsedToken: {
chainId: selectedChainID,
address: selectedTokenAddress,
decimals: selectedTokenDecimals,
},
})
}

onNext()
refetchBalances(address ?? '')
Expand Down
30 changes: 14 additions & 16 deletions src/context/tokenSelector.context.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,17 @@ export const tokenSelectorContext = createContext({
*/
export const TokenContextProvider = ({ children }: { children: React.ReactNode }) => {
const initialTokenData = {
tokenAddress: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', // USDC
address: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85', // USDC
chainId: '10', // Optimism
decimals: 6,
}
const prefs = utils.getPeanutPreferences()
if (prefs && prefs.tokenAddress && prefs.chainId && prefs.decimals) {
initialTokenData.tokenAddress = prefs.tokenAddress
initialTokenData.chainId = prefs.chainId
initialTokenData.decimals = prefs.decimals
const { lastUsedToken } = utils.getUserPreferences() ?? {}
if (lastUsedToken) {
initialTokenData.address = lastUsedToken.address
initialTokenData.chainId = lastUsedToken.chainId
initialTokenData.decimals = lastUsedToken.decimals
}
const [selectedTokenAddress, setSelectedTokenAddress] = useState(initialTokenData.tokenAddress)
const [selectedTokenAddress, setSelectedTokenAddress] = useState(initialTokenData.address)
const [selectedChainID, setSelectedChainID] = useState(initialTokenData.chainId)
const [selectedTokenPrice, setSelectedTokenPrice] = useState<number | undefined>(undefined)
const [inputDenomination, setInputDenomination] = useState<inputDenominationType>('TOKEN')
Expand All @@ -59,22 +59,20 @@ export const TokenContextProvider = ({ children }: { children: React.ReactNode }
Record<string, interfaces.ISquidChain & { tokens: interfaces.ISquidToken[] }>
>({})

const preferences = utils.getPeanutPreferences()

const updateSelectedChainID = (chainID: string) => {
setSelectedTokenAddress('0x0000000000000000000000000000000000000000')
setSelectedChainID(chainID)
}

const resetTokenContextProvider = () => {
if (preferences && preferences.tokenAddress == selectedTokenAddress && preferences.chainId == selectedChainID)
return
setSelectedChainID(preferences?.tokenAddress ? preferences.chainId : '10')
setSelectedTokenAddress(
preferences?.tokenAddress ? preferences.tokenAddress : '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85'
)
const { lastUsedToken } = utils.getUserPreferences() ?? {}
const tokenData = lastUsedToken ?? initialTokenData
setSelectedChainID(tokenData.chainId)
setSelectedTokenAddress(tokenData.address)
setSelectedTokenDecimals(tokenData.decimals)
setSelectedTokenPrice(undefined)
setSelectedTokenDecimals(undefined)
setInputDenomination('TOKEN')
setSelectedTokenData(undefined)
}

useEffect(() => {
Expand Down
21 changes: 19 additions & 2 deletions src/context/walletContext/walletContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'
import { PEANUT_WALLET_CHAIN, PEANUT_WALLET_TOKEN } from '@/constants'
import { Chain, erc20Abi, getAddress, parseUnits } from 'viem'
import { useAuth } from '../authContext'
import { backgroundColorFromAddress, areEvmAddressesEqual, fetchWalletBalances } from '@/utils'
import {
backgroundColorFromAddress,
areEvmAddressesEqual,
fetchWalletBalances,
getUserPreferences,
updateUserPreferences,
} from '@/utils'
import { peanutPublicClient } from '@/constants/viem.consts'

interface WalletContextType {
Expand Down Expand Up @@ -51,7 +57,9 @@ export const WalletProvider = ({ children }: { children: ReactNode }) => {
////// User props
const { addAccount, user } = useAuth()

const [selectedAddress, setSelectedAddress] = useState<string | undefined>(undefined)
const [selectedAddress, setSelectedAddress] = useState<string | undefined>(
getUserPreferences()?.lastSelectedWallet?.address
)

const isWalletConnected = useCallback(
(wallet: interfaces.IDBWallet): boolean => {
Expand Down Expand Up @@ -151,6 +159,15 @@ export const WalletProvider = ({ children }: { children: ReactNode }) => {
}
}, [wallets, selectedAddress])

// Remember selected address
useEffect(() => {
if (selectedAddress) {
updateUserPreferences({
lastSelectedWallet: { address: selectedAddress },
})
}
}, [selectedAddress])

// Add new BYOW wallet when connected
useEffect(() => {
if (!user || !wagmiAddress || !wallets.length) return
Expand Down
61 changes: 26 additions & 35 deletions src/utils/general.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ function waitForPromise<T>(promise: Promise<T>, timeoutTime: number = 30000): Pr
})
}

const saveToLocalStorage = (key: string, data: any) => {
export const saveToLocalStorage = (key: string, data: any) => {
try {
// Convert the data to a string before storing it in localStorage
const serializedData = JSON.stringify(data)
Expand All @@ -95,7 +95,7 @@ const saveToLocalStorage = (key: string, data: any) => {
}
}

const getFromLocalStorage = (key: string) => {
export const getFromLocalStorage = (key: string) => {
try {
if (typeof localStorage === 'undefined') return
const data = localStorage.getItem(key)
Expand Down Expand Up @@ -747,53 +747,44 @@ export const getRequestLinkFulfillmentsFromLocalStorage = () => {
}
}

export const updatePeanutPreferences = ({
chainId,
tokenAddress,
decimals,
}: {
chainId?: string
tokenAddress?: string
decimals?: number
}) => {
export type UserPreferences = {
lastUsedToken?: {
chainId: string
address: string
decimals: number
}
lastSelectedWallet?: {
address: string
}
}

export const updateUserPreferences = (partialPrefs: Partial<UserPreferences>): UserPreferences | undefined => {
try {
if (typeof localStorage === 'undefined') return

const key = `peanut-preferences`

let data = {
chainId: chainId,
tokenAddress: tokenAddress,
decimals: decimals,
const currentPrefs = getUserPreferences() || {}
const newPrefs: UserPreferences = {
...currentPrefs,
...partialPrefs,
}

localStorage.setItem(key, JSON.stringify(data))
localStorage.setItem('user-preferences', JSON.stringify(newPrefs))
return newPrefs
} catch (error) {
console.error('Error adding data to localStorage:', error)
console.error('Error updating user preferences:', error)
}
}

export const getPeanutPreferences = () => {
export const getUserPreferences = (): UserPreferences | undefined => {
try {
if (typeof localStorage === 'undefined') return

const key = `peanut-preferences`
const storedData = localStorage.getItem('user-preferences')
if (!storedData) return undefined

const storedData = localStorage.getItem(key)

let data = {
chainId: '',
tokenAddress: '',
decimals: undefined,
}

if (storedData) {
data = JSON.parse(storedData)
}

return data
return JSON.parse(storedData) as UserPreferences
} catch (error) {
console.error('Error getting data from localStorage:', error)
console.error('Error getting user preferences:', error)
}
}

Expand Down
Loading