From c569e7d3643d10ca9fb2309cbdaa863be6d27c28 Mon Sep 17 00:00:00 2001 From: limitofzero Date: Wed, 31 Dec 2025 00:14:46 +0400 Subject: [PATCH 1/2] feat: refetch geodata when user changes wallet address --- .../application/containers/App/Updaters.tsx | 2 ++ .../cowswap-frontend/src/modules/rwa/index.ts | 1 + .../src/modules/rwa/state/geoDataAtom.ts | 36 +++++++++++++------ .../modules/rwa/updaters/GeoDataUpdater.tsx | 22 ++++++++++++ 4 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx diff --git a/apps/cowswap-frontend/src/modules/application/containers/App/Updaters.tsx b/apps/cowswap-frontend/src/modules/application/containers/App/Updaters.tsx index b479a7c4e1..171ffd9536 100644 --- a/apps/cowswap-frontend/src/modules/application/containers/App/Updaters.tsx +++ b/apps/cowswap-frontend/src/modules/application/containers/App/Updaters.tsx @@ -31,6 +31,7 @@ import { ProgressBarExecutingOrdersUpdater, } from 'modules/orderProgressBar' import { OrdersNotificationsUpdater } from 'modules/orders' +import { GeoDataUpdater } from 'modules/rwa' import { BlockedListSourcesUpdater, useSourceChainId } from 'modules/tokensList' import { TradeType, useTradeTypeInfo } from 'modules/trade' import { UsdPricesUpdater } from 'modules/usdAmount' @@ -116,6 +117,7 @@ export function Updaters(): ReactNode { /> + diff --git a/apps/cowswap-frontend/src/modules/rwa/index.ts b/apps/cowswap-frontend/src/modules/rwa/index.ts index 61614e1adf..d53031811f 100644 --- a/apps/cowswap-frontend/src/modules/rwa/index.ts +++ b/apps/cowswap-frontend/src/modules/rwa/index.ts @@ -9,3 +9,4 @@ export * from './hooks/useGeoStatus' export * from './hooks/useRwaTokenStatus' export * from './pure/RwaConsentModal' export * from './containers/RwaConsentModalContainer' +export * from './updaters/GeoDataUpdater' diff --git a/apps/cowswap-frontend/src/modules/rwa/state/geoDataAtom.ts b/apps/cowswap-frontend/src/modules/rwa/state/geoDataAtom.ts index 5aa2f5170b..7dfb51d45b 100644 --- a/apps/cowswap-frontend/src/modules/rwa/state/geoDataAtom.ts +++ b/apps/cowswap-frontend/src/modules/rwa/state/geoDataAtom.ts @@ -14,30 +14,44 @@ const initialGeoData: GeoData = { export const geoDataAtom = atom(initialGeoData) -export const fetchGeoDataAtom = atom(null, async (get, set) => { - const current = get(geoDataAtom) - - // Don't fetch if already loaded or loading - if (current.country !== null || current.isLoading) { - return - } - - set(geoDataAtom, { ...current, isLoading: true }) +async function doFetchGeoData(set: (update: GeoData) => void, current: GeoData): Promise { + set({ ...current, isLoading: true }) try { const response = await fetch('https://api.country.is') const data = await response.json() - set(geoDataAtom, { + set({ country: data.country || null, isLoading: false, error: null, }) } catch (error) { - set(geoDataAtom, { + set({ country: null, isLoading: false, error: error instanceof Error ? error.message : 'Failed to fetch geo data', }) } +} + +export const fetchGeoDataAtom = atom(null, async (get, set) => { + const current = get(geoDataAtom) + + if (current.country !== null || current.isLoading) { + return + } + + await doFetchGeoData((update) => set(geoDataAtom, update), current) +}) + +// for cases when user changes wallet +export const refetchGeoDataAtom = atom(null, async (get, set) => { + const current = get(geoDataAtom) + + if (current.isLoading) { + return + } + + await doFetchGeoData((update) => set(geoDataAtom, update), current) }) diff --git a/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx b/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx new file mode 100644 index 0000000000..e7aa076ee9 --- /dev/null +++ b/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx @@ -0,0 +1,22 @@ +import { useSetAtom } from 'jotai' +import { useEffect } from 'react' + +import { usePrevious } from '@cowprotocol/common-hooks' +import { useWalletInfo } from '@cowprotocol/wallet' + +import { refetchGeoDataAtom } from '../state/geoDataAtom' + +export function GeoDataUpdater(): null { + const { account } = useWalletInfo() + const refetchGeoData = useSetAtom(refetchGeoDataAtom) + const prevAccount = usePrevious(account) + + useEffect(() => { + // only refetch when wallet actually changes (not on initial render) + if (prevAccount !== account) { + refetchGeoData() + } + }, [account, prevAccount, refetchGeoData]) + + return null +} From 52d5ddb471b052a130221bd28f5681d75284711b Mon Sep 17 00:00:00 2001 From: limitofzero Date: Wed, 31 Dec 2025 15:00:56 +0400 Subject: [PATCH 2/2] refactor: use areAddressesEqual --- .../src/modules/rwa/updaters/GeoDataUpdater.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx b/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx index e7aa076ee9..6ce9f7bd41 100644 --- a/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx +++ b/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx @@ -2,6 +2,7 @@ import { useSetAtom } from 'jotai' import { useEffect } from 'react' import { usePrevious } from '@cowprotocol/common-hooks' +import { areAddressesEqual } from '@cowprotocol/common-utils' import { useWalletInfo } from '@cowprotocol/wallet' import { refetchGeoDataAtom } from '../state/geoDataAtom' @@ -13,7 +14,7 @@ export function GeoDataUpdater(): null { useEffect(() => { // only refetch when wallet actually changes (not on initial render) - if (prevAccount !== account) { + if (!areAddressesEqual(prevAccount, account)) { refetchGeoData() } }, [account, prevAccount, refetchGeoData])