diff --git a/.eslintrc.js b/.eslintrc.js
index 4d604c901b60280cffb38ec3f550d01b84bbda2f..ecbdf8bed73adb95b3afc85268186afbfa9439dd 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -29,6 +29,8 @@ module.exports = {
     'no-console': 'off',
     '@typescript-eslint/no-explicit-any': 'warn',
     '@typescript-eslint/prefer-optional-chain': 'warn',
+    'no-param-reassign': 'warn',
+    'spaced-comment': ['error', 'always', { block: { exceptions: ['*'] } }],
     'react/self-closing-comp': 'warn',
   },
   settings: {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b70b92acddf829659d039b71f60d6bb2612e0dc7..fb7b6acd06e5b2c2d6e07290a748facf7ef6cbdc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,21 @@
 
 All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
 
+### [2.2.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.2.1...v2.2.2) (2023-02-09)
+
+
+### Bug Fixes
+
+* **mail:** update assets ([2e71f40](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e71f40122a0fa13564c692313ecbd2125c6b682))
+* user statistics ([0cd23c6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0cd23c6ec0c528e35751311dc914ce3efe538554))
+
+### [2.2.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.2.0...v2.2.1) (2023-02-03)
+
+
+### Bug Fixes
+
+* **alert:** partners date error on empty profiles ([0d9a71d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0d9a71db99229c6d5e2241b73bdda077cabdce00))
+
 ## [2.2.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.1.1...v2.2.0) (2023-02-02)
 
 
diff --git a/app.config.environment.dev.js b/app.config.environment.dev.js
index 8cb7804264915ccc335702a63d7e3a7f60c1786b..120aa2a2de67d54d8631f0eddd1dfe898241a24d 100644
--- a/app.config.environment.dev.js
+++ b/app.config.environment.dev.js
@@ -21,8 +21,8 @@ const stackProvidedLibsConfig = {
       __IS_ALPHA__: true,
       __DEVELOPMENT__: true,
       __STACK_ASSETS__: true,
-      __PIWIK_TRACKER_URL__: JSON.stringify('http://localhost:9800/'),
-      __PIWIK_SITEID__: 1,
+      __PIWIK_TRACKER_URL__: JSON.stringify('https://statweb.grandlyon.com/'),
+      __PIWIK_SITEID__: 117,
       __SAU_LINK__: JSON.stringify(
         'https://portail-citoyen-sau.guichet-recette.grandlyon.com/ecolyo/'
       ),
diff --git a/manifest.webapp b/manifest.webapp
index eaeab1937304309e0f912ef98383f67d8d7ab74f..322fc31aa73bfa798d7250b8b069ad8697d0425b 100644
--- a/manifest.webapp
+++ b/manifest.webapp
@@ -3,7 +3,7 @@
   "slug": "ecolyo",
   "icon": "icon.svg",
   "categories": ["energy"],
-  "version": "2.2.0",
+  "version": "2.2.2",
   "licence": "AGPL-3.0",
   "editor": "Métropole de Lyon",
   "default_locale": "fr",
diff --git a/package.json b/package.json
index d255cc3d092a76997b66e65161edab158546f58f..cd63cb5c7d137fdf0c7020dea2a4e5781abad39b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ecolyo",
-  "version": "2.2.0",
+  "version": "2.2.2",
   "scripts": {
     "build": "yarn run build:css && yarn run build:browser",
     "build:browser": "cs build --browser ",
@@ -15,7 +15,7 @@
     "deploy-dev": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-dev}",
     "deploy-test": "git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-test}",
     "lint": "yarn lint:js",
-    "lint:js": "cs lint {src,test}/**/*.{js,jsx,ts,tsx} --fix",
+    "lint:js": "eslint src -c .eslintrc.js --fix",
     "load-data": "cd test && importData.bat",
     "prebuild": "yarn lint",
     "prepare": "husky install",
@@ -49,7 +49,6 @@
     "@sentry/react": "^7.21.1",
     "@sentry/tracing": "^7.21.1",
     "@simbathesailor/use-what-changed": "^2.0.0",
-    "axios": "^0.27.0",
     "cozy-bar": "8.9.2",
     "cozy-client": "34.7.1",
     "cozy-device-helper": ">=2.1.0",
@@ -63,7 +62,6 @@
     "cozy-ui": "79.3.0",
     "d3": "^6.0.0",
     "detect-browser": "^5.1.1",
-    "eslint-config-cozy-app": "5.1.0",
     "file-saver": "^2.0.5",
     "global": "^4.4.0",
     "handlebars": "^4.7.7",
@@ -88,6 +86,7 @@
     "@types/d3": "^6.0.0",
     "@types/enzyme": "^3.10.8",
     "@types/file-saver": "^2.0.5",
+    "@types/history": "^5.0.0",
     "@types/jest": "^29.0.0",
     "@types/lodash": "^4.14.149",
     "@types/luxon": "^3.0.0",
@@ -101,6 +100,7 @@
     "@types/redux-mock-store": "^1.0.2",
     "@typescript-eslint/eslint-plugin": "^5.37.0",
     "@typescript-eslint/parser": "^5.37.0",
+    "axios": "^1.3.0",
     "babel-polyfill": "^6.26.0",
     "babel-preset-cozy-app": "2.0.3",
     "copy-webpack-plugin": "6.4.1",
diff --git a/src/assets/icons/email/desktop.png b/src/assets/icons/email/desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..98f561e6cd13c04ad5cb664055d1923a60a59472
Binary files /dev/null and b/src/assets/icons/email/desktop.png differ
diff --git a/src/assets/icons/email/dot.svg b/src/assets/icons/email/dot.svg
new file mode 100644
index 0000000000000000000000000000000000000000..10e779f09c268d43884d2cc154b7993da51cecd4
--- /dev/null
+++ b/src/assets/icons/email/dot.svg
@@ -0,0 +1,7 @@
+<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.5" y="1.47879" width="23" height="23" rx="2.5" fill="#1B1C22"/>
+<circle cx="12" cy="6.97879" r="2" fill="#A0A0A0"/>
+<circle cx="12" cy="12.9788" r="2" fill="#A0A0A0"/>
+<circle cx="12" cy="18.9788" r="2" fill="#A0A0A0"/>
+<rect x="0.5" y="1.47879" width="23" height="23" rx="2.5" stroke="#A0A0A0"/>
+</svg>
diff --git a/src/assets/icons/email/feedback.png b/src/assets/icons/email/feedback.png
deleted file mode 100644
index 9ff4045b26edadccd52d1600922dd0ffec723d00..0000000000000000000000000000000000000000
Binary files a/src/assets/icons/email/feedback.png and /dev/null differ
diff --git a/src/assets/icons/email/feedback.svg b/src/assets/icons/email/feedback.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ea49553d6dcf6a9300cbeabbf92ceacd897e3b9f
--- /dev/null
+++ b/src/assets/icons/email/feedback.svg
@@ -0,0 +1,4 @@
+<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="16" cy="16" r="14.5526" stroke="white"/>
+<path d="M12.7203 11.6815C12.914 11.5106 13.1247 11.3483 13.3525 11.1945C13.5861 11.0408 13.8367 10.9069 14.1044 10.793C14.3721 10.6791 14.6625 10.5908 14.9758 10.5281C15.289 10.4598 15.6279 10.4256 15.9925 10.4256C16.488 10.4256 16.9379 10.494 17.3423 10.6307C17.7524 10.7674 18.1027 10.9639 18.3931 11.2202C18.6836 11.4708 18.9086 11.7755 19.0681 12.1343C19.2276 12.4931 19.3073 12.8947 19.3073 13.3389C19.3073 13.7718 19.2446 14.1477 19.1193 14.4666C18.994 14.7799 18.8346 15.0533 18.6409 15.2868C18.453 15.5203 18.2479 15.7225 18.0258 15.8934C17.8037 16.0643 17.5929 16.2266 17.3936 16.3804C17.1942 16.5285 17.0205 16.6765 16.8724 16.8246C16.73 16.967 16.6446 17.1293 16.6161 17.3116L16.4196 18.5589H14.9758L14.8306 17.1664C14.8249 17.1379 14.822 17.1151 14.822 17.098C14.822 17.0752 14.822 17.0496 14.822 17.0211C14.822 16.7705 14.8847 16.5541 15.01 16.3718C15.1353 16.1839 15.2919 16.0102 15.4799 15.8507C15.6678 15.6855 15.87 15.526 16.0864 15.3722C16.3029 15.2185 16.5051 15.0533 16.693 14.8767C16.881 14.6945 17.0376 14.4894 17.1629 14.2616C17.2882 14.0338 17.3509 13.7661 17.3509 13.4585C17.3509 13.2535 17.311 13.0712 17.2312 12.9118C17.1572 12.7466 17.0518 12.607 16.9151 12.4931C16.7784 12.3735 16.6133 12.2824 16.4196 12.2197C16.2317 12.1571 16.0266 12.1258 15.8045 12.1258C15.4799 12.1258 15.2036 12.1628 14.9758 12.2368C14.7537 12.3052 14.5629 12.3849 14.4034 12.476C14.2496 12.5615 14.1186 12.6412 14.0104 12.7153C13.9022 12.7836 13.8053 12.8178 13.7199 12.8178C13.5149 12.8178 13.3668 12.7323 13.2757 12.5615L12.7203 11.6815ZM14.335 21.7542C14.335 21.5776 14.3664 21.4096 14.429 21.2501C14.4974 21.0906 14.5885 20.9539 14.7024 20.84C14.822 20.7261 14.9616 20.635 15.121 20.5666C15.2805 20.4983 15.4514 20.4641 15.6336 20.4641C15.8102 20.4641 15.9782 20.4983 16.1377 20.5666C16.2972 20.635 16.4339 20.7261 16.5478 20.84C16.6617 20.9539 16.7528 21.0906 16.8212 21.2501C16.8895 21.4096 16.9237 21.5776 16.9237 21.7542C16.9237 21.9364 16.8895 22.1073 16.8212 22.2668C16.7528 22.4205 16.6617 22.5544 16.5478 22.6683C16.4339 22.7822 16.2972 22.8705 16.1377 22.9331C15.9782 23.0015 15.8102 23.0357 15.6336 23.0357C15.4514 23.0357 15.2805 23.0015 15.121 22.9331C14.9616 22.8705 14.822 22.7822 14.7024 22.6683C14.5885 22.5544 14.4974 22.4205 14.429 22.2668C14.3664 22.1073 14.335 21.9364 14.335 21.7542Z" fill="white"/>
+</svg>
diff --git a/src/assets/icons/email/menu.svg b/src/assets/icons/email/menu.svg
deleted file mode 100644
index 2dc3df8d6029ada788a5b3dca7a07b4b2ed4d7b0..0000000000000000000000000000000000000000
--- a/src/assets/icons/email/menu.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg width="4" height="20" viewBox="0 0 4 20" fill="none" xmlns="http://www.w3.org/2000/svg">
-<circle cx="2" cy="2" r="2" fill="#C4C4C4"/>
-<circle cx="2" cy="10" r="2" fill="#C4C4C4"/>
-<circle cx="2" cy="18" r="2" fill="#C4C4C4"/>
-</svg>
diff --git a/src/assets/icons/email/share.svg b/src/assets/icons/email/share.svg
index 61d74d78a2d9e421b20f96ad841269b99bca14ef..7e0e4f861230263d9f6a8dd3b1fe954de4b1c3ba 100644
--- a/src/assets/icons/email/share.svg
+++ b/src/assets/icons/email/share.svg
@@ -1,5 +1,7 @@
-<svg width="16" height="27" viewBox="0 0 16 27" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M4.5 11H1V26H15V11H11.5" stroke="#C4C4C4" stroke-width="1.5"/>
-<path d="M8 17L8 3" stroke="#C4C4C4" stroke-width="1.5"/>
-<path d="M13.4202 7.38441L8.03577 2L2.65135 7.38441" stroke="#C4C4C4" stroke-width="1.5"/>
+<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.5" y="1.47879" width="23" height="23" rx="2.5" fill="#1B1C22"/>
+<path d="M9.66671 10.9788H8.33337C7.78109 10.9788 7.33337 11.4265 7.33337 11.9788V19.9788C7.33337 20.5311 7.78109 20.9788 8.33337 20.9788H15.6667C16.219 20.9788 16.6667 20.5311 16.6667 19.9788V11.9788C16.6667 11.4265 16.219 10.9788 15.6667 10.9788H14.3334" stroke="#A0A0A0"/>
+<path d="M12.0001 14.9788L12.0001 5.64546" stroke="#A0A0A0"/>
+<path d="M15.6132 8.5684L12.0236 4.97879L8.43395 8.5684" stroke="#A0A0A0"/>
+<rect x="0.5" y="1.47879" width="23" height="23" rx="2.5" stroke="#A0A0A0"/>
 </svg>
diff --git a/src/assets/icons/email/star.svg b/src/assets/icons/email/star.svg
new file mode 100644
index 0000000000000000000000000000000000000000..afae8bf6db9cf2ef4148854e5ff77f0799a1d486
--- /dev/null
+++ b/src/assets/icons/email/star.svg
@@ -0,0 +1,5 @@
+<svg width="23" height="24" viewBox="0 0 23 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="0.5" y="1.47879" width="22" height="22" rx="2.5" fill="#1B1C22"/>
+<path d="M11.0245 4.06035C11.1741 3.59969 11.8259 3.59969 11.9755 4.06035L13.3819 8.38862C13.5827 9.00665 14.1586 9.42509 14.8085 9.42509H19.3595C19.8438 9.42509 20.0452 10.0449 19.6534 10.3296L15.9715 13.0046C15.4458 13.3866 15.2258 14.0636 15.4266 14.6817L16.8329 19.0099C16.9826 19.4706 16.4554 19.8537 16.0635 19.569L12.3817 16.8939C11.8559 16.512 11.1441 16.512 10.6183 16.8939L6.93648 19.569C6.54462 19.8537 6.01738 19.4706 6.16705 19.0099L7.57339 14.6817C7.77421 14.0636 7.55422 13.3866 7.02849 13.0046L3.34664 10.3296C2.95478 10.0449 3.15617 9.42509 3.64053 9.42509H8.19155C8.84138 9.42509 9.41732 9.00665 9.61813 8.38862L11.0245 4.06035Z" fill="#1B1C22" stroke="#A0A0A0"/>
+<rect x="0.5" y="1.47879" width="22" height="22" rx="2.5" stroke="#A0A0A0"/>
+</svg>
diff --git a/src/components/Analysis/MaxConsumptionCard.spec.tsx b/src/components/Analysis/MaxConsumptionCard.spec.tsx
index 2ddf41589a393cecfcbc066aae5d5efaff276123..ec38f627242e4390c7442297dd30f9ecd8ff48b0 100644
--- a/src/components/Analysis/MaxConsumptionCard.spec.tsx
+++ b/src/components/Analysis/MaxConsumptionCard.spec.tsx
@@ -78,12 +78,12 @@ describe('MaxConsumptionCard component', () => {
       </Provider>
     )
     expect(wrapper.find('.arrow-next').exists()).toBeTruthy()
-    //navigate next
+    // navigate next
     wrapper.find('.arrow-next').first().simulate('click')
     expect(wrapper.find('.fluid').text()).toBe('FLUID.GAS.LABEL')
     wrapper.find('.arrow-next').first().simulate('click')
     expect(wrapper.find('.fluid').text()).toBe('FLUID.ELECTRICITY.LABEL')
-    //navigate prev
+    // navigate prev
     wrapper.find('.arrow-prev').first().simulate('click')
     expect(wrapper.find('.fluid').text()).toBe('FLUID.GAS.LABEL')
     wrapper.find('.arrow-prev').first().simulate('click')
diff --git a/src/components/App.tsx b/src/components/App.tsx
index 5de0b85096d762cf1c1a77fdc5a81c55d859aff8..fd0b11c37075af7f4debe63a30733d460af47bd7 100644
--- a/src/components/App.tsx
+++ b/src/components/App.tsx
@@ -7,29 +7,22 @@ import SplashScreenError from 'components/Splash/SplashScreenError'
 import { Content, Layout, Main } from 'cozy-ui/transpiled/react/Layout'
 import React, { useEffect } from 'react'
 import { useSelector } from 'react-redux'
-import EnvironmentService from 'services/environment.service'
+import { useLocation } from 'react-router-dom'
 import { AppStore } from 'store'
 import MatomoTracker from 'utils/matomoTracker'
 
 interface AppProps {
-  tracker: MatomoTracker
+  tracker: undefined | MatomoTracker
 }
 
 export const App = ({ tracker }: AppProps) => {
+  const location = useLocation()
   const { onboarding } = useSelector((state: AppStore) => state.ecolyo.profile)
   const { termsStatus } = useSelector((state: AppStore) => state.ecolyo.global)
-  const isDev = new EnvironmentService().isLocal()
 
   useEffect(() => {
-    if (tracker && !isDev) {
-      if (termsStatus.accepted) {
-        tracker.connectToHistory()
-      }
-      return () => {
-        tracker.disconnectFromHistory()
-      }
-    }
-  }, [termsStatus.accepted, tracker, isDev])
+    tracker?.track(location)
+  }, [tracker, location])
 
   return (
     <Layout>
diff --git a/src/components/Challenge/ChallengeCardLocked.spec.tsx b/src/components/Challenge/ChallengeCardLocked.spec.tsx
index 84fee1557824212f28c305867f4d42d2a9869718..80236b17128106e6182305ff54c56fc882de0776 100644
--- a/src/components/Challenge/ChallengeCardLocked.spec.tsx
+++ b/src/components/Challenge/ChallengeCardLocked.spec.tsx
@@ -12,7 +12,7 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => {
     }),
   }
 })
-//TODO fis MUI theme error
+// TODO fis MUI theme error
 describe('ChallengeCardLocked component', () => {
   it('should be rendered correctly', () => {
     const component = shallow(
diff --git a/src/components/Challenge/ChallengeCardOnGoing.tsx b/src/components/Challenge/ChallengeCardOnGoing.tsx
index 9933fcbee9c92fbeb3c714c2aec83529ba3312cb..be9eb1452d2e10d288d0d6c459a9b5725c31510f 100644
--- a/src/components/Challenge/ChallengeCardOnGoing.tsx
+++ b/src/components/Challenge/ChallengeCardOnGoing.tsx
@@ -50,7 +50,7 @@ const ChallengeCardOnGoing: React.FC<ChallengeCardOnGoingProps> = ({
   }, [])
   const goDuel = async () => {
     setIsLoading(true)
-    //Check if at least one fluid is up
+    // Check if at least one fluid is up
     if (fluidTypes.length !== 0) {
       if (userChallenge.duel.state !== UserDuelState.ONGOING) {
         const challengeService = new ChallengeService(client)
diff --git a/src/components/Challenge/ChallengeView.tsx b/src/components/Challenge/ChallengeView.tsx
index 7e3e1b74400fb374057a641308494c6ba64846c6..49a0ee304f46ef334935fa6504d92e0bc7b47314 100644
--- a/src/components/Challenge/ChallengeView.tsx
+++ b/src/components/Challenge/ChallengeView.tsx
@@ -36,7 +36,7 @@ const ChallengeView: React.FC = () => {
   }
 
   const resetValues = () => {
-    //Method used to cancel a swipe on a simple click
+    // Method used to cancel a swipe on a simple click
     setTouchEnd(0)
     setTouchStart(0)
   }
@@ -85,16 +85,16 @@ const ChallengeView: React.FC = () => {
   }
 
   const handleClickOrTouchEnd = () => {
-    //if the swipe is too small and can be taken for a touch
+    // if the swipe is too small and can be taken for a touch
     if (touchStart && touchEnd) {
       if (touchStart - touchEnd < 5 && -5 < touchStart - touchEnd) return
-      //Change the following value in order to change the swipe sensibilyy
+      // Change the following value in order to change the swipe sensibilyy
       if (touchStart - touchEnd > 75) {
-        //If swipe left move slider right and add positive translation
+        // If swipe left move slider right and add positive translation
         moveSliderRight()
       }
       if (touchStart - touchEnd < -75) {
-        //If swipe right move slider left and add negative translation
+        // If swipe right move slider left and add negative translation
         moveSliderLeft()
       }
     }
diff --git a/src/components/Challenge/StarsContainer.tsx b/src/components/Challenge/StarsContainer.tsx
index 2559ff83acb1c4de1994214d1acdcf5ff76560c1..47ce2ce2b5535aaef9a2251b151d6232058d011e 100644
--- a/src/components/Challenge/StarsContainer.tsx
+++ b/src/components/Challenge/StarsContainer.tsx
@@ -16,7 +16,7 @@ const StarsContainer: React.FC<StarsContainerProps> = ({
 
   useEffect(() => {
     const renderStars = () => {
-      //To be removed when action and explorations will be done
+      // To be removed when action and explorations will be done
       if (result === 5) {
         elements.splice(0, elements.length)
       }
diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx
index 214dadb432b29f2b133e84845c040769ecd0b501..9fc8b66bd622340ccb59b4c03dde027d912b9ece 100644
--- a/src/components/Connection/ConnectionResult.tsx
+++ b/src/components/Connection/ConnectionResult.tsx
@@ -119,7 +119,7 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({
       if (fluidType == FluidType.ELECTRICITY) {
         const accountData = fluidStatus.connection.account
           ?.auth as AccountSgeData
-        //store the previous account data since the onDelete will remove account from DB
+        // store the previous account data since the onDelete will remove account from DB
         dispatch(
           updateSgeStore({
             currentStep: 0,
diff --git a/src/components/Connection/ExpiredConsentModal.tsx b/src/components/Connection/ExpiredConsentModal.tsx
index 792c8301f707e54b63001033112137c3ac2070c9..ef0c9c5ee1e79676fdf55d944776d9c241b6cb56 100644
--- a/src/components/Connection/ExpiredConsentModal.tsx
+++ b/src/components/Connection/ExpiredConsentModal.tsx
@@ -39,7 +39,7 @@ const ExpiredConsentModal: React.FC<ExpiredConsentModalProps> = ({
     if (fluidType === FluidType.ELECTRICITY) {
       const accountData = fluidStatus[FluidType.ELECTRICITY].connection.account
         ?.auth as AccountSgeData
-      //store the previous account data since the onDelete will remove account from DB
+      // store the previous account data since the onDelete will remove account from DB
       dispatch(
         updateSgeStore({
           currentStep: 0,
diff --git a/src/components/Connection/FormOAuth.tsx b/src/components/Connection/FormOAuth.tsx
index 08dd87b6588ed37684a4cfcb9a16dd2e39c96d82..93eb4226d71030e257ce674a95612e72073ae415 100644
--- a/src/components/Connection/FormOAuth.tsx
+++ b/src/components/Connection/FormOAuth.tsx
@@ -33,7 +33,7 @@ const FormOAuth: React.FC<FormOAuthProps> = ({
   const dispatch = useDispatch()
   const endOAuth = useCallback(() => {
     setStatus(IDLE)
-    //Set back to false the variable that allows to automatically refresh the consent (deletes and recreates the account)
+    // Set back to false the variable that allows to automatically refresh the consent (deletes and recreates the account)
     dispatch(setShouldRefreshConsent(false))
   }, [dispatch])
 
diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx
index 31bf92185c0694392301ece6e18260f6de790754..9377278e20666b2d250966bfdae2446230b00954 100644
--- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx
@@ -163,7 +163,7 @@ describe('Dataload consumption visualizer component', () => {
     const mockAddEvent = jest.fn()
     UsageEventService.addEvent = mockAddEvent
 
-    //Render Navlinks to fluids
+    // Render Navlinks to fluids
     wrapper.find('.dataloadvisualizer-euro-fluid').first().simulate('click')
     expect(mockAddEvent).toHaveBeenCalled()
   })
diff --git a/src/components/ConsumptionVisualizer/DataloadNoValue.tsx b/src/components/ConsumptionVisualizer/DataloadNoValue.tsx
index e00a7d364f4fad6492e0791110b50331c5b285aa..cef6acd8c784debd24d4757265284e0b0b00ca8b 100644
--- a/src/components/ConsumptionVisualizer/DataloadNoValue.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadNoValue.tsx
@@ -25,12 +25,12 @@ const DataloadNoValue: React.FC<DataloadNoValueProps> = ({
     const content = document.querySelector('.content-view')
     if (content && app) {
       setTimeout(() => {
-        //Desktop devices
+        // Desktop devices
         app.scrollTo({
           top: content.scrollHeight + 300,
           behavior: 'smooth',
         })
-        //Mobiles devices
+        // Mobiles devices
         app.scrollIntoView({
           behavior: 'smooth',
           block: 'end',
diff --git a/src/components/Ecogesture/SingleEcogesture.tsx b/src/components/Ecogesture/SingleEcogesture.tsx
index 5368d0dcaef600f6fad9839d817c2b15dd61a011..58b9237fa77d9516f247ad05f6aa865fbb839415 100644
--- a/src/components/Ecogesture/SingleEcogesture.tsx
+++ b/src/components/Ecogesture/SingleEcogesture.tsx
@@ -95,7 +95,7 @@ const SingleEcogesture: React.FC = () => {
       if (subscribed) {
         if (data?.[0]) {
           setEcogesture(data[0])
-          //Prevent case this key doesn't exist in doctype
+          // Prevent case this key doesn't exist in doctype
           setIsObjective(data[0].objective)
           setIsDoing(data[0].doing)
           const icon = await importIconById(data[0].id, 'ecogesture')
diff --git a/src/components/EcogestureForm/EcogestureFormView.spec.tsx b/src/components/EcogestureForm/EcogestureFormView.spec.tsx
index 9e98552b954a5a99919aef179238e9c3e6e99cc1..ced14d322584a1e305bf25e77408304d441950b2 100644
--- a/src/components/EcogestureForm/EcogestureFormView.spec.tsx
+++ b/src/components/EcogestureForm/EcogestureFormView.spec.tsx
@@ -98,13 +98,13 @@ describe('EcogestureFormView component', () => {
         <EcogestureFormView />
       </Provider>
     )
-    //go first to next step
+    // go first to next step
     await waitForComponentToPaint(wrapper)
     wrapper.find('input').first().simulate('change')
     await waitForComponentToPaint(wrapper)
     wrapper.find(Button).at(1).simulate('click')
     await waitForComponentToPaint(wrapper)
-    //then go back
+    // then go back
     wrapper.find(Button).first().simulate('click')
     expect(wrapper.find('.ecogesture-form-single').exists()).toBeTruthy()
   })
diff --git a/src/components/FormGlobal/FormNavigation.tsx b/src/components/FormGlobal/FormNavigation.tsx
index c720d5bb6e359f917011f99cb5f6829895c6e4c6..dc4fd447dfefce259af2e3a477d0d9dd5f94688b 100644
--- a/src/components/FormGlobal/FormNavigation.tsx
+++ b/src/components/FormGlobal/FormNavigation.tsx
@@ -36,7 +36,7 @@ const FormNavigation: React.FC<FormNavigationProps> = ({
   }
   const handleNextClick = () => {
     handleNext()
-    //handle go back to connect for SGE
+    // handle go back to connect for SGE
     if (isLastConnectStep) {
       navigate('/consumption/electricity')
     }
diff --git a/src/components/Home/ConsumptionView.tsx b/src/components/Home/ConsumptionView.tsx
index f73f22f87cacaaa208002bcba1d626f20a35f46d..83a6b6199ecb48bf127eb9b54d0e763fbdc172bf 100644
--- a/src/components/Home/ConsumptionView.tsx
+++ b/src/components/Home/ConsumptionView.tsx
@@ -161,7 +161,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({
   useEffect(() => {
     let subscribed = true
     const expiredConsents: FluidType[] = []
-    //Check if some fluids have expired consent error
+    // Check if some fluids have expired consent error
     for (const fluid of fluidStatus) {
       const error = fluid.connection.triggerState?.last_error
       if (error && getKonnectorUpdateError(error) === 'error_update_oauth') {
diff --git a/src/components/Home/FluidButton.tsx b/src/components/Home/FluidButton.tsx
index f4dfb311c37cfda5578adaad528d77996a1cd085..9d24a0d2bfd91151d24226762d4b6bb63f878fb2 100644
--- a/src/components/Home/FluidButton.tsx
+++ b/src/components/Home/FluidButton.tsx
@@ -74,7 +74,7 @@ const FluidButton: React.FC<FluidButtonProps> = ({
   const isFluidMaintenance = () => fluidStatus[fluidType]?.maintenance
 
   useEffect(() => {
-    //Show errors only on konnected konnectors that are in error, outdated, with no data (specific case), and not in multifluid
+    // Show errors only on konnected konnectors that are in error, outdated, with no data (specific case), and not in multifluid
     if (
       (fluidType !== FluidType.MULTIFLUID && isConnected() && isErrored()) ||
       (fluidType !== FluidType.MULTIFLUID && isConnected() && isOutdated()) ||
diff --git a/src/components/Konnector/KonnectorModal.tsx b/src/components/Konnector/KonnectorModal.tsx
index 1b6dd8ddb1ae49e9c3313e1e38ec11349999f17f..6796da60af91e44930b4132117a7ba45773a33ae 100644
--- a/src/components/Konnector/KonnectorModal.tsx
+++ b/src/components/Konnector/KonnectorModal.tsx
@@ -149,7 +149,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({
               {state === ERROR_EVENT && (
                 <>
                   {error === KonnectorError.LOGIN_FAILED && (
-                    //LOGIN FAILED FOR ENEDIS AND EGL
+                    // LOGIN FAILED FOR ENEDIS AND EGL
                     <div className="konnector-config">
                       <Icon icon={errorIcon} size={48} />
                       <div className="kce-picto-txt text-20-bold">
@@ -196,7 +196,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({
                   {error === KonnectorError.TERMS_VERSION_MISMATCH &&
                     isUpdating &&
                     fluidType === FluidType.ELECTRICITY && (
-                      //MISMATCH UPDATE ERROR ENEDIS
+                      // MISMATCH UPDATE ERROR ENEDIS
                       <div className="kce-picto-txt konnector-config mismatch">
                         <Icon icon={EnedisIcon} width={120} height={80} />
                         <div className="title text-20-bold">
@@ -215,7 +215,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({
                     )}
                   {error !== KonnectorError.LOGIN_FAILED &&
                     error !== KonnectorError.TERMS_VERSION_MISMATCH && (
-                      //DEFAULT CASE
+                      // DEFAULT CASE
                       <div className="konnector-config">
                         {console.log('errortype', error)}
                         <Icon icon={errorIcon} size={48} />
@@ -237,7 +237,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({
                 </>
               )}
               {state === SUCCESS_EVENT && (
-                //SUCCESS CASE
+                // SUCCESS CASE
                 <div className="konnector-config">
                   <Icon icon={successIcon} size={48} />
                   <div className="kcs-picto-txt text-20-bold">
diff --git a/src/components/Konnector/KonnectorModalFooter.tsx b/src/components/Konnector/KonnectorModalFooter.tsx
index 584dd67a680539af203bf5b9fb600d97a620cbb0..c8e14e357a442a2fbb47278a991d5498a92b48f9 100644
--- a/src/components/Konnector/KonnectorModalFooter.tsx
+++ b/src/components/Konnector/KonnectorModalFooter.tsx
@@ -52,7 +52,7 @@ const KonnectorModalFooter: React.FC<KonnectorModalFooterProps> = ({
   const errorButtons = () => {
     switch (error) {
       case KonnectorError.USER_ACTION_NEEDED:
-        //INSEE CODE ERROR ENEDIS
+        // INSEE CODE ERROR ENEDIS
         return (
           <Button
             aria-label={t('konnector_modal.accessibility.button_close')}
@@ -67,7 +67,7 @@ const KonnectorModalFooter: React.FC<KonnectorModalFooterProps> = ({
           </Button>
         )
       case KonnectorError.LOGIN_FAILED:
-        //MISMATCH NAME / ADDRESS / PDL
+        // MISMATCH NAME / ADDRESS / PDL
         return (
           <Button
             aria-label={t('konnector_modal.accessibility.button_close')}
@@ -111,8 +111,8 @@ const KonnectorModalFooter: React.FC<KonnectorModalFooterProps> = ({
           </div>
         )
       default:
-        //DEFAULT FOOTER BUTTONS
-        //TODO change default button
+        // DEFAULT FOOTER BUTTONS
+        // TODO change default button
         return (
           <Button
             aria-label={t('konnector_modal.accessibility.button_close')}
@@ -130,7 +130,7 @@ const KonnectorModalFooter: React.FC<KonnectorModalFooterProps> = ({
   }
 
   const successButton = () => {
-    //DEFAULT FOOTER BUTTONS
+    // DEFAULT FOOTER BUTTONS
     return (
       <Button
         aria-label={t('konnector_modal.accessibility.button_close')}
diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx
index 694f150279862272115515c3fdbb35689fd7c5c7..e4b391981cf37fef3b8f4813f4eb3dcc578b42bc 100644
--- a/src/components/Konnector/KonnectorViewerCard.tsx
+++ b/src/components/Konnector/KonnectorViewerCard.tsx
@@ -184,7 +184,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
   const handleConnectionEnd = useCallback(
     async (isSuccess?: boolean) => {
       if (
-        //CASE FOR GLOBAL LOGIN FAILED
+        // CASE FOR GLOBAL LOGIN FAILED
         (account &&
           !isSuccess &&
           (konnectorErrorDescription === KonnectorError.LOGIN_FAILED ||
@@ -193,7 +193,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
           fluidStatus !== null &&
           fluidStatus.connection.account !== null &&
           fluidStatus.connection.account.auth !== undefined) ||
-        //CASE FOR ENEDIS CODE INSEE ERROR
+        // CASE FOR ENEDIS CODE INSEE ERROR
         (account &&
           !isSuccess &&
           !isUpdating &&
@@ -202,19 +202,19 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
           fluidStatus.connection.account !== null &&
           fluidStatus.connection.account.auth !== undefined)
       ) {
-        //KEEP CREDENTIALS FOR EGL
+        // KEEP CREDENTIALS FOR EGL
         if (fluidSlug === FluidSlugType.WATER) {
           const auth = fluidStatus.connection.account.auth as AccountAuthData
           fluidStatus.connection.konnectorConfig.lastKnownCredentials =
             auth.login
         }
-        //DELETE ACCOUNT
+        // DELETE ACCOUNT
         const accountService = new AccountService(client)
         await accountService.deleteAccount(account)
         await handleAccountDeletion()
       } else {
         if (isSuccess && fluidStatus.lastDataDate === null) {
-          //UPDATE THE DACC EVENT STATUS TO SUCCESS
+          // UPDATE THE DACC EVENT STATUS TO SUCCESS
           await UsageEventService.udpateConnectionAttemptEvent(
             client,
             fluidSlug
diff --git a/src/components/Onboarding/WelcomeModal.tsx b/src/components/Onboarding/WelcomeModal.tsx
index 44dcbdd575a79c718859f12b91af94db9bff2748..b17c2fe7b323525631675c10c3603b23f3fda554 100644
--- a/src/components/Onboarding/WelcomeModal.tsx
+++ b/src/components/Onboarding/WelcomeModal.tsx
@@ -41,9 +41,11 @@ const WelcomeModal = ({ open }: WelcomeModalProps) => {
       clientUrl: client.options.uri,
       cloudImageUrl: baseUrl + '/assets/godCloud.png',
       ecolyoPhoneImageUrl: baseUrl + '/assets/ecolyoPhone.png',
+      desktopImageUrl: baseUrl + '/assets/desktop.png',
       androidImageUrl: baseUrl + '/assets/android.png',
-      menuImageUrl: baseUrl + '/assets/menu.png',
       appleImageUrl: baseUrl + '/assets/apple.png',
+      dotImageUrl: baseUrl + '/assets/dot.png',
+      starImageUrl: baseUrl + '/assets/star.png',
       shareImageUrl: baseUrl + '/assets/share.png',
     })
     const mailData = {
diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx
index ea6cffa0c8b08d8a6ae93b8c42c74bca27d66bf9..a7432b5eb92cc99a539a70a5d255f46fd1ee8b26 100644
--- a/src/components/Splash/SplashRoot.tsx
+++ b/src/components/Splash/SplashRoot.tsx
@@ -214,7 +214,7 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => {
           )
         )
 
-        //init Terms
+        // init Terms
         const termsStatus: TermsStatus =
           await initializationService.initConsent()
         if (subscribed) dispatch(updateTermValidation(termsStatus))
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 522a8737951f6fd0052ebf074ec86943c909e5a6..fcf5f1b82b34a385ae9bd9bda04b414630494abb 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -854,7 +854,7 @@
     "p6b": "Maintenance technique : ",
     "p6": "Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques",
     "title1": "Crédits",
-    "part1": "Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, eslint-config-cozy-app, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: enzyme, enzyme-adapter-react-16, jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.",
+    "part1": "Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: enzyme, enzyme-adapter-react-16, jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.",
     "title2": "Traitement des données personnelles et droit d’accès, de modification et de suppression",
     "part2": "Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : ",
     "part2-1": "Les partenaires du service GRDF et Eau Publique du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.",
diff --git a/src/models/profile.model.ts b/src/models/profile.model.ts
index 8950b1d2292130b18ae1a21ed4d42b31524a0c50..c041fb23a5f8acd5a20d4cf83dc48a518374bad1 100644
--- a/src/models/profile.model.ts
+++ b/src/models/profile.model.ts
@@ -23,9 +23,9 @@ export interface ProfileEntity {
   onboarding: Onboarding
   mailToken: string
   partnersIssueSeenDate: {
-    enedis: string
-    egl: string
-    grdf: string
+    enedis?: string
+    egl?: string
+    grdf?: string
   }
   haveSeenEcogestureModal: boolean
   activateHalfHourDate: string
diff --git a/src/notifications/monthlyReport.hbs b/src/notifications/monthlyReport.hbs
index b08c1b51c63e5f15f214d803aed00a5a3af8da55..120094858bb0d1ad2e1f31cd4ec42bc1bac68f71 100644
--- a/src/notifications/monthlyReport.hbs
+++ b/src/notifications/monthlyReport.hbs
@@ -80,7 +80,7 @@
     {{/if}}
     <mj-section background-color="#121212">
       <mj-column vertical-align="middle">
-        <mj-image src={{feedbackImageUrl}} width="53px" align="center" alt="feedback"></mj-image>
+        <mj-image src={{feedbackImageUrl}} width="32px" align="center" alt="feedback"></mj-image>
         <mj-text color="white" font-weight="900" align="center" font-size="18px">
           Un problème, une question, une suggestion ?
         </mj-text>
diff --git a/src/notifications/welcome.hbs b/src/notifications/welcome.hbs
index 71e16dfe263db4266697000f50bb6f0e66feeb0c..e708651b3d8338450f1e36fcb4a33313626c83e1 100644
--- a/src/notifications/welcome.hbs
+++ b/src/notifications/welcome.hbs
@@ -7,14 +7,13 @@
     {{#> base/header}}
     {{/base/header}}
 
-  <mj-section background-color="#121212">
+    <mj-section background-color="#121212">
       <mj-column vertical-align="middle">
         <mj-text color="white" font-weight="900" font-size="24px">
           Bonjour {{username}},
         </mj-text>
-        <mj-text color="white" font-weight="400" font-size="18px"> Bravo, vous faites partie des utilisateurs d’Ecolyo.
+        <mj-text color="white" font-size="18px">Bravo, vous faites partie des utilisateurs d’Ecolyo.
         </mj-text>
-
       </mj-column>
       <mj-column vertical-align="middle">
         <mj-image src={{cloudImageUrl}} width="130px" align="center"></mj-image>
@@ -24,57 +23,57 @@
     <mj-section background-color="#1B1C22">
       <mj-column>
         <mj-text color="white" font-weight="900" font-size="24px" align="center">
-          Vous pouvez dès maintenant ajouter Ecolyo sur votre téléphone !
+          Ajoutez dès maintenant Ecolyo à votre téléphone ou votre ordinateur !
         </mj-text>
-        <mj-image src={{ecolyoPhoneImageUrl}} width="92px" align="center"></mj-image>
-        <mj-text color="white" font-weight="600" font-size="18px">
-          Comment faire ?
+        <mj-image src={{ecolyoPhoneImageUrl}} width="92px" height="53px" align="center"></mj-image>
+
+        <mj-social align="left" icon-size="30px" mode="horizontal" font-weight="600" font-size="18px" padding-top="15px">
+          <mj-social-element color="#F1C017" src={{desktopImageUrl}} name="ecolyo" padding="0 24px 0 0">
+            Ecolyo pour Ordinateur
+          </mj-social-element>
+        </mj-social>
+        <mj-text color="white" font-size="18px">
+          Pour mettre Ecolyo en favori dans votre navigateur :
         </mj-text>
-        <mj-text color="white" font-weight="600" font-size="18px">
-          Accédez au service en cliquant sur le lien situé en fin d’email. Puis une fois la page web du service ouverte dans votre navigateur :
+        <mj-text color="white" font-size="18px">
+          - Appuyez sur l’étoile dans votre barre de recherche à côté de l’URL
+          <img width="24px" src={{starImageUrl}}></img>
         </mj-text>
 
-        <mj-social align="left" icon-size="30px" mode="horizontal" font-weight="600" font-size="18px" padding-top="15px">
-          <mj-social-element color="#F1C017" src="{{baseUrl}}/assets/android.png" name="ecolyo" padding="0 10px 0 0">
+        <mj-social align="left" icon-size="30px" mode="horizontal" font-weight="600" font-size="18px" padding-top="30px">
+          <mj-social-element color="#F1C017" src="{{androidImageUrl}}" name="ecolyo" padding="0 24px 0 0">
             Ecolyo pour Android
           </mj-social-element>
         </mj-social>
-
-        <mj-hero css-class="text-and-image" background-color="#1B1C22" padding-top="15px">
-          <mj-text color="white" font-weight="600" font-size="18px">
-            1 - Appuyez sur les trois petits points du menu en haut à droite
-            <img width="4px" src={{menuImageUrl}} />
-          </mj-text>
-        </mj-hero>
-        <mj-text color="white" font-weight="600" font-size="18px">
+        <mj-text color="white" font-size="18px">
+          1 - Appuyez sur les trois petits points du menu en haut à droite
+          <img width="24px" src={{dotImageUrl}}></img>
+        </mj-text>
+        <mj-text color="white" font-size="18px">
           2 - Sélectionnez "Ajouter à l'écran d'accueil".
         </mj-text>
-        <mj-text color="white" font-weight="600" font-size="18px">
+        <mj-text color="white" font-size="18px">
           3 - Nommez la page et appuyez sur "Ajouter". Un raccourci vers la page web est apparu sur l'écran d'accueil de votre smartphone.
         </mj-text>
 
-        <mj-social align="left" icon-size="30px" mode="horizontal" font-weight="600" font-size="18px" padding-top="15px">
-          <mj-social-element color="#F1C017" src={{appleImageUrl}} name="ecolyo" padding="0 10px 0 0">
+        <mj-social align="left" icon-size="30px" mode="horizontal" font-weight="600" font-size="18px" padding-top="30px">
+          <mj-social-element color="#F1C017" src={{appleImageUrl}} name="ecolyo" padding="0 24px 0 0">
             Ecolyo pour Iphone
           </mj-social-element>
         </mj-social>
-
-        <mj-hero css-class="text-and-image" background-color="#1B1C22" padding-top="15px" >
-          <mj-text color="white" font-weight="600" font-size="18px" vertical-align="middle">
-            1 - Cliquez sur partager (carré avec flèche pointant vers le haut)
-            <img width="16px" src={{shareImageUrl}}  />
-          </mj-text>
-        </mj-hero>
-        <mj-text color="white" font-weight="600" font-size="18px">
+        <mj-text color="white" font-size="18px" vertical-align="middle">
+          1 - Cliquez sur partager (carré avec flèche pointant vers le haut)
+          <img width="24px" src={{shareImageUrl}} />
+        </mj-text>
+        <mj-text color="white" font-size="18px">
           2 - Dans le menu ouvert, descendez et sélectionnez sur « Sur l’Écran d’Accueil ».
         </mj-text>
-        <mj-text color="white" font-weight="600" font-size="18px">
+        <mj-text color="white" font-size="18px">
           3 - Cliquez sur « Ajouter ». Un raccourci vers Ecolyo aura ainsi été créé sur votre écran d’accueil. Vous pourrez y accéder comme pour une autre application.
         </mj-text>
-        <mj-text color="white" font-weight="600" font-size="18px">
+        <mj-text color="#A0A0A0" font-weight="400" font-style="italic" font-size="18px">
           Attention cette manipulation ne fonctionne que si vous avez ouvert le lien dans Safari.
         </mj-text>
-
       </mj-column>
     </mj-section>
 
@@ -93,5 +92,4 @@
     {{#> base/footer}}
     {{/base/footer}}
   </mj-body>
-</mjml>
-
+</mjml>
\ No newline at end of file
diff --git a/src/services/account.service.spec.ts b/src/services/account.service.spec.ts
index c52dfac07ef6af8d05f3d14f6d6da1b07b62ade5..a3d19f98421c49f3de145633f8b23cdb12e20836 100644
--- a/src/services/account.service.spec.ts
+++ b/src/services/account.service.spec.ts
@@ -30,7 +30,7 @@ describe('Account service', () => {
       mockHavestLibAccounts.createAccount.mockResolvedValueOnce(accountsData[2])
       const mockAuthData: AccountAuthData = {
         login: 'login',
-        password: 'password', //NOSONAR
+        password: 'password', // NOSONAR
       }
       const result = await accountService.createAccount(
         konnectorsData[2],
diff --git a/src/services/action.service.ts b/src/services/action.service.ts
index 2383d7f14c6c55f9af7b6c3f7a79dee6e7b5db62..7a705f6501a4580806ec52db1786e4916f1788b2 100644
--- a/src/services/action.service.ts
+++ b/src/services/action.service.ts
@@ -38,7 +38,7 @@ export default class ActionService {
       .map(challenge => challenge.action)
       .filter(action => action.state === UserActionState.DONE)
       .map(action => action.ecogesture && action.ecogesture.id)
-    //Remove actions Done from the list
+    // Remove actions Done from the list
     if (actionsDone.length > 0) {
       actionsListIds.forEach(id => {
         if (actionsDone.includes(id)) {
diff --git a/src/services/challenge.service.ts b/src/services/challenge.service.ts
index fb7c042a7eb0a63983263c6bfdcb8e35a14359f5..012741fb6b44e8c916d83f5ec208335ad39770a0 100644
--- a/src/services/challenge.service.ts
+++ b/src/services/challenge.service.ts
@@ -162,7 +162,7 @@ export default class ChallengeService {
   ): Promise<boolean> {
     let isValid = false
     const fluidCondition: FluidType[] = exploration.fluid_condition
-    //check if the fluid is connected
+    // check if the fluid is connected
     if (
       fluidStatus[fluidCondition[0]].status !==
         FluidState.KONNECTOR_NOT_FOUND &&
@@ -212,7 +212,7 @@ export default class ChallengeService {
     fluidStatus: FluidStatus[]
   ): Promise<UserChallenge | undefined> {
     let userChallenge: UserChallenge | null = null
-    //Check if it's a conditionnal exploration
+    // Check if it's a conditionnal exploration
     if (exploration.fluid_condition.length > 0) {
       const isConditionVerified = await this.isExplorationConditionVerified(
         exploration,
@@ -228,7 +228,7 @@ export default class ChallengeService {
         )
         return userChallenge
       }
-    } //if there is no condition, add the exploration
+    } // if there is no condition, add the exploration
     else {
       userChallenge = this.parseChallengeEntityToUserChallenge(
         challenge,
@@ -383,7 +383,7 @@ export default class ChallengeService {
           quizEntities || [],
           relationEntities.quizEntityRelation._id
         )
-        //Only one exploration relation
+        // Only one exploration relation
         if (relationEntities.explorationEntityRelation.length === 1) {
           const exploration: UserExploration =
             explorationService.getUserExplorationfromExplorationEntities(
@@ -398,7 +398,7 @@ export default class ChallengeService {
           )
           buildList.push(userChallenge)
         }
-        //Several explorations with fluid condition
+        // Several explorations with fluid condition
         else {
           await this.processExploration(
             explorationEntities,
diff --git a/src/services/consumption.service.spec.ts b/src/services/consumption.service.spec.ts
index b8757e23e964ab656f16744efe1ac05abc54d10c..226026b0218eb20bf7268620490e7e5289394e61 100644
--- a/src/services/consumption.service.spec.ts
+++ b/src/services/consumption.service.spec.ts
@@ -351,7 +351,7 @@ describe('Consumption service', () => {
       mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison)
       mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual)
       mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison)
-      //Incomplete Data to test all possibilities
+      // Incomplete Data to test all possibilities
       mockFetchFluidData.mockResolvedValueOnce([
         {
           date: DateTime.fromISO('2020-08-01T00:23:20.000Z'),
diff --git a/src/services/consumption.service.ts b/src/services/consumption.service.ts
index 535e8857f51c31a890bd29c4f6328c86f6b9dfc2..3ad7142253b3466eff3013c0fc8994e957d88c23 100644
--- a/src/services/consumption.service.ts
+++ b/src/services/consumption.service.ts
@@ -403,7 +403,7 @@ export default class ConsumptionDataManager {
 
   private aggregateGraphData(
     singleFluidCharts: ISingleFluidChartData[]
-    //,withComparison: boolean = true
+    // ,withComparison: boolean = true
   ): Datachart | null {
     if (singleFluidCharts[0]?.chartData) {
       const converterService = new ConverterService()
diff --git a/src/services/consumptionValidator.service.spec.ts b/src/services/consumptionValidator.service.spec.ts
index 41aee67ea568051b34b999f90c11d3bc4aefb262..2957f46199dafdb72428df2c46ee6521e925bdaa 100644
--- a/src/services/consumptionValidator.service.spec.ts
+++ b/src/services/consumptionValidator.service.spec.ts
@@ -95,7 +95,7 @@ describe('ConsumptionFormatter service', () => {
       expect(result).toBeFalsy()
     })
     it('should return false because of HALF_AN_HOUR and ValidateTimePeriodLength', () => {
-      fluidTypes = [0] //Only fluid without TimeStep incompatibilty
+      fluidTypes = [0] // Only fluid without TimeStep incompatibilty
       const mockTimePeriodTooLong: TimePeriod = {
         startDate: DateTime.fromISO('2020-10-01T00:00:00.000Z', {
           zone: 'utc',
diff --git a/src/services/exploration.service.ts b/src/services/exploration.service.ts
index 1bc61c88c8ded0ec3b84af5f13c2bfb30144f64b..40ddc77db05644fb4c019b09d13fa4275487a342 100644
--- a/src/services/exploration.service.ts
+++ b/src/services/exploration.service.ts
@@ -144,7 +144,7 @@ export default class ExplorationService {
     const updatedUserExploration: UserExploration = {
       ...userExploration,
       state: UserExplorationState.NOTIFICATION,
-      progress: 5, //userExploration.type === UserExplorationType.ACTION ? 3 : 1,
+      progress: 5, // userExploration.type === UserExplorationType.ACTION ? 3 : 1,
     }
     return updatedUserExploration
   }
@@ -157,7 +157,7 @@ export default class ExplorationService {
     const updatedUserExploration: UserExploration = {
       ...userExploration,
       state: UserExplorationState.DONE,
-      progress: 5, //userExploration.type === UserExplorationType.ACTION ? 3 : 1,
+      progress: 5, // userExploration.type === UserExplorationType.ACTION ? 3 : 1,
     }
     return updatedUserExploration
   }
@@ -194,7 +194,7 @@ export default class ExplorationService {
     const challengeService = new ChallengeService(this._client)
     switch (explorationID) {
       case UserExplorationID.EXPLORATION007:
-        //ECOLYO CONNEXION EXPLORATION
+        // ECOLYO CONNEXION EXPLORATION
         if (
           currentChallenge.exploration.progress + 1 <
           currentChallenge.exploration.target
diff --git a/src/services/fluidConfig.service.ts b/src/services/fluidConfig.service.ts
index e78242383011c4f0eb662ac64bfb228c29e0fd03..b6aae3539923e43031c0aed00555ccef4c1a6324 100644
--- a/src/services/fluidConfig.service.ts
+++ b/src/services/fluidConfig.service.ts
@@ -12,8 +12,8 @@ export default class ConfigService {
    * @param max Maximum hour for cron
    */
   public getCronArgs(min = 8, max = 9): string {
-    const randomHour = Math.floor(Math.random() * (max - min + 1) + min) //NOSONAR
-    const randomMinutes = Math.floor(Math.random() * 59) //NOSONAR
+    const randomHour = Math.floor(Math.random() * (max - min + 1) + min) // NOSONAR
+    const randomMinutes = Math.floor(Math.random() * 59) // NOSONAR
     return `0 ${randomMinutes} ${randomHour} * * *`
   }
 }
diff --git a/src/services/fluidsPrices.service.ts b/src/services/fluidsPrices.service.ts
index 91dea069893fa1b05968be1ef058284c99588676..39ac3bf3469841cbef873209ff80e67d88869bc3 100644
--- a/src/services/fluidsPrices.service.ts
+++ b/src/services/fluidsPrices.service.ts
@@ -23,7 +23,7 @@ export default class FluidPricesService {
    */
   public async getAllPrices(): Promise<FluidPrice[]> {
     const query: QueryDefinition = Q(FLUIDPRICES_DOCTYPE).limitBy(900)
-    //TODO : handle case of 1000+ entries in doctype
+    // TODO : handle case of 1000+ entries in doctype
     const { data: fluidsPrices }: QueryResult<FluidPrice[]> =
       await this._client.query(query)
     return fluidsPrices
diff --git a/src/services/performanceIndicator.service.spec.ts b/src/services/performanceIndicator.service.spec.ts
index ec4706dce86629482fbe83a5842d0d634d849380..e73c56e12bbff334a54eb2dad48533a9787e833f 100644
--- a/src/services/performanceIndicator.service.spec.ts
+++ b/src/services/performanceIndicator.service.spec.ts
@@ -34,7 +34,7 @@ describe('performanceIndicator service', () => {
         )
       expect(result).toEqual(expectedResult)
 
-      //Only two values
+      // Only two values
       performanceIndicator = [
         {
           value: 10,
@@ -58,7 +58,7 @@ describe('performanceIndicator service', () => {
         )
       expect(result).toEqual(expectedResult)
 
-      //lack of value for one
+      // lack of value for one
       performanceIndicator = [
         {
           value: null,
@@ -87,7 +87,7 @@ describe('performanceIndicator service', () => {
         )
       expect(result).toEqual(expectedResult)
 
-      //lack of compareValue for one
+      // lack of compareValue for one
       performanceIndicator = [
         {
           value: 30,
@@ -116,7 +116,7 @@ describe('performanceIndicator service', () => {
         )
       expect(result).toEqual(expectedResult)
 
-      //Only one with no compared value
+      // Only one with no compared value
       performanceIndicator = [
         {
           value: 30,
@@ -135,7 +135,7 @@ describe('performanceIndicator service', () => {
         )
       expect(result).toEqual(expectedResult)
 
-      //Only one with no value
+      // Only one with no value
       performanceIndicator = [
         {
           value: null,
diff --git a/src/services/profile.service.ts b/src/services/profile.service.ts
index 06f7d644e8277baba9382c98aeb1508902187241..64bf5dc792d3d18564472b50773c10ee527240d3 100644
--- a/src/services/profile.service.ts
+++ b/src/services/profile.service.ts
@@ -10,7 +10,10 @@ export default class ProfileService {
     this._client = _client
   }
 
-  private getDate(date: string): DateTime {
+  private getDate(date: string | undefined): DateTime {
+    if (!date) {
+      return DateTime.local().minus({ day: 1 }).startOf('day')
+    }
     return DateTime.fromISO(date, {
       zone: 'utc',
     })
@@ -30,9 +33,9 @@ export default class ProfileService {
           : profileEntity.monthlyAnalysisDate,
       lastConnectionDate: this.getDate(profileEntity.lastConnectionDate),
       partnersIssueSeenDate: {
-        enedis: this.getDate(profileEntity.partnersIssueSeenDate.enedis),
-        egl: this.getDate(profileEntity.partnersIssueSeenDate.egl),
-        grdf: this.getDate(profileEntity.partnersIssueSeenDate.grdf),
+        enedis: this.getDate(profileEntity.partnersIssueSeenDate?.enedis),
+        egl: this.getDate(profileEntity.partnersIssueSeenDate?.egl),
+        grdf: this.getDate(profileEntity.partnersIssueSeenDate?.grdf),
       },
       activateHalfHourDate: this.getDate(profileEntity.activateHalfHourDate),
       customPopupDate: this.getDate(profileEntity.customPopupDate),
diff --git a/src/services/profileType.service.ts b/src/services/profileType.service.ts
index 3aab00466cb866d4b3e60bba663f1bd975fef282..5dafc811a2b4aba27376f9452a1a9179ee3c7148 100644
--- a/src/services/profileType.service.ts
+++ b/src/services/profileType.service.ts
@@ -83,7 +83,7 @@ export default class ProfileTypeService {
       this.profileType.hasReplacedHeater
     const heating = this.profileType.heating
 
-    //Apply corrections
+    // Apply corrections
     const correctionsNbWalls =
       heatingData.adjustment_outisde_facing_walls[housingType]
     const correctionWalls: number = correctionsNbWalls[outsideFacingWalls]
@@ -497,7 +497,7 @@ export default class ProfileTypeService {
       .endOf('month')
       .plus({ minutes: 5 })
       .toISO()
-    //We add or remove 5 minutes so the api returns the exact period
+    // We add or remove 5 minutes so the api returns the exact period
     try {
       const result = await this._client
         .getStackClient()
diff --git a/src/services/quiz.service.ts b/src/services/quiz.service.ts
index 8f6aa656e7543b081b4063f0e77d488fb6552c09..ca0bb4cb5a4b2332a13ea7426ee0fc3ca468f28b 100644
--- a/src/services/quiz.service.ts
+++ b/src/services/quiz.service.ts
@@ -289,7 +289,7 @@ export default class QuizService {
     if (customQuestionEntity.singleFluid === true) {
       let unitLabel = 'kWh'
       let fluidLabel = "d'électricité"
-      //Define the right fluidType
+      // Define the right fluidType
       if (fluidType.includes(FluidType.ELECTRICITY)) {
         useFluidType = [FluidType.ELECTRICITY]
         unit = 'kWh'
@@ -303,12 +303,12 @@ export default class QuizService {
         unitLabel = 'litre'
         fluidLabel = "d'eau"
       }
-      //Adapt the question
+      // Adapt the question
       questionLabel = questionLabel.replace('#unit', unitLabel)
       questionLabel = questionLabel.replace('#fluid', fluidLabel)
     }
     if (customQuestionEntity.type === CustomQuestionType.DATE) {
-      //Interval
+      // Interval
       const intervalAsnwer: IntervalAnswer =
         await this.getMaxLoadOnLastInterval(
           customQuestionEntity.timeStep,
@@ -321,7 +321,7 @@ export default class QuizService {
         finalInterval
       )
     } else if (customQuestionEntity.type === CustomQuestionType.MAXDATA) {
-      //Max data
+      // Max data
       const consumptionService = new ConsumptionDataManager(this._client)
       let maxLoad = await consumptionService.getMaxLoad(
         finalInterval,
@@ -333,7 +333,7 @@ export default class QuizService {
       maxLoad = maxLoad === null ? 0 : maxLoad
       answers = this.getAnswersForNumberValue(maxLoad as number, unit)
     } else {
-      //average
+      // average
       const averageLoad: number = await this.getAverageOnGivenPeriod(
         customQuestionEntity.timeStep,
         finalInterval,
@@ -642,11 +642,11 @@ export default class QuizService {
   private getAnswersForNumberValue(maxLoad: number, unit: string): Answer[] {
     const coefList: number[] = [0.6, 0.7, 0.8, 0.12, 0.13]
     // Pick a random number in the coefList and remove it from array
-    const index1: number = Math.floor(Math.random() * coefList.length) //NOSONAR
+    const index1: number = Math.floor(Math.random() * coefList.length) // NOSONAR
     const roll: number[] = coefList.splice(index1, 1)
     const coef1: number = roll[0]
     // Pick a second number in the coefList
-    const index2: number = Math.floor(Math.random() * coefList.length) //NOSONAR
+    const index2: number = Math.floor(Math.random() * coefList.length) // NOSONAR
     const roll2: number[] = coefList.splice(index2, 1)
     const coef2: number = roll2[0]
     // Format answers
diff --git a/src/services/usageEvent.service.ts b/src/services/usageEvent.service.ts
index 6ab397dddc94aded55f52890a8a6c70860ede6ce..9b18e59c4e342fd543fb8410e12019c12a244779 100644
--- a/src/services/usageEvent.service.ts
+++ b/src/services/usageEvent.service.ts
@@ -77,7 +77,7 @@ export default class UsageEventService {
     konnectorSlug: string
   ): Promise<UsageEventEntity | undefined> {
     try {
-      //Get last Connection attempt Event
+      // Get last Connection attempt Event
       const query: QueryDefinition = Q(USAGEEVENT_DOCTYPE)
         .where({
           type: UsageEventType.KONNECTOR_ATTEMPT_EVENT,
diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts
index 848faf512645af8b0dc5798479555daf8672fd2a..624e2edbd11368e5476dcb9a06bcd910e081000a 100644
--- a/src/store/global/global.reducer.ts
+++ b/src/store/global/global.reducer.ts
@@ -141,7 +141,7 @@ const getFluidTypesFromStatus = (fluidStatus: FluidStatus[]): FluidType[] => {
       (fluid.status !== FluidState.KONNECTOR_NOT_FOUND &&
         fluid.status !== FluidState.NOT_CONNECTED &&
         fluid.status !== FluidState.ERROR_LOGIN_FAILED) ||
-      //Handle Login Error case for oauth konnectors
+      // Handle Login Error case for oauth konnectors
       (fluid.status === FluidState.ERROR_LOGIN_FAILED &&
         fluid.fluidType !== FluidType.WATER)
     ) {
diff --git a/src/targets/browser/index.tsx b/src/targets/browser/index.tsx
index f6ae853033dc29899b76261c543dbedfb47c23c9..eb5836f4578cd219bcb3568be388fe65e718b80e 100644
--- a/src/targets/browser/index.tsx
+++ b/src/targets/browser/index.tsx
@@ -12,7 +12,7 @@ import CozyClient, { Client, CozyProvider } from 'cozy-client'
 import { handleOAuthResponse } from 'cozy-harvest-lib/dist/helpers/oauth'
 import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n'
 import schema from 'doctypes'
-import { createBrowserHistory, History } from 'history'
+import { createHashHistory, History } from 'history'
 import { memoize } from 'lodash'
 import React from 'react'
 import { render } from 'react-dom'
@@ -26,7 +26,7 @@ import manifest from '../../../manifest.webapp'
 import '../../styles/index.scss'
 
 const setupApp = memoize(() => {
-  const history: History = createBrowserHistory()
+  const history: History = createHashHistory()
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
   const root: any = document.querySelector('[role=application]')
   const data = JSON.parse(root.dataset.cozy)
@@ -65,7 +65,7 @@ const setupApp = memoize(() => {
     appNamePrefix: data.app.prefix,
   })
 
-  let tracker
+  let tracker: undefined | MatomoTracker
   if (window.Piwik) {
     Piwik.getTracker()
     tracker = new MatomoTracker({
diff --git a/src/targets/services/aggregatorUsageEvents.ts b/src/targets/services/aggregatorUsageEvents.ts
index fbdbf208f27aef9a4d46fa81939868c9d25c87a8..9a2c6fd14d664f99a0012268a3438a784aa75834 100644
--- a/src/targets/services/aggregatorUsageEvents.ts
+++ b/src/targets/services/aggregatorUsageEvents.ts
@@ -782,7 +782,7 @@ const sendKonnectorEvents = async (client: Client) => {
             })
             .startOf('day')
             .toISODate(),
-          value: allConnectionEvents.length + 1, //+1 in order to count the success
+          value: allConnectionEvents.length + 1, // +1 in order to count the success
         }
         // Send indicator if it's in current month
         if (successEvent.eventDate.month === today.minus({ month: 1 }).month) {
diff --git a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts
index 3f9a56f5067212532b5652b798e69f526cb9a81c..ab802266964624187c87a08b331389733577213c 100644
--- a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts
+++ b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts
@@ -191,7 +191,7 @@ const getEnedisMonthAnalysisData = async (
 const syncEnedisMonthlyAnalysisDataDoctype = async ({
   client,
 }: EnedisMonthlyProps) => {
-  //SERVICE RUNS ONLY IF ENEDIS MINUTE IS ACTIVATED
+  // SERVICE RUNS ONLY IF ENEDIS MINUTE IS ACTIVATED
   const emas = new EnedisMonthlyAnalysisDataService(client)
   const cs = new ConsumptionService(client)
   const firstMinuteData = (await cs.getFirsDataDateFromDoctype(
@@ -200,7 +200,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({
 
   const lastEnedisMonthlyAnalysis = await emas.getLastEnedisMonthlyAnalysis()
   if (firstMinuteData && firstMinuteData[0]) {
-    //First creates the analysis of the month - 1
+    // First creates the analysis of the month - 1
     logStack('info', 'Fetching last Enedis monthly Analysis...')
     const firstMinuteDate = DateTime.fromObject({
       year: firstMinuteData[0].year,
@@ -234,7 +234,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({
     logStack('info', 'Getting first endis half hour data date')
 
     if (lastEnedisMonthlyAnalysis.length > 0) {
-      //If user has more than one entry (already synced), fetch the full history
+      // If user has more than one entry (already synced), fetch the full history
       const firstEnedisMonthlyAnalysis = (await cs.getFirsDataDateFromDoctype(
         ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE
       )) as EnedisMonthlyAnalysisData[]
@@ -271,7 +271,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({
         }
       }
     } else {
-      //If user only have the last analysis available, fetch one year history
+      // If user only have the last analysis available, fetch one year history
       logStack(
         'info',
         'Doctype is empty, fetching history for one year maximum or until first enedis minute date'
diff --git a/src/targets/services/fluidsPrices.ts b/src/targets/services/fluidsPrices.ts
index 4f4c1137cee6ae0244fef384fa2dee0d953a6e0f..fd0208f8c30d7cf85b447d2edc473de8659bccba 100644
--- a/src/targets/services/fluidsPrices.ts
+++ b/src/targets/services/fluidsPrices.ts
@@ -51,13 +51,13 @@ const synchroPricesToUpdate = async (
   let firstEditedPrice: string | null = null
   await Promise.all(
     remotePrices.map(remotePrice => {
-      //eslint-disable-next-line no-async-promise-executor
+      // eslint-disable-next-line no-async-promise-executor
       return new Promise<void>(async resolve => {
         try {
-          //Check if price exist in database
+          // Check if price exist in database
           const existingPrice = await fps.checkIfPriceExists(remotePrice)
           if (existingPrice) {
-            //Check if the remote price is more recent
+            // Check if the remote price is more recent
             if (
               existingPrice.UpdatedAt &&
               remotePrice.UpdatedAt &&
@@ -67,7 +67,7 @@ const synchroPricesToUpdate = async (
                 'debug',
                 `Price exist in db but not up to date, updating it`
               )
-              //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
+              // If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
               if (firstEditedPrice === null) {
                 firstEditedPrice = remotePrice.startDate
               }
@@ -75,7 +75,7 @@ const synchroPricesToUpdate = async (
                 firstEditedPrice = remotePrice.startDate
               }
 
-              //update this price in db
+              // update this price in db
               await fps.updatePrice(existingPrice, {
                 price: remotePrice.price,
                 UpdatedAt: remotePrice.UpdatedAt,
@@ -83,7 +83,7 @@ const synchroPricesToUpdate = async (
                 endDate: remotePrice.endDate,
               })
             } else if (!existingPrice.UpdatedAt && remotePrice.UpdatedAt) {
-              //updatedAt key doesn't exist in db
+              // updatedAt key doesn't exist in db
               await fps.updatePrice(existingPrice, {
                 UpdatedAt: remotePrice.UpdatedAt,
               })
@@ -92,14 +92,14 @@ const synchroPricesToUpdate = async (
             }
           } else {
             logStack('debug', `Price doesn't exist in db, creating new price`)
-            //If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
+            // If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
             if (firstEditedPrice === null) {
               firstEditedPrice = remotePrice.startDate
             }
             if (firstEditedPrice >= remotePrice.startDate) {
               firstEditedPrice = remotePrice.startDate
             }
-            //create price in db
+            // create price in db
             await fps.createPrice(remotePrice)
           }
         } catch (error) {
@@ -239,7 +239,7 @@ const applyPrices = async (client: Client, fluidType: FluidType) => {
   const cdm = new ConsumptionDataManager(client)
   const qr = new QueryRunner(client)
 
-  //Synchro dbprices with remote prices
+  // Synchro dbprices with remote prices
   const firstEditedPriceDate = await synchroPricesToUpdate(client, fluidType)
   const firstDataDate = await cdm.fetchAllFirstDateData([fluidType])
   const prices = await fluidsPricesService.getAllPrices()
@@ -326,7 +326,7 @@ const applyPrices = async (client: Client, fluidType: FluidType) => {
                 // If lastItem has a price, skip this day (in order to save perf)
                 const lastItem = data?.data && data.data[data.data.length - 1]
                 if (lastItem && priceData) {
-                  //if a price has been updated in backoffice re-calculates all price from the firstEditedPriceDate
+                  // if a price has been updated in backoffice re-calculates all price from the firstEditedPriceDate
                   data &&
                     data.data.forEach((element: DataloadEntity) => {
                       element.price = element.load * priceData.price
diff --git a/src/utils/matomoTracker.ts b/src/utils/matomoTracker.ts
index 3cc3aaf0b5f2c4fc2356439f290af8b832ee979b..1fe084049f77000e7520041bd74f56d530e58765 100644
--- a/src/utils/matomoTracker.ts
+++ b/src/utils/matomoTracker.ts
@@ -1,5 +1,6 @@
 import { readCozyDataFromDOM } from 'cozy-ui/transpiled/react/helpers/appDataset'
-import { History, Location, UnregisterCallback } from 'history'
+import { History } from 'history'
+import { Location } from 'react-router'
 
 interface InitSettings {
   cozyUrl: string
@@ -11,8 +12,8 @@ interface InitSettings {
 
 declare global {
   interface Window {
-    _paq: any
-    Piwik: any
+    _paq: { push: (arg0: unknown) => void }
+    Piwik: unknown
   }
 }
 
@@ -22,7 +23,7 @@ export default class MatomoTracker {
   siteId: number
   phpFilename: string
   history: History
-  unlistenFromHistory: UnregisterCallback
+  tracking = false
 
   constructor({
     cozyUrl,
@@ -41,7 +42,6 @@ export default class MatomoTracker {
     this.siteId = siteId
     this.phpFilename = phpFilename
     this.history = history
-    this.unlistenFromHistory = () => null
     this.init()
   }
 
@@ -57,8 +57,6 @@ export default class MatomoTracker {
     return {
       push: MatomoTracker.push,
       track: this.track,
-      connectToHistory: this.connectToHistory,
-      disconnectFromHistory: this.disconnectFromHistory,
     }
   }
 
@@ -82,28 +80,15 @@ export default class MatomoTracker {
     }
   }
 
-  connectToHistory() {
-    this.unlistenFromHistory = this.history.listen(loc => {
-      this.track(loc)
-    })
-  }
-
-  disconnectFromHistory() {
-    if (this.unlistenFromHistory) {
-      this.unlistenFromHistory()
-      return true
-    }
-    return false
-  }
-
+  /** If matomo find a cookie "mtm_consent_removed" tracking will not be sent */
   track(loc: Location) {
     if (typeof window === 'undefined') {
       return
     }
     const currentPath = loc.hash.substring(1)
 
-    MatomoTracker.push(['setDocumentTitle', currentPath.substring(1)])
     MatomoTracker.push(['setCustomUrl', 'https://ecolyo.com' + currentPath])
+    MatomoTracker.push(['setDocumentTitle', currentPath.substring(1)])
     MatomoTracker.push(['trackPageView'])
   }
 }
diff --git a/yarn.lock b/yarn.lock
index 644998649cb3dc2ad1de790b9ac75fef38429235..64de230e88f3da932dd72cdc2c458e9b92f71ef9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -139,7 +139,7 @@
     json5 "^2.2.1"
     semver "^6.3.0"
 
-"@babel/eslint-parser@7.18.9", "@babel/eslint-parser@^7.16.3":
+"@babel/eslint-parser@^7.16.3":
   version "7.18.9"
   resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz#255a63796819a97b7578751bb08ab9f2a375a031"
   integrity sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==
@@ -1481,9 +1481,9 @@
     regenerator-runtime "^0.13.4"
 
 "@babel/runtime@^7.7.6":
-  version "7.20.7"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd"
-  integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==
+  version "7.20.13"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
+  integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
   dependencies:
     regenerator-runtime "^0.13.11"
 
@@ -1692,35 +1692,11 @@
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/eslintrc@^1.3.1":
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356"
-  integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==
-  dependencies:
-    ajv "^6.12.4"
-    debug "^4.3.2"
-    espree "^9.4.0"
-    globals "^13.15.0"
-    ignore "^5.2.0"
-    import-fresh "^3.2.1"
-    js-yaml "^4.1.0"
-    minimatch "^3.1.2"
-    strip-json-comments "^3.1.1"
-
 "@gar/promisify@^1.0.1":
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
   integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
 
-"@humanwhocodes/config-array@^0.10.4":
-  version "0.10.4"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c"
-  integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==
-  dependencies:
-    "@humanwhocodes/object-schema" "^1.2.1"
-    debug "^4.1.1"
-    minimatch "^3.0.4"
-
 "@humanwhocodes/config-array@^0.5.0":
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
@@ -1739,16 +1715,6 @@
     debug "^4.1.1"
     minimatch "^3.0.4"
 
-"@humanwhocodes/gitignore-to-minimatch@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
-  integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
-
-"@humanwhocodes/module-importer@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
-  integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-
 "@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1":
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
@@ -2791,6 +2757,13 @@
   resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64"
   integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==
 
+"@types/history@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@types/history/-/history-5.0.0.tgz#29f919f0c8e302763798118f45b19cab4a886f14"
+  integrity sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==
+  dependencies:
+    history "*"
+
 "@types/hoist-non-react-statics@^3.3.0":
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
@@ -3017,21 +2990,6 @@
   dependencies:
     "@types/yargs-parser" "*"
 
-"@typescript-eslint/eslint-plugin@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.0.tgz#8f159c4cdb3084eb5d4b72619a2ded942aa109e5"
-  integrity sha512-X3In41twSDnYRES7hO2xna4ZC02SY05UN9sGW//eL1P5k4CKfvddsdC2hOq0O3+WU1wkCPQkiTY9mzSnXKkA0w==
-  dependencies:
-    "@typescript-eslint/scope-manager" "5.36.0"
-    "@typescript-eslint/type-utils" "5.36.0"
-    "@typescript-eslint/utils" "5.36.0"
-    debug "^4.3.4"
-    functional-red-black-tree "^1.0.1"
-    ignore "^5.2.0"
-    regexpp "^3.2.0"
-    semver "^7.3.7"
-    tsutils "^3.21.0"
-
 "@typescript-eslint/eslint-plugin@^5.37.0":
   version "5.37.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.37.0.tgz#5ccdd5d9004120f28fc6e717fb4b5c9bddcfbc04"
@@ -3047,16 +3005,6 @@
     semver "^7.3.7"
     tsutils "^3.21.0"
 
-"@typescript-eslint/parser@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.36.0.tgz#c08883073fb65acaafd268a987fd2314ce80c789"
-  integrity sha512-dlBZj7EGB44XML8KTng4QM0tvjI8swDh8MdpE5NX5iHWgWEfIuqSfSE+GPeCrCdj7m4tQLuevytd57jNDXJ2ZA==
-  dependencies:
-    "@typescript-eslint/scope-manager" "5.36.0"
-    "@typescript-eslint/types" "5.36.0"
-    "@typescript-eslint/typescript-estree" "5.36.0"
-    debug "^4.3.4"
-
 "@typescript-eslint/parser@^5.10.0":
   version "5.30.5"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.5.tgz#f667c34e4e4c299d98281246c9b1e68c03a92522"
@@ -3085,14 +3033,6 @@
     "@typescript-eslint/types" "5.30.5"
     "@typescript-eslint/visitor-keys" "5.30.5"
 
-"@typescript-eslint/scope-manager@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.36.0.tgz#f4f859913add160318c0a5daccd3a030d1311530"
-  integrity sha512-PZUC9sz0uCzRiuzbkh6BTec7FqgwXW03isumFVkuPw/Ug/6nbAqPUZaRy4w99WCOUuJTjhn3tMjsM94NtEj64g==
-  dependencies:
-    "@typescript-eslint/types" "5.36.0"
-    "@typescript-eslint/visitor-keys" "5.36.0"
-
 "@typescript-eslint/scope-manager@5.37.0":
   version "5.37.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz#044980e4f1516a774a418dafe701a483a6c9f9ca"
@@ -3101,16 +3041,6 @@
     "@typescript-eslint/types" "5.37.0"
     "@typescript-eslint/visitor-keys" "5.37.0"
 
-"@typescript-eslint/type-utils@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.36.0.tgz#5d2f94a36a298ae240ceca54b3bc230be9a99f0a"
-  integrity sha512-W/E3yJFqRYsjPljJ2gy0YkoqLJyViWs2DC6xHkXcWyhkIbCDdaVnl7mPLeQphVI+dXtY05EcXFzWLXhq8Mm/lQ==
-  dependencies:
-    "@typescript-eslint/typescript-estree" "5.36.0"
-    "@typescript-eslint/utils" "5.36.0"
-    debug "^4.3.4"
-    tsutils "^3.21.0"
-
 "@typescript-eslint/type-utils@5.37.0":
   version "5.37.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz#43ed2f567ada49d7e33a6e4b6f9babd060445fe5"
@@ -3126,11 +3056,6 @@
   resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.5.tgz#36a0c05a72af3623cdf9ee8b81ea743b7de75a98"
   integrity sha512-kZ80w/M2AvsbRvOr3PjaNh6qEW1LFqs2pLdo2s5R38B2HYXG8Z0PP48/4+j1QHJFL3ssHIbJ4odPRS8PlHrFfw==
 
-"@typescript-eslint/types@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.36.0.tgz#cde7b94d1c09a4f074f46db99e7bd929fb0a5559"
-  integrity sha512-3JJuLL1r3ljRpFdRPeOtgi14Vmpx+2JcR6gryeORmW3gPBY7R1jNYoq4yBN1L//ONZjMlbJ7SCIwugOStucYiQ==
-
 "@typescript-eslint/types@5.37.0":
   version "5.37.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.37.0.tgz#09e4870a5f3af7af3f84e08d792644a87d232261"
@@ -3149,19 +3074,6 @@
     semver "^7.3.7"
     tsutils "^3.21.0"
 
-"@typescript-eslint/typescript-estree@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.0.tgz#0acce61b4850bdb0e578f0884402726680608789"
-  integrity sha512-EW9wxi76delg/FS9+WV+fkPdwygYzRrzEucdqFVWXMQWPOjFy39mmNNEmxuO2jZHXzSQTXzhxiU1oH60AbIw9A==
-  dependencies:
-    "@typescript-eslint/types" "5.36.0"
-    "@typescript-eslint/visitor-keys" "5.36.0"
-    debug "^4.3.4"
-    globby "^11.1.0"
-    is-glob "^4.0.3"
-    semver "^7.3.7"
-    tsutils "^3.21.0"
-
 "@typescript-eslint/typescript-estree@5.37.0":
   version "5.37.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz#956dcf5c98363bcb97bdd5463a0a86072ff79355"
@@ -3175,18 +3087,6 @@
     semver "^7.3.7"
     tsutils "^3.21.0"
 
-"@typescript-eslint/utils@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.36.0.tgz#104c864ecc1448417606359275368bf3872bbabb"
-  integrity sha512-wAlNhXXYvAAUBbRmoJDywF/j2fhGLBP4gnreFvYvFbtlsmhMJ4qCKVh/Z8OP4SgGR3xbciX2nmG639JX0uw1OQ==
-  dependencies:
-    "@types/json-schema" "^7.0.9"
-    "@typescript-eslint/scope-manager" "5.36.0"
-    "@typescript-eslint/types" "5.36.0"
-    "@typescript-eslint/typescript-estree" "5.36.0"
-    eslint-scope "^5.1.1"
-    eslint-utils "^3.0.0"
-
 "@typescript-eslint/utils@5.37.0":
   version "5.37.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.37.0.tgz#7784cb8e91390c4f90ccaffd24a0cf9874df81b2"
@@ -3207,14 +3107,6 @@
     "@typescript-eslint/types" "5.30.5"
     eslint-visitor-keys "^3.3.0"
 
-"@typescript-eslint/visitor-keys@5.36.0":
-  version "5.36.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.0.tgz#565d35a5ca00d00a406a942397ead2cb190663ba"
-  integrity sha512-pdqSJwGKueOrpjYIex0T39xarDt1dn4p7XJ+6FqBWugNQwXlNGC5h62qayAIYZ/RPPtD+ButDWmpXT1eGtiaYg==
-  dependencies:
-    "@typescript-eslint/types" "5.36.0"
-    eslint-visitor-keys "^3.3.0"
-
 "@typescript-eslint/visitor-keys@5.37.0":
   version "5.37.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz#7b72dd343295ea11e89b624995abc7103c554eee"
@@ -3437,11 +3329,6 @@ acorn@^8.2.4, acorn@^8.7.1:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
   integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
 
-acorn@^8.8.0:
-  version "8.8.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
-  integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
-
 add-stream@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
@@ -3907,13 +3794,14 @@ axios@^0.21.1:
   dependencies:
     follow-redirects "^1.14.0"
 
-axios@^0.27.0:
-  version "0.27.2"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
-  integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
+axios@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.0.tgz#4cb0d72213989dec08d4b10129e42063bcb3dc78"
+  integrity sha512-oCye5nHhTypzkdLIvF9SaHfr8UAquqCn1KY3j8vsrjeol8yohAdGxIpRPbF1bOLsx33HOAatdfMX1yzsj2cHwg==
   dependencies:
-    follow-redirects "^1.14.9"
+    follow-redirects "^1.15.0"
     form-data "^4.0.0"
+    proxy-from-env "^1.1.0"
 
 babel-core@7.0.0-bridge.0:
   version "7.0.0-bridge.0"
@@ -7333,23 +7221,6 @@ eslint-config-cozy-app@1.5.0:
     eslint-plugin-vue "5.2.3"
     prettier "1.18.2"
 
-eslint-config-cozy-app@5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/eslint-config-cozy-app/-/eslint-config-cozy-app-5.1.0.tgz#17cf39c01edf587512164aaf340a139f65bc9bb7"
-  integrity sha512-S5dILPftGUzbFJM8bLCegTqj6kHyU+9mXMoa+jd06ARenvcqE8TQuDhGLhI6z/EdpIlXBNBED/eBQZ+fyyhDXQ==
-  dependencies:
-    "@babel/eslint-parser" "7.18.9"
-    "@typescript-eslint/eslint-plugin" "5.36.0"
-    "@typescript-eslint/parser" "5.36.0"
-    eslint "8.23.0"
-    eslint-config-prettier "8.5.0"
-    eslint-plugin-prettier "4.2.1"
-    eslint-plugin-promise "6.0.1"
-    eslint-plugin-react "7.31.1"
-    eslint-plugin-react-hooks "4.6.0"
-    prettier "2.7.1"
-    typescript "4.8.2"
-
 eslint-config-prettier@4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz#c55c1fcac8ce4518aeb77906984e134d9eb5a4f0"
@@ -7357,7 +7228,7 @@ eslint-config-prettier@4.3.0:
   dependencies:
     get-stdin "^6.0.0"
 
-eslint-config-prettier@8.5.0, eslint-config-prettier@^8.5.0:
+eslint-config-prettier@^8.5.0:
   version "8.5.0"
   resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1"
   integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==
@@ -7380,18 +7251,13 @@ eslint-plugin-prettier@3.1.2:
   dependencies:
     prettier-linter-helpers "^1.0.0"
 
-eslint-plugin-prettier@4.2.1, eslint-plugin-prettier@^4.2.1:
+eslint-plugin-prettier@^4.2.1:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b"
   integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==
   dependencies:
     prettier-linter-helpers "^1.0.0"
 
-eslint-plugin-promise@6.0.1:
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.0.1.tgz#a8cddf96a67c4059bdabf4d724a29572188ae423"
-  integrity sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==
-
 eslint-plugin-react-hooks@2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.3.0.tgz#53e073961f1f5ccf8dd19558036c1fac8c29d99a"
@@ -7402,11 +7268,6 @@ eslint-plugin-react-hooks@4.0.4:
   resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.4.tgz#aed33b4254a41b045818cacb047b81e6df27fa58"
   integrity sha512-equAdEIsUETLFNCmmCkiCGq6rkSK5MoJhXFPFYeUebcjKgBmWWcgVOqZyQC8Bv1BwVCnTq9tBxgJFgAJTWoJtA==
 
-eslint-plugin-react-hooks@4.6.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
-  integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
-
 eslint-plugin-react-hooks@^4.2.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172"
@@ -7445,26 +7306,6 @@ eslint-plugin-react@7.19.0:
     string.prototype.matchall "^4.0.2"
     xregexp "^4.3.0"
 
-eslint-plugin-react@7.31.1:
-  version "7.31.1"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz#d29793ed27743f3ed8a473c347b1bf5a0a8fb9af"
-  integrity sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==
-  dependencies:
-    array-includes "^3.1.5"
-    array.prototype.flatmap "^1.3.0"
-    doctrine "^2.1.0"
-    estraverse "^5.3.0"
-    jsx-ast-utils "^2.4.1 || ^3.0.0"
-    minimatch "^3.1.2"
-    object.entries "^1.1.5"
-    object.fromentries "^2.0.5"
-    object.hasown "^1.1.1"
-    object.values "^1.1.5"
-    prop-types "^15.8.1"
-    resolve "^2.0.0-next.3"
-    semver "^6.3.0"
-    string.prototype.matchall "^4.0.7"
-
 eslint-plugin-react@7.31.8:
   version "7.31.8"
   resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf"
@@ -7602,51 +7443,6 @@ eslint@5.16.0:
     table "^5.2.3"
     text-table "^0.2.0"
 
-eslint@8.23.0:
-  version "8.23.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.0.tgz#a184918d288820179c6041bb3ddcc99ce6eea040"
-  integrity sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==
-  dependencies:
-    "@eslint/eslintrc" "^1.3.1"
-    "@humanwhocodes/config-array" "^0.10.4"
-    "@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
-    "@humanwhocodes/module-importer" "^1.0.1"
-    ajv "^6.10.0"
-    chalk "^4.0.0"
-    cross-spawn "^7.0.2"
-    debug "^4.3.2"
-    doctrine "^3.0.0"
-    escape-string-regexp "^4.0.0"
-    eslint-scope "^7.1.1"
-    eslint-utils "^3.0.0"
-    eslint-visitor-keys "^3.3.0"
-    espree "^9.4.0"
-    esquery "^1.4.0"
-    esutils "^2.0.2"
-    fast-deep-equal "^3.1.3"
-    file-entry-cache "^6.0.1"
-    find-up "^5.0.0"
-    functional-red-black-tree "^1.0.1"
-    glob-parent "^6.0.1"
-    globals "^13.15.0"
-    globby "^11.1.0"
-    grapheme-splitter "^1.0.4"
-    ignore "^5.2.0"
-    import-fresh "^3.0.0"
-    imurmurhash "^0.1.4"
-    is-glob "^4.0.0"
-    js-yaml "^4.1.0"
-    json-stable-stringify-without-jsonify "^1.0.1"
-    levn "^0.4.1"
-    lodash.merge "^4.6.2"
-    minimatch "^3.1.2"
-    natural-compare "^1.4.0"
-    optionator "^0.9.1"
-    regexpp "^3.2.0"
-    strip-ansi "^6.0.1"
-    strip-json-comments "^3.1.0"
-    text-table "^0.2.0"
-
 eslint@^7.32.0:
   version "7.32.0"
   resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
@@ -7770,15 +7566,6 @@ espree@^9.0.0, espree@^9.3.2:
     acorn-jsx "^5.3.2"
     eslint-visitor-keys "^3.3.0"
 
-espree@^9.4.0:
-  version "9.4.0"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a"
-  integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==
-  dependencies:
-    acorn "^8.8.0"
-    acorn-jsx "^5.3.2"
-    eslint-visitor-keys "^3.3.0"
-
 esprima@^4.0.0, esprima@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@@ -8345,11 +8132,16 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
 
-follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.9:
+follow-redirects@^1.0.0, follow-redirects@^1.14.0:
   version "1.15.1"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
   integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
 
+follow-redirects@^1.15.0:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
+  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
+
 for-in@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -8751,11 +8543,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
   integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
 
-grapheme-splitter@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
-  integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
-
 growly@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -8942,7 +8729,7 @@ highlight.js@^10.7.1:
   resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
   integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
 
-history@^5.3.0:
+history@*, history@^5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b"
   integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==
@@ -13359,7 +13146,7 @@ prettier@1.18.2:
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
   integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
 
-prettier@2.7.1, prettier@^2.5.1, prettier@^2.7.1:
+prettier@^2.5.1, prettier@^2.7.1:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
   integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
@@ -13514,6 +13301,11 @@ proxy-addr@~2.0.7:
     forwarded "0.2.0"
     ipaddr.js "1.9.1"
 
+proxy-from-env@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
 prr@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@@ -16198,11 +15990,6 @@ typedarray@^0.0.6:
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
 
-typescript@4.8.2:
-  version "4.8.2"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.2.tgz#e3b33d5ccfb5914e4eeab6699cf208adee3fd790"
-  integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==
-
 typescript@^4.0.0, typescript@^4.5.4:
   version "4.7.4"
   resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"