From 281868189b8d4eb435680ad27a11d20a819c52a2 Mon Sep 17 00:00:00 2001 From: yleclercq-pass <62058919+yleclercq-pass@users.noreply.github.com> Date: Mon, 3 Feb 2025 15:17:50 +0100 Subject: [PATCH] (PC-32988) after review refacto adapter --- ...st.ts => headlineOfferData.native.test.ts} | 16 ++++++----- .../adapters/headlineOfferData.ts | 27 ++++++++++--------- .../HeadlineOffer/HeadlineOffer.tsx | 13 ++------- src/features/headlineOffer/type.ts | 11 ++++++++ .../venue/components/VenueBody/VenueBody.tsx | 16 ++++++----- 5 files changed, 45 insertions(+), 38 deletions(-) rename src/features/headlineOffer/adapters/{headlineOfferData.test.ts => headlineOfferData.native.test.ts} (66%) create mode 100644 src/features/headlineOffer/type.ts diff --git a/src/features/headlineOffer/adapters/headlineOfferData.test.ts b/src/features/headlineOffer/adapters/headlineOfferData.native.test.ts similarity index 66% rename from src/features/headlineOffer/adapters/headlineOfferData.test.ts rename to src/features/headlineOffer/adapters/headlineOfferData.native.test.ts index ef20164858c..c09ba5ba6bc 100644 --- a/src/features/headlineOffer/adapters/headlineOfferData.test.ts +++ b/src/features/headlineOffer/adapters/headlineOfferData.native.test.ts @@ -1,17 +1,19 @@ -import { headlineOfferData } from 'features/headlineOffer/adapters/headlineOfferData' +import { offerToHeadlineOfferData } from 'features/headlineOffer/adapters/headlineOfferData' import { mockLabelMapping, mockMapping } from 'features/headlineOffer/fixtures/mockMapping' import { Currency } from 'shared/currency/useGetCurrencyToDisplay' import { offersFixture } from 'shared/offer/offer.fixture' describe('headlineOfferData', () => { it('should transform headline offer data correctly', () => { - const result = headlineOfferData({ + const result = offerToHeadlineOfferData({ offer: offersFixture[0], - mapping: mockMapping, - labelMapping: mockLabelMapping, - currency: Currency.EURO, - euroToPacificFrancRate: 10, - userLocation: { latitude: 1, longitude: 1 }, + transformParameters: { + mapping: mockMapping, + labelMapping: mockLabelMapping, + currency: Currency.EURO, + euroToPacificFrancRate: 10, + userLocation: { latitude: 1, longitude: 1 }, + }, }) expect(result).toEqual({ diff --git a/src/features/headlineOffer/adapters/headlineOfferData.ts b/src/features/headlineOffer/adapters/headlineOfferData.ts index 10d4a7cbda9..4ed8f84303a 100644 --- a/src/features/headlineOffer/adapters/headlineOfferData.ts +++ b/src/features/headlineOffer/adapters/headlineOfferData.ts @@ -1,3 +1,4 @@ +import { HeadlineOfferData } from 'features/headlineOffer/type' import { Position } from 'libs/location' import { formatDistance } from 'libs/parsers/formatDistance' import { getDisplayedPrice } from 'libs/parsers/getDisplayedPrice' @@ -5,8 +6,7 @@ import { CategoryHomeLabelMapping, CategoryIdMapping } from 'libs/subcategories/ import { Currency } from 'shared/currency/useGetCurrencyToDisplay' import { Offer } from 'shared/offer/types' -type HeadlineOfferData = { - offer: Offer +type OfferToHeadlineOfferData = { mapping: CategoryIdMapping labelMapping: CategoryHomeLabelMapping currency: Currency @@ -14,26 +14,27 @@ type HeadlineOfferData = { userLocation?: Position } -export function headlineOfferData({ +type OfferToHeadlineParams = { + offer: Offer + transformParameters: OfferToHeadlineOfferData +} + +export function offerToHeadlineOfferData({ offer, - mapping, - labelMapping, - currency, - euroToPacificFrancRate, - userLocation, -}: HeadlineOfferData) { - if (!offer) return + transformParameters, +}: OfferToHeadlineParams): HeadlineOfferData | null { + if (!offer) return null const { offer: hitOffer, objectID, _geoloc } = offer - - if (!hitOffer.thumbUrl) return + const { mapping, labelMapping, currency, euroToPacificFrancRate, userLocation } = + transformParameters const displayedPrice = getDisplayedPrice(hitOffer.prices, currency, euroToPacificFrancRate) return { id: objectID, offerTitle: hitOffer.name, - imageUrl: hitOffer.thumbUrl, + imageUrl: hitOffer.thumbUrl ?? '', categoryId: mapping[hitOffer.subcategoryId], category: labelMapping[hitOffer.subcategoryId] ?? '', price: displayedPrice, diff --git a/src/features/headlineOffer/components/HeadlineOffer/HeadlineOffer.tsx b/src/features/headlineOffer/components/HeadlineOffer/HeadlineOffer.tsx index 4311403f969..91333e570f3 100644 --- a/src/features/headlineOffer/components/HeadlineOffer/HeadlineOffer.tsx +++ b/src/features/headlineOffer/components/HeadlineOffer/HeadlineOffer.tsx @@ -3,7 +3,7 @@ import React, { FunctionComponent } from 'react' import LinearGradient from 'react-native-linear-gradient' import styled, { useTheme } from 'styled-components/native' -import { CategoryIdEnum } from 'api/gen' +import { HeadlineOfferData } from 'features/headlineOffer/type' import { Image } from 'libs/resizing-image-on-demand/Image' import { HeadlineOfferLargeViewport } from './HeadlineOfferLargeViewport' @@ -12,16 +12,7 @@ import { HeadlineOfferSmallViewport } from './HeadlineOfferSmallViewport' const HEADLINE_OFFER_LARGE_VIEWPORT = 327 const HEADLINE_OFFER_SMALL_VIEWPORT = 245 -export type HeadlineOfferBaseProps = { - imageUrl: string - categoryId: CategoryIdEnum - category: string - price: string - offerTitle?: string - distance?: string -} - -export const HeadlineOffer: FunctionComponent = (props) => { +export const HeadlineOffer: FunctionComponent = (props) => { const { isDesktopViewport } = useTheme() const HeadlineOfferContent = isDesktopViewport ? HeadlineOfferLargeViewport diff --git a/src/features/headlineOffer/type.ts b/src/features/headlineOffer/type.ts new file mode 100644 index 00000000000..c7a618d6ad2 --- /dev/null +++ b/src/features/headlineOffer/type.ts @@ -0,0 +1,11 @@ +import { CategoryIdEnum } from 'api/gen' + +export type HeadlineOfferData = { + id: string + imageUrl: string + categoryId: CategoryIdEnum + category: string + price: string + offerTitle?: string + distance?: string +} diff --git a/src/features/venue/components/VenueBody/VenueBody.tsx b/src/features/venue/components/VenueBody/VenueBody.tsx index 88966435793..4e5084a9822 100644 --- a/src/features/venue/components/VenueBody/VenueBody.tsx +++ b/src/features/venue/components/VenueBody/VenueBody.tsx @@ -4,7 +4,7 @@ import styled, { useTheme } from 'styled-components/native' import { VenueResponse } from 'api/gen' import { GtlPlaylistData } from 'features/gtlPlaylist/types' -import { headlineOfferData } from 'features/headlineOffer/adapters/headlineOfferData' +import { offerToHeadlineOfferData } from 'features/headlineOffer/adapters/headlineOfferData' import { HeadlineOffer } from 'features/headlineOffer/components/HeadlineOffer/HeadlineOffer' import { PracticalInformation } from 'features/venue/components/PracticalInformation/PracticalInformation' import { TabLayout } from 'features/venue/components/TabLayout/TabLayout' @@ -46,14 +46,16 @@ export const VenueBody: FunctionComponent = ({ const SectionContainer = isLargeScreen ? View : SectionWithDivider - const headlineData = headlineOfferData({ + const headlineData = offerToHeadlineOfferData({ // Fake data to remove offer: offersFixture[0], - currency, - euroToPacificFrancRate, - mapping, - labelMapping, - userLocation, + transformParameters: { + currency, + euroToPacificFrancRate, + mapping, + labelMapping, + userLocation, + }, }) const tabPanels = {