0xtrails
Version:
SDK for Trails
107 lines (90 loc) • 3.13 kB
text/typescript
import { useState, useEffect, useCallback } from "react"
import type { SupportedToken } from "../../tokens.js"
import { logger } from "../../logger.js"
interface RecentTokensStorage {
[accountAddress: string]: SupportedToken[]
}
const RECENT_TOKENS_KEY = "trails_recent_tokens"
const MAX_RECENT_TOKENS = 10
export function useRecentTokens(accountAddress?: string) {
const [recentTokens, setRecentTokens] = useState<SupportedToken[]>([])
// Load recent tokens from localStorage for the current account
useEffect(() => {
if (!accountAddress) {
setRecentTokens([])
return
}
try {
const stored = localStorage.getItem(RECENT_TOKENS_KEY)
if (stored) {
const allRecentTokens: RecentTokensStorage = JSON.parse(stored)
const accountTokens =
allRecentTokens[accountAddress.toLowerCase()] || []
setRecentTokens(accountTokens)
}
} catch (error) {
logger.console.warn(
"[trails-sdk] Failed to load recent tokens from localStorage:",
error,
)
}
}, [accountAddress])
// Add or update a recent token
const addRecentToken = useCallback(
(token: SupportedToken) => {
if (!accountAddress) return
try {
const stored = localStorage.getItem(RECENT_TOKENS_KEY)
const allRecentTokens: RecentTokensStorage = stored
? JSON.parse(stored)
: {}
const accountKey = accountAddress.toLowerCase()
let accountTokens = allRecentTokens[accountKey] || []
// Remove the token if it already exists (to avoid duplicates)
accountTokens = accountTokens.filter(
(t) =>
!(
t.contractAddress === token.contractAddress &&
t.chainId === token.chainId
),
)
// Add the token to the beginning (most recent)
accountTokens.unshift(token)
// Keep only the most recent tokens
accountTokens = accountTokens.slice(0, MAX_RECENT_TOKENS)
// Update storage
allRecentTokens[accountKey] = accountTokens
localStorage.setItem(RECENT_TOKENS_KEY, JSON.stringify(allRecentTokens))
// Update state
setRecentTokens(accountTokens)
} catch (error) {
logger.console.warn(
"[trails-sdk] Failed to save recent token to localStorage:",
error,
)
}
},
[accountAddress],
)
// Clear recent tokens for current account
const clearRecentTokens = useCallback(() => {
if (!accountAddress) return
try {
const stored = localStorage.getItem(RECENT_TOKENS_KEY)
if (stored) {
const allRecentTokens: RecentTokensStorage = JSON.parse(stored)
const accountKey = accountAddress.toLowerCase()
delete allRecentTokens[accountKey]
localStorage.setItem(RECENT_TOKENS_KEY, JSON.stringify(allRecentTokens))
}
setRecentTokens([])
} catch (error) {
console.warn("Failed to clear recent tokens from localStorage:", error)
}
}, [accountAddress])
return {
recentTokens,
addRecentToken,
clearRecentTokens,
}
}