From 0f2898aef26c9d0f21867a8026e7ef9bfc72313b Mon Sep 17 00:00:00 2001 From: Steffen Kleinle Date: Wed, 11 Sep 2024 14:09:25 +0200 Subject: [PATCH] 2897: Refresh cities every day --- native/src/hooks/useLoadCityContent.ts | 14 ++++++++++---- release-notes/unreleased/2897-refresh-cities.yml | 6 ++++++ shared/api/endpoints/createCitiesEndpoint.ts | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 release-notes/unreleased/2897-refresh-cities.yml diff --git a/native/src/hooks/useLoadCityContent.ts b/native/src/hooks/useLoadCityContent.ts index d1d1cebbc6..4872f50560 100644 --- a/native/src/hooks/useLoadCityContent.ts +++ b/native/src/hooks/useLoadCityContent.ts @@ -14,12 +14,12 @@ import { LocalNewsModel, PoiModel, ReturnType, + createCitiesEndpoint, } from 'shared/api' import dataContainer from '../utils/DefaultDataContainer' import loadResourceCache from '../utils/loadResourceCache' import { reportError } from '../utils/sentry' -import useLoadCities from './useLoadCities' import useLoadWithCache from './useLoadWithCache' import usePreviousProp from './usePreviousProp' import useSnackbar from './useSnackbar' @@ -51,10 +51,16 @@ export type CityContentReturn = Omit, 'error'>, */ const useLoadCityContent = ({ cityCode, languageCode, refreshLocalNews }: Params): CityContentReturn => { const showSnackbar = useSnackbar() - const citiesReturn = useLoadCities() const previousLanguageCode = usePreviousProp({ prop: languageCode }) const params = { cityCode, languageCode, showSnackbar } + const citiesReturn = useLoadWithCache({ + ...params, + isAvailable: dataContainer.citiesAvailable, + createEndpoint: createCitiesEndpoint, + getFromDataContainer: dataContainer.getCities, + setToDataContainer: (_, __, cities) => dataContainer.setCities(cities), + }) const categoriesReturn = useLoadWithCache({ ...params, isAvailable: dataContainer.categoriesAvailable, @@ -86,7 +92,7 @@ const useLoadCityContent = ({ cityCode, languageCode, refreshLocalNews }: Params }) useEffect(() => { - if (categoriesReturn.data && eventsReturn.data && poisReturn.data) { + if (citiesReturn.data && categoriesReturn.data && eventsReturn.data && poisReturn.data && localNewsReturn.data) { // Load the resource cache in the background once a day and do not wait for it dataContainer.getLastUpdate(cityCode, languageCode).then(lastUpdate => { if (!lastUpdate || lastUpdate < DateTime.utc().startOf('day')) { @@ -104,7 +110,7 @@ const useLoadCityContent = ({ cityCode, languageCode, refreshLocalNews }: Params // WARNING: This also means that the last update is updated if everything is just loaded from the cache. dataContainer.setLastUpdate(cityCode, languageCode, DateTime.utc()).catch(reportError) } - }, [categoriesReturn, eventsReturn, poisReturn, cityCode, languageCode]) + }, [citiesReturn, categoriesReturn, eventsReturn, poisReturn, localNewsReturn, cityCode, languageCode]) const city = citiesReturn.data?.find(it => it.code === cityCode) const language = city?.languages.find(it => it.code === languageCode) diff --git a/release-notes/unreleased/2897-refresh-cities.yml b/release-notes/unreleased/2897-refresh-cities.yml new file mode 100644 index 0000000000..05d518eac6 --- /dev/null +++ b/release-notes/unreleased/2897-refresh-cities.yml @@ -0,0 +1,6 @@ +issue_key: 2897 +show_in_stores: false +platforms: + - ios + - android +en: Cities and enabled features are now updated daily. diff --git a/shared/api/endpoints/createCitiesEndpoint.ts b/shared/api/endpoints/createCitiesEndpoint.ts index 35e9ddc999..addec8e039 100644 --- a/shared/api/endpoints/createCitiesEndpoint.ts +++ b/shared/api/endpoints/createCitiesEndpoint.ts @@ -6,8 +6,8 @@ import { JsonCityType } from '../types' export const CITIES_ENDPOINT_NAME = 'cities' -export default (baseUrl: string): Endpoint => - new EndpointBuilder(CITIES_ENDPOINT_NAME) +export default (baseUrl: string): Endpoint | void, CityModel[]> => + new EndpointBuilder | void, CityModel[]>(CITIES_ENDPOINT_NAME) .withParamsToUrlMapper(() => `${baseUrl}/api/${API_VERSION}/regions/`) .withMapper((json: JsonCityType[]) => json.map(mapCityJson).sort((city1, city2) => city1.sortingName.localeCompare(city2.sortingName)),