diff --git a/2/ecolyo.428a0f6e105059ec41cb.js b/2/ecolyo.11a0524f373f31cee670.js
similarity index 99%
rename from 2/ecolyo.428a0f6e105059ec41cb.js
rename to 2/ecolyo.11a0524f373f31cee670.js
index 330b6544a4714dd65ba17cefc36dd3cb894f3e22..23dba32707a84f96a3192f607428aedd88cde7b5 100644
--- a/2/ecolyo.428a0f6e105059ec41cb.js
+++ b/2/ecolyo.11a0524f373f31cee670.js
@@ -146,14 +146,12 @@ var AnalysisConsumption = function AnalysisConsumption(_ref) {
   var navigate = (0, _reactRouterDom.useNavigate)();
   var client = (0, _cozyClient.useClient)();
   var userPriceConsumption = aggregatedPerformanceIndicator.value || 0;
-  var profile = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  });
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
+    return state.ecolyo;
   }),
-      fluidTypes = _useSelector.fluidTypes;
+      fluidTypes = _useSelector.global.fluidTypes,
+      profile = _useSelector.profile;
 
   var _useState = (0, _react.useState)(0),
       _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -1124,24 +1122,17 @@ var AnalysisView = function AnalysisView() {
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
     return state.ecolyo;
   }),
+      selectedDate = _useSelector.chart.selectedDate,
       analysisNotification = _useSelector.global.analysisNotification,
-      monthlyAnalysisDate = _useSelector.profile.monthlyAnalysisDate;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.chart;
-  }),
-      selectedDate = _useSelector2.selectedDate;
+      _useSelector$profile = _useSelector.profile,
+      monthlyAnalysisDate = _useSelector$profile.monthlyAnalysisDate,
+      mailToken = _useSelector$profile.mailToken;
 
   var _useState3 = (0, _react.useState)(monthlyAnalysisDate),
       _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
       currentAnalysisDate = _useState4[0],
       setCurrentAnalysisDate = _useState4[1];
 
-  var _useSelector3 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  }),
-      mailToken = _useSelector3.mailToken;
-
   var dispatch = (0, _reactRedux.useDispatch)();
   var defineHeaderHeight = (0, _react.useCallback)(function (height) {
     setHeaderHeight(height);
diff --git a/3/ecolyo.0e7e4206658f5e4b1eff.js b/3/ecolyo.9343f3201d05ad1a3cf3.js
similarity index 99%
rename from 3/ecolyo.0e7e4206658f5e4b1eff.js
rename to 3/ecolyo.9343f3201d05ad1a3cf3.js
index 3123e1b1791cb3e8ebaecef7f56d05b35dcf2100..c19a010bba0c097266b395435960dffaf170e1a7 100644
--- a/3/ecolyo.0e7e4206658f5e4b1eff.js
+++ b/3/ecolyo.9343f3201d05ad1a3cf3.js
@@ -1210,6 +1210,8 @@ var _chart = __webpack_require__("U6AS");
 
 var _global = __webpack_require__("c4IZ");
 
+var _modal = __webpack_require__("lSJB");
+
 var _utils = __webpack_require__("c+yx");
 
 __webpack_require__("xz5R");
@@ -1247,7 +1249,7 @@ var ConsumptionView = function ConsumptionView(_ref) {
       fluidStatus = _useSelector$global.fluidStatus,
       releaseNotes = _useSelector$global.releaseNotes,
       customPopupModal = _useSelector$global.customPopupModal,
-      openPartnersIssueModal = _useSelector$global.openPartnersIssueModal;
+      partnersIssueModal = _useSelector.modal.partnersIssueModal;
 
   var _useState = (0, _react.useState)(false),
       _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -1337,7 +1339,7 @@ var ConsumptionView = function ConsumptionView(_ref) {
               updatedProfile = _context.sent;
 
               if (updatedProfile) {
-                dispatch((0, _global.setPartnersIssue)(_objectSpread(_objectSpread({}, openPartnersIssueModal), {}, (0, _defineProperty2.default)({}, getPartnerKey(fluidType), false))));
+                dispatch((0, _modal.openPartnersModal)(_objectSpread(_objectSpread({}, partnersIssueModal), {}, (0, _defineProperty2.default)({}, getPartnerKey(fluidType), false))));
               }
 
             case 9:
@@ -1351,7 +1353,7 @@ var ConsumptionView = function ConsumptionView(_ref) {
     return function (_x) {
       return _ref2.apply(this, arguments);
     };
-  }(), [client, dispatch, openPartnersIssueModal]);
+  }(), [client, dispatch, partnersIssueModal]);
 
   var handleCloseCustomPopupModal = /*#__PURE__*/function () {
     var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
@@ -1480,7 +1482,7 @@ var ConsumptionView = function ConsumptionView(_ref) {
     return /*#__PURE__*/_react.default.createElement(_PartnerIssueModal.default, {
       key: issuedFluid.fluidType,
       issuedFluid: issuedFluid,
-      open: openPartnersIssueModal[getPartnerKey(issuedFluid.fluidType)],
+      open: partnersIssueModal[getPartnerKey(issuedFluid.fluidType)],
       handleCloseClick: handleClosePartnerIssueModal
     });
   }), /*#__PURE__*/_react.default.createElement(_CustomPopupModal.default, {
@@ -1975,7 +1977,7 @@ var _dateChart = _interopRequireDefault(__webpack_require__("Ty7+"));
 
 var _fluid2 = _interopRequireDefault(__webpack_require__("z34f"));
 
-var _partnersInfo = _interopRequireDefault(__webpack_require__("4zrG"));
+var _partnersInfo2 = _interopRequireDefault(__webpack_require__("4zrG"));
 
 var _usageEvent2 = _interopRequireDefault(__webpack_require__("dECN"));
 
@@ -2023,10 +2025,13 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) {
   var trigger = fluidStatus.connection.trigger;
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
+    return state.ecolyo;
   }),
-      statusArray = _useSelector.fluidStatus,
-      shouldRefreshConsent = _useSelector.shouldRefreshConsent;
+      currentChallenge = _useSelector.challenge.currentChallenge,
+      _useSelector$global = _useSelector.global,
+      statusArray = _useSelector$global.fluidStatus,
+      shouldRefreshConsent = _useSelector$global.shouldRefreshConsent,
+      partnersInfo = _useSelector$global.partnersInfo;
 
   var _useState = (0, _react.useState)(false),
       _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -2063,16 +2068,11 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) {
       isOutdatedData = _useState14[0],
       setIsOutdatedData = _useState14[1];
 
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.challenge;
-  }),
-      currentChallenge = _useSelector2.currentChallenge;
-
   var fluidService = (0, _react.useMemo)(function () {
     return new _fluid2.default(client);
   }, [client]);
   var partnersInfoService = (0, _react.useMemo)(function () {
-    return new _partnersInfo.default(client);
+    return new _partnersInfo2.default(client);
   }, [client]);
   var lastDataDate = fluidType !== _fluid.FluidType.MULTIFLUID && statusArray[fluidType].lastDataDate ? statusArray[fluidType].lastDataDate.toLocaleString() + fluidType : fluidType;
   var iconType = (0, _picto.getParamPicto)(fluidStatus.fluidType);
@@ -2166,7 +2166,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) {
     }, _callee2);
   })), [client, dispatch, currentChallenge]);
   var handleAccountDeletion = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
-    var _updatedFluidStatus, partnersInfo, _updatedFluidStatus2;
+    var _updatedFluidStatus, _partnersInfo, _updatedFluidStatus2;
 
     return _regenerator.default.wrap(function _callee3$(_context3) {
       while (1) {
@@ -2191,9 +2191,9 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) {
             return partnersInfoService.getPartnersInfo();
 
           case 8:
-            partnersInfo = _context3.sent;
+            _partnersInfo = _context3.sent;
             _context3.next = 11;
-            return fluidService.getFluidStatus(partnersInfo);
+            return fluidService.getFluidStatus(_partnersInfo);
 
           case 11:
             _updatedFluidStatus2 = _context3.sent;
@@ -2211,7 +2211,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) {
   })), [refreshChallengeState, updateGlobalFluidStatus, setActive, partnersInfoService, fluidService, dispatch]);
   var handleConnectionEnd = (0, _react.useCallback)( /*#__PURE__*/function () {
     var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(isSuccess) {
-      var auth, accountService, partnersInfo, _updatedFluidStatus;
+      var auth, accountService, _updatedFluidStatus3;
 
       return _regenerator.default.wrap(function _callee4$(_context4) {
         while (1) {
@@ -2240,7 +2240,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) {
               return handleAccountDeletion();
 
             case 7:
-              _context4.next = 20;
+              _context4.next = 17;
               break;
 
             case 9:
@@ -2254,30 +2254,25 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) {
 
             case 12:
               if (!(updatedFluidStatus.length > 0)) {
-                _context4.next = 20;
+                _context4.next = 17;
                 break;
               }
 
               _context4.next = 15;
-              return partnersInfoService.getPartnersInfo();
-
-            case 15:
-              partnersInfo = _context4.sent;
-              _context4.next = 18;
               return fluidService.getFluidStatus(partnersInfo);
 
-            case 18:
-              _updatedFluidStatus = _context4.sent;
-              dispatch((0, _global.setFluidStatus)(_updatedFluidStatus));
+            case 15:
+              _updatedFluidStatus3 = _context4.sent;
+              dispatch((0, _global.setFluidStatus)(_updatedFluidStatus3));
 
-            case 20:
+            case 17:
               setActive(false);
               setOpenModal(false); // TODO null state seems to be read before modal closing and display a success icon in modal
 
               setKonnectorState(null);
               setKonnectorErrorDescription(null);
 
-            case 24:
+            case 21:
             case "end":
               return _context4.stop();
           }
@@ -2961,16 +2956,14 @@ var FluidChartSlide = function FluidChartSlide(_ref) {
   var dispatch = (0, _reactRedux.useDispatch)();
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.chart;
-  }),
-      currentTimeStep = _useSelector.currentTimeStep,
-      currentIndex = _useSelector.currentIndex;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
+    return state.ecolyo;
   }),
-      fluidTypes = _useSelector2.fluidTypes,
-      fluidStatus = _useSelector2.fluidStatus;
+      _useSelector$chart = _useSelector.chart,
+      currentTimeStep = _useSelector$chart.currentTimeStep,
+      currentIndex = _useSelector$chart.currentIndex,
+      _useSelector$global = _useSelector.global,
+      fluidStatus = _useSelector$global.fluidStatus,
+      fluidTypes = _useSelector$global.fluidTypes;
 
   var _useState = (0, _react.useState)({
     actualData: [],
@@ -4237,16 +4230,14 @@ var ConsumptionVisualizer = function ConsumptionVisualizer(_ref) {
       setActive = _ref.setActive;
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
-  }),
-      fluidStatus = _useSelector.fluidStatus,
-      fluidTypes = _useSelector.fluidTypes;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.chart;
+    return state.ecolyo;
   }),
-      currentDatachart = _useSelector2.currentDatachart,
-      currentDatachartIndex = _useSelector2.currentDatachartIndex;
+      _useSelector$chart = _useSelector.chart,
+      currentDatachart = _useSelector$chart.currentDatachart,
+      currentDatachartIndex = _useSelector$chart.currentDatachartIndex,
+      _useSelector$global = _useSelector.global,
+      fluidStatus = _useSelector$global.fluidStatus,
+      fluidTypes = _useSelector$global.fluidTypes;
 
   var dataload = currentDatachart.actualData[currentDatachartIndex];
   var compareDataload = currentDatachart.comparisonData ? currentDatachart.comparisonData[currentDatachartIndex] : null;
@@ -5631,15 +5622,12 @@ var FluidChart = function FluidChart(_ref) {
   var client = (0, _cozyClient.useClient)();
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
-  }),
-      fluidStatus = _useSelector.fluidStatus;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.chart;
+    return state.ecolyo;
   }),
-      currentTimeStep = _useSelector2.currentTimeStep,
-      selectedDate = _useSelector2.selectedDate;
+      _useSelector$chart = _useSelector.chart,
+      currentTimeStep = _useSelector$chart.currentTimeStep,
+      selectedDate = _useSelector$chart.selectedDate,
+      fluidStatus = _useSelector.global.fluidStatus;
 
   var _useExploration = (0, _useExploration3.default)(),
       _useExploration2 = (0, _slicedToArray2.default)(_useExploration, 2),
diff --git a/4/ecolyo.b36c04845ac8ccdfd8e2.js b/4/ecolyo.36d65c19c36ee336be1e.js
similarity index 99%
rename from 4/ecolyo.b36c04845ac8ccdfd8e2.js
rename to 4/ecolyo.36d65c19c36ee336be1e.js
index b0b9e8790bdfa8891b171b9d62b71532546e74b7..d6c6faec1ef342819a03e4d941c53dd0475fa223 100644
--- a/4/ecolyo.b36c04845ac8ccdfd8e2.js
+++ b/4/ecolyo.36d65c19c36ee336be1e.js
@@ -95,18 +95,15 @@ var EcogestureView = function EcogestureView() {
   var client = (0, _cozyClient.useClient)();
   var dispatch = (0, _reactRedux.useDispatch)();
   var tab = new URLSearchParams((0, _reactRouterDom.useLocation)().search).get('tab');
-  var profileType = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profileType;
-  });
-  var profileEcogesture = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profileEcogesture;
-  });
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
+    return state.ecolyo;
   }),
-      haveSeenEcogestureModal = _useSelector.haveSeenEcogestureModal,
-      isProfileEcogestureCompleted = _useSelector.isProfileEcogestureCompleted;
+      _useSelector$profile = _useSelector.profile,
+      haveSeenEcogestureModal = _useSelector$profile.haveSeenEcogestureModal,
+      isProfileEcogestureCompleted = _useSelector$profile.isProfileEcogestureCompleted,
+      profileEcogesture = _useSelector.profileEcogesture,
+      profileType = _useSelector.profileType;
 
   var _useState3 = (0, _react.useState)(tab ? parseInt(tab) : _ecogesture.EcogestureTab.OBJECTIVE),
       _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
diff --git a/5/ecolyo.4c1d9ae558d5214ade9c.js b/5/ecolyo.b68bd78f52796a5a0574.js
similarity index 98%
rename from 5/ecolyo.4c1d9ae558d5214ade9c.js
rename to 5/ecolyo.b68bd78f52796a5a0574.js
index 872207057909d60e0deea3f63296943de5aa582e..886876155ac40e9b5720b2f96f34eff1770ce4bd 100644
--- a/5/ecolyo.4c1d9ae558d5214ade9c.js
+++ b/5/ecolyo.b68bd78f52796a5a0574.js
@@ -120,16 +120,13 @@ var DateNavigator = function DateNavigator(_ref) {
   var dispatch = (0, _reactRedux.useDispatch)();
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.chart;
+    return state.ecolyo;
   }),
-      currentTimeStep = _useSelector.currentTimeStep,
-      selectedDate = _useSelector.selectedDate,
-      currentIndex = _useSelector.currentIndex;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
-  }),
-      fluidStatus = _useSelector2.fluidStatus;
+      _useSelector$chart = _useSelector.chart,
+      currentTimeStep = _useSelector$chart.currentTimeStep,
+      selectedDate = _useSelector$chart.selectedDate,
+      currentIndex = _useSelector$chart.currentIndex,
+      fluidStatus = _useSelector.global.fluidStatus;
 
   var disablePrev = selectedDate < _luxon.DateTime.local(0, 1, 1).setZone('utc', {
     keepLocalTime: true
diff --git a/6/ecolyo.8a0fb54d4ad7a438bb12.js b/6/ecolyo.5d999cf4bd9b64c4eb2f.js
similarity index 99%
rename from 6/ecolyo.8a0fb54d4ad7a438bb12.js
rename to 6/ecolyo.5d999cf4bd9b64c4eb2f.js
index e60253ab7158ff36d9e17e2ee612eb158cfde13a..2cf57f8e44c2493a959cdc58208f07cb8c287911 100644
--- a/6/ecolyo.8a0fb54d4ad7a438bb12.js
+++ b/6/ecolyo.5d999cf4bd9b64c4eb2f.js
@@ -53,14 +53,12 @@ var ReportOptions = function ReportOptions() {
 
   var client = (0, _cozyClient.useClient)();
   var dispatch = (0, _reactRedux.useDispatch)();
-  var profile = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  });
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
+    return state.ecolyo;
   }),
-      fluidStatus = _useSelector.fluidStatus;
+      fluidStatus = _useSelector.global.fluidStatus,
+      profile = _useSelector.profile;
 
   var _useState = (0, _react.useState)(null),
       _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -305,12 +303,11 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
 function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
 
 var ProfileTypeOptions = function ProfileTypeOptions() {
-  var profile = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  });
-  var profileType = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profileType;
-  });
+  var _useSelector = (0, _reactRedux.useSelector)(function (state) {
+    return state.ecolyo;
+  }),
+      profile = _useSelector.profile,
+      profileType = _useSelector.profileType;
 
   var _useI18n = (0, _I18n.useI18n)(),
       t = _useI18n.t;
@@ -1905,6 +1902,21 @@ var OptionsView = function OptionsView() {
     setHeaderHeight(height);
   };
 
+  var beforeInstallPrompt = null;
+  window.addEventListener('beforeinstallprompt', eventHandler, errorHandler);
+
+  function eventHandler(event) {
+    beforeInstallPrompt = event;
+  }
+
+  function errorHandler(e) {
+    console.log('error: ' + e);
+  }
+
+  function install() {
+    if (beforeInstallEvent) beforeInstallPrompt.prompt();
+  }
+
   return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_CozyBar.default, {
     titleKey: 'common.title_options'
   }), /*#__PURE__*/_react.default.createElement(_Header.default, {
@@ -1912,7 +1924,9 @@ var OptionsView = function OptionsView() {
     desktopTitleKey: 'common.title_options'
   }), /*#__PURE__*/_react.default.createElement(_Content.default, {
     height: headerHeight
-  }, /*#__PURE__*/_react.default.createElement(_ProfileTypeOptions.default, null), /*#__PURE__*/_react.default.createElement(_exportOptions.default, null), /*#__PURE__*/_react.default.createElement(_ReportOptions.default, null), /*#__PURE__*/_react.default.createElement(_HelpLink.default, null), /*#__PURE__*/_react.default.createElement(_LegalNoticeLink.default, null), /*#__PURE__*/_react.default.createElement(_GCULink.default, null), /*#__PURE__*/_react.default.createElement(_MatomoOptOut.default, null), /*#__PURE__*/_react.default.createElement("div", {
+  }, /*#__PURE__*/_react.default.createElement(_ProfileTypeOptions.default, null), /*#__PURE__*/_react.default.createElement(_exportOptions.default, null), /*#__PURE__*/_react.default.createElement(_ReportOptions.default, null), /*#__PURE__*/_react.default.createElement(_HelpLink.default, null), /*#__PURE__*/_react.default.createElement(_LegalNoticeLink.default, null), /*#__PURE__*/_react.default.createElement(_GCULink.default, null), /*#__PURE__*/_react.default.createElement("button", {
+    onClick: install
+  }, "Installer"), /*#__PURE__*/_react.default.createElement(_MatomoOptOut.default, null), /*#__PURE__*/_react.default.createElement("div", {
     className: "parameters-logos"
   }, /*#__PURE__*/_react.default.createElement("img", {
     src: _logos_partenaires.default,
@@ -2109,7 +2123,7 @@ var HelpLink = function HelpLink() {
   return /*#__PURE__*/_react.default.createElement("div", {
     className: "help-root",
     onClick: function onClick() {
-      return dispatch((0, _modal.updateModalIsFeedbacksOpen)(true));
+      return dispatch((0, _modal.openFeedbackModal)(true));
     }
   }, /*#__PURE__*/_react.default.createElement("div", {
     className: "help-content"
diff --git a/app/ecolyo.c6f769f46df3b9432805.js b/app/ecolyo.50adf68b820b9d0f117e.js
similarity index 99%
rename from app/ecolyo.c6f769f46df3b9432805.js
rename to app/ecolyo.50adf68b820b9d0f117e.js
index 191f14ae0284c063ffd4fde08e76e4b56b0ee5bd..0f6e72c4cc3bcb330aac519dd6bc31811b1a1c2b 100644
--- a/app/ecolyo.c6f769f46df3b9432805.js
+++ b/app/ecolyo.50adf68b820b9d0f117e.js
@@ -64,7 +64,7 @@
 /******/
 /******/ 	// script path function
 /******/ 	function jsonpScriptSrc(chunkId) {
-/******/ 		return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"2":"428a0f6e105059ec41cb","3":"0e7e4206658f5e4b1eff","4":"b36c04845ac8ccdfd8e2","5":"4c1d9ae558d5214ade9c","6":"8a0fb54d4ad7a438bb12","7":"403585665c5e67c3d156","8":"8763ca2635d712139819","9":"9ad8f654859d6a5af353"}[chunkId] + ".js"
+/******/ 		return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"2":"11a0524f373f31cee670","3":"9343f3201d05ad1a3cf3","4":"36d65c19c36ee336be1e","5":"b68bd78f52796a5a0574","6":"5d999cf4bd9b64c4eb2f","7":"403585665c5e67c3d156","8":"8763ca2635d712139819","9":"9ad8f654859d6a5af353"}[chunkId] + ".js"
 /******/ 	}
 /******/
 /******/ 	// The require function
@@ -1685,6 +1685,8 @@ var _chart = __webpack_require__("U6AS");
 
 var _global = __webpack_require__("c4IZ");
 
+var _modal = __webpack_require__("lSJB");
+
 var _profile = __webpack_require__("jPH6");
 
 var _profileEcogesture = __webpack_require__("Zmlh");
@@ -1841,7 +1843,7 @@ var SplashRoot = function SplashRoot(_ref) {
                   if (Object.values(partnersIssue).some(function (issue) {
                     return issue;
                   })) {
-                    dispatch((0, _global.setPartnersIssue)(partnersIssue));
+                    dispatch((0, _modal.openPartnersModal)(partnersIssue));
                   }
                 }
               } catch (error) {
@@ -1890,63 +1892,64 @@ var SplashRoot = function SplashRoot(_ref) {
     }
 
     function _loadData() {
-      _loadData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
-        var initializationService, customPopupService, ms, migrationsResult, termsStatus, profile, profileType, profileEcogesture, _yield$Promise$all, _yield$Promise$all2, ecogestureHash, duelHash, quizHash, challengeHash, explorationHash, analysisResult, fluidStatus, refDate, lastDataDate, _iterator, _step, fluid, userChallengeList, _filteredCurrentOngoi, _filteredCurrentOngoi2, _filteredCurrentOngoi3, _filteredCurrentDuelC, filteredCurrentOngoingChallenge, actionService, updatedUserChallenge, filteredCurrentDuelChallenge, _yield$initialization, _updatedUserChallenge, dataloads, challengeService, _yield$challengeServi, isDone, customPopup, partnersInfoService, partnersInfo;
+      _loadData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
+        var initializationService, customPopupService, partnersInfoService, ms, migrationsResult, termsStatus, profile, profileType, profileEcogesture, _yield$Promise$all, _yield$Promise$all2, ecogestureHash, duelHash, quizHash, challengeHash, explorationHash, analysisResult, fluidStatus, refDate, lastDataDate, _iterator, _step, fluid, userChallengeList, _filteredCurrentOngoi, _filteredCurrentOngoi2, _filteredCurrentOngoi3, _filteredCurrentDuelC, filteredCurrentOngoingChallenge, actionService, updatedUserChallenge, filteredCurrentDuelChallenge, _yield$initialization, _updatedUserChallenge, dataloads, challengeService, _yield$challengeServi, isDone;
 
-        return _regenerator.default.wrap(function _callee4$(_context4) {
+        return _regenerator.default.wrap(function _callee6$(_context6) {
           while (1) {
-            switch (_context4.prev = _context4.next) {
+            switch (_context6.prev = _context6.next) {
               case 0:
                 initializationService = new _initialization.default(client, setInitStep, setInitStepErrors);
                 customPopupService = new _customPopup.default(client);
+                partnersInfoService = new _partnersInfo.default(client);
                 ms = new _migration2.MigrationService(client, setInitStepErrors);
-                _context4.prev = 3;
-                _context4.next = 6;
+                _context6.prev = 4;
+                _context6.next = 7;
                 return ms.runMigrations(_migration.migrations);
 
-              case 6:
-                migrationsResult = _context4.sent;
+              case 7:
+                migrationsResult = _context6.sent;
                 // Init last release notes when they exist
                 dispatch((0, _global.showReleaseNotes)(migrationsResult.show, migrationsResult.notes, migrationsResult.redirectLink)); // init Terms
 
-                _context4.next = 10;
+                _context6.next = 11;
                 return initializationService.initConsent();
 
-              case 10:
-                termsStatus = _context4.sent;
+              case 11:
+                termsStatus = _context6.sent;
                 if (subscribed) dispatch((0, _global.updateTermValidation)(termsStatus)); // Init fluidPrices
 
-                _context4.next = 14;
+                _context6.next = 15;
                 return initializationService.initFluidPrices();
 
-              case 14:
-                _context4.next = 16;
+              case 15:
+                _context6.next = 17;
                 return initializationService.initProfile();
 
-              case 16:
-                profile = _context4.sent;
-                _context4.next = 19;
+              case 17:
+                profile = _context6.sent;
+                _context6.next = 20;
                 return initializationService.initProfileType();
 
-              case 19:
-                profileType = _context4.sent;
-                _context4.next = 22;
+              case 20:
+                profileType = _context6.sent;
+                _context6.next = 23;
                 return initializationService.initProfileEcogesture();
 
-              case 22:
-                profileEcogesture = _context4.sent;
+              case 23:
+                profileEcogesture = _context6.sent;
 
                 if (!(subscribed && profile)) {
-                  _context4.next = 46;
+                  _context6.next = 47;
                   break;
                 }
 
                 setValidExploration(_userExploration.UserExplorationID.EXPLORATION007);
-                _context4.next = 27;
+                _context6.next = 28;
                 return Promise.all([initializationService.initEcogesture(profile.ecogestureHash), initializationService.initDuelEntity(profile.duelHash), initializationService.initQuizEntity(profile.quizHash), initializationService.initExplorationEntity(profile.challengeHash), initializationService.initChallengeEntity(profile.explorationHash), initializationService.initAnalysis(profile)]);
 
-              case 27:
-                _yield$Promise$all = _context4.sent;
+              case 28:
+                _yield$Promise$all = _context6.sent;
                 _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 6);
                 ecogestureHash = _yield$Promise$all2[0];
                 duelHash = _yield$Promise$all2[1];
@@ -1973,12 +1976,12 @@ var SplashRoot = function SplashRoot(_ref) {
 
                 dispatch((0, _global.toggleAnalysisNotification)(!profile.haveSeenLastAnalysis));
 
-              case 46:
-                _context4.next = 48;
+              case 47:
+                _context6.next = 49;
                 return initializationService.initFluidStatus();
 
-              case 48:
-                fluidStatus = _context4.sent;
+              case 49:
+                fluidStatus = _context6.sent;
 
                 if (subscribed) {
                   dispatch((0, _global.setFluidStatus)(fluidStatus));
@@ -2006,14 +2009,14 @@ var SplashRoot = function SplashRoot(_ref) {
                 } // Init Challenge
 
 
-                _context4.next = 52;
+                _context6.next = 53;
                 return initializationService.initUserChallenges(fluidStatus);
 
-              case 52:
-                userChallengeList = _context4.sent;
+              case 53:
+                userChallengeList = _context6.sent;
 
                 if (!subscribed) {
-                  _context4.next = 79;
+                  _context6.next = 80;
                   break;
                 }
 
@@ -2028,22 +2031,22 @@ var SplashRoot = function SplashRoot(_ref) {
 
 
                 if (!(((_filteredCurrentOngoi2 = filteredCurrentOngoingChallenge[0]) === null || _filteredCurrentOngoi2 === void 0 ? void 0 : _filteredCurrentOngoi2.action.state) === _userAction.UserActionState.ONGOING)) {
-                  _context4.next = 63;
+                  _context6.next = 64;
                   break;
                 }
 
                 actionService = new _action.default(client);
-                _context4.next = 61;
+                _context6.next = 62;
                 return actionService.isActionDone(filteredCurrentOngoingChallenge[0]);
 
-              case 61:
-                updatedUserChallenge = _context4.sent;
+              case 62:
+                updatedUserChallenge = _context6.sent;
 
                 if (updatedUserChallenge) {
                   dispatch((0, _challenge2.updateUserChallengeList)(updatedUserChallenge));
                 }
 
-              case 63:
+              case 64:
                 // Set Notification if action state is notification
                 if (((_filteredCurrentOngoi3 = filteredCurrentOngoingChallenge[0]) === null || _filteredCurrentOngoi3 === void 0 ? void 0 : _filteredCurrentOngoi3.action.state) === _userAction.UserActionState.NOTIFICATION) {
                   dispatch((0, _global.toggleChallengeActionNotification)(true));
@@ -2054,83 +2057,108 @@ var SplashRoot = function SplashRoot(_ref) {
                 });
 
                 if (!(((_filteredCurrentDuelC = filteredCurrentDuelChallenge[0]) === null || _filteredCurrentDuelC === void 0 ? void 0 : _filteredCurrentDuelC.duel.state) === _userDuel.UserDuelState.ONGOING)) {
-                  _context4.next = 79;
+                  _context6.next = 80;
                   break;
                 }
 
-                _context4.next = 68;
+                _context6.next = 69;
                 return initializationService.initDuelProgress(filteredCurrentDuelChallenge[0]);
 
-              case 68:
-                _yield$initialization = _context4.sent;
+              case 69:
+                _yield$initialization = _context6.sent;
                 _updatedUserChallenge = _yield$initialization.updatedUserChallenge;
                 dataloads = _yield$initialization.dataloads;
 
                 if (!subscribed) {
-                  _context4.next = 79;
+                  _context6.next = 80;
                   break;
                 }
 
                 dispatch((0, _challenge2.setChallengeConsumption)(_updatedUserChallenge, dataloads)); // Check is duel is done and display notification
 
                 challengeService = new _challenge.default(client);
-                _context4.next = 76;
+                _context6.next = 77;
                 return challengeService.isChallengeDone(_updatedUserChallenge, dataloads);
 
-              case 76:
-                _yield$challengeServi = _context4.sent;
+              case 77:
+                _yield$challengeServi = _context6.sent;
                 isDone = _yield$challengeServi.isDone;
                 dispatch((0, _global.toggleChallengeDuelNotification)(isDone));
 
-              case 79:
+              case 80:
                 if (!profile) {
-                  _context4.next = 82;
+                  _context6.next = 83;
                   break;
                 }
 
-                _context4.next = 82;
+                _context6.next = 83;
                 return _usageEvent2.default.addEvent(client, {
                   type: _usageEvent.UsageEventType.CONNECTION_EVENT,
                   result: profile.isFirstConnection ? 'firstConnection' : undefined,
                   context: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'mobile' : 'desktop'
                 });
 
-              case 82:
-                _context4.next = 84;
-                return customPopupService.getCustomPopup();
-
-              case 84:
-                customPopup = _context4.sent;
-
-                if (!(profile && customPopup)) {
-                  _context4.next = 88;
-                  break;
-                }
-
-                _context4.next = 88;
-                return processCustomPopup(profile, customPopup);
-
-              case 88:
-                partnersInfoService = new _partnersInfo.default(client);
-                _context4.next = 91;
-                return partnersInfoService.getPartnersInfo();
-
-              case 91:
-                partnersInfo = _context4.sent;
-
-                if (!(profile && partnersInfo)) {
-                  _context4.next = 97;
-                  break;
-                }
+              case 83:
+                /**
+                 * Load custom popup and partners info synchronously so these treatments don't block the loading
+                 */
+                customPopupService.getCustomPopup().then( /*#__PURE__*/function () {
+                  var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(customPopup) {
+                    return _regenerator.default.wrap(function _callee4$(_context4) {
+                      while (1) {
+                        switch (_context4.prev = _context4.next) {
+                          case 0:
+                            if (!(profile && customPopup)) {
+                              _context4.next = 3;
+                              break;
+                            }
+
+                            _context4.next = 3;
+                            return processCustomPopup(profile, customPopup);
+
+                          case 3:
+                          case "end":
+                            return _context4.stop();
+                        }
+                      }
+                    }, _callee4);
+                  }));
 
-                _context4.next = 95;
-                return processFluidsStatus(profile, partnersInfo);
+                  return function (_x7) {
+                    return _ref5.apply(this, arguments);
+                  };
+                }());
+                partnersInfoService.getPartnersInfo().then( /*#__PURE__*/function () {
+                  var _ref6 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(partnersInfo) {
+                    return _regenerator.default.wrap(function _callee5$(_context5) {
+                      while (1) {
+                        switch (_context5.prev = _context5.next) {
+                          case 0:
+                            if (!(profile && partnersInfo)) {
+                              _context5.next = 5;
+                              break;
+                            }
+
+                            _context5.next = 3;
+                            return processFluidsStatus(profile, partnersInfo);
+
+                          case 3:
+                            _context5.next = 5;
+                            return processPartnersStatus(profile, partnersInfo);
+
+                          case 5:
+                          case "end":
+                            return _context5.stop();
+                        }
+                      }
+                    }, _callee5);
+                  }));
 
-              case 95:
-                _context4.next = 97;
-                return processPartnersStatus(profile, partnersInfo);
+                  return function (_x8) {
+                    return _ref6.apply(this, arguments);
+                  };
+                }());
 
-              case 97:
                 if (subscribed) {
                   _logger.default.info('[Initialization] Finished successfully !');
 
@@ -2141,29 +2169,29 @@ var SplashRoot = function SplashRoot(_ref) {
                   });
                 }
 
-                _context4.next = 105;
+                _context6.next = 93;
                 break;
 
-              case 100:
-                _context4.prev = 100;
-                _context4.t0 = _context4["catch"](3);
+              case 88:
+                _context6.prev = 88;
+                _context6.t0 = _context6["catch"](4);
 
-                if (_context4.t0.message === 'Failed to fetch' && !initStepErrors) {
+                if (_context6.t0.message === 'Failed to fetch' && !initStepErrors) {
                   setInitStepErrors(_initialisationSteps.InitStepsErrors.UNKNOWN_ERROR);
                 }
 
-                _logger.default.error("[Initialization] Error : ".concat(_context4.t0));
+                _logger.default.error("[Initialization] Error : ".concat(_context6.t0));
 
                 Sentry.captureException(JSON.stringify({
-                  error: _context4.t0
+                  error: _context6.t0
                 }));
 
-              case 105:
+              case 93:
               case "end":
-                return _context4.stop();
+                return _context6.stop();
             }
           }
-        }, _callee4, null, [[3, 100]]);
+        }, _callee6, null, [[4, 88]]);
       }));
       return _loadData.apply(this, arguments);
     }
@@ -3677,37 +3705,42 @@ var initialState = {
 var chartReducer = function chartReducer() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
   var action = arguments.length > 1 ? arguments[1] : undefined;
+  if (action.payload == undefined) return state;
+
+  var updateState = function updateState(updates) {
+    return _objectSpread(_objectSpread({}, state), updates);
+  };
 
   switch (action.type) {
     case _chart.SET_SELECTED_DATE:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         selectedDate: action.payload
-      }) : state;
+      });
 
     case _chart.SET_CURRENT_TIMESTEP:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         currentTimeStep: action.payload
-      }) : state;
+      });
 
     case _chart.SET_CURRENT_INDEX:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         currentIndex: action.payload
-      }) : state;
+      });
 
     case _chart.SET_CURRENT_DATACHART:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         currentDatachart: action.payload
-      }) : state;
+      });
 
     case _chart.SET_CURRENT_DATACHART_INDEX:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         currentDatachartIndex: action.payload
-      }) : state;
+      });
 
     case _chart.SET_LOADING:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         loading: action.payload
-      }) : state;
+      });
 
     default:
       return state;
@@ -4604,14 +4637,10 @@ var ActionBegin = function ActionBegin(_ref) {
       t = _useI18n.t;
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  }),
-      isProfileTypeCompleted = _useSelector.isProfileTypeCompleted;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
+    return state.ecolyo;
   }),
-      fluidTypes = _useSelector2.fluidTypes;
+      fluidTypes = _useSelector.global.fluidTypes,
+      isProfileTypeCompleted = _useSelector.profile.isProfileTypeCompleted;
 
   var _useState = (0, _react.useState)(),
       _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -5369,7 +5398,8 @@ var DuelOngoing = function DuelOngoing(_ref) {
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
     return state.ecolyo.challenge;
   }),
-      currentDataload = _useSelector.currentDataload;
+      currentDataload = _useSelector.currentDataload,
+      userChallengeList = _useSelector.userChallengeList;
 
   var dispatch = (0, _reactRedux.useDispatch)();
   var navigate = (0, _reactRouterDom.useNavigate)();
@@ -5402,18 +5432,12 @@ var DuelOngoing = function DuelOngoing(_ref) {
   var _useState11 = (0, _react.useState)(),
       _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
       finishedDataLoad = _useState12[0],
-      setfinishedDataLoad = _useState12[1];
+      setFinishedDataLoad = _useState12[1];
 
   var chartContainer = (0, _react.useRef)(null);
   var challengeService = (0, _react.useMemo)(function () {
     return new _challenge.default(client);
   }, [client]);
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.challenge;
-  }),
-      userChallengeList = _useSelector2.userChallengeList;
-
   var duel = userChallenge.duel;
   var title = duel.title;
   var durationInDays = duel.duration.days;
@@ -5568,7 +5592,7 @@ var DuelOngoing = function DuelOngoing(_ref) {
                 dataloads = _context4.sent;
 
                 if (subscribed) {
-                  setfinishedDataLoad(dataloads);
+                  setFinishedDataLoad(dataloads);
                 }
 
               case 5:
@@ -9937,7 +9961,7 @@ var _interopRequireDefault = __webpack_require__("TqRt");
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.ecolyoReducer = exports.default = void 0;
+exports.defaultAction = exports.default = void 0;
 
 var Sentry = _interopRequireWildcard(__webpack_require__("agHs"));
 
@@ -9965,16 +9989,20 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
 
 function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
 
+var defaultAction = {
+  type: null,
+  payload: undefined
+};
+exports.defaultAction = defaultAction;
 var ecolyoReducer = (0, _redux.combineReducers)({
+  challenge: _challenge.challengeReducer,
+  chart: _chart.chartReducer,
   global: _global.globalReducer,
+  modal: _modal.modalReducer,
   profile: _profile.profileReducer,
-  profileType: _profileType.profileTypeReducer,
   profileEcogesture: _profileEcogesture.profileEcogestureReducer,
-  chart: _chart.chartReducer,
-  modal: _modal.modalReducer,
-  challenge: _challenge.challengeReducer
+  profileType: _profileType.profileTypeReducer
 });
-exports.ecolyoReducer = ecolyoReducer;
 var sentryReduxEnhancer = Sentry.createReduxEnhancer({});
 
 var configureStore = function configureStore(client, persistedState) {
@@ -10182,7 +10210,7 @@ var CozyBar = function CozyBar(_ref) {
   }, [backFunction, navigate]);
 
   var handleClickFeedbacks = function handleClickFeedbacks() {
-    dispatch((0, _modal.updateModalIsFeedbacksOpen)(true));
+    dispatch((0, _modal.openFeedbackModal)(true));
   };
 
   var cozyBarCustom = function cozyBarCustom(screen) {
@@ -14560,10 +14588,11 @@ var initialState = {
 var profileEcogestureReducer = function profileEcogestureReducer() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
   var action = arguments.length > 1 ? arguments[1] : undefined;
+  if (action.payload == undefined) return state;
 
   switch (action.type) {
-    case _profileEcogesture.UPDATE_PROFILEECOGESTURE:
-    case _profileEcogesture.CREATE_NEW_PROFILEECOGESTURE:
+    case _profileEcogesture.UPDATE_PROFILE_ECOGESTURE:
+    case _profileEcogesture.CREATE_NEW_PROFILE_ECOGESTURE:
       return _objectSpread(_objectSpread({}, state), action.payload);
 
     default:
@@ -18429,24 +18458,27 @@ var initialState = {
 var challengeReducer = function challengeReducer() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
   var action = arguments.length > 1 ? arguments[1] : undefined;
+  if (action.payload == undefined) return state;
+
+  var updateState = function updateState(updates) {
+    return _objectSpread(_objectSpread({}, state), updates);
+  };
 
   switch (action.type) {
     case _challenge.SET_USER_CHALLENGE_LIST:
-      if (action.payload !== undefined) {
+      {
         var filteredCurrentChallenge = action.payload.filter(function (challenge) {
           return challenge.state === _userChallenge.UserChallengeState.ONGOING || challenge.state === _userChallenge.UserChallengeState.DUEL;
         });
-        var currentChallenge = filteredCurrentChallenge[0] ? filteredCurrentChallenge[0] : null;
-        return _objectSpread(_objectSpread({}, state), {}, {
+        var currentChallenge = filteredCurrentChallenge[0] || null;
+        return updateState({
           userChallengeList: action.payload,
           currentChallenge: currentChallenge
         });
-      } else {
-        return state;
       }
 
     case _challenge.UPDATE_USER_CHALLENGE_LIST:
-      if (action.payload !== undefined) {
+      {
         var id = action.payload.id;
 
         var _currentChallenge = action.payload.state === _userChallenge.UserChallengeState.ONGOING || action.payload.state === _userChallenge.UserChallengeState.DUEL ? action.payload : null;
@@ -18456,16 +18488,14 @@ var challengeReducer = function challengeReducer() {
           return challenge.id === id;
         });
         updatedList[findIndex] = action.payload;
-        return _objectSpread(_objectSpread({}, state), {}, {
+        return updateState({
           userChallengeList: updatedList,
-          currentChallenge: _currentChallenge ? _currentChallenge : state.currentChallenge
+          currentChallenge: _currentChallenge || state.currentChallenge
         });
-      } else {
-        return state;
       }
 
     case _challenge.UNLOCK_NEXT_USER_CHALLENGE:
-      if (action.payload !== undefined) {
+      {
         var _id = action.payload.id;
 
         var _updatedList = (0, _toConsumableArray2.default)(state.userChallengeList);
@@ -18482,16 +18512,14 @@ var challengeReducer = function challengeReducer() {
           });
         }
 
-        return _objectSpread(_objectSpread({}, state), {}, {
+        return updateState({
           userChallengeList: _updatedList,
           currentChallenge: null
         });
-      } else {
-        return state;
       }
 
     case _challenge.SET_CHALLENGE_CONSUMPTION:
-      if (action.payload !== undefined) {
+      {
         var _id2 = action.payload.userChallenge.id;
 
         var _updatedList2 = (0, _toConsumableArray2.default)(state.userChallengeList);
@@ -18501,13 +18529,11 @@ var challengeReducer = function challengeReducer() {
         });
 
         _updatedList2[_findIndex2] = action.payload.userChallenge;
-        return _objectSpread(_objectSpread({}, state), {}, {
+        return updateState({
           userChallengeList: _updatedList2,
           currentChallenge: state.currentChallenge && state.currentChallenge.id === action.payload.userChallenge.id ? action.payload.userChallenge : state.currentChallenge,
           currentDataload: action.payload.currentDataload
         });
-      } else {
-        return state;
       }
 
     default:
@@ -18711,10 +18737,9 @@ function updateProfileTypeSuccess(updatedProfileType) {
     type: UPDATE_PROFILETYPE,
     payload: updatedProfileType
   };
-} // eslint-disable-next-line @typescript-eslint/no-explicit-any
-
+}
 
-function updateProfileType(upd) {
+function updateProfileType(updates) {
   return /*#__PURE__*/function () {
     var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(dispatch, getState, _ref) {
       var client, profileTypeEntityService, updatedProfileType;
@@ -18725,7 +18750,7 @@ function updateProfileType(upd) {
               client = _ref.client;
               profileTypeEntityService = new _profileTypeEntity.default(client);
               _context.next = 4;
-              return profileTypeEntityService.updateProfileType(upd);
+              return profileTypeEntityService.updateProfileType(updates);
 
             case 4:
               updatedProfileType = _context.sent;
@@ -18746,10 +18771,9 @@ function updateProfileType(upd) {
       return _ref2.apply(this, arguments);
     };
   }();
-} // eslint-disable-next-line @typescript-eslint/no-explicit-any
-
+}
 
-function newProfileTypeEntry(upd) {
+function newProfileTypeEntry(updates) {
   return /*#__PURE__*/function () {
     var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(dispatch, getState, _ref3) {
       var client, _yield$client$create, newProfileType;
@@ -18760,7 +18784,7 @@ function newProfileTypeEntry(upd) {
             case 0:
               client = _ref3.client;
               _context2.next = 3;
-              return client.create(_doctypes.PROFILETYPE_DOCTYPE, upd);
+              return client.create(_doctypes.PROFILETYPE_DOCTYPE, updates);
 
             case 3:
               _yield$client$create = _context2.sent;
@@ -19396,18 +19420,18 @@ exports.setCurrentIndex = setCurrentIndex;
 exports.setCurrentTimeStep = setCurrentTimeStep;
 exports.setLoading = setLoading;
 exports.setSelectedDate = setSelectedDate;
-var SET_CURRENT_TIMESTEP = 'SET_CURRENT_TIMESTEP';
-exports.SET_CURRENT_TIMESTEP = SET_CURRENT_TIMESTEP;
-var SET_SELECTED_DATE = 'SET_SELECTED_DATE';
-exports.SET_SELECTED_DATE = SET_SELECTED_DATE;
-var SET_CURRENT_INDEX = 'SET_CURRENT_INDEX';
-exports.SET_CURRENT_INDEX = SET_CURRENT_INDEX;
 var SET_CURRENT_DATACHART = 'SET_CURRENT_DATACHART';
 exports.SET_CURRENT_DATACHART = SET_CURRENT_DATACHART;
 var SET_CURRENT_DATACHART_INDEX = 'SET_CURRENT_DATACHART_INDEX';
 exports.SET_CURRENT_DATACHART_INDEX = SET_CURRENT_DATACHART_INDEX;
+var SET_CURRENT_INDEX = 'SET_CURRENT_INDEX';
+exports.SET_CURRENT_INDEX = SET_CURRENT_INDEX;
+var SET_CURRENT_TIMESTEP = 'SET_CURRENT_TIMESTEP';
+exports.SET_CURRENT_TIMESTEP = SET_CURRENT_TIMESTEP;
 var SET_LOADING = 'SET_LOADING';
 exports.SET_LOADING = SET_LOADING;
+var SET_SELECTED_DATE = 'SET_SELECTED_DATE';
+exports.SET_SELECTED_DATE = SET_SELECTED_DATE;
 
 function setSelectedDate(date) {
   return {
@@ -20003,19 +20027,15 @@ var Content = function Content(_ref) {
   var dispatch = (0, _reactRedux.useDispatch)();
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
-  }),
-      screenType = _useSelector.screenType;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.modal;
+    return state.ecolyo;
   }),
-      isFeedbacksOpen = _useSelector2.isFeedbacksOpen;
+      screenType = _useSelector.global.screenType,
+      isFeedbacksOpen = _useSelector.modal.isFeedbacksOpen;
 
   var cozyBarHeight = 48;
   var cozyNavHeight = 56;
   var handleFeedbackModalClose = (0, _react.useCallback)(function () {
-    dispatch((0, _modal.updateModalIsFeedbacksOpen)(false));
+    dispatch((0, _modal.openFeedbackModal)(false));
   }, [dispatch]); // Set listeners for scroll
 
   (0, _react.useEffect)(function () {
@@ -22266,10 +22286,11 @@ var initialState = {
     description: '',
     endDate: ''
   },
-  openPartnersIssueModal: {
-    enedis: false,
-    egl: false,
-    grdf: false
+  partnersInfo: {
+    egl_failure: false,
+    enedis_failure: false,
+    grdf_failure: false,
+    notification_activated: false
   },
   shouldRefreshConsent: false,
   sgeConnect: {
@@ -22300,84 +22321,84 @@ var getFluidTypesFromStatus = function getFluidTypesFromStatus(fluidStatus) {
 var globalReducer = function globalReducer() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
   var action = arguments.length > 1 ? arguments[1] : undefined;
+  if (action.payload == undefined) return state;
+
+  var updateState = function updateState(updates) {
+    return _objectSpread(_objectSpread({}, state), updates);
+  };
 
   switch (action.type) {
     case _global.CHANGE_SCREEN_TYPE:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         screenType: action.payload
-      }) : state;
+      });
 
     case _global.TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         challengeExplorationNotification: action.payload
-      }) : state;
+      });
 
     case _global.TOGGLE_CHALLENGE_ACTION_NOTIFICATION:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         challengeActionNotification: action.payload
-      }) : state;
+      });
 
     case _global.TOGGLE_CHALLENGE_DUEL_NOTIFICATION:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         challengeDuelNotification: action.payload
-      }) : state;
+      });
 
     case _global.TOGGLE_ANALYSIS_NOTIFICATION:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         analysisNotification: action.payload
-      }) : state;
+      });
 
     case _global.SET_FLUID_STATUS:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         fluidStatus: action.payload,
         fluidTypes: getFluidTypesFromStatus(action.payload)
-      }) : state;
+      });
 
     case _global.UPDATE_TERMS_VALIDATION:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         termsStatus: action.payload
-      }) : state;
+      });
 
     case _global.SHOW_RELEASE_NOTES:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         releaseNotes: action.payload
-      }) : state;
+      });
 
-    case _global.SET_PARTNERS_ISSUE:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
-        openPartnersIssueModal: action.payload
-      }) : state;
+    case _global.SET_PARTNERS_INFO:
+      return updateState({
+        partnersInfo: action.payload
+      });
 
     case _global.SET_CUSTOM_POPUP:
-      return _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         customPopupModal: action.payload
       });
 
     case _global.SET_SHOULD_REFRESH_CONSENT:
-      return action.payload != undefined ? _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         shouldRefreshConsent: action.payload
-      }) : state;
+      });
 
     case _global.UPDATE_FLUID_CONNECTION:
-      if (action.payload !== undefined) {
-        var updatedFluidStatus = (0, _toConsumableArray2.default)(state.fluidStatus);
-        var fluidType = action.payload.fluidType;
-        var findIndex = state.fluidStatus.findIndex(function (fluid) {
-          return fluid.fluidType === fluidType;
-        });
-        updatedFluidStatus[findIndex].connection = action.payload.fluidConnection;
-        return _objectSpread(_objectSpread({}, state), {}, {
-          fluidStatus: updatedFluidStatus
-        });
-      } else {
-        return state;
-      }
+      var updatedFluidStatus = (0, _toConsumableArray2.default)(state.fluidStatus);
+      var fluidType = action.payload.fluidType;
+      var findIndex = state.fluidStatus.findIndex(function (fluid) {
+        return fluid.fluidType === fluidType;
+      });
+      updatedFluidStatus[findIndex].connection = action.payload.fluidConnection;
+      return _objectSpread(_objectSpread({}, state), {}, {
+        fluidStatus: updatedFluidStatus
+      });
 
     case _global.UPDATE_SGE_CONNECT:
-      if (action.payload != undefined) return _objectSpread(_objectSpread({}, state), {}, {
+      return updateState({
         sgeConnect: action.payload
       });
-      return state;
 
     default:
       return state;
@@ -22806,7 +22827,7 @@ var _interopRequireDefault = __webpack_require__("TqRt");
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.UPDATE_PROFILEECOGESTURE = exports.CREATE_NEW_PROFILEECOGESTURE = void 0;
+exports.UPDATE_PROFILE_ECOGESTURE = exports.CREATE_NEW_PROFILE_ECOGESTURE = void 0;
 exports.newProfileEcogestureEntry = newProfileEcogestureEntry;
 exports.updateProfileEcogesture = updateProfileEcogesture;
 exports.updateProfileEcogestureSuccess = updateProfileEcogestureSuccess;
@@ -22819,20 +22840,20 @@ var _comGrandlyonEcolyoProfileecogesture = __webpack_require__("fGnb");
 
 var _profileEcogesture = _interopRequireDefault(__webpack_require__("4iQs"));
 
-var UPDATE_PROFILEECOGESTURE = 'UPDATE_PROFILEECOGESTURE';
-exports.UPDATE_PROFILEECOGESTURE = UPDATE_PROFILEECOGESTURE;
-var CREATE_NEW_PROFILEECOGESTURE = 'CREATE_NEW_PROFILEECOGESTURE';
-exports.CREATE_NEW_PROFILEECOGESTURE = CREATE_NEW_PROFILEECOGESTURE;
+// TODO never used ?
+var CREATE_NEW_PROFILE_ECOGESTURE = 'CREATE_NEW_PROFILE_ECOGESTURE';
+exports.CREATE_NEW_PROFILE_ECOGESTURE = CREATE_NEW_PROFILE_ECOGESTURE;
+var UPDATE_PROFILE_ECOGESTURE = 'UPDATE_PROFILE_ECOGESTURE';
+exports.UPDATE_PROFILE_ECOGESTURE = UPDATE_PROFILE_ECOGESTURE;
 
 function updateProfileEcogestureSuccess(updatedProfileEcogesture) {
   return {
-    type: UPDATE_PROFILEECOGESTURE,
+    type: UPDATE_PROFILE_ECOGESTURE,
     payload: updatedProfileEcogesture
   };
-} // eslint-disable-next-line @typescript-eslint/no-explicit-any
-
+}
 
-function updateProfileEcogesture(upd) {
+function updateProfileEcogesture(updates) {
   return /*#__PURE__*/function () {
     var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(dispatch, getState, _ref) {
       var client, profileEcogestureService, updatedProfileEcogesture;
@@ -22843,7 +22864,7 @@ function updateProfileEcogesture(upd) {
               client = _ref.client;
               profileEcogestureService = new _profileEcogesture.default(client);
               _context.next = 4;
-              return profileEcogestureService.updateProfileEcogesture(upd);
+              return profileEcogestureService.updateProfileEcogesture(updates);
 
             case 4:
               updatedProfileEcogesture = _context.sent;
@@ -22866,7 +22887,7 @@ function updateProfileEcogesture(upd) {
   }();
 }
 
-function newProfileEcogestureEntry(upd) {
+function newProfileEcogestureEntry(updates) {
   return /*#__PURE__*/function () {
     var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(dispatch, getState, _ref3) {
       var client, _yield$client$create, newProfileEcogesture;
@@ -22877,7 +22898,7 @@ function newProfileEcogestureEntry(upd) {
             case 0:
               client = _ref3.client;
               _context2.next = 3;
-              return client.create(_comGrandlyonEcolyoProfileecogesture.PROFILEECOGESTURE_DOCTYPE, upd);
+              return client.create(_comGrandlyonEcolyoProfileecogesture.PROFILEECOGESTURE_DOCTYPE, updates);
 
             case 3:
               _yield$client$create = _context2.sent;
@@ -24192,11 +24213,11 @@ exports.getTodayDate = getTodayDate;
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.UPDATE_TERMS_VALIDATION = exports.UPDATE_SGE_CONNECT = exports.UPDATE_FLUID_CONNECTION = exports.TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION = exports.TOGGLE_CHALLENGE_DUEL_NOTIFICATION = exports.TOGGLE_CHALLENGE_ACTION_NOTIFICATION = exports.TOGGLE_ANALYSIS_NOTIFICATION = exports.SHOW_RELEASE_NOTES = exports.SET_SHOULD_REFRESH_CONSENT = exports.SET_PARTNERS_ISSUE = exports.SET_FLUID_STATUS = exports.SET_CUSTOM_POPUP = exports.CHANGE_SCREEN_TYPE = void 0;
+exports.UPDATE_TERMS_VALIDATION = exports.UPDATE_SGE_CONNECT = exports.UPDATE_FLUID_CONNECTION = exports.TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION = exports.TOGGLE_CHALLENGE_DUEL_NOTIFICATION = exports.TOGGLE_CHALLENGE_ACTION_NOTIFICATION = exports.TOGGLE_ANALYSIS_NOTIFICATION = exports.SHOW_RELEASE_NOTES = exports.SET_SHOULD_REFRESH_CONSENT = exports.SET_PARTNERS_INFO = exports.SET_FLUID_STATUS = exports.SET_CUSTOM_POPUP = exports.CHANGE_SCREEN_TYPE = void 0;
 exports.changeScreenType = changeScreenType;
 exports.setCustomPopup = setCustomPopup;
 exports.setFluidStatus = setFluidStatus;
-exports.setPartnersIssue = setPartnersIssue;
+exports.setPartnersInfo = setPartnersInfo;
 exports.setShouldRefreshConsent = setShouldRefreshConsent;
 exports.showReleaseNotes = showReleaseNotes;
 exports.toggleAnalysisNotification = toggleAnalysisNotification;
@@ -24208,30 +24229,30 @@ exports.updateTermValidation = updateTermValidation;
 exports.updatedFluidConnection = updatedFluidConnection;
 var CHANGE_SCREEN_TYPE = 'CHANGE_SCREEN_TYPE';
 exports.CHANGE_SCREEN_TYPE = CHANGE_SCREEN_TYPE;
+var SET_CUSTOM_POPUP = 'SET_CUSTOM_POPUP';
+exports.SET_CUSTOM_POPUP = SET_CUSTOM_POPUP;
+var SET_FLUID_STATUS = 'SET_FLUID_STATUS';
+exports.SET_FLUID_STATUS = SET_FLUID_STATUS;
+var SET_PARTNERS_INFO = 'SET_PARTNERS_INFO';
+exports.SET_PARTNERS_INFO = SET_PARTNERS_INFO;
+var SET_SHOULD_REFRESH_CONSENT = 'SET_SHOULD_REFRESH_CONSENT';
+exports.SET_SHOULD_REFRESH_CONSENT = SET_SHOULD_REFRESH_CONSENT;
 var SHOW_RELEASE_NOTES = 'SHOW_RELEASE_NOTES';
 exports.SHOW_RELEASE_NOTES = SHOW_RELEASE_NOTES;
-var TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION = 'TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION';
-exports.TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION = TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION;
+var TOGGLE_ANALYSIS_NOTIFICATION = 'TOGGLE_ANALYSIS_NOTIFICATION';
+exports.TOGGLE_ANALYSIS_NOTIFICATION = TOGGLE_ANALYSIS_NOTIFICATION;
 var TOGGLE_CHALLENGE_ACTION_NOTIFICATION = 'TOGGLE_CHALLENGE_ACTION_NOTIFICATION';
 exports.TOGGLE_CHALLENGE_ACTION_NOTIFICATION = TOGGLE_CHALLENGE_ACTION_NOTIFICATION;
 var TOGGLE_CHALLENGE_DUEL_NOTIFICATION = 'TOGGLE_CHALLENGE_DUEL_NOTIFICATION';
 exports.TOGGLE_CHALLENGE_DUEL_NOTIFICATION = TOGGLE_CHALLENGE_DUEL_NOTIFICATION;
-var TOGGLE_ANALYSIS_NOTIFICATION = 'TOGGLE_ANALYSIS_NOTIFICATION';
-exports.TOGGLE_ANALYSIS_NOTIFICATION = TOGGLE_ANALYSIS_NOTIFICATION;
-var SET_FLUID_STATUS = 'SET_FLUID_STATUS';
-exports.SET_FLUID_STATUS = SET_FLUID_STATUS;
+var TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION = 'TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION';
+exports.TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION = TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION;
 var UPDATE_FLUID_CONNECTION = 'UPDATE_FLUID_CONNECTION';
 exports.UPDATE_FLUID_CONNECTION = UPDATE_FLUID_CONNECTION;
-var UPDATE_TERMS_VALIDATION = 'UPDATE_TERMS_VALIDATION';
-exports.UPDATE_TERMS_VALIDATION = UPDATE_TERMS_VALIDATION;
-var SET_PARTNERS_ISSUE = 'SET_PARTNERS_ISSUE';
-exports.SET_PARTNERS_ISSUE = SET_PARTNERS_ISSUE;
-var SET_CUSTOM_POPUP = 'SET_CUSTOM_POPUP';
-exports.SET_CUSTOM_POPUP = SET_CUSTOM_POPUP;
-var SET_SHOULD_REFRESH_CONSENT = 'SET_SHOULD_REFRESH_CONSENT';
-exports.SET_SHOULD_REFRESH_CONSENT = SET_SHOULD_REFRESH_CONSENT;
 var UPDATE_SGE_CONNECT = 'UPDATE_SGE_CONNECT';
 exports.UPDATE_SGE_CONNECT = UPDATE_SGE_CONNECT;
+var UPDATE_TERMS_VALIDATION = 'UPDATE_TERMS_VALIDATION';
+exports.UPDATE_TERMS_VALIDATION = UPDATE_TERMS_VALIDATION;
 
 function changeScreenType(screenType) {
   return {
@@ -24251,31 +24272,31 @@ function showReleaseNotes(show, notes, redirectLink) {
   };
 }
 
-function toggleChallengeExplorationNotification(notif) {
+function toggleChallengeExplorationNotification(notification) {
   return {
     type: TOGGLE_CHALLENGE_EXPLORATION_NOTIFICATION,
-    payload: notif
+    payload: notification
   };
 }
 
-function toggleChallengeActionNotification(notif) {
+function toggleChallengeActionNotification(notification) {
   return {
     type: TOGGLE_CHALLENGE_ACTION_NOTIFICATION,
-    payload: notif
+    payload: notification
   };
 }
 
-function toggleChallengeDuelNotification(notif) {
+function toggleChallengeDuelNotification(notification) {
   return {
     type: TOGGLE_CHALLENGE_DUEL_NOTIFICATION,
-    payload: notif
+    payload: notification
   };
 }
 
-function toggleAnalysisNotification(notif) {
+function toggleAnalysisNotification(notification) {
   return {
     type: TOGGLE_ANALYSIS_NOTIFICATION,
-    payload: notif
+    payload: notification
   };
 }
 
@@ -24303,10 +24324,10 @@ function updateTermValidation(termsStatus) {
   };
 }
 
-function setPartnersIssue(openPartnersIssueModal) {
+function setPartnersInfo(partnersInfo) {
   return {
-    type: SET_PARTNERS_ISSUE,
-    payload: openPartnersIssueModal
+    type: SET_PARTNERS_INFO,
+    payload: partnersInfo
   };
 }
 
@@ -24502,13 +24523,11 @@ var EcogestureFormView = function EcogestureFormView() {
   };
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
+    return state.ecolyo;
   }),
-      isProfileTypeCompleted = _useSelector.isProfileTypeCompleted;
+      isProfileTypeCompleted = _useSelector.profile.isProfileTypeCompleted,
+      curProfileEcogesture = _useSelector.profileEcogesture;
 
-  var curProfileEcogesture = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profileEcogesture;
-  });
   var shouldOpenModal = new URLSearchParams((0, _reactRouterDom.useLocation)().search).get('modal');
 
   var _useState3 = (0, _react.useState)(_ecogestureForm.EcogestureStepForm.HEATING_TYPE),
@@ -25191,9 +25210,10 @@ var ProfileTypeFinished = function ProfileTypeFinished(_ref) {
   var client = (0, _cozyClient.useClient)();
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.challenge;
+    return state.ecolyo;
   }),
-      currentChallenge = _useSelector.currentChallenge;
+      currentChallenge = _useSelector.challenge.currentChallenge,
+      profile = _useSelector.profile;
 
   var handleClick = function handleClick() {
     if ((location === null || location === void 0 ? void 0 : location.pathname) === '/ecogesture-form') {
@@ -25212,9 +25232,6 @@ var ProfileTypeFinished = function ProfileTypeFinished(_ref) {
       _useExploration2 = (0, _slicedToArray2.default)(_useExploration, 2),
       setValidExploration = _useExploration2[1];
 
-  var profile = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  });
   (0, _react2.useEffect)(function () {
     function checkForExistingProfileType() {
       return _checkForExistingProfileType.apply(this, arguments);
@@ -25980,7 +25997,7 @@ var Header = function Header(_ref) {
   }, [backFunction, navigate]);
 
   var handleClickFeedbacks = function handleClickFeedbacks() {
-    dispatch((0, _modal.updateModalIsFeedbacksOpen)(true));
+    dispatch((0, _modal.openFeedbackModal)(true));
   };
 
   (0, _react.useEffect)(function () {
@@ -27316,9 +27333,8 @@ var _interopRequireDefault = __webpack_require__("TqRt");
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.UPDATE_PROFILE = exports.SET_FIRST_CONNECTION = void 0;
+exports.UPDATE_PROFILE = void 0;
 exports.updateProfile = updateProfile;
-exports.updateProfileSuccess = updateProfileSuccess;
 
 var _regenerator = _interopRequireDefault(__webpack_require__("o0o1"));
 
@@ -27328,18 +27344,15 @@ var _profile = _interopRequireDefault(__webpack_require__("2l2O"));
 
 var UPDATE_PROFILE = 'UPDATE_PROFILE';
 exports.UPDATE_PROFILE = UPDATE_PROFILE;
-var SET_FIRST_CONNECTION = 'SET_FIRST_CONNECTION';
-exports.SET_FIRST_CONNECTION = SET_FIRST_CONNECTION;
 
 function updateProfileSuccess(updatedProfile) {
   return {
     type: UPDATE_PROFILE,
     payload: updatedProfile
   };
-} // eslint-disable-next-line @typescript-eslint/no-explicit-any
-
+}
 
-function updateProfile(upd) {
+function updateProfile(updates) {
   return /*#__PURE__*/function () {
     var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(dispatch, getState, _ref) {
       var client, profileService, updatedProfile;
@@ -27350,7 +27363,7 @@ function updateProfile(upd) {
               client = _ref.client;
               profileService = new _profile.default(client);
               _context.next = 4;
-              return profileService.updateProfile(upd);
+              return profileService.updateProfile(updates);
 
             case 4:
               updatedProfile = _context.sent;
@@ -30013,18 +30026,28 @@ module.exports = JSON.parse("[{\"_id\":\"QUIZ001\",\"questions\":[{\"questionLab
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.UPDATE_MODAL_ISFEEDBACKSOPEN = void 0;
-exports.updateModalIsFeedbacksOpen = updateModalIsFeedbacksOpen;
-var UPDATE_MODAL_ISFEEDBACKSOPEN = 'UPDATE_MODAL_ISFEEDBACKSOPEN';
-exports.UPDATE_MODAL_ISFEEDBACKSOPEN = UPDATE_MODAL_ISFEEDBACKSOPEN;
+exports.OPEN_PARTNERS_MODAL = exports.OPEN_FEEDBACK_MODAL = void 0;
+exports.openFeedbackModal = openFeedbackModal;
+exports.openPartnersModal = openPartnersModal;
+var OPEN_PARTNERS_MODAL = 'OPEN_PARTNERS_ISSUE';
+exports.OPEN_PARTNERS_MODAL = OPEN_PARTNERS_MODAL;
+var OPEN_FEEDBACK_MODAL = 'OPEN_FEEDBACK_MODAL';
+exports.OPEN_FEEDBACK_MODAL = OPEN_FEEDBACK_MODAL;
 
-function updateModalIsFeedbacksOpen(isOpen) {
+function openFeedbackModal(isOpen) {
   return {
-    type: UPDATE_MODAL_ISFEEDBACKSOPEN,
+    type: OPEN_FEEDBACK_MODAL,
     payload: isOpen
   };
 }
 
+function openPartnersModal(openPartnersModal) {
+  return {
+    type: OPEN_PARTNERS_MODAL,
+    payload: openPartnersModal
+  };
+}
+
 /***/ }),
 
 /***/ "lrcb":
@@ -31183,15 +31206,12 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
 function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 var ProfileTypeView = function ProfileTypeView() {
-  var profile = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  });
-  var curProfileType = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profileType;
-  });
-  var curProfileEcogesture = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profileEcogesture;
-  });
+  var _useSelector = (0, _reactRedux.useSelector)(function (state) {
+    return state.ecolyo;
+  }),
+      profile = _useSelector.profile,
+      curProfileType = _useSelector.profileType,
+      curProfileEcogesture = _useSelector.profileEcogesture;
 
   var _useState = (0, _react.useState)(0),
       _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -33140,14 +33160,10 @@ var ActionList = function ActionList(_ref) {
   var client = (0, _cozyClient.useClient)();
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  }),
-      isProfileTypeCompleted = _useSelector.isProfileTypeCompleted;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
+    return state.ecolyo;
   }),
-      fluidTypes = _useSelector2.fluidTypes;
+      fluidTypes = _useSelector.global.fluidTypes,
+      isProfileTypeCompleted = _useSelector.profile.isProfileTypeCompleted;
 
   var _useState = (0, _react.useState)(),
       _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -34483,14 +34499,10 @@ var App = function App(_ref) {
   var location = (0, _reactRouterDom.useLocation)();
 
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.profile;
-  }),
-      onboarding = _useSelector.onboarding;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
+    return state.ecolyo;
   }),
-      termsStatus = _useSelector2.termsStatus;
+      termsStatus = _useSelector.global.termsStatus,
+      onboarding = _useSelector.profile.onboarding;
 
   (0, _react.useEffect)(function () {
     tracker === null || tracker === void 0 ? void 0 : tracker.track(location);
@@ -35716,12 +35728,8 @@ var ChallengeCardUnlocked = function ChallengeCardUnlocked(_ref) {
   var _useSelector = (0, _reactRedux.useSelector)(function (state) {
     return state.ecolyo.global;
   }),
-      fluidTypes = _useSelector.fluidTypes;
-
-  var _useSelector2 = (0, _reactRedux.useSelector)(function (state) {
-    return state.ecolyo.global;
-  }),
-      fluidStatus = _useSelector2.fluidStatus;
+      fluidTypes = _useSelector.fluidTypes,
+      fluidStatus = _useSelector.fluidStatus;
 
   var _useState3 = (0, _react.useState)(_challengeLocked.default),
       _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
@@ -38618,7 +38626,7 @@ var InitializationService = /*#__PURE__*/function () {
 
                 return _context10.abrupt("return", {
                   monthlyAnalysisDate: actualAnalysisDate,
-                  haveSeenLastAnalysis: profile.isFirstConnection ? true : false
+                  haveSeenLastAnalysis: profile.isFirstConnection
                 });
 
               case 8:
@@ -39073,18 +39081,32 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
 function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
 
 var initialState = {
-  isFeedbacksOpen: false
+  isFeedbacksOpen: false,
+  partnersIssueModal: {
+    enedis: false,
+    egl: false,
+    grdf: false
+  }
 };
 
 var modalReducer = function modalReducer() {
   var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
   var action = arguments.length > 1 ? arguments[1] : undefined;
+  if (action.payload == undefined) return state;
+
+  var updateState = function updateState(updates) {
+    return _objectSpread(_objectSpread({}, state), updates);
+  };
 
   switch (action.type) {
-    case _modal.UPDATE_MODAL_ISFEEDBACKSOPEN:
-      var isOpen = action.payload != undefined ? action.payload : state.isFeedbacksOpen;
-      return _objectSpread(_objectSpread({}, state), {}, {
-        isFeedbacksOpen: isOpen
+    case _modal.OPEN_FEEDBACK_MODAL:
+      return updateState({
+        isFeedbacksOpen: action.payload
+      });
+
+    case _modal.OPEN_PARTNERS_MODAL:
+      return updateState({
+        partnersIssueModal: action.payload
       });
 
     default:
diff --git a/apple-touch-icon-retina.png b/apple-touch-icon-retina.png
deleted file mode 100644
index 659c6a53916e7cdc5647d0b6ca5d0411cfb4fb3f..0000000000000000000000000000000000000000
Binary files a/apple-touch-icon-retina.png and /dev/null differ
diff --git a/cover.png b/cover.png
deleted file mode 100644
index ba57a0e8e13a24699c0430771d128f8357636879..0000000000000000000000000000000000000000
Binary files a/cover.png and /dev/null differ
diff --git a/index.html b/index.html
index 2489c1d0218a5d51b4f78f92faa3b28ba244ca57..11d0040a6938c850d93c8db6515012501f6f7671 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-retina.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.35f915516b9585855081.js"></script><script src="app/ecolyo.c6f769f46df3b9432805.js"></script></div></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.35f915516b9585855081.js"></script><script src="app/ecolyo.50adf68b820b9d0f117e.js"></script></div></body></html>
\ No newline at end of file
diff --git a/serviceWorker.js b/serviceWorker.js
index 51dc9b97b60f013203eabb07d760dfee02265eca..56ef4139d3b2da46f0f3d494deb1f2cb099e6599 100644
--- a/serviceWorker.js
+++ b/serviceWorker.js
@@ -28,6 +28,19 @@ self.addEventListener('fetch', event => {
   )
 })
 
+let deferredPrompt
+self.addEventListener('beforeinstallprompt', e => {
+  // Prevents the default mini-infobar or install dialog from appearing on mobile
+  e.preventDefault()
+  // Save the event because you'll need to trigger it later.
+  deferredPrompt = e
+  // Show your customized install prompt for your PWA
+  // Your own UI doesn't have to be a single element, you
+  // can have buttons in different locations, or wait to prompt
+  // as part of a critical journey.
+  showInAppInstallPromotion()
+})
+
 // Activate the SW
 self.addEventListener('activate', event => {
   const cacheWhitelist = []