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..6ce9f7bd41
--- /dev/null
+++ b/apps/cowswap-frontend/src/modules/rwa/updaters/GeoDataUpdater.tsx
@@ -0,0 +1,23 @@
+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'
+
+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 (!areAddressesEqual(prevAccount, account)) {
+ refetchGeoData()
+ }
+ }, [account, prevAccount, refetchGeoData])
+
+ return null
+}