From 5dd471bcf1e21086a20b357e3fbf3029e988d52f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Pasteau?= <4895034+ClementPasteau@users.noreply.github.com> Date: Thu, 3 Oct 2024 18:20:27 +0200 Subject: [PATCH] Handle internal navigation for promotions --- .../AnnouncementFormatting.js | 6 ++-- .../AnnouncementsFeedContext.js | 9 +----- newIDE/app/src/Promotions/PromotionHelper.js | 31 ++++++++++++++++++- .../Utils/GDevelopServices/Announcement.js | 20 ++++++------ 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/newIDE/app/src/AnnouncementsFeed/AnnouncementFormatting.js b/newIDE/app/src/AnnouncementsFeed/AnnouncementFormatting.js index 85cd27a3d7a5..aa1cd2c97838 100644 --- a/newIDE/app/src/AnnouncementsFeed/AnnouncementFormatting.js +++ b/newIDE/app/src/AnnouncementsFeed/AnnouncementFormatting.js @@ -4,7 +4,7 @@ import { type I18n as I18nType } from '@lingui/core'; import { type Route, type RouteArguments } from '../MainFrame/RouterContext'; import { selectMessageByLocale } from '../Utils/i18n/MessageByLocale'; -const getAdapatedMessageAndRouteNavigationParams = ( +const getAdaptedMessageAndRouteNavigationParams = ( message: string ): {| message: string, @@ -81,12 +81,12 @@ export const getAnnouncementContent = ( message: adaptedDesktopMessage, routeNavigationParams: desktopRouteNavigationParams, isClickableContent: isDesktopClickableContent, - } = getAdapatedMessageAndRouteNavigationParams(message); + } = getAdaptedMessageAndRouteNavigationParams(message); const { message: adaptedMobileMessage, routeNavigationParams: mobileRouteNavigationParams, isClickableContent: isMobileClickableContent, - } = getAdapatedMessageAndRouteNavigationParams(mobileMessage); + } = getAdaptedMessageAndRouteNavigationParams(mobileMessage); return { title, diff --git a/newIDE/app/src/AnnouncementsFeed/AnnouncementsFeedContext.js b/newIDE/app/src/AnnouncementsFeed/AnnouncementsFeedContext.js index 1e7de62ca4c6..98f3f97d550a 100644 --- a/newIDE/app/src/AnnouncementsFeed/AnnouncementsFeedContext.js +++ b/newIDE/app/src/AnnouncementsFeed/AnnouncementsFeedContext.js @@ -56,14 +56,7 @@ export const AnnouncementsFeedStateProvider = ({ listAllPromotions(), ]); - // Logic to remove once promotions are displayed to enough users. - // For now, we filter out promotions from the announcements. - const filteredAnnouncements = fetchedAnnouncements.filter( - announcement => - !fetchedPromotions.find(promotion => promotion.id === announcement.id) - ); - - setAnnouncements(filteredAnnouncements); + setAnnouncements(fetchedAnnouncements); setPromotions(fetchedPromotions); } catch (error) { console.error(`Unable to load the announcements from the api:`, error); diff --git a/newIDE/app/src/Promotions/PromotionHelper.js b/newIDE/app/src/Promotions/PromotionHelper.js index 057686bd4a4b..1f68c73718c9 100644 --- a/newIDE/app/src/Promotions/PromotionHelper.js +++ b/newIDE/app/src/Promotions/PromotionHelper.js @@ -3,6 +3,27 @@ import { type Promotion } from '../Utils/GDevelopServices/Announcement'; import { type Route, type RouteArguments } from '../MainFrame/RouterContext'; import Window from '../Utils/Window'; +const getRouteNavigationParamsFromLink = ( + link: string +): {| route: Route, params: RouteArguments |} | null => { + if (link.startsWith('https://editor.gdevelop.io')) { + const urlParams = new URLSearchParams(link.replace(/.*\?/, '')); + // $FlowFixMe - Assume that the arguments are always valid. + const route: ?Route = urlParams.get('initial-dialog'); + const otherParams = {}; + urlParams.forEach((value, key) => { + if (key !== 'initial-dialog') otherParams[key] = value; + }); + if (route) { + return { route, params: otherParams }; + } + + return null; + } + + return null; +}; + export const getOnClick = ({ promotion, navigateToRoute, @@ -24,7 +45,15 @@ export const getOnClick = ({ const linkUrl = promotion.linkUrl; if (linkUrl) { - return () => Window.openExternalURL(linkUrl); + const routeNavigationParams = getRouteNavigationParamsFromLink(linkUrl); + + return routeNavigationParams + ? () => + navigateToRoute( + routeNavigationParams.route, + routeNavigationParams.params + ) + : () => Window.openExternalURL(linkUrl); } return undefined; diff --git a/newIDE/app/src/Utils/GDevelopServices/Announcement.js b/newIDE/app/src/Utils/GDevelopServices/Announcement.js index 261cc0dafa95..d1f0abcfa0b1 100644 --- a/newIDE/app/src/Utils/GDevelopServices/Announcement.js +++ b/newIDE/app/src/Utils/GDevelopServices/Announcement.js @@ -14,15 +14,17 @@ export type Announcement = { buttonLabelByLocale?: MessageByLocale, }; -export type Promotion = { - id: string, - imageUrl: string, - mobileImageUrl: string, - display: 'all' | 'non-native-mobile', - type: 'game-template' | 'asset-pack' | 'game', - linkUrl?: string, - productId?: string, -}; +export interface Promotion { + id: string; + imageUrl: string; + mobileImageUrl: string; + display: 'all' | 'non-native-mobile' | 'native-mobile'; + type: 'game-template' | 'asset-pack' | 'game' | 'other'; + linkUrl?: string; + productId?: string; + fromDate?: number; + toDate?: number; +} export const listAllAnnouncements = async (): Promise> => { const response = await axios.get(