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 +}